merge fx-team to mozilla-central a=merge
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Wed, 06 Jul 2016 11:41:53 +0200
changeset 303887 95ffbc4ff63584631c408e8d9912961fcf68bb09
parent 303886 a7d6bb9e7d12166470ad4210dd1f56b7b07d0dc8 (current diff)
parent 303828 d8fa10d0a52eb52ee1fc46f88c37662c71af37a6 (diff)
child 303889 d666f37dfa890eb321002fa4daf75080826d2649
child 303937 39ec98bf2580a236471714c28b336d8c974cc365
child 303986 f89429b567cc881c5de58042c465fcd830415a04
push id79199
push usergszorc@mozilla.com
push dateThu, 07 Jul 2016 01:27:06 +0000
treeherdermozilla-inbound@d666f37dfa89 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone50.0a1
first release with
nightly linux32
95ffbc4ff635 / 50.0a1 / 20160706030233 / files
nightly linux64
95ffbc4ff635 / 50.0a1 / 20160706030233 / files
nightly mac
95ffbc4ff635 / 50.0a1 / 20160706030201 / files
nightly win32
95ffbc4ff635 / 50.0a1 / 20160706030233 / files
nightly win64
95ffbc4ff635 / 50.0a1 / 20160706030233 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge fx-team to mozilla-central a=merge
browser/themes/linux/preferences/Options-sync.png
browser/themes/linux/preferences/Options.png
browser/themes/osx/preferences/Options-sync.png
browser/themes/osx/preferences/Options.png
browser/themes/osx/preferences/checkbox-yosemite.png
browser/themes/osx/preferences/checkbox-yosemite@2x.png
browser/themes/osx/preferences/checkbox.png
browser/themes/osx/preferences/checkbox@2x.png
browser/themes/shared/search/search-pref.png
browser/themes/windows/preferences/Options-XP.png
browser/themes/windows/preferences/Options-sync.png
browser/themes/windows/preferences/Options.png
browser/themes/windows/preferences/checkbox-aero.png
browser/themes/windows/preferences/checkbox-classic.png
browser/themes/windows/preferences/checkbox-xp.png
browser/themes/windows/preferences/checkbox.png
browser/themes/windows/preferences/mail-XP.png
browser/themes/windows/preferences/mail.png
devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll.js
devtools/client/inspector/markup/test/doc_markup_dragdrop_autoscroll.html
devtools/client/webconsole/new-console-output/components/message-types/date-preview.js
devtools/client/webconsole/new-console-output/test/components/test_date-preview.html
--- a/browser/base/content/sync/genericChange.xul
+++ b/browser/base/content/sync/genericChange.xul
@@ -62,17 +62,17 @@
 
       <vbox id="passphraseRow">
         <hbox flex="1">
           <label id="passphraseLabel" control="passphraseBox"/>
           <spacer flex="1"/>
           <label id="generatePassphraseButton"
                  hidden="true"
                  value="&syncGenerateNewKey.label;"
-                 class="text-link inline-link"
+                 class="text-link"
                  onclick="event.stopPropagation();
                           Change.doGeneratePassphrase();"/>
         </hbox>
         <textbox id="passphraseBox"
                  flex="1"
                  onfocus="this.select()"
                  oninput="Change.validate()"/>
       </vbox>
--- a/browser/base/content/sync/setup.xul
+++ b/browser/base/content/sync/setup.xul
@@ -178,22 +178,22 @@
             <checkbox id="tos"
                       accesskey="&setup.tosAgree1.accesskey;"
                       oncommand="this.focus(); gSyncSetup.checkFields();"/>
             <description id="tosDesc"
                          flex="1"
                          onclick="document.getElementById('tos').focus();
                                   document.getElementById('tos').click()">
               &setup.tosAgree1.label;
-              <label class="text-link inline-link"
+              <label class="text-link"
                      onclick="event.stopPropagation();gSyncUtils.openToS();">
                 &setup.tosLink.label;
               </label>
               &setup.tosAgree2.label;
-              <label class="text-link inline-link"
+              <label class="text-link"
                      onclick="event.stopPropagation();gSyncUtils.openPrivacyPolicy();">
                 &setup.ppLink.label;
               </label>
               &setup.tosAgree3.label;
             </description>
           </hbox>
         </row>
       </rows>
--- a/browser/components/preferences/in-content/privacy.xul
+++ b/browser/components/preferences/in-content/privacy.xul
@@ -131,19 +131,19 @@
              value="&trackingProtectionPBMLearnMore.label;"/>
       <spacer flex="1" />
       <button id="changeBlockListPBM"
               label="&changeBlockList.label;" accesskey="&changeBlockList.accesskey;"
               preference="pref.privacy.disable_button.change_blocklist"/>
     </hbox>
   </vbox>
   <vbox>
-    <description>&doNotTrack.pre.label;<html:a
-    class="inline-link" id="doNotTrackSettings" href="#"
-    >&doNotTrack.settings.label;</html:a>&doNotTrack.post.label;</description>
+    <description>&doNotTrack.pre.label;<label
+    class="text-link" id="doNotTrackSettings"
+    >&doNotTrack.settings.label;</label>&doNotTrack.post.label;</description>
   </vbox>
 </groupbox>
 
 <!-- History -->
 <groupbox id="historyGroup" data-category="panePrivacy" hidden="true">
   <caption><label>&history.label;</label></caption>
   <hbox align="center">
     <label id="historyModeLabel"
@@ -160,32 +160,32 @@
     <label>&historyHeader.post.label;</label>
   </hbox>
   <deck id="historyPane">
     <vbox id="historyRememberPane">
       <hbox align="center" flex="1">
         <vbox flex="1">
           <description>&rememberDescription.label;</description>
           <separator class="thin"/>
-          <description>&rememberActions.pre.label;<html:a
-          class="inline-link" id="historyRememberClear" href="#"
-          >&rememberActions.clearHistory.label;</html:a>&rememberActions.middle.label;<html:a
-          class="inline-link" id="historyRememberCookies" href="#"
-          >&rememberActions.removeCookies.label;</html:a>&rememberActions.post.label;</description>
+          <description>&rememberActions.pre.label;<label
+          class="text-link" id="historyRememberClear"
+          >&rememberActions.clearHistory.label;</label>&rememberActions.middle.label;<label
+          class="text-link" id="historyRememberCookies"
+          >&rememberActions.removeCookies.label;</label>&rememberActions.post.label;</description>
         </vbox>
       </hbox>
     </vbox>
     <vbox id="historyDontRememberPane">
       <hbox align="center" flex="1">
         <vbox flex="1">
           <description>&dontrememberDescription.label;</description>
           <separator class="thin"/>
-          <description>&dontrememberActions.pre.label;<html:a
-          class="inline-link" id="historyDontRememberClear" href="#"
-          >&dontrememberActions.clearHistory.label;</html:a>&dontrememberActions.post.label;</description>
+          <description>&dontrememberActions.pre.label;<label
+          class="text-link" id="historyDontRememberClear"
+          >&dontrememberActions.clearHistory.label;</label>&dontrememberActions.post.label;</description>
         </vbox>
       </hbox>
     </vbox>
     <vbox id="historyCustomPane">
       <separator class="thin"/>
       <vbox>
         <vbox align="start">
           <checkbox id="privateBrowsingAutoStart"
--- a/browser/components/uitour/test/browser.ini
+++ b/browser/components/uitour/test/browser.ini
@@ -35,13 +35,13 @@ skip-if = os == "linux" # Linux: Bug 986
 skip-if = true # Bug 1225832 - New Loop architecture is not compatible with test.
 [browser_UITour_loop_panel.js]
 [browser_UITour_modalDialog.js]
 skip-if = os != "mac" # modal dialog disabling only working on OS X.
 [browser_UITour_observe.js]
 [browser_UITour_panel_close_annotation.js]
 skip-if = true # Disabled due to frequent failures, bugs 1026310 and 1032137
 [browser_UITour_pocket.js]
-skip-if = os == "linux" || debug
+skip-if = true # Disabled pending removal of pocket UI Tour
 [browser_UITour_registerPageID.js]
 [browser_UITour_resetProfile.js]
 [browser_UITour_sync.js]
 [browser_UITour_toggleReaderMode.js]
--- a/browser/extensions/pocket/content/main.js
+++ b/browser/extensions/pocket/content/main.js
@@ -123,58 +123,70 @@ var pktUI = (function() {
 
 
     // -- Panel UI -- //
 
     /**
      * Show the sign-up panel
      */
     function showSignUp() {
+        // AB test: Direct logged-out users to tab vs panel
+        if (pktApi.getSignupPanelTabTestVariant() == 'tab')
+        {
+            let site = Services.prefs.getCharPref("extensions.pocket.site");
+            openTabWithUrl('https://' + site + '/firefox_learnmore?src=ff_ext&s=ffi&t=buttonclick', true);
+
+            // force the panel closed before it opens
+            // wrapped in setTimeout to avoid race condition after logging out
+            // if this test goes to 100%, we should move this logic up before
+            // the panel is actually opened
+            setTimeout(function() {
+                getPanel().hidePopup();
+            }, 0);
+
+            return;
+        }
+
+        // Control: Show panel as normal
         getFirefoxAccountSignedInUser(function(userdata)
         {
             var fxasignedin = (typeof userdata == 'object' && userdata !== null) ? '1' : '0';
             var startheight = 490;
             var inOverflowMenu = isInOverflowMenu();
 
             if (inOverflowMenu)
             {
                 startheight = overflowMenuHeight;
             }
-            else if (pktApi.getSignupAB().indexOf('storyboard') > -1)
+            else
             {
                 startheight = 460;
                 if (fxasignedin == '1')
                 {
                     startheight = 406;
                 }
             }
-            else
-            {
-                if (fxasignedin == '1')
-                {
-                    startheight = 436;
-                }
-            }
             var variant;
             if (inOverflowMenu)
             {
                 variant = 'overflow';
             }
             else
             {
-                variant = pktApi.getSignupAB();
+                variant = 'storyboard_lm';
             }
+
             var panelId = showPanel("about:pocket-signup?pockethost=" + Services.prefs.getCharPref("extensions.pocket.site") + "&fxasignedin=" + fxasignedin + "&variant=" + variant + '&inoverflowmenu=' + inOverflowMenu + "&locale=" + getUILocale(), {
                     onShow: function() {
                     },
                     onHide: panelDidHide,
                     width: inOverflowMenu ? overflowMenuWidth : 300,
                     height: startheight
-                });
             });
+        });
     }
 
     /**
      * Show the logged-out state / sign-up panel
      */
     function saveAndShowConfirmation(url, title) {
 
         // Validate input parameter
--- a/browser/extensions/pocket/content/panels/js/signup.js
+++ b/browser/extensions/pocket/content/panels/js/signup.js
@@ -99,38 +99,38 @@ PKT_SIGNUP_OVERLAY.prototype = {
         this.active = true;
 
         // set translations
         this.getTranslations();
         this.dictJSON.fxasignedin = this.fxasignedin ? 1 : 0;
         this.dictJSON.variant = (this.variant ? this.variant : 'undefined');
         this.dictJSON.variant += this.fxasignedin ? '_fxa' : '_nonfxa';
         this.dictJSON.pockethost = this.pockethost;
-        this.dictJSON.showlearnmore = (this.variant.indexOf('_lm') > -1 || this.variant == 'storyboard' || this.variant == 'hero') ? 1 : 0;
+        this.dictJSON.showlearnmore = true;
 
         // extra modifier class for collapsed state
         if (this.inoverflowmenu)
         {
             $('body').addClass('pkt_ext_signup_overflow');
         }
 
         // extra modifier class for language
         if (this.locale)
         {
             $('body').addClass('pkt_ext_signup_' + this.locale);
         }
 
         // Create actual content
-        if (this.variant == 'storyboard' || this.variant == 'storyboard_lm' || this.variant == 'storyboard_nlm')
+        if (this.variant == 'overflow')
         {
-            $('body').append(Handlebars.templates.signupstoryboard_shell(this.dictJSON));
+            $('body').append(Handlebars.templates.signup_shell(this.dictJSON));
         }
         else
         {
-            $('body').append(Handlebars.templates.signup_shell(this.dictJSON));
+            $('body').append(Handlebars.templates.signupstoryboard_shell(this.dictJSON));
         }
 
 
         // tell background we're ready
         thePKT_SIGNUP.sendMessage("show");
 
         // close events
         this.initCloseTabEvents();
--- a/browser/extensions/pocket/content/pktApi.jsm
+++ b/browser/extensions/pocket/content/pktApi.jsm
@@ -604,43 +604,51 @@ var pktApi = (function() {
             success: options.success,
             error: options.error
         });
     }
 
     /**
      * Helper function to get current signup AB group the user is in
      */
-    function getSignupAB() {
-        var setting = getSetting('signupAB');
-        if (!setting || setting.includes('hero'))
+    function getSignupPanelTabTestVariant() {
+        return getSimpleTestOption('panelTab', 0.1, 'tab');
+    }
+
+    function getSimpleTestOption(testName, threshold, testOptionName) {
+        // Get the test from preferences if we've already assigned the user to a test
+        var settingName = 'test.' + testName;
+        var assignedValue = getSetting(settingName);
+
+        // If not assigned yet, pick and store a value
+        if (!assignedValue)
         {
-            var rand = (Math.floor(Math.random()*100+1));
-            if (rand > 90)
-            {
-                setting = 'storyboard_nlm';
+            if (Math.random() <= threshold) {
+                assignedValue = testOptionName;
             }
-            else
-            {
-                setting = 'storyboard_lm';
+            else {
+                assignedValue = 'control';
             }
-            setSetting('signupAB',setting);
+
+            setSetting('test.'+testName, assignedValue);
         }
-        return setting;
+
+        return assignedValue;
     }
 
+
     /**
      * Public functions
      */
     return {
         isUserLoggedIn : isUserLoggedIn,
         clearUserData: clearUserData,
         addLink: addLink,
         deleteItem: deleteItem,
         addTagsToItem: addTagsToItem,
         addTagsToURL: addTagsToURL,
         getTags: getTags,
         isPremiumUser: isPremiumUser,
         getSuggestedTagsForItem: getSuggestedTagsForItem,
         getSuggestedTagsForURL: getSuggestedTagsForURL,
-        getSignupAB: getSignupAB
+        getSignupPanelTabTestVariant: getSignupPanelTabTestVariant,
     };
 }());
--- a/browser/extensions/pocket/install.rdf.in
+++ b/browser/extensions/pocket/install.rdf.in
@@ -5,17 +5,17 @@
 
 #filter substitution
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:em="http://www.mozilla.org/2004/em-rdf#">
 
   <Description about="urn:mozilla:install-manifest">
     <em:id>firefox@getpocket.com</em:id>
-    <em:version>1.0.3b1</em:version>
+    <em:version>1.0.4</em:version>
     <em:type>2</em:type>
     <em:bootstrap>true</em:bootstrap>
 
     <!-- Target Application this theme can install into,
         with minimum and maximum supported versions. -->
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -77,19 +77,16 @@ browser.jar:
   skin/classic/browser/places/organizer.css           (places/organizer.css)
   skin/classic/browser/places/organizer.xml           (places/organizer.xml)
   skin/classic/browser/places/query.png               (places/query.png)
   skin/classic/browser/places/tag.png                 (places/tag.png)
   skin/classic/browser/places/toolbarDropMarker.png   (places/toolbarDropMarker.png)
   skin/classic/browser/places/unsortedBookmarks.png   (places/unsortedBookmarks.png)
   skin/classic/browser/places/downloads.png           (places/downloads.png)
   skin/classic/browser/preferences/alwaysAsk.png      (preferences/alwaysAsk.png)
-  skin/classic/browser/preferences/mail.png           (preferences/mail.png)
-  skin/classic/browser/preferences/Options.png        (preferences/Options.png)
-  skin/classic/browser/preferences/Options-sync.png   (preferences/Options-sync.png)
   skin/classic/browser/preferences/preferences.css    (preferences/preferences.css)
 * skin/classic/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
 * skin/classic/browser/preferences/in-content/dialog.css      (preferences/in-content/dialog.css)
   skin/classic/browser/preferences/applications.css   (preferences/applications.css)
   skin/classic/browser/social/services-16.png         (social/services-16.png)
   skin/classic/browser/social/services-64.png         (social/services-64.png)
   skin/classic/browser/social/share-button.png        (social/share-button.png)
   skin/classic/browser/social/share-button-active.png (social/share-button-active.png)
deleted file mode 100644
index 89901fb698c4a06792d6ae974489cb6b93ed3994..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 82bebd2a4f0b610dd02925140adac8e7a8493792..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/linux/preferences/preferences.css
+++ b/browser/themes/linux/preferences/preferences.css
@@ -1,106 +1,36 @@
 /*
 # -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
 
 /* Global Styles */
-#BrowserPreferences radio[pane] {
-  list-style-image: url("chrome://browser/skin/preferences/Options.png"); 
-}
-
-radio[pane=paneMain] {
-  -moz-image-region: rect(0px, 32px,  32px, 0px)
-}
-
-radio[pane=paneTabs] {
-  -moz-image-region: rect(0px, 64px, 32px, 32px)
-}
-
-#BrowserPreferences radio[pane=paneSearch] {
-  list-style-image: url("chrome://browser/skin/search-pref.png");
-}
-
 .checkbox-check {
   -moz-appearance: checkbox;
 }
 
-radio[pane=paneContent] {
-  -moz-image-region: rect(0px, 96px,  32px, 64px)
-}
-
-radio[pane=paneApplications] {
-  -moz-image-region: rect(0px, 128px,  32px, 96px)
-}
-
-radio[pane=panePrivacy] {
-  -moz-image-region: rect(0px, 160px,  32px, 128px)
-}
-
-radio[pane=paneSecurity] {
-  -moz-image-region: rect(0px, 192px,  32px, 160px)
-}
-
-radio[pane=paneAdvanced] {
-  -moz-image-region: rect(0px, 224px, 32px, 192px)
-}
-
-radio[pane=paneSync] {
-  list-style-image: url("chrome://browser/skin/preferences/Options-sync.png") !important;
-}
-
-/* These lines should be removed as part of fixing bug 1140495 */
-label.small {
-  font-size: smaller;
-}
-
-#tabPrefsBox {
-  margin: 5px;
-}
-
 /* General Pane */
 #useFirefoxSync,
 #getStarted {
   font-size: 90%;
 }
 
 #isNotDefaultLabel {
   font-weight: bold;
 }
 
 /* Content Pane */
 #translationAttributionImage {
   width: 70px;
   cursor: pointer;
 }
 
-/* Applications Pane */
-#BrowserPreferences[animated="true"] #handlersView {
-  height: 25em;
-}
-
-#BrowserPreferences[animated="false"] #handlersView {
-  -moz-box-flex: 1;
-}
-
-/* Privacy Pane */
-
-/* styles for the link elements copied from .text-link in global.css */
-.inline-link {
-  color: -moz-nativehyperlinktext;
-  text-decoration: none;
-}
-
-.inline-link:hover {
-  text-decoration: underline;
-}
-
 /* Modeless Window Dialogs */
 .windowDialog,
 .windowDialog prefpane {
   padding: 0px;
 }
 
 .contentPane {
   margin: 9px 8px 5px 8px;
@@ -113,30 +43,20 @@ label.small {
 /* Cookies Manager */
 #cookiesChildren::-moz-tree-image(domainCol) {
   width: 16px;
   height: 16px;
   margin: 0px 2px;
   list-style-image: url("chrome://mozapps/skin/places/defaultFavicon.png");
 }
 
-#paneApplications {
-  margin-left: 4px;
-  margin-right: 4px; 
-  padding-left: 0;
-  padding-right: 0; 
-}
-
 #linksOpenInBox {
   margin-top: 5px;
 }
 
-#paneAdvanced {
-  padding-bottom: 10px;
-}
 #advancedPrefs {
   margin-left: 0;
   margin-right: 0; 
 }
 
 #cookiesChildren::-moz-tree-image(domainCol, container) {
   list-style-image: url("moz-icon://stock/gtk-directory?size=menu");
 }
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -124,27 +124,21 @@ browser.jar:
   skin/classic/browser/places/unfiledBookmarks.png          (places/unfiledBookmarks.png)
   skin/classic/browser/places/unfiledBookmarks@2x.png       (places/unfiledBookmarks@2x.png)
   skin/classic/browser/places/tag.png                       (places/tag.png)
   skin/classic/browser/places/tag@2x.png                    (places/tag@2x.png)
   skin/classic/browser/places/downloads.png                 (places/downloads.png)
   skin/classic/browser/places/livemark-item.png             (places/livemark-item.png)
   skin/classic/browser/preferences/alwaysAsk.png            (preferences/alwaysAsk.png)
   skin/classic/browser/preferences/application.png          (preferences/application.png)
-  skin/classic/browser/preferences/Options.png              (preferences/Options.png)
-  skin/classic/browser/preferences/Options-sync.png         (preferences/Options-sync.png)
   skin/classic/browser/preferences/saveFile.png             (preferences/saveFile.png)
 * skin/classic/browser/preferences/preferences.css          (preferences/preferences.css)
 * skin/classic/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
 * skin/classic/browser/preferences/in-content/dialog.css      (preferences/in-content/dialog.css)
   skin/classic/browser/preferences/applications.css         (preferences/applications.css)
-  skin/classic/browser/preferences/checkbox.png             (preferences/checkbox.png)
-  skin/classic/browser/preferences/checkbox@2x.png          (preferences/checkbox@2x.png)
-  skin/classic/browser/yosemite/preferences/checkbox.png    (preferences/checkbox-yosemite.png)
-  skin/classic/browser/yosemite/preferences/checkbox@2x.png (preferences/checkbox-yosemite@2x.png)
   skin/classic/browser/social/services-16.png               (social/services-16.png)
   skin/classic/browser/social/services-16@2x.png            (social/services-16@2x.png)
   skin/classic/browser/social/services-64.png               (social/services-64.png)
   skin/classic/browser/social/services-64@2x.png            (social/services-64@2x.png)
   skin/classic/browser/tabbrowser/alltabs-box-bkgnd-icon.png             (tabbrowser/alltabs-box-bkgnd-icon.png)
   skin/classic/browser/tabbrowser/alltabs-box-bkgnd-icon-inverted.png    (tabbrowser/alltabs-box-bkgnd-icon-inverted.png)
   skin/classic/browser/tabbrowser/alltabs-box-bkgnd-icon-inverted@2x.png (tabbrowser/alltabs-box-bkgnd-icon-inverted@2x.png)
   skin/classic/browser/tabbrowser/newtab.png                             (tabbrowser/newtab.png)
@@ -250,14 +244,12 @@ browser.jar:
 % override chrome://browser/skin/menuPanel-customize.png                   chrome://browser/skin/yosemite/menuPanel-customize.png                  os=Darwin osversion>=10.10
 % override chrome://browser/skin/menuPanel-customize@2x.png                chrome://browser/skin/yosemite/menuPanel-customize@2x.png               os=Darwin osversion>=10.10
 % override chrome://browser/skin/menuPanel-exit.png                        chrome://browser/skin/yosemite/menuPanel-exit.png                       os=Darwin osversion>=10.10
 % override chrome://browser/skin/menuPanel-exit@2x.png                     chrome://browser/skin/yosemite/menuPanel-exit@2x.png                    os=Darwin osversion>=10.10
 % override chrome://browser/skin/menuPanel-help.png                        chrome://browser/skin/yosemite/menuPanel-help.png                       os=Darwin osversion>=10.10
 % override chrome://browser/skin/menuPanel-help@2x.png                     chrome://browser/skin/yosemite/menuPanel-help@2x.png                    os=Darwin osversion>=10.10
 % override chrome://browser/skin/menuPanel-small.png                       chrome://browser/skin/yosemite/menuPanel-small.png                      os=Darwin osversion>=10.10
 % override chrome://browser/skin/menuPanel-small@2x.png                    chrome://browser/skin/yosemite/menuPanel-small@2x.png                   os=Darwin osversion>=10.10
-% override chrome://browser/skin/preferences/checkbox.png                  chrome://browser/skin/yosemite/preferences/checkbox.png                 os=Darwin osversion>=10.10
-% override chrome://browser/skin/preferences/checkbox@2x.png               chrome://browser/skin/yosemite/preferences/checkbox@2x.png              os=Darwin osversion>=10.10
 % override chrome://browser/skin/reload-stop-go.png                        chrome://browser/skin/yosemite/reload-stop-go.png                       os=Darwin osversion>=10.10
 % override chrome://browser/skin/reload-stop-go@2x.png                     chrome://browser/skin/yosemite/reload-stop-go@2x.png                    os=Darwin osversion>=10.10
 % override chrome://browser/skin/sync-horizontalbar.png                    chrome://browser/skin/yosemite/sync-horizontalbar.png               os=Darwin osversion>=10.10
 % override chrome://browser/skin/sync-horizontalbar@2x.png                 chrome://browser/skin/yosemite/sync-horizontalbar@2x.png            os=Darwin osversion>=10.10
deleted file mode 100644
index 89901fb698c4a06792d6ae974489cb6b93ed3994..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 615029cd1058a1656deb6c2e99cd45506cd0a762..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 1421c7d0e29cc43deab290b4d99f08c778fe3a00..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 9f156f2587d396c049f98a7ff57b7e09ad419910..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index fd009385362bcef2a1bdb4f4da71307366300c58..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index a5094640fd2f412b4b13cc9bc37337766de3dfc0..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/osx/preferences/preferences.css
+++ b/browser/themes/osx/preferences/preferences.css
@@ -10,140 +10,44 @@
 @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
 @namespace html url("http://www.w3.org/1999/xhtml");
 
 .windowDialog {
   padding: 12px;
   font: -moz-dialog;
 }
 
-.paneSelector {
-  list-style-image: url("chrome://browser/skin/preferences/Options.png");
-}
-
-/* ----- GENERAL BUTTON ----- */
-
-radio[pane=paneGeneral],
-radio[pane=paneMain] {
-  -moz-image-region: rect(0px, 32px, 32px, 0px);
-} 
-
-/* ----- TABS BUTTON ----- */
-
-radio[pane=paneTabs] {
-  -moz-image-region: rect(0px, 64px, 32px, 32px);
-}
-
-/* ----- SEARCH BUTTON ----- */
-
-radio[pane=paneSearch] {
-  list-style-image: url("chrome://browser/skin/search-pref.png");
-}
-
-/* ----- CONTENT BUTTON ----- */
-
-radio[pane=paneContent] {
-  -moz-image-region: rect(0px, 96px, 32px, 64px);
-}
-
-/* ----- APPLICATIONS BUTTON ----- */
-
-radio[pane=paneApplications] {
-  -moz-image-region: rect(0px, 128px, 32px, 96px);
-}
-
-/* ----- PRIVACY BUTTON ----- */
-
-radio[pane=panePrivacy] {
-  -moz-image-region: rect(0px, 160px, 32px, 128px);
-}
-
-/* ----- SECURITY BUTTON ----- */
-
-radio[pane=paneSecurity] {
-  -moz-image-region: rect(0px, 192px, 32px, 160px);
-}
-
-/* ----- ADVANCED BUTTON ----- */
-
-radio[pane=paneAdvanced] {
-  -moz-image-region: rect(0px, 224px, 32px, 192px);
-}
-
-/* ----- SYNC BUTTON ----- */
-
-radio[pane=paneSync] {
-  list-style-image: url("chrome://browser/skin/preferences/Options-sync.png");
-}
-
-/* These lines should be removed as part of fixing bug 1140495 */
-label.small {
-  font-size: smaller;
-}
-
 /* ----- APPLICATIONS PREFPANE ----- */
-#BrowserPreferences[animated="true"] #handlersView {
-  height: 25em;
-}
-
-#BrowserPreferences[animated="false"] #handlersView {
-  -moz-box-flex: 1;
-}
-
 description {
   font: small-caption;
   font-weight: normal;
   line-height: 1.3em;
   margin-bottom: 4px !important;
 }
 
 prefpane .groupbox-body {
   -moz-appearance: none;
   padding: 8px 4px 4px 4px;
 }
 
-#paneTabs > groupbox {
-  margin: 0;
-}
-
-#tabPrefsBox {
-  margin: 12px 4px;
-}
-
 prefpane .groupbox-title {
   background: url("chrome://global/skin/50pct_transparent_grey.png") repeat-x bottom left;
   margin-bottom: 4px;
 }
 
 tabpanels {
   padding: 20px 7px 7px;
 }
 
 caption {
   padding-inline-start: 5px;
   padding-top: 4px;
   padding-bottom: 2px;
 }
 
-#paneMain description,
-#paneContent description,
-#paneAdvanced description,
-#paneSecurity description {
-  font: -moz-dialog;
-}
-
-#paneContent {
-  padding-top: 8px;
-}
-
-#paneContent row {
-  padding: 2px 4px;
-  -moz-box-align: center;
-}
-
 #popupPolicyRow {
   margin-bottom: 4px !important;
   padding-bottom: 4px !important;
   border-bottom: 1px solid #ccc;
 }
 
 #translationAttributionImage {
   width: 70px;
@@ -179,34 +83,16 @@ caption {
   font-size: 90%;
 }
 
 #isNotDefaultLabel {
   font-weight: bold;
 }
 
 /**
- * Privacy Pane
- */
-
-html|a.inline-link {
-  color: -moz-nativehyperlinktext;
-  text-decoration: none;
-}
-
-html|a.inline-link:hover {
-  text-decoration: underline;
-}
-
-html|a.inline-link:-moz-focusring {
-  outline-width: 0;
-  box-shadow: @focusRingShadow@;
-}
-
-/**
  * Update Preferences
  */
 #autoInstallOptions {
   margin-inline-start: 20px;
 }
 
 .updateControls {
   margin-inline-start: 10px;
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -81,17 +81,16 @@
   skin/classic/browser/fxa/logo@2x.png                         (../shared/fxa/logo@2x.png)
   skin/classic/browser/fxa/sync-illustration.png               (../shared/fxa/sync-illustration.png)
   skin/classic/browser/fxa/sync-illustration@2x.png            (../shared/fxa/sync-illustration@2x.png)
   skin/classic/browser/fxa/sync-illustration.svg               (../shared/fxa/sync-illustration.svg)
   skin/classic/browser/fxa/android.png                         (../shared/fxa/android.png)
   skin/classic/browser/fxa/android@2x.png                      (../shared/fxa/android@2x.png)
   skin/classic/browser/fxa/ios.png                             (../shared/fxa/ios.png)
   skin/classic/browser/fxa/ios@2x.png                          (../shared/fxa/ios@2x.png)
-  skin/classic/browser/search-pref.png                         (../shared/search/search-pref.png)
   skin/classic/browser/search-indicator.png                    (../shared/search/search-indicator.png)
   skin/classic/browser/search-indicator@2x.png                 (../shared/search/search-indicator@2x.png)
   skin/classic/browser/search-engine-placeholder.png           (../shared/search/search-engine-placeholder.png)
   skin/classic/browser/search-engine-placeholder@2x.png        (../shared/search/search-engine-placeholder@2x.png)
   skin/classic/browser/searchReset.css                         (../shared/searchReset.css)
   skin/classic/browser/badge-add-engine.png                    (../shared/search/badge-add-engine.png)
   skin/classic/browser/badge-add-engine@2x.png                 (../shared/search/badge-add-engine@2x.png)
   skin/classic/browser/search-indicator-badge-add.png          (../shared/search/search-indicator-badge-add.png)
deleted file mode 100644
index 1d50804b35d29d786da83988168a612b087e3126..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -136,31 +136,22 @@ browser.jar:
   skin/classic/browser/places/unsortedBookmarks.png            (places/unsortedBookmarks.png)
   skin/classic/browser/places/unsortedBookmarks-XP.png         (places/unsortedBookmarks-XP.png)
   skin/classic/browser/places/downloads.png                    (places/downloads.png)
   skin/classic/browser/places/livemark-item.png                (places/livemark-item.png)
   skin/classic/browser/preferences/alwaysAsk.png               (preferences/alwaysAsk.png)
   skin/classic/browser/preferences/alwaysAsk-XP.png            (preferences/alwaysAsk-XP.png)
   skin/classic/browser/preferences/application.png             (preferences/application.png)
   skin/classic/browser/preferences/application-XP.png          (preferences/application-XP.png)
-  skin/classic/browser/preferences/mail.png                    (preferences/mail.png)
-  skin/classic/browser/preferences/mail-XP.png                 (preferences/mail-XP.png)
-  skin/classic/browser/preferences/Options.png                 (preferences/Options.png)
-  skin/classic/browser/preferences/Options-XP.png              (preferences/Options-XP.png)
-  skin/classic/browser/preferences/Options-sync.png            (preferences/Options-sync.png)
   skin/classic/browser/preferences/saveFile.png                (preferences/saveFile.png)
   skin/classic/browser/preferences/saveFile-XP.png             (preferences/saveFile-XP.png)
   skin/classic/browser/preferences/preferences.css             (preferences/preferences.css)
 * skin/classic/browser/preferences/in-content/preferences.css  (preferences/in-content/preferences.css)
 * skin/classic/browser/preferences/in-content/dialog.css       (preferences/in-content/dialog.css)
   skin/classic/browser/preferences/applications.css            (preferences/applications.css)
-  skin/classic/browser/preferences/checkbox.png                (preferences/checkbox.png)
-  skin/classic/browser/preferences/checkbox-aero.png           (preferences/checkbox-aero.png)
-  skin/classic/browser/preferences/checkbox-classic.png        (preferences/checkbox-classic.png)
-  skin/classic/browser/preferences/checkbox-xp.png             (preferences/checkbox-xp.png)
   skin/classic/browser/social/services-16.png                  (social/services-16.png)
   skin/classic/browser/social/services-64.png                  (social/services-64.png)
   skin/classic/browser/tabbrowser/newtab.svg                   (tabbrowser/newtab.svg)
   skin/classic/browser/tabbrowser/newtab-XPVista7.svg          (tabbrowser/newtab-XPVista7.svg)
   skin/classic/browser/tabbrowser/newtab-inverted.svg          (tabbrowser/newtab-inverted.svg)
   skin/classic/browser/tabbrowser/newtab-inverted-XPVista7.svg (tabbrowser/newtab-inverted-XPVista7.svg)
   skin/classic/browser/tabbrowser/connecting.png               (tabbrowser/connecting.png)
   skin/classic/browser/tabbrowser/connecting@2x.png            (tabbrowser/connecting@2x.png)
@@ -249,18 +240,16 @@ browser.jar:
 % override chrome://browser/skin/places/libraryToolbar.png            chrome://browser/skin/places/libraryToolbar-XP.png                os=WINNT osversion<6
 % override chrome://browser/skin/places/starred48.png                 chrome://browser/skin/places/starred48-XP.png                     os=WINNT osversion<6
 % override chrome://browser/skin/places/tag.png                       chrome://browser/skin/places/tag-XP.png                           os=WINNT osversion<6
 % override chrome://browser/skin/places/history.png                   chrome://browser/skin/places/history-XP.png                       os=WINNT osversion<6
 % override chrome://browser/skin/places/allBookmarks.png              chrome://browser/skin/places/allBookmarks-XP.png                  os=WINNT osversion<6
 % override chrome://browser/skin/places/unsortedBookmarks.png         chrome://browser/skin/places/unsortedBookmarks-XP.png             os=WINNT osversion<6
 % override chrome://browser/skin/preferences/alwaysAsk.png            chrome://browser/skin/preferences/alwaysAsk-XP.png                os=WINNT osversion<6
 % override chrome://browser/skin/preferences/application.png          chrome://browser/skin/preferences/application-XP.png              os=WINNT osversion<6
-% override chrome://browser/skin/preferences/mail.png                 chrome://browser/skin/preferences/mail-XP.png                     os=WINNT osversion<6
-% override chrome://browser/skin/preferences/Options.png              chrome://browser/skin/preferences/Options-XP.png                  os=WINNT osversion<6
 % override chrome://browser/skin/preferences/saveFile.png             chrome://browser/skin/preferences/saveFile-XP.png                 os=WINNT osversion<6
 
 % override chrome://browser/skin/actionicon-tab.png                   chrome://browser/skin/actionicon-tab-XPVista7.png                 os=WINNT osversion<=6.1
 % override chrome://browser/skin/privatebrowsing-mask-tabstrip.png    chrome://browser/skin/privatebrowsing-mask-tabstrip-XPVista7.png  os=WINNT osversion<=6.1
 % override chrome://browser/skin/privatebrowsing-mask-titlebar.png    chrome://browser/skin/privatebrowsing-mask-titlebar-XPVista7.png  os=WINNT osversion<=6.1
 % override chrome://browser/skin/reload-stop-go.png                   chrome://browser/skin/reload-stop-go-XPVista7.png                 os=WINNT osversion<=6.1
 % override chrome://browser/skin/reload-stop-go@2x.png                chrome://browser/skin/reload-stop-go-XPVista7@2x.png              os=WINNT osversion<=6.1
 % override chrome://browser/skin/sync-horizontalbar.png               chrome://browser/skin/sync-horizontalbar-XPVista7.png             os=WINNT osversion<=6.1
@@ -290,18 +279,15 @@ browser.jar:
 % override chrome://browser/skin/Toolbar@2x.png                       chrome://browser/skin/Toolbar-aero@2x.png                         os=WINNT osversion=6.1
 % override chrome://browser/skin/Toolbar@2x.png                       chrome://browser/skin/Toolbar-win8@2x.png                         os=WINNT osversion=6.2
 % override chrome://browser/skin/Toolbar@2x.png                       chrome://browser/skin/Toolbar-win8@2x.png                         os=WINNT osversion=6.3
 % override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-XP.png                              os=WINNT osversion<6
 % override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-aero.png                            os=WINNT osversion=6
 % override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-aero.png                            os=WINNT osversion=6.1
 % override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-win8.png                            os=WINNT osversion=6.2
 % override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-win8.png                            os=WINNT osversion=6.3
-% override chrome://browser/skin/preferences/checkbox.png             chrome://browser/skin/preferences/checkbox-aero.png               os=WINNT osversion=6
-% override chrome://browser/skin/preferences/checkbox.png             chrome://browser/skin/preferences/checkbox-aero.png               os=WINNT osversion=6.1
-% override chrome://browser/skin/preferences/checkbox.png             chrome://browser/skin/preferences/checkbox-xp.png                 os=WINNT osversion<6
 
 % override chrome://browser/skin/tabbrowser/tab-background-start.png     chrome://browser/skin/tabbrowser/tab-background-start-preWin10.png     os=WINNT osversion<=6.3
 % override chrome://browser/skin/tabbrowser/tab-background-start@2x.png  chrome://browser/skin/tabbrowser/tab-background-start-preWin10@2x.png  os=WINNT osversion<=6.3
 % override chrome://browser/skin/tabbrowser/tab-background-middle.png    chrome://browser/skin/tabbrowser/tab-background-middle-preWin10.png    os=WINNT osversion<=6.3
 % override chrome://browser/skin/tabbrowser/tab-background-middle@2x.png chrome://browser/skin/tabbrowser/tab-background-middle-preWin10@2x.png os=WINNT osversion<=6.3
 % override chrome://browser/skin/tabbrowser/tab-background-end.png       chrome://browser/skin/tabbrowser/tab-background-end-preWin10.png       os=WINNT osversion<=6.3
 % override chrome://browser/skin/tabbrowser/tab-background-end@2x.png    chrome://browser/skin/tabbrowser/tab-background-end-preWin10@2x.png    os=WINNT osversion<=6.3
deleted file mode 100644
index 065f3c725227ab63a6543ad31c916eff27453611..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 245aed398952ec3211d9e0ec469b5f816bc074ba..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 4f99e62ada530dae2d3841e101c4a82537414f6e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 899c39c603a41bceeb3d394375c0023aed62f7a5..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 6205b45b19b8e05c06814c1edee1efc2916a88b0..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index cb7a5badd688ba469d19c6a53e21b3b91abc2f97..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index be1747e2406e0fd75c13e4f76dbd1c5874c387cf..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 9f7c1896f85b53b94a91e0dfda6631303dc56c7a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 12a975d16bc99e72f32b8657b00826065b65aa4b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/windows/preferences/preferences.css
+++ b/browser/themes/windows/preferences/preferences.css
@@ -1,66 +1,15 @@
 /*
 # -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
 
-/* Global Styles */
-#BrowserPreferences radio[pane] {
-  list-style-image: url("chrome://browser/skin/preferences/Options.png"); 
-  padding: 5px 3px 1px;
-}
-
-radio[pane=paneMain] {
-  -moz-image-region: rect(0, 32px,  32px, 0);
-}
-
-radio[pane=paneTabs] {
-  -moz-image-region: rect(0, 64px, 32px, 32px);
-}
-
-#BrowserPreferences radio[pane=paneSearch] {
-  list-style-image: url("chrome://browser/skin/search-pref.png");
-}
-
-radio[pane=paneContent] {
-  -moz-image-region: rect(0, 96px,  32px, 64px);
-}
-
-radio[pane=paneApplications] {
-  -moz-image-region: rect(0, 128px,  32px, 96px);
-}
-
-radio[pane=panePrivacy] {
-  -moz-image-region: rect(0, 160px,  32px, 128px);
-}
-
-radio[pane=paneSecurity] {
-  -moz-image-region: rect(0, 192px,  32px, 160px);
-}
-
-radio[pane=paneAdvanced] {
-  -moz-image-region: rect(0, 224px, 32px, 192px);
-}
-
-radio[pane=paneSync] {
-  list-style-image: url("chrome://browser/skin/preferences/Options-sync.png") !important;
-}
-
-/* These lines should be removed as part of fixing bug 1140495 */
-label.small {
-  font-size: smaller;
-}
-
-#tabPrefsBox {
-  margin: 6px;
-}
-
 /* General Pane */
 
 #useFirefoxSync,
 #getStarted {
   font-size: 90%;
 }
 
 #isNotDefaultLabel {
@@ -68,37 +17,16 @@ label.small {
 }
 
 /* Content Pane */
 #translationAttributionImage {
   width: 70px;
   cursor: pointer;
 }
 
-/* Applications Pane */
-#BrowserPreferences[animated="true"] #handlersView {
-  height: 25em;
-}
-
-#BrowserPreferences[animated="false"] #handlersView {
-  -moz-box-flex: 1;
-}
-
-/* Privacy Pane */
-
-/* styles for the link elements copied from .text-link in global.css */
-.inline-link {
-  color: -moz-nativehyperlinktext;
-  text-decoration: none;
-}
-
-.inline-link:hover {
-  text-decoration: underline;
-}
-
 /* Modeless Window Dialogs */
 .windowDialog,
 .windowDialog prefpane {
   padding: 0;
 }
 
 .contentPane {
   margin: 9px 8px 5px;
--- a/devtools/client/inspector/markup/markup.js
+++ b/devtools/client/inspector/markup/markup.js
@@ -10,20 +10,24 @@
 const {Cc, Ci} = require("chrome");
 
 // Page size for pageup/pagedown
 const PAGE_SIZE = 10;
 const DEFAULT_MAX_CHILDREN = 100;
 const COLLAPSE_DATA_URL_REGEX = /^data.+base64/;
 const COLLAPSE_DATA_URL_LENGTH = 60;
 const NEW_SELECTION_HIGHLIGHTER_TIMER = 1000;
-const DRAG_DROP_AUTOSCROLL_EDGE_DISTANCE = 50;
-const DRAG_DROP_MIN_AUTOSCROLL_SPEED = 5;
-const DRAG_DROP_MAX_AUTOSCROLL_SPEED = 15;
+const DRAG_DROP_AUTOSCROLL_EDGE_MAX_DISTANCE = 50;
+const DRAG_DROP_AUTOSCROLL_EDGE_RATIO = 0.1;
+const DRAG_DROP_MIN_AUTOSCROLL_SPEED = 2;
+const DRAG_DROP_MAX_AUTOSCROLL_SPEED = 8;
 const DRAG_DROP_MIN_INITIAL_DISTANCE = 10;
+const DRAG_DROP_HEIGHT_TO_SPEED = 500;
+const DRAG_DROP_HEIGHT_TO_SPEED_MIN = 0.5;
+const DRAG_DROP_HEIGHT_TO_SPEED_MAX = 1;
 const AUTOCOMPLETE_POPUP_PANEL_ID = "markupview_autoCompletePopup";
 const ATTR_COLLAPSE_ENABLED_PREF = "devtools.markup.collapseAttributes";
 const ATTR_COLLAPSE_LENGTH_PREF = "devtools.markup.collapseAttributeLength";
 const PREVIEW_MAX_DIM_PREF = "devtools.inspector.imagePreviewTooltipSize";
 
 // Contains only void (without end tag) HTML elements
 const HTML_VOID_ELEMENTS = [ "area", "base", "br", "col", "command", "embed",
   "hr", "img", "input", "keygen", "link", "meta", "param", "source",
@@ -247,49 +251,70 @@ MarkupView.prototype = {
   /**
    * Executed on each mouse-move while a node is being dragged in the view.
    * Auto-scrolls the view to reveal nodes below the fold to drop the dragged
    * node in.
    */
   _autoScroll: function (event) {
     let docEl = this.doc.documentElement;
 
-    if (this._autoScrollInterval) {
-      clearInterval(this._autoScrollInterval);
+    if (this._autoScrollAnimationFrame) {
+      this.win.cancelAnimationFrame(this._autoScrollAnimationFrame);
     }
 
     // Auto-scroll when the mouse approaches top/bottom edge.
     let fromBottom = docEl.clientHeight - event.pageY + this.win.scrollY;
     let fromTop = event.pageY - this.win.scrollY;
-
-    if (fromBottom <= DRAG_DROP_AUTOSCROLL_EDGE_DISTANCE) {
-      // Map our distance from 0-50 to 5-15 range so the speed is kept in a
-      // range not too fast, not too slow.
+    let edgeDistance = Math.min(DRAG_DROP_AUTOSCROLL_EDGE_MAX_DISTANCE,
+           docEl.clientHeight * DRAG_DROP_AUTOSCROLL_EDGE_RATIO);
+
+    // The smaller the screen, the slower the movement.
+    let heightToSpeedRatio =
+      Math.max(DRAG_DROP_HEIGHT_TO_SPEED_MIN,
+        Math.min(DRAG_DROP_HEIGHT_TO_SPEED_MAX,
+          docEl.clientHeight / DRAG_DROP_HEIGHT_TO_SPEED));
+
+    if (fromBottom <= edgeDistance) {
+      // Map our distance range to a speed range so that the speed is not too
+      // fast or too slow.
       let speed = map(
         fromBottom,
-        0, DRAG_DROP_AUTOSCROLL_EDGE_DISTANCE,
+        0, edgeDistance,
         DRAG_DROP_MIN_AUTOSCROLL_SPEED, DRAG_DROP_MAX_AUTOSCROLL_SPEED);
 
-      this._autoScrollInterval = setInterval(() => {
-        docEl.scrollTop -= speed - DRAG_DROP_MAX_AUTOSCROLL_SPEED;
-      }, 0);
+      this._runUpdateLoop(() => {
+        docEl.scrollTop -= heightToSpeedRatio *
+          (speed - DRAG_DROP_MAX_AUTOSCROLL_SPEED);
+      });
     }
 
-    if (fromTop <= DRAG_DROP_AUTOSCROLL_EDGE_DISTANCE) {
+    if (fromTop <= edgeDistance) {
       let speed = map(
         fromTop,
-        0, DRAG_DROP_AUTOSCROLL_EDGE_DISTANCE,
+        0, edgeDistance,
         DRAG_DROP_MIN_AUTOSCROLL_SPEED, DRAG_DROP_MAX_AUTOSCROLL_SPEED);
 
-      this._autoScrollInterval = setInterval(() => {
-        docEl.scrollTop += speed - DRAG_DROP_MAX_AUTOSCROLL_SPEED;
-      }, 0);
+      this._runUpdateLoop(() => {
+        docEl.scrollTop += heightToSpeedRatio *
+          (speed - DRAG_DROP_MAX_AUTOSCROLL_SPEED);
+      });
     }
   },
 
+  /**
+   * Run a loop on the requestAnimationFrame.
+   */
+  _runUpdateLoop: function (update) {
+    let loop = () => {
+      update();
+      this._autoScrollAnimationFrame = this.win.requestAnimationFrame(loop);
+    };
+    loop();
+  },
+
   _onMouseClick: function (event) {
     // From the target passed here, let's find the parent MarkupContainer
     // and ask it if the tooltip should be shown
     let parentNode = event.target;
     let container;
     while (parentNode !== this.doc.body) {
       if (parentNode.container) {
         container = parentNode.container;
@@ -304,18 +329,18 @@ MarkupView.prototype = {
       container._buildEventTooltipContent(event.target,
         this.eventDetailsTooltip);
     }
   },
 
   _onMouseUp: function () {
     this.indicateDropTarget(null);
     this.indicateDragTarget(null);
-    if (this._autoScrollInterval) {
-      clearInterval(this._autoScrollInterval);
+    if (this._autoScrollAnimationFrame) {
+      this.win.cancelAnimationFrame(this._autoScrollAnimationFrame);
     }
   },
 
   _onCollapseAttributesPrefChange: function () {
     this.collapseAttributes =
       Services.prefs.getBoolPref(ATTR_COLLAPSE_ENABLED_PREF);
     this.collapseAttributeLength =
       Services.prefs.getIntPref(ATTR_COLLAPSE_LENGTH_PREF);
@@ -331,18 +356,18 @@ MarkupView.prototype = {
       if (container.isDragging) {
         container.cancelDragging();
         break;
       }
     }
 
     this.indicateDropTarget(null);
     this.indicateDragTarget(null);
-    if (this._autoScrollInterval) {
-      clearInterval(this._autoScrollInterval);
+    if (this._autoScrollAnimationFrame) {
+      this.win.cancelAnimationFrame(this._autoScrollAnimationFrame);
     }
   },
 
   _hoveredNode: null,
 
   /**
    * Show a NodeFront's container as being hovered
    *
@@ -358,18 +383,18 @@ MarkupView.prototype = {
       this.getContainer(this._hoveredNode).hovered = false;
     }
 
     this.getContainer(nodeFront).hovered = true;
     this._hoveredNode = nodeFront;
   },
 
   _onMouseLeave: function () {
-    if (this._autoScrollInterval) {
-      clearInterval(this._autoScrollInterval);
+    if (this._autoScrollAnimationFrame) {
+      this.win.cancelAnimationFrame(this._autoScrollAnimationFrame);
     }
     if (this.isDragging) {
       return;
     }
 
     this._hideBoxModel(true);
     if (this._hoveredNode) {
       this.getContainer(this._hoveredNode).hovered = false;
@@ -1879,16 +1904,17 @@ MarkupContainer.prototype = {
    *         Which template to render for this container
    */
   initialize: function (markupView, node, templateID) {
     this.markup = markupView;
     this.node = node;
     this.undo = this.markup.undo;
     this.win = this.markup._frame.contentWindow;
     this.id = "treeitem-" + markupContainerID++;
+    this.htmlElt = this.win.document.documentElement;
 
     // The template will fill the following properties
     this.elt = null;
     this.expander = null;
     this.tagState = null;
     this.tagLine = null;
     this.children = null;
     this.markup.template(templateID, this);
@@ -2180,20 +2206,22 @@ MarkupContainer.prototype = {
 
   set isDragging(isDragging) {
     let rootElt = this.markup.getContainer(this.markup._rootNode).elt;
     this._isDragging = isDragging;
     this.markup.isDragging = isDragging;
     this.tagLine.setAttribute("aria-grabbed", isDragging);
 
     if (isDragging) {
+      this.htmlElt.classList.add("dragging");
       this.elt.classList.add("dragging");
       this.markup.doc.body.classList.add("dragging");
       rootElt.setAttribute("aria-dropeffect", "move");
     } else {
+      this.htmlElt.classList.remove("dragging");
       this.elt.classList.remove("dragging");
       this.markup.doc.body.classList.remove("dragging");
       rootElt.setAttribute("aria-dropeffect", "none");
     }
   },
 
   get isDragging() {
     return this._isDragging;
@@ -2520,16 +2548,17 @@ MarkupContainer.prototype = {
     this.elt.removeEventListener("dblclick", this._onToggle, false);
     this.tagLine.removeEventListener("keydown", this._onKeyDown, true);
     if (this.win) {
       this.win.removeEventListener("mouseup", this._onMouseUp, true);
       this.win.removeEventListener("mousemove", this._onMouseMove, true);
     }
 
     this.win = null;
+    this.htmlElt = null;
 
     if (this.expander) {
       this.expander.removeEventListener("click", this._onToggle, false);
     }
 
     // Recursively destroy children containers
     let firstChild = this.children.firstChild;
     while (firstChild) {
--- a/devtools/client/inspector/markup/test/browser.ini
+++ b/devtools/client/inspector/markup/test/browser.ini
@@ -1,16 +1,17 @@
 [DEFAULT]
 tags = devtools
 subsuite = devtools
 support-files =
   actor_events_form.js
   doc_markup_anonymous.html
   doc_markup_dragdrop.html
-  doc_markup_dragdrop_autoscroll.html
+  doc_markup_dragdrop_autoscroll_01.html
+  doc_markup_dragdrop_autoscroll_02.html
   doc_markup_edit.html
   doc_markup_events1.html
   doc_markup_events2.html
   doc_markup_events3.html
   doc_markup_events_form.html
   doc_markup_events_jquery.html
   doc_markup_events-overflow.html
   doc_markup_flashing.html
@@ -60,17 +61,18 @@ skip-if = os == "mac" # Full keyboard na
 skip-if = e10s # scratchpad.xul is not loading in e10s window
 [browser_markup_anonymous_03.js]
 [browser_markup_anonymous_04.js]
 [browser_markup_copy_image_data.js]
 subsuite = clipboard
 [browser_markup_css_completion_style_attribute_01.js]
 [browser_markup_css_completion_style_attribute_02.js]
 [browser_markup_css_completion_style_attribute_03.js]
-[browser_markup_dragdrop_autoscroll.js]
+[browser_markup_dragdrop_autoscroll_01.js]
+[browser_markup_dragdrop_autoscroll_02.js]
 [browser_markup_dragdrop_distance.js]
 [browser_markup_dragdrop_draggable.js]
 [browser_markup_dragdrop_dragRootNode.js]
 [browser_markup_dragdrop_escapeKeyPress.js]
 [browser_markup_dragdrop_invalidNodes.js]
 [browser_markup_dragdrop_reorder.js]
 [browser_markup_dragdrop_tooltip.js]
 [browser_markup_events1.js]
rename from devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll.js
rename to devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js
--- a/devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll.js
+++ b/devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js
@@ -1,73 +1,51 @@
 /* vim: set ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 // Test that dragging a node near the top or bottom edge of the markup-view
-// auto-scrolls the view.
+// auto-scrolls the view on a large toolbox.
 
-const TEST_URL = URL_ROOT + "doc_markup_dragdrop_autoscroll.html";
+const TEST_URL = URL_ROOT + "doc_markup_dragdrop_autoscroll_01.html";
 
 add_task(function* () {
+  // Set the toolbox as large as it would get. The toolbox automatically shrinks
+  // to not overflow to window.
+  yield pushPref("devtools.toolbox.footer.height", 10000);
+
   let {inspector} = yield openInspectorForURL(TEST_URL);
   let markup = inspector.markup;
   let viewHeight = markup.doc.documentElement.clientHeight;
 
   info("Pretend the markup-view is dragging");
   markup.isDragging = true;
 
   info("Simulate a mousemove on the view, at the bottom, and expect scrolling");
-  let onScrolled = waitForScrollStop(markup);
+  let onScrolled = waitForScrollStop(markup.doc);
 
   markup._onMouseMove({
     preventDefault: () => {},
     target: markup.doc.body,
     pageY: viewHeight
   });
 
   let bottomScrollPos = yield onScrolled;
   ok(bottomScrollPos > 0, "The view was scrolled down");
 
   info("Simulate a mousemove at the top and expect more scrolling");
-  onScrolled = waitForScrollStop(markup);
+  onScrolled = waitForScrollStop(markup.doc);
 
   markup._onMouseMove({
     preventDefault: () => {},
     target: markup.doc.body,
     pageY: 0
   });
 
   let topScrollPos = yield onScrolled;
   ok(topScrollPos < bottomScrollPos, "The view was scrolled up");
   is(topScrollPos, 0, "The view was scrolled up to the top");
 
   info("Simulate a mouseup to stop dragging");
   markup._onMouseUp();
 });
-
-/**
- * Waits until the element has not scrolled for 30 consecutive frames.
- */
-function* waitForScrollStop(markup) {
-  let el = markup.doc.documentElement;
-  let win = markup.doc.defaultView;
-  let lastScrollTop = el.scrollTop;
-  let stopFrameCount = 0;
-  while (stopFrameCount < 30) {
-    // Wait for a frame.
-    yield new Promise(resolve => win.requestAnimationFrame(resolve));
-
-    // Check if the element has scrolled.
-    if (lastScrollTop == el.scrollTop) {
-      // No scrolling since the last frame.
-      stopFrameCount++;
-    } else {
-      // The element has scrolled. Reset the frame counter.
-      stopFrameCount = 0;
-      lastScrollTop = el.scrollTop;
-    }
-  }
-
-  return lastScrollTop;
-}
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_02.js
@@ -0,0 +1,50 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test that dragging a node near the top or bottom edge of the markup-view
+// auto-scrolls the view on a small toolbox.
+
+const TEST_URL = URL_ROOT + "doc_markup_dragdrop_autoscroll_02.html";
+
+add_task(function* () {
+  // Set the toolbox to very small in size.
+  yield pushPref("devtools.toolbox.footer.height", 150);
+
+  let {inspector} = yield openInspectorForURL(TEST_URL);
+  let markup = inspector.markup;
+  let viewHeight = markup.doc.documentElement.clientHeight;
+
+  info("Pretend the markup-view is dragging");
+  markup.isDragging = true;
+
+  info("Simulate a mousemove on the view, at the bottom, and expect scrolling");
+  let onScrolled = waitForScrollStop(markup.doc);
+
+  markup._onMouseMove({
+    preventDefault: () => {},
+    target: markup.doc.body,
+    pageY: viewHeight
+  });
+
+  let bottomScrollPos = yield onScrolled;
+  ok(bottomScrollPos > 0, "The view was scrolled down");
+
+  info("Simulate a mousemove at the top and expect more scrolling");
+  onScrolled = waitForScrollStop(markup.doc);
+
+  markup._onMouseMove({
+    preventDefault: () => {},
+    target: markup.doc.body,
+    pageY: 0
+  });
+
+  let topScrollPos = yield onScrolled;
+  ok(topScrollPos < bottomScrollPos, "The view was scrolled up");
+  is(topScrollPos, 0, "The view was scrolled up to the top");
+
+  info("Simulate a mouseup to stop dragging");
+  markup._onMouseUp();
+});
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/markup/test/doc_markup_dragdrop_autoscroll_01.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=858038
+https://bugzilla.mozilla.org/show_bug.cgi?id=1226898
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 858038 and 1226898 - Autoscroll</title>
+</head>
+<body>
+  <div id="first"></div>
+  <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=858038">Mozilla Bug 858038</a>
+  <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1226898">Mozilla Bug 1226898</a>
+  <p id="display">Test</p>
+  <div id="content" style="display: none">
+
+  </div>
+
+  <!-- Make sure the markup-view has enough nodes shown by default that it has a scrollbar -->
+
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+</body>
+</html>
rename from devtools/client/inspector/markup/test/doc_markup_dragdrop_autoscroll.html
rename to devtools/client/inspector/markup/test/doc_markup_dragdrop_autoscroll_02.html
--- a/devtools/client/inspector/markup/test/doc_markup_dragdrop_autoscroll.html
+++ b/devtools/client/inspector/markup/test/doc_markup_dragdrop_autoscroll_02.html
@@ -1,20 +1,22 @@
 <!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=858038
+https://bugzilla.mozilla.org/show_bug.cgi?id=1226898
 -->
 <head>
   <meta charset="utf-8">
-  <title>Test for Bug 858038 - Autoscroll</title>
+  <title>Test for Bug 858038 and 1226898 - Autoscroll</title>
 </head>
 <body>
   <div id="first"></div>
   <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=858038">Mozilla Bug 858038</a>
+  <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1226898">Mozilla Bug 1226898</a>
   <p id="display">Test</p>
   <div id="content" style="display: none">
 
   </div>
 
   <!-- Make sure the markup-view has enough nodes shown by default that it has a scrollbar -->
 
   <div></div>
@@ -42,10 +44,20 @@ https://bugzilla.mozilla.org/show_bug.cg
   <div></div>
   <div></div>
   <div></div>
   <div></div>
   <div></div>
   <div></div>
   <div></div>
   <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
 </body>
 </html>
--- a/devtools/client/inspector/markup/test/head.js
+++ b/devtools/client/inspector/markup/test/head.js
@@ -579,8 +579,34 @@ function* simulateNodeDrop(inspector, se
  * the MarkupContainer for this node.
  * @param {Number} xOffset Optional x offset to drag by.
  * @param {Number} yOffset Optional y offset to drag by.
  */
 function* simulateNodeDragAndDrop(inspector, selector, xOffset, yOffset) {
   yield simulateNodeDrag(inspector, selector, xOffset, yOffset);
   yield simulateNodeDrop(inspector, selector);
 }
+
+/**
+ * Waits until the element has not scrolled for 30 consecutive frames.
+ */
+function* waitForScrollStop(doc) {
+  let el = doc.documentElement;
+  let win = doc.defaultView;
+  let lastScrollTop = el.scrollTop;
+  let stopFrameCount = 0;
+  while (stopFrameCount < 30) {
+    // Wait for a frame.
+    yield new Promise(resolve => win.requestAnimationFrame(resolve));
+
+    // Check if the element has scrolled.
+    if (lastScrollTop == el.scrollTop) {
+      // No scrolling since the last frame.
+      stopFrameCount++;
+    } else {
+      // The element has scrolled. Reset the frame counter.
+      stopFrameCount = 0;
+      lastScrollTop = el.scrollTop;
+    }
+  }
+
+  return lastScrollTop;
+}
--- a/devtools/client/themes/markup.css
+++ b/devtools/client/themes/markup.css
@@ -31,16 +31,20 @@ body {
   min-width: 100%;
 }
 
 /* Don't display a parent-child outline for the root elements */
 #root > ul > li > .children {
   background: none;
 }
 
+html.dragging {
+  overflow-x: hidden;
+}
+
 body.dragging .tag-line {
   cursor: grabbing;
 }
 
 #root-wrapper:after {
    content: "";
    display: block;
    clear: both;
new file mode 100644
--- /dev/null
+++ b/devtools/client/webconsole/new-console-output/components/grip-message-body.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+// React
+const {
+  PropTypes
+} = require("devtools/client/shared/vendor/react");
+const { createFactories } = require("devtools/client/shared/components/reps/rep-utils");
+const { Rep } = createFactories(require("devtools/client/shared/components/reps/rep"));
+const { Grip } = require("devtools/client/shared/components/reps/grip");
+
+GripMessageBody.displayName = "GripMessageBody";
+
+GripMessageBody.propTypes = {
+  grip: PropTypes.object.isRequired,
+};
+
+function GripMessageBody(props) {
+  return Rep({
+    object: props.grip,
+    defaultRep: Grip
+  });
+}
+
+module.exports.GripMessageBody = GripMessageBody;
--- a/devtools/client/webconsole/new-console-output/components/message-types/console-api-call.js
+++ b/devtools/client/webconsole/new-console-output/components/message-types/console-api-call.js
@@ -7,65 +7,55 @@
 "use strict";
 
 // React & Redux
 const {
   createFactory,
   DOM: dom,
   PropTypes
 } = require("devtools/client/shared/vendor/react");
+const GripMessageBody = createFactory(require("devtools/client/webconsole/new-console-output/components/grip-message-body").GripMessageBody);
 const MessageRepeat = createFactory(require("devtools/client/webconsole/new-console-output/components/message-repeat").MessageRepeat);
 const MessageIcon = createFactory(require("devtools/client/webconsole/new-console-output/components/message-icon").MessageIcon);
 
 ConsoleApiCall.displayName = "ConsoleApiCall";
 
 ConsoleApiCall.propTypes = {
   message: PropTypes.object.isRequired,
 };
 
 function ConsoleApiCall(props) {
   const { message } = props;
-  const messageBody =
-    dom.span({className: "message-body devtools-monospace"},
-      formatTextContent(message.data));
+
+  const counter = message.data.counter;
+  const messageBody = counter ?
+    `${counter.label}: ${counter.count}` :
+    message.data.arguments.map((arg) => GripMessageBody({grip: arg}));
+
   const icon = MessageIcon({severity: message.severity});
   const repeat = MessageRepeat({repeat: message.repeat});
-  const children = [
-    messageBody,
-    repeat
-  ];
 
   // @TODO Use of "is" is a temporary hack to get the category and severity
   // attributes to be applied. There are targeted in webconsole's CSS rules,
   // so if we remove this hack, we have to modify the CSS rules accordingly.
   return dom.div({
     class: "message cm-s-mozilla",
     is: "fdt-message",
     category: message.category,
     severity: message.severity
   },
+    // @TODO add timestamp
+    // @TODO add indent if necessary
     icon,
     dom.span({className: "message-body-wrapper"},
       dom.span({},
         dom.span({className: "message-flex-body"},
-          children
+          dom.span({className: "message-body devtools-monospace"},
+            messageBody
+          ),
+          repeat
         )
       )
     )
   );
 }
 
-function formatTextContent(data) {
-  return data.arguments.map(function (arg, i, arr) {
-    if (data.counter) {
-      let {label, count} = data.counter;
-      arg = `${label}: ${count}`;
-    }
-
-    const str = dom.span({className: "console-string"}, arg);
-    if (i < arr.length - 1) {
-      return [str, " "];
-    }
-    return str;
-  });
-}
-
 module.exports.ConsoleApiCall = ConsoleApiCall;
deleted file mode 100644
--- a/devtools/client/webconsole/new-console-output/components/message-types/date-preview.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-// React & Redux
-const {
-  createFactory,
-  DOM: dom,
-  PropTypes
-} = require("devtools/client/shared/vendor/react");
-
-const VariablesViewLink = createFactory(require("devtools/client/webconsole/new-console-output/components/variables-view-link").VariablesViewLink);
-const MessageIcon = createFactory(require("devtools/client/webconsole/new-console-output/components/message-icon").MessageIcon);
-
-DatePreview.displayName = "DatePreview";
-
-DatePreview.propTypes = {
-  data: PropTypes.object.isRequired,
-};
-
-function DatePreview(props) {
-  const { data, category, severity } = props;
-  const { preview } = data;
-
-  const dateString = new Date(preview.timestamp).toISOString();
-  const textNodes = [
-    VariablesViewLink({
-      objectActor: data,
-      label: "Date"
-    }),
-    dom.span({ className: "cm-string-2" }, ` ${dateString}`)
-  ];
-  const icon = MessageIcon({ severity });
-
-  // @TODO Use of "is" is a temporary hack to get the category and severity
-  // attributes to be applied. There are targeted in webconsole's CSS rules,
-  // so if we remove this hack, we have to modify the CSS rules accordingly.
-  return dom.div({
-    class: "message cm-s-mozilla",
-    is: "fdt-message",
-    category: category,
-    severity: severity
-  },
-    icon,
-    dom.span({
-      className: "message-body-wrapper message-body devtools-monospace"
-    }, dom.span({},
-        dom.span({ className: "class-Date" },
-          textNodes
-        )
-      )
-    )
-  );
-}
-
-module.exports.DatePreview = DatePreview;
--- a/devtools/client/webconsole/new-console-output/components/message-types/evaluation-result.js
+++ b/devtools/client/webconsole/new-console-output/components/message-types/evaluation-result.js
@@ -4,39 +4,46 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 // React & Redux
 const {
   createFactory,
+  DOM: dom,
   PropTypes
 } = require("devtools/client/shared/vendor/react");
+const GripMessageBody = createFactory(require("devtools/client/webconsole/new-console-output/components/grip-message-body").GripMessageBody);
+const MessageIcon = createFactory(require("devtools/client/webconsole/new-console-output/components/message-icon").MessageIcon);
 
 EvaluationResult.displayName = "EvaluationResult";
 
 EvaluationResult.propTypes = {
   message: PropTypes.object.isRequired,
 };
 
 function EvaluationResult(props) {
   const { message } = props;
-  let PreviewComponent = getPreviewComponent(message.data);
+  const icon = MessageIcon({severity: message.severity});
 
-  return PreviewComponent({
-    data: message.data,
+  // @TODO Use of "is" is a temporary hack to get the category and severity
+  // attributes to be applied. There are targeted in webconsole's CSS rules,
+  // so if we remove this hack, we have to modify the CSS rules accordingly.
+  return dom.div({
+    class: "message cm-s-mozilla",
+    is: "fdt-message",
     category: message.category,
     severity: message.severity
-  });
-}
-
-function getPreviewComponent(data) {
-  if (typeof data.class != "undefined") {
-    switch (data.class) {
-      case "Date":
-        return createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/date-preview").DatePreview);
-    }
-  }
-  return createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/default-renderer").DefaultRenderer);
+  },
+    // @TODO add timestamp
+    // @TODO add indent if needed with console.group
+    icon,
+    dom.span(
+      {className: "message-body-wrapper message-body devtools-monospace"},
+      dom.span({},
+        GripMessageBody({grip: message.data})
+      )
+    )
+  );
 }
 
 module.exports.EvaluationResult = EvaluationResult;
--- a/devtools/client/webconsole/new-console-output/components/message-types/moz.build
+++ b/devtools/client/webconsole/new-console-output/components/message-types/moz.build
@@ -1,12 +1,11 @@
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DevToolsModules(
     'console-api-call.js',
-    'date-preview.js',
     'default-renderer.js',
     'evaluation-result.js',
     'page-error.js',
 )
--- a/devtools/client/webconsole/new-console-output/components/moz.build
+++ b/devtools/client/webconsole/new-console-output/components/moz.build
@@ -4,13 +4,14 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += [
     'message-types'
 ]
 
 DevToolsModules(
     'console-output.js',
+    'grip-message-body.js',
     'message-container.js',
     'message-icon.js',
     'message-repeat.js',
     'variables-view-link.js'
 )
--- a/devtools/client/webconsole/new-console-output/test/components/chrome.ini
+++ b/devtools/client/webconsole/new-console-output/test/components/chrome.ini
@@ -1,13 +1,12 @@
 [DEFAULT]
 
 support-files =
   head.js
 
 [test_console-api-call.html]
 [test_console-api-call_repeat.html]
-[test_date-preview.html]
 [test_evaluation-result.html]
 [test_message-icon.html]
 [test_message-container.html]
 [test_message-repeat.html]
 [test_page-error.html]
--- a/devtools/client/webconsole/new-console-output/test/components/head.js
+++ b/devtools/client/webconsole/new-console-output/test/components/head.js
@@ -27,22 +27,24 @@ var { require: browserRequire } = Browse
 let ReactDOM = browserRequire("devtools/client/shared/vendor/react-dom");
 let React = browserRequire("devtools/client/shared/vendor/react");
 var TestUtils = React.addons.TestUtils;
 
 let testCommands = new Map();
 testCommands.set("console.log()", {
   command: "console.log('foobar', 'test')",
   commandType: "consoleAPICall",
-  expectedText: "foobar test"
+  // @TODO should output: foobar test
+  expectedText: "\"foobar\"\"test\""
 });
 testCommands.set("new Date()", {
   command: "new Date(448156800000)",
   commandType: "evaluationResult",
-  expectedText: "Date 1984-03-15T00:00:00.000Z"
+  // @TODO should output: Date 1984-03-15T00:00:00.000Z
+  expectedText: "1984-03-15T00:00:00.000Z"
 });
 testCommands.set("pageError", {
   command: null,
   commandType: "pageError",
   expectedText: "ReferenceError: asdf is not defined"
 });
 
 function* getPacket(command, type = "evaluationResult") {
--- a/devtools/client/webconsole/new-console-output/test/components/test_console-api-call.html
+++ b/devtools/client/webconsole/new-console-output/test/components/test_console-api-call.html
@@ -7,55 +7,52 @@
   <script type="application/javascript;version=1.8" src="head.js"></script>
   <!-- Any copyright is dedicated to the Public Domain.
      - http://creativecommons.org/publicdomain/zero/1.0/ -->
 </head>
 <body>
 <p>Test for ConsoleApiCall component</p>
 
 <script type="text/javascript;version=1.8">
+const { prepareMessage } = require("devtools/client/webconsole/new-console-output/utils/messages");
+const { ConsoleApiCall } = require("devtools/client/webconsole/new-console-output/components/message-types/console-api-call");
+
 window.onload = Task.async(function* () {
-  const { prepareMessage } = require("devtools/client/webconsole/new-console-output/utils/messages");
-  const { ConsoleApiCall } = require("devtools/client/webconsole/new-console-output/components/message-types/console-api-call");
+  yield testConsoleLog();
+  yield testConsoleCount();
 
+  SimpleTest.finish()
+});
+
+function testConsoleLog() {
   const packet = yield getPacket("console.log('foobar', 'test')", "consoleAPICall");
   const message = prepareMessage(packet);
   const rendered = renderComponent(ConsoleApiCall, {message});
 
   const messageBody = getMessageBody(rendered);
-  const consoleStringNodes = getConsoleStringNodes(messageBody);
+  // @TODO should output: foobar test
+  is(messageBody.textContent, "\"foobar\"\"test\"", "ConsoleApiCall outputs expected text");
+
+  const consoleStringNodes = messageBody.querySelectorAll(".objectBox");
   is(consoleStringNodes.length, 2, "ConsoleApiCall outputs expected HTML structure");
-  is(messageBody.textContent, "foobar test", "ConsoleApiCall outputs expected text");
+}
 
+function testConsoleCount() {
   for (let i = 0; i < 3; i++) {
-    const countPacket = yield getPacket("console.count('bar')", "consoleAPICall");
-    const countMessage = prepareMessage(countPacket);
-    const countRendered = renderComponent(ConsoleApiCall, {message: countMessage});
-    testConsoleCountRenderedElement(countRendered, `bar: ${i + 1}`);
+    const packet = yield getPacket("console.count('bar')", "consoleAPICall");
+    const message = prepareMessage(packet);
+    const rendered = renderComponent(ConsoleApiCall, {message: message});
+    const messageBody = getMessageBody(rendered);
+
+    const expected = `bar: ${i + 1}`;
+    is(messageBody.textContent, expected,
+      "console.count has the expected text content: ${expected}");
   }
-
-  SimpleTest.finish()
-});
+}
 
 function getMessageBody(renderedComponent) {
-  const queryPath = "div.message.cm-s-mozilla span span.message-flex-body " +
-    "span.message-body.devtools-monospace";
+  const queryPath = "div.message.cm-s-mozilla span span.message-flex-body span.message-body.devtools-monospace";
   return renderedComponent.querySelector(queryPath);
 }
 
-function getConsoleStringNodes(messageBody) {
-  return messageBody.querySelectorAll("span.console-string");
-}
-
-function testConsoleCountRenderedElement(renderedComponent, expectedTextContent) {
-  info("Testing console.count rendered element");
-
-  const messageBody = getMessageBody(renderedComponent);
-  const consoleStringNodes = getConsoleStringNodes(messageBody);
-
-  is(consoleStringNodes.length, 1,
-    "console.count rendered element has the expected HTML structure");
-  is(messageBody.textContent, expectedTextContent,
-    "console.count rendered element has the expected text content");
-}
 </script>
 </body>
 </html>
--- a/devtools/client/webconsole/new-console-output/test/components/test_console-api-call_repeat.html
+++ b/devtools/client/webconsole/new-console-output/test/components/test_console-api-call_repeat.html
@@ -18,17 +18,18 @@ window.onload = Task.async(function* () 
 
   const packet = yield getPacket("console.log('foobar', 'test')", "consoleAPICall");
   const message = prepareMessage(packet);
   message.repeat = 107;
   const rendered = renderComponent(ConsoleApiCall, {message});
 
   const messageBodyPath = "span > span.message-flex-body > span.message-body.devtools-monospace";
   const messageBody = rendered.querySelectorAll(messageBodyPath);
-  is(messageBody[0].textContent, "foobar test", "ConsoleApiCall outputs expected text for repeated message");
+  // @TODO Expected output should be: foobar test
+  is(messageBody[0].textContent, "\"foobar\"\"test\"", "ConsoleApiCall outputs expected text for repeated message");
 
   const repeatPath = "span > span.message-flex-body > span.message-body.devtools-monospace + span.message-repeats";
   const repeat = rendered.querySelectorAll(repeatPath);
   is(repeat[0].textContent, `${message.repeat}`, "ConsoleApiCall outputs correct repeat count");
 
   SimpleTest.finish()
 });
 </script>
deleted file mode 100644
--- a/devtools/client/webconsole/new-console-output/test/components/test_date-preview.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en">
-<head>
-  <meta charset="utf8">
-  <title>Test for DatePreview component</title>
-  <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript;version=1.8" src="head.js"></script>
-  <!-- Any copyright is dedicated to the Public Domain.
-     - http://creativecommons.org/publicdomain/zero/1.0/ -->
-</head>
-<body>
-<p>Test for DatePreview component</p>
-
-<script type="text/javascript;version=1.8">
-window.onload = Task.async(function* () {
-  const { prepareMessage } = require("devtools/client/webconsole/new-console-output/utils/messages");
-  const { DatePreview } = require("devtools/client/webconsole/new-console-output/components/message-types/date-preview");
-
-  const testCommand = testCommands.get("new Date()");
-  const packet = yield getPacket(testCommand.command, testCommand.commandType);
-  const message = prepareMessage(packet);
-  const props = {
-    data: message.data,
-    severity: message.severity,
-    category: message.category,
-  };
-  const rendered = renderComponent(DatePreview, props);
-
-  const queryPathBase = "div.message.cm-s-mozilla span.message-body-wrapper.message-body.devtools-monospace span span.class-Date";
-
-  const preview = rendered.querySelectorAll(queryPathBase);
-  is(preview[0].textContent, testCommand.expectedText, "DatePreview outputs expected text");
-
-  const link = rendered.querySelectorAll(`${queryPathBase} a[draggable=false][href="#"].cm-variable`);
-  is(link.length, 1, "DatePreview outputs the variables view link");
-
-  SimpleTest.finish()
-});
-</script>
-</body>
-</html>
--- a/devtools/client/webconsole/new-console-output/test/components/test_evaluation-result.html
+++ b/devtools/client/webconsole/new-console-output/test/components/test_evaluation-result.html
@@ -10,61 +10,37 @@
 </head>
 <body>
 <p>Test for EvaluationResult component</p>
 
 <script type="text/javascript;version=1.8">
 window.onload = Task.async(function* () {
   const { prepareMessage } = require("devtools/client/webconsole/new-console-output/utils/messages");
   const {
-    EvaluationResult,
-    getPreviewComponent
+    EvaluationResult
   } = require("devtools/client/webconsole/new-console-output/components/message-types/evaluation-result");
 
-  yield testFullRender();
-  yield testGetPreviewComponent();
+  yield testDate();
 
   SimpleTest.finish()
 
   /**
-   * Test that passing in a message correctly wires up all the children.
-   *
-   * The different combinations of children are tested in separate per-component
-   * tests. This test just ensures that this component pipes data to its children.
+   * Test that evaluation result correctly outputs date results.
    */
-  function testFullRender() {
-    const testValue = testCommands.get("new Date()");
-    const packet = yield getPacket(testValue.command, testValue.commandType);
+  function testDate() {
+    const testCommand = testCommands.get("new Date()");
+    const packet = yield getPacket(testCommand.command, testCommand.commandType);
     const message = prepareMessage(packet);
     const props = {
       message
     };
     const rendered = renderComponent(EvaluationResult, props);
 
-    ok(rendered.textContent.includes(testValue.expectedText),
-      "EvaluationResult pipes data to its children as expected");
-}
+    const queryPathBase = "div.message.cm-s-mozilla span.message-body-wrapper.message-body.devtools-monospace span .objectLink";
 
-  /**
-   * Test that getPreviewComponent() returns correct component for each object type.
-   */
-  function testGetPreviewComponent() {
-    const testValues = [
-      {
-        commandObj: testCommands.get("new Date()"),
-        expectedComponent: require("devtools/client/webconsole/new-console-output/components/message-types/date-preview").DatePreview
-      }
-    ];
-
-    for (let testValue of testValues) {
-      const { commandObj, expectedComponent } = testValue;
-      const packet = yield getPacket(commandObj.command, commandObj.commandType);
-      const message = prepareMessage(packet);
-      const rendered = shallowRenderComponent(EvaluationResult, {message});
-      is(rendered.type, expectedComponent,
-        `EvaluationResult nests ${expectedComponent} based on command: ${commandObj.command}`);
-    }
+    const preview = rendered.querySelectorAll(queryPathBase);
+    is(preview[0].textContent, testCommand.expectedText, "EvaluationResult outputs expected text");
   }
 });
 
 </script>
 </body>
 </html>
--- a/devtools/client/webconsole/new-console-output/utils/messages.js
+++ b/devtools/client/webconsole/new-console-output/utils/messages.js
@@ -78,17 +78,21 @@ function prepareMessage(packet) {
       if (data.warning || data.strict) {
         severity = SEVERITY_CLASS_FRAGMENTS[SEVERITY_WARNING];
       } else if (data.info) {
         severity = SEVERITY_CLASS_FRAGMENTS[SEVERITY_LOG];
       }
       break;
     case "evaluationResult":
     default:
-      data = Object.assign({}, packet.result);
+      if (typeof packet.result === "object") {
+        data = Object.assign({}, packet.result);
+      } else {
+        data = packet.result;
+      }
       allowRepeating = true;
       category = CATEGORY_CLASS_FRAGMENTS[CATEGORY_OUTPUT];
       messageType = "EvaluationResult";
       repeat = 1;
       repeatId = getRepeatId(data);
       severity = SEVERITY_CLASS_FRAGMENTS[SEVERITY_LOG];
       break;
   }
--- a/devtools/server/actors/webconsole.js
+++ b/devtools/server/actors/webconsole.js
@@ -215,18 +215,17 @@ WebConsoleActor.prototype =
    * @private
    * @param nsIDOMWindow window
    *        The window to store on the actor (can be null).
    */
   _handleNewWindow: function WCA__handleNewWindow(window)
   {
     if (window) {
       if (this._hadChromeWindow) {
-        let contextChangedMsg = WebConsoleActor.l10n.getStr("evaluationContextChanged");
-        Services.console.logStringMessage(contextChangedMsg);
+        Services.console.logStringMessage('Webconsole context has changed');
       }
       this._lastChromeWindow = Cu.getWeakReference(window);
       this._hadChromeWindow = true;
     } else {
       this._lastChromeWindow = null;
     }
   },
 
--- a/mobile/android/base/java/org/mozilla/gecko/gcm/GcmInstanceIDListenerService.java
+++ b/mobile/android/base/java/org/mozilla/gecko/gcm/GcmInstanceIDListenerService.java
@@ -23,13 +23,13 @@ public class GcmInstanceIDListenerServic
      * InstanceID provider.
      */
     @Override
     public void onTokenRefresh() {
         Log.d("GeckoPushGCM", "Token refresh request received.  Processing on background thread.");
         ThreadUtils.postToBackgroundThread(new Runnable() {
             @Override
             public void run() {
-                PushService.getInstance().onRefresh();
+                PushService.getInstance(GcmInstanceIDListenerService.this).onRefresh();
             }
         });
     }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/gcm/GcmMessageListenerService.java
+++ b/mobile/android/base/java/org/mozilla/gecko/gcm/GcmMessageListenerService.java
@@ -25,14 +25,14 @@ public class GcmMessageListenerService e
      * @param bundle Data bundle containing message data as key/value pairs.
      */
     @Override
     public void onMessageReceived(final String from, final Bundle bundle) {
         Log.d("GeckoPushGCM", "Message received.  Processing on background thread.");
         ThreadUtils.postToBackgroundThread(new Runnable() {
             @Override
             public void run() {
-                PushService.getInstance().onMessageReceived(
+                PushService.getInstance(GcmMessageListenerService.this).onMessageReceived(
                         GcmMessageListenerService.this, bundle);
             }
         });
     }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/push/PushService.java
+++ b/mobile/android/base/java/org/mozilla/gecko/push/PushService.java
@@ -61,19 +61,19 @@ public class PushService implements Bund
             "PushServiceAndroidGCM:Uninitialized",
             "PushServiceAndroidGCM:RegisterUserAgent",
             "PushServiceAndroidGCM:UnregisterUserAgent",
             "PushServiceAndroidGCM:SubscribeChannel",
             "PushServiceAndroidGCM:UnsubscribeChannel",
             "History:GetPrePathLastVisitedTimeMilliseconds",
     };
 
-    public static synchronized PushService getInstance() {
+    public static synchronized PushService getInstance(Context context) {
         if (sInstance == null) {
-            throw new IllegalStateException("PushService not yet created!");
+            onCreate(context);
         }
         return sInstance;
     }
 
     @ReflectionTarget
     public static synchronized void onCreate(Context context) {
         if (sInstance != null) {
             throw new IllegalStateException("PushService already created!");
--- a/toolkit/themes/linux/global/in-content/common.css
+++ b/toolkit/themes/linux/global/in-content/common.css
@@ -85,18 +85,17 @@ xul|checkbox:not([disabled="true"]):hove
   color: var(--in-content-text-color);
 }
 
 xul|*.numberbox-input-box {
   -moz-appearance: none;
   border-width: 0;
 }
 
-xul|*.text-link:-moz-focusring,
-xul|*.inline-link:-moz-focusring {
+xul|*.text-link:-moz-focusring {
   border: 1px dotted -moz-DialogText;
 }
 
 xul|menulist:-moz-focusring > xul|*.menulist-label-box,
 xul|radio[focused="true"] > xul|*.radio-label-box,
 html|input[type="checkbox"]:-moz-focusring + html|label:before,
 xul|checkbox:-moz-focusring > xul|*.checkbox-label-box {
   outline: 1px dotted;
--- a/toolkit/themes/osx/global/in-content/common.css
+++ b/toolkit/themes/osx/global/in-content/common.css
@@ -71,18 +71,17 @@ xul|*.numberbox-input-box {
   border-width: 0;
 }
 
 xul|description {
   font-size: 1.25rem;
   line-height: 22px;
 }
 
-xul|*.text-link:-moz-focusring,
-xul|*.inline-link:-moz-focusring {
+xul|*.text-link:-moz-focusring {
   color: var(--in-content-link-highlight);
   text-decoration: underline;
   box-shadow: none;
 }
 
 xul|button:-moz-focusring,
 xul|menulist:-moz-focusring,
 xul|checkbox:-moz-focusring > .checkbox-check,
--- a/toolkit/themes/shared/in-content/common.inc.css
+++ b/toolkit/themes/shared/in-content/common.inc.css
@@ -446,36 +446,33 @@ html|input[type="text"]:disabled,
 html|textarea:disabled,
 xul|textbox[disabled="true"] {
   opacity: 0.5;
 }
 
 /* Links */
 
 html|a,
-.text-link,
-.inline-link {
+.text-link {
   color: var(--in-content-link-color);
   text-decoration: none;
 }
 
 html|a:hover,
-.text-link:hover,
-.inline-link:hover {
+.text-link:hover {
   color: var(--in-content-link-color-hover);
   text-decoration: underline;
 }
 
 html|a:visited {
   color: var(--in-content-link-color-visited);
 }
 
 html|a:hover:active,
-.text-link:hover:active,
-.inline-link:hover:active {
+.text-link:hover:active {
   color: var(--in-content-link-color-active);
   text-decoration: none;
 }
 
 /* Checkboxes and radio buttons */
 
 /* Hide the actual checkbox */
 html|input[type="checkbox"] {
--- a/toolkit/themes/windows/global/in-content/common.css
+++ b/toolkit/themes/windows/global/in-content/common.css
@@ -59,17 +59,16 @@ xul|*.checkbox-icon {
 /* Never draw a border for the focusring, use outline instead */
 xul|*.button-box,
 xul|*.menulist-label-box,
 xul|*.radio-label-box,
 xul|*.checkbox-label-box {
   border-style: none;
 }
 
-xul|*.inline-link:-moz-focusring,
 xul|button:-moz-focusring > xul|*.button-box,
 xul|menulist:-moz-focusring > xul|*.menulist-label-box,
 xul|radio[focused="true"] > xul|*.radio-label-box,
 html|input[type="checkbox"]:-moz-focusring + html|label:before,
 xul|checkbox:-moz-focusring > xul|*.checkbox-label-box {
   outline: 1px dotted;
 }