Merge mozilla-central to mozilla-inbound
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Tue, 14 Jan 2014 16:11:37 +0100
changeset 163339 0999c05896cf6248989529c3edf91aa80280d6d6
parent 163338 141b703571fc193fd7771978fc63348710dd81b3 (current diff)
parent 163293 3a264db9f9e7c25c6e7395e75420de846302b986 (diff)
child 163340 6779278f87dfb5f21b91a6b326c156a5000c4d06
push id25993
push userkwierso@gmail.com
push dateTue, 14 Jan 2014 23:24:56 +0000
treeherdermozilla-central@4e671e3183c4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone29.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to mozilla-inbound
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,4 +1,4 @@
 {
-    "revision": "449764bc60bafa78cec7aa6cad0d65e558ab7473", 
+    "revision": "c8716b0dcb8cc8946903355c3533481f967b52d3", 
     "repo_path": "/integration/gaia-central"
 }
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -2,19 +2,19 @@
  * 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/. */
 
 @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
 @namespace html url("http://www.w3.org/1999/xhtml");
 
 #main-window:not([chromehidden~="toolbar"]) {
 %ifdef XP_MACOSX
-  min-width: 425px;
+  min-width: 335px;
 %else
-  min-width: 390px;
+  min-width: 300px;
 %endif
 }
 
 searchbar {
   -moz-binding: url("chrome://browser/content/search/search.xml#searchbar");
 }
 
 .browserStack > browser[remote="true"] {
@@ -279,17 +279,17 @@ toolbarpaletteitem > #personal-bookmarks
   overflow-x: hidden;
   overflow-y: auto;
 }
 #panelMenu_bookmarksMenu > .bookmark-item {
   max-width: none;
 }
 
 #urlbar-container {
-  min-width: 50ch;
+  min-width: 30ch;
 }
 
 #search-container {
   min-width: 25ch;
 }
 
 #main-window:-moz-lwtheme {
   background-repeat: no-repeat;
--- a/browser/components/customizableui/test/browser_901207_searchbar_in_panel.js
+++ b/browser/components/customizableui/test/browser_901207_searchbar_in_panel.js
@@ -47,17 +47,17 @@ add_task(function() {
 
 // Ctrl+K should open the overflow panel and focus the search bar if the search bar is overflowed.
 add_task(function() {
   this.originalWindowWidth = window.outerWidth;
   let navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
   ok(!navbar.hasAttribute("overflowing"), "Should start with a non-overflowing toolbar.");
   ok(CustomizableUI.inDefaultState, "Should start in default state.");
 
-  window.resizeTo(390, window.outerHeight);
+  window.resizeTo(380, window.outerHeight);
   yield waitForCondition(() => navbar.hasAttribute("overflowing"));
   ok(!navbar.querySelector("#search-container"), "Search container should be overflowing");
   let searchbar = document.getElementById("searchbar");
 
   let shownPanelPromise = promiseOverflowShown(window);
   sendWebSearchKeyCommand();
   yield shownPanelPromise;
 
--- a/browser/components/customizableui/test/browser_914138_widget_API_overflowable_toolbar.js
+++ b/browser/components/customizableui/test/browser_914138_widget_API_overflowable_toolbar.js
@@ -103,17 +103,17 @@ add_task(function() {
   window.resizeTo(originalWindowWidth, window.outerHeight);
 });
 
 // Overflow everything that can, then reorganize that list
 add_task(function() {
   ok(!navbar.hasAttribute("overflowing"), "Should start with a non-overflowing toolbar.");
   ok(CustomizableUI.inDefaultState, "Should start in default state.");
 
-  window.resizeTo(480, window.outerHeight);
+  window.resizeTo(380, window.outerHeight);
   yield waitForCondition(() => navbar.hasAttribute("overflowing"));
   ok(!navbar.querySelector("#" + kSearchBox), "Search container should be overflowing");
   let placements = CustomizableUI.getWidgetIdsInArea(navbar.id);
   let searchboxPlacement = placements.indexOf(kSearchBox);
   CustomizableUI.moveWidgetWithinArea(kHomeBtn, searchboxPlacement);
   yield waitForCondition(() => navbar.querySelector("#" + kHomeBtn));
   ok(navbar.querySelector("#" + kHomeBtn), "Home button should have moved back");
   let inc = 15;
--- a/browser/devtools/debugger/debugger-panes.js
+++ b/browser/devtools/debugger/debugger-panes.js
@@ -1863,17 +1863,21 @@ VariableBubbleView.prototype = {
       { line: line - 1, ch: column },
       { line: line - 1, ch: column + length });
 
     // If the grip represents a primitive value, use a more lightweight
     // machinery to display it.
     if (VariablesView.isPrimitive({ value: objectActor })) {
       let className = VariablesView.getClass(objectActor);
       let textContent = VariablesView.getString(objectActor);
-      this._tooltip.setTextContent([textContent], className, "plain");
+      this._tooltip.setTextContent({
+        messages: [textContent],
+        messagesClass: className,
+        containerClass: "plain"
+      });
     } else {
       this._tooltip.setVariableContent(objectActor, {
         searchPlaceholder: L10N.getStr("emptyPropertiesFilterText"),
         searchEnabled: Prefs.variablesSearchboxVisible,
         eval: (variable, value) => {
           let string = variable.evaluationMacro(variable, value);
           DebuggerController.StackFrames.evaluate(string);
           DebuggerView.VariableBubble.hideContents();
--- a/browser/devtools/debugger/debugger-toolbar.js
+++ b/browser/devtools/debugger/debugger-toolbar.js
@@ -76,17 +76,18 @@ ToolbarView.prototype = {
    * Display a warning when trying to resume a debuggee while another is paused.
    * Debuggees must be unpaused in a Last-In-First-Out order.
    *
    * @param string aPausedUrl
    *        The URL of the last paused debuggee.
    */
   showResumeWarning: function(aPausedUrl) {
     let label = L10N.getFormatStr("resumptionOrderPanelTitle", aPausedUrl);
-    this._resumeOrderTooltip.setTextContent([label]);
+    let defaultStyle = "default-tooltip-simple-text-colors";
+    this._resumeOrderTooltip.setTextContent({ messages: [label], isAlertTooltip: true });
     this._resumeOrderTooltip.show(this._resumeButton);
   },
 
   /**
    * Sets the resume button state based on the debugger active thread.
    *
    * @param string aState
    *        Either "paused" or "attached".
--- a/browser/devtools/netmonitor/netmonitor-view.js
+++ b/browser/devtools/netmonitor/netmonitor-view.js
@@ -1234,16 +1234,19 @@ RequestsMenuView.prototype = Heritage.ex
    * Handle the context menu opening. Hide items if no request is selected.
    */
   _onContextShowing: function() {
     let resendElement = $("#request-menu-context-resend");
     resendElement.hidden = !this.selectedItem || this.selectedItem.attachment.isCustom;
 
     let copyUrlElement = $("#request-menu-context-copy-url");
     copyUrlElement.hidden = !this.selectedItem;
+
+    let newTabElement = $("#request-menu-context-newtab");
+    newTabElement.hidden = !this.selectedItem;
   },
 
   /**
    * Checks if the specified unix time is the first one to be known of,
    * and saves it if so.
    *
    * @param number aUnixTime
    *        The milliseconds to check and save.
--- a/browser/devtools/shadereditor/shadereditor.js
+++ b/browser/devtools/shadereditor/shadereditor.js
@@ -562,17 +562,17 @@ let ShadersEditorsView = {
    */
   _onMarkerMouseEnter: function(line, node, messages) {
     if (node._markerErrorsTooltip) {
       return;
     }
 
     let tooltip = node._markerErrorsTooltip = new Tooltip(document);
     tooltip.defaultOffsetX = GUTTER_ERROR_PANEL_OFFSET_X;
-    tooltip.setTextContent(messages);
+    tooltip.setTextContent({ messages: messages });
     tooltip.startTogglingOnHover(node, () => true, GUTTER_ERROR_PANEL_DELAY);
   },
 
   /**
    * Removes all the gutter markers and line classes from the editor.
    */
   _cleanEditor: function(type) {
     this._getEditor(type).then(editor => {
--- a/browser/devtools/shared/widgets/Tooltip.js
+++ b/browser/devtools/shared/widgets/Tooltip.js
@@ -406,34 +406,47 @@ Tooltip.prototype = {
    * Sets some text as the content of this tooltip.
    *
    * @param {array} messages
    *        A list of text messages.
    * @param {string} messagesClass [optional]
    *        A style class for the text messages.
    * @param {string} containerClass [optional]
    *        A style class for the text messages container.
+   * @param {boolean} isAlertTooltip [optional]
+   *        Pass true to add an alert image for your tooltip.
    */
-  setTextContent: function(messages,
-    messagesClass = "default-tooltip-simple-text-colors",
-    containerClass = "default-tooltip-simple-text-colors") {
+  setTextContent: function({ messages, messagesClass, containerClass, isAlertTooltip }) {
+    messagesClass = messagesClass || "default-tooltip-simple-text-colors";
+    containerClass = containerClass || "default-tooltip-simple-text-colors";
 
     let vbox = this.doc.createElement("vbox");
     vbox.className = "devtools-tooltip-simple-text-container " + containerClass;
     vbox.setAttribute("flex", "1");
 
     for (let text of messages) {
       let description = this.doc.createElement("description");
       description.setAttribute("flex", "1");
       description.className = "devtools-tooltip-simple-text " + messagesClass;
       description.textContent = text;
       vbox.appendChild(description);
     }
 
-    this.content = vbox;
+    if (isAlertTooltip) {
+      let hbox = this.doc.createElement("hbox");
+      hbox.setAttribute("align", "start");
+
+      let alertImg = this.doc.createElement("image");
+      alertImg.className = "devtools-tooltip-alert-icon";
+      hbox.appendChild(alertImg);
+      hbox.appendChild(vbox);
+      this.content = hbox;
+    } else {
+      this.content = vbox;
+    }
   },
 
   /**
    * Fill the tooltip with a variables view, inspecting an object via its
    * corresponding object actor, as specified in the remote debugging protocol.
    *
    * @param {object} objectActor
    *        The value grip for the object actor.
@@ -506,17 +519,17 @@ Tooltip.prototype = {
    *        it was resized, if if was resized before this function was called.
    *        If not provided, will be measured on the loaded image.
    *        - maxDim : if the image should be resized before being shown, pass
    *        a number here
    */
   setImageContent: function(imageUrl, options={}) {
     // Main container
     let vbox = this.doc.createElement("vbox");
-    vbox.setAttribute("align", "center")
+    vbox.setAttribute("align", "center");
 
     // Display the image
     let image = this.doc.createElement("image");
     image.setAttribute("src", imageUrl);
     if (options.maxDim) {
       image.style.maxWidth = options.maxDim + "px";
       image.style.maxHeight = options.maxDim + "px";
     }
--- a/browser/devtools/styleinspector/rule-view.js
+++ b/browser/devtools/styleinspector/rule-view.js
@@ -2365,17 +2365,21 @@ UserProperties.prototype = {
    *          otherwise.
    */
   getProperty: function(aStyle, aName, aDefault) {
     let key = this.getKey(aStyle);
     let entry = this.map.get(key, null);
 
     if (entry && aName in entry) {
       let item = entry[aName];
-      return item || aDefault;
+      if (item != aDefault) {
+        delete entry[aName];
+        return aDefault;
+      }
+      return item;
     }
     return aDefault;
   },
 
   /**
    * Set a named property for a given CSSStyleDeclaration.
    *
    * @param {CSSStyleDeclaration} aStyle
--- a/browser/devtools/styleinspector/test/browser.ini
+++ b/browser/devtools/styleinspector/test/browser.ini
@@ -59,8 +59,9 @@ support-files = browser_ruleview_pseudoe
 [browser_ruleview_original_source_link.js]
 support-files =
   sourcemaps.html
   sourcemaps.css
   sourcemaps.css.map
   sourcemaps.scss
 [browser_computedview_original_source_link.js]
 [browser_bug946331_close_tooltip_on_new_selection.js]
+[browser_bug942297_user_property_reset.js]
new file mode 100644
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_bug942297_user_property_reset.js
@@ -0,0 +1,128 @@
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Test that user set style properties can be changed from the markup-view and
+// don't survive page reload
+
+let {devtools} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
+let promise = devtools.require("sdk/core/promise");
+let {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
+
+let TEST_PAGE = [
+  "data:text/html,",
+  "<p id='id1' style='width:200px;'>element 1</p>",
+  "<p id='id2' style='width:100px;'>element 2</p>"
+].join("");
+
+let doc;
+let inspector;
+let ruleView;
+let markupView;
+
+function test() {
+  waitForExplicitFinish();
+
+  gBrowser.selectedTab = gBrowser.addTab();
+  gBrowser.selectedBrowser.addEventListener("load", function onload(evt) {
+    gBrowser.selectedBrowser.removeEventListener("load", onload, true);
+    doc = content.document;
+    waitForFocus(() => {
+      openRuleView((aInspector, aView) => {
+        inspector = aInspector;
+        ruleView = aView;
+        markupView = inspector.markup;
+
+        Task.spawn(function() {
+          yield selectElement("id1");
+          yield modifyRuleViewWidth("300px");
+          assertRuleAndMarkupViewWidth("id1", "300px");
+          yield selectElement("id2");
+          assertRuleAndMarkupViewWidth("id2", "100px");
+          yield modifyRuleViewWidth("50px");
+          assertRuleAndMarkupViewWidth("id2", "50px");
+
+          yield reloadPage();
+          yield selectElement("id1");
+          assertRuleAndMarkupViewWidth("id1", "200px");
+          yield selectElement("id2");
+          assertRuleAndMarkupViewWidth("id2", "100px");
+
+          finishTest();
+        }).then(null, Cu.reportError);
+      });
+    }, content);
+  }, true);
+
+  content.location = TEST_PAGE;
+}
+
+function finishTest() {
+  doc = inspector = ruleView = markupView = null;
+  gBrowser.removeCurrentTab();
+  finish();
+}
+
+function selectElement(id) {
+  let deferred = promise.defer();
+  inspector.selection.setNode(doc.getElementById(id));
+  inspector.once("inspector-updated", deferred.resolve);
+  return deferred.promise;
+}
+
+function getStyleRule() {
+  return ruleView.doc.querySelector(".ruleview-rule");
+}
+
+function modifyRuleViewWidth(value) {
+  let deferred = promise.defer();
+
+  let valueSpan = getStyleRule().querySelector(".ruleview-propertyvalue");
+  waitForEditorFocus(valueSpan.parentNode, () => {
+    let editor = inplaceEditor(valueSpan);
+    editor.input.value = value;
+    waitForEditorBlur(editor, () => {
+      // Changing the style will refresh the markup view, let's wait for that
+      inspector.once("markupmutation", () => {
+        waitForEditorBlur({input: ruleView.doc.activeElement}, deferred.resolve);
+        EventUtils.sendKey("escape");
+      });
+    });
+    EventUtils.sendKey("return");
+  });
+  valueSpan.click();
+
+  return deferred.promise;
+}
+
+function getContainerStyleAttrValue(id) {
+  let front = markupView.walker.frontForRawNode(doc.getElementById(id));
+  let container = markupView.getContainer(front);
+
+  let attrIndex = 0;
+  for (let attrName of container.elt.querySelectorAll(".attr-name")) {
+    if (attrName.textContent === "style") {
+      return container.elt.querySelectorAll(".attr-value")[attrIndex];
+    }
+    attrIndex ++;
+  }
+}
+
+function assertRuleAndMarkupViewWidth(id, value) {
+  let valueSpan = getStyleRule().querySelector(".ruleview-propertyvalue");
+  is(valueSpan.textContent, value, "Rule-view style width is " + value + " as expected");
+
+  let attr = getContainerStyleAttrValue(id);
+  is(attr.textContent.replace(/\s/g, ""), "width:" + value + ";", "Markup-view style attribute width is " + value);
+}
+
+function reloadPage() {
+  let deferred = promise.defer();
+  inspector.once("new-root", () => {
+    doc = content.document;
+    markupView = inspector.markup;
+    markupView._waitForChildren().then(deferred.resolve);
+  });
+  content.location.reload();
+  return deferred.promise;
+}
--- a/browser/metro/base/content/helperui/FindHelperUI.js
+++ b/browser/metro/base/content/helperui/FindHelperUI.js
@@ -168,20 +168,20 @@ var FindHelperUI = {
   goToPrevious: function findHelperGoToPrevious() {
     this.searchAgain(this._searchString, true);
   },
 
   goToNext: function findHelperGoToNext() {
     this.searchAgain(this._searchString, false);
   },
 
-  onFindResult: function(aResult, aFindBackwards, aLinkURL, aRect) {
-    this._status = aResult;
-    if (aRect) {
-      this._zoom(aRect, Browser.selectedBrowser.contentDocumentHeight);
+  onFindResult: function(aData) {
+    this._status = aData.result;
+    if (aData.rect) {
+      this._zoom(aData.rect, Browser.selectedBrowser.contentDocumentHeight);
     }
     this.updateCommands();
   },
 
   updateCommands: function findHelperUpdateCommands() {
     let disabled = (this._status == Ci.nsITypeAheadFind.FIND_NOTFOUND) || (this._searchString == "");
     this._cmdPrevious.setAttribute("disabled", disabled);
     this._cmdNext.setAttribute("disabled", disabled);
--- a/browser/metro/theme/browser.css
+++ b/browser/metro/theme/browser.css
@@ -783,32 +783,40 @@ documenttab[selected] .documenttab-selec
 #star-button {
   list-style-image: url(chrome://browser/skin/images/navbar-star.png);
 }
 
 #menu-button {
   list-style-image: url(chrome://browser/skin/images/navbar-menu.png);
 }
 
+#close-button {
+  list-style-image: url(chrome://browser/skin/images/navbar-close.png);
+}
+
 @media (min-resolution: @min_res_140pc@) {
   #download-progress {
     list-style-image: url(chrome://browser/skin/images/navbar-download@1.4x.png);
   }
 
   #pin-button {
     list-style-image: url(chrome://browser/skin/images/navbar-pin@1.4x.png);
   }
 
   #star-button {
     list-style-image: url(chrome://browser/skin/images/navbar-star@1.4x.png);
   }
 
   #menu-button {
     list-style-image: url(chrome://browser/skin/images/navbar-menu@1.4x.png);
   }
+
+  #close-button {
+    list-style-image: url(chrome://browser/skin/images/navbar-close@1.4x.png);
+  }
 }
 
 @media (min-resolution: @min_res_180pc@) {
   #download-progress {
     list-style-image: url(chrome://browser/skin/images/navbar-download@1.8x.png);
   }
 
   #pin-button {
@@ -817,28 +825,20 @@ documenttab[selected] .documenttab-selec
 
   #star-button {
     list-style-image: url(chrome://browser/skin/images/navbar-star@1.8x.png);
   }
 
   #menu-button {
     list-style-image: url(chrome://browser/skin/images/navbar-menu@1.8x.png);
   }
-}
 
-#close-button {
-  -moz-image-region: rect(0px, 480px, 40px, 440px);
-}
-
-#close-button:hover:not(:active) {
-  -moz-image-region: rect(40px, 480px, 80px, 440px);
-}
-
-#close-button:active {
-  -moz-image-region: rect(80px, 480px, 120px, 440px);
+  #close-button {
+    list-style-image: url(chrome://browser/skin/images/navbar-close@1.8x.png);
+  }
 }
 
 /* Panel UI ================================================================ */
 
 #panel-container {
   padding: 60px 40px;
 }
 
new file mode 100644
index 0000000000000000000000000000000000000000..c014e3cbee594ff90ab32a11163c436ff466843a
GIT binary patch
literal 3408
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
RxhwxTb_6Fp-|~3$zW_fk4b%Vt
new file mode 100644
index 0000000000000000000000000000000000000000..382c12d8ed801e3217a9c02bbfb731eee17d7c04
GIT binary patch
literal 4500
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%0A_omA73l*%K0DkQ+$f
z*mw{<tP1fsLEej~)h^NKvq=it@t=10p9sc^b{(^VEroxKabE>`cN>0Jbe>p)=fYAg
zn{N?RH;*G8a%$WMhEsM{KxQs;W1dxa1=NpYIZ-v}*45*IpLG=;8YUBmjLO@R1{O|j
zj_ik*?o4bA8%OMlF1rL`KPI~f$U%AcQO17NQ%a`QPuHzXrX7<k|BxH~)1>5nbt=)|
zQk5x2jaRT3Kwq3mSL&1X4k&A8cp7HN#sApL)kcI}E*2S<o{y~1XuHsJyxHw`knSmq
z>rXyLWe`yWhG&q#w?ikw%F}c0gTe5EE2#HDZSXF9y7i4)&ShLje(-oe{BA?#7!~97
z7f5kpPIoZrk&5qcM$5tD`U2h5H|u&1v5G<gcg@2N#8zp*dCU2J3my-{YB8b)<obVG
zc>m=!4`u4U+OsRiDLEU{x^Un@$-V-BOx*)ISE8=&4yJaugf}SKfj{94z+=2mx>e#|
z$=qu@3f^4E%X5)TyqVU6S7`CtmfC$YzWr2!5&H!YCph8>W;by{?w7-&GF>4_f<lR4
z-8@_%GPk5KdfwRbLh+l>(B0&@N-_cX{At9|5g?8CZH7mY4E%AJ=oC2`Fkd%U@H!{w
z+{%slS7$C{H!cAya=53za2^H`o{KSgGd~VBM}S8od_{|F?(afgPV}&OGb=?a{Y1@j
zSi3a{y>DM7sMZbKE|)7Vv&nzu?^Dpa_C0`j<)T<?gG$N9e-gWc4%Rm@KBxZ!jmr#&
new file mode 100644
index 0000000000000000000000000000000000000000..e8ab41b4671fe6f51eb9a1c4a8bb59a935379624
GIT binary patch
literal 5478
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
--- a/browser/metro/theme/jar.mn
+++ b/browser/metro/theme/jar.mn
@@ -26,16 +26,19 @@ chrome.jar:
 % override chrome://global/skin/about.css chrome://browser/skin/about.css
 % override chrome://global/skin/media/videocontrols.css chrome://browser/skin/touchcontrols.css
 % override chrome://global/skin/netError.css chrome://browser/skin/netError.css
 
   skin/images/panel-dark.png                (images/panel-dark.png)
   skin/images/navbar-back.png               (images/navbar-back.png)
   skin/images/navbar-back@1.4x.png          (images/navbar-back@1.4x.png)
   skin/images/navbar-back@1.8x.png          (images/navbar-back@1.8x.png)
+  skin/images/navbar-close.png              (images/navbar-close.png)
+  skin/images/navbar-close@1.4x.png         (images/navbar-close@1.4x.png)
+  skin/images/navbar-close@1.8x.png         (images/navbar-close@1.8x.png)
   skin/images/navbar-contextual-clear.png (images/navbar-contextual-clear.png)
   skin/images/navbar-contextual-clear@1.4x.png (images/navbar-contextual-clear@1.4x.png)
   skin/images/navbar-contextual-clear@1.8x.png (images/navbar-contextual-clear@1.8x.png)
   skin/images/navbar-contextual-delete.png (images/navbar-contextual-delete.png)
   skin/images/navbar-contextual-delete@1.4x.png (images/navbar-contextual-delete@1.4x.png)
   skin/images/navbar-contextual-delete@1.8x.png (images/navbar-contextual-delete@1.8x.png)
   skin/images/navbar-contextual-hide.png (images/navbar-contextual-hide.png)
   skin/images/navbar-contextual-hide@1.4x.png (images/navbar-contextual-hide@1.4x.png)
--- a/browser/themes/shared/devtools/common.css
+++ b/browser/themes/shared/devtools/common.css
@@ -197,16 +197,29 @@
 .devtools-tooltip-simple-text:first-child {
   margin-top: -4px;
 }
 
 .devtools-tooltip-simple-text:last-child {
   margin-bottom: -4px;
 }
 
+/* Tooltip: Alert Icon */
+
+.devtools-tooltip-alert-icon {
+  width: 32px;
+  height: 32px;
+  margin: 6px;
+  -moz-margin-end: 20px;
+}
+
+.devtools-tooltip-alert-icon {
+  list-style-image: url("chrome://global/skin/icons/warning-32.png");
+}
+
 /* Tooltip: Variables View */
 
 .devtools-tooltip-variables-view-box {
   margin: -4px; /* Compensate for the .panel-arrowcontent padding. */
 }
 
 /* Tooltip: Tiles */
 
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -1758,17 +1758,20 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ns
   }
 
   if (tmp->mListenerManager) {
     tmp->mListenerManager->Disconnect();
     NS_IMPL_CYCLE_COLLECTION_UNLINK(mListenerManager)
   }
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mLocalStorage)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mSessionStorage)
-  NS_IMPL_CYCLE_COLLECTION_UNLINK(mApplicationCache)
+  if (tmp->mApplicationCache) {
+    static_cast<nsDOMOfflineResourceList*>(tmp->mApplicationCache.get())->Disconnect();
+    NS_IMPL_CYCLE_COLLECTION_UNLINK(mApplicationCache)
+  }
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocumentPrincipal)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mDoc)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mIdleService)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mPendingStorageEvents)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mIdleObservers)
 
 #ifdef MOZ_GAMEPAD
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mGamepads)
--- a/dom/system/gonk/RadioInterfaceLayer.js
+++ b/dom/system/gonk/RadioInterfaceLayer.js
@@ -689,17 +689,37 @@ CdmaIccInfo.prototype = {
 
 function RadioInterfaceLayer() {
   gMessageManager.init(this);
   gRadioEnabledController.init(this);
 
   let options = {
     debug: debugPref,
     cellBroadcastDisabled: false,
-    clirMode: RIL.CLIR_DEFAULT
+    clirMode: RIL.CLIR_DEFAULT,
+    quirks: {
+      callstateExtraUint32:
+        libcutils.property_get("ro.moz.ril.callstate_extra_int", "false") === "true",
+      v5Legacy:
+        libcutils.property_get("ro.moz.ril.v5_legacy", "true") === "true",
+      requestUseDialEmergencyCall:
+        libcutils.property_get("ro.moz.ril.dial_emergency_call", "false") === "true",
+      simAppStateExtraFields:
+        libcutils.property_get("ro.moz.ril.simstate_extra_field", "false") === "true",
+      extraUint2ndCall:
+        libcutils.property_get("ro.moz.ril.extra_int_2nd_call", "false") == "true",
+      haveQueryIccLockRetryCount:
+        libcutils.property_get("ro.moz.ril.query_icc_count", "false") == "true",
+      sendStkProfileDownload:
+        libcutils.property_get("ro.moz.ril.send_stk_profile_dl", "false") == "true",
+      dataRegistrationOnDemand:
+        libcutils.property_get("ro.moz.ril.data_reg_on_demand", "false") == "true"
+    },
+    rilEmergencyNumbers: libcutils.property_get("ril.ecclist") ||
+                         libcutils.property_get("ro.ril.ecclist")
   };
 
   try {
     options.cellBroadcastDisabled =
       Services.prefs.getBoolPref(kPrefCellBroadcastDisabled);
   } catch(e) {}
 
   try {
@@ -1432,16 +1452,27 @@ RadioInterface.prototype = {
         return;
       case "broadcastsms-received":
       case "cellbroadcast-received":
         message.timestamp = Date.now();
         gMessageManager.sendCellBroadcastMessage("RIL:CellBroadcastReceived",
                                                  this.clientId, message);
         break;
       case "datacallstatechange":
+        message.ip = null;
+        message.netmask = null;
+        message.broadcast = null;
+        if (message.ipaddr) {
+          message.ip = message.ipaddr.split("/")[0];
+          let ip_value = netHelpers.stringToIP(message.ip);
+          let prefix_len = message.ipaddr.split("/")[1];
+          let mask_value = netHelpers.makeMask(prefix_len);
+          message.netmask = netHelpers.ipToString(mask_value);
+          message.broadcast = netHelpers.ipToString((ip_value & mask_value) + ~mask_value);
+        }
         this.handleDataCallState(message);
         break;
       case "datacalllist":
         this.handleDataCallList(message);
         break;
       case "nitzTime":
         this.handleNitzTime(message);
         break;
--- a/dom/system/gonk/ril_worker.js
+++ b/dom/system/gonk/ril_worker.js
@@ -33,31 +33,32 @@
  *
  * Note: The code below is purposely lean on abstractions to be as lean in
  * terms of object allocations. As a result, it may look more like C than
  * JavaScript, and that's intended.
  */
 
 "use strict";
 
-importScripts("ril_consts.js", "systemlibs.js");
+importScripts("ril_consts.js");
 importScripts("resource://gre/modules/workers/require.js");
 
 // set to true in ril_consts.js to see debug messages
 let DEBUG = DEBUG_WORKER;
 let CLIENT_ID = -1;
 let GLOBAL = this;
 
 if (!this.debug) {
   // Debugging stub that goes nowhere.
   this.debug = function debug(message) {
     dump("RIL Worker[" + CLIENT_ID + "]: " + message + "\n");
   };
 }
 
+let RIL_EMERGENCY_NUMBERS;
 const DEFAULT_EMERGENCY_NUMBERS = ["112", "911"];
 
 // Timeout value for emergency callback mode.
 const EMERGENCY_CB_MODE_TIMEOUT_MS = 300000;  // 5 mins = 300000 ms.
 
 const ICC_MAX_LINEAR_FIXED_RECORDS = 0xfe;
 
 // MMI match groups
@@ -69,33 +70,32 @@ const MMI_MATCH_GROUP_SIB = 7;
 const MMI_MATCH_GROUP_SIC = 9;
 const MMI_MATCH_GROUP_PWD_CONFIRM = 11;
 const MMI_MATCH_GROUP_DIALING_NUMBER = 12;
 
 const MMI_MAX_LENGTH_SHORT_CODE = 2;
 
 const MMI_END_OF_USSD = "#";
 
-let RILQUIRKS_CALLSTATE_EXTRA_UINT32 = libcutils.property_get("ro.moz.ril.callstate_extra_int", "false") === "true";
+let RILQUIRKS_CALLSTATE_EXTRA_UINT32;
 // This may change at runtime since in RIL v6 and later, we get the version
 // number via the UNSOLICITED_RIL_CONNECTED parcel.
-let RILQUIRKS_V5_LEGACY = libcutils.property_get("ro.moz.ril.v5_legacy", "true") === "true";
-let RILQUIRKS_REQUEST_USE_DIAL_EMERGENCY_CALL = libcutils.property_get("ro.moz.ril.dial_emergency_call", "false") === "true";
-let RILQUIRKS_SIM_APP_STATE_EXTRA_FIELDS = libcutils.property_get("ro.moz.ril.simstate_extra_field", "false") === "true";
+let RILQUIRKS_V5_LEGACY;
+let RILQUIRKS_REQUEST_USE_DIAL_EMERGENCY_CALL;
+let RILQUIRKS_SIM_APP_STATE_EXTRA_FIELDS;
 // Needed for call-waiting on Peak device
-let RILQUIRKS_EXTRA_UINT32_2ND_CALL = libcutils.property_get("ro.moz.ril.extra_int_2nd_call", "false") == "true";
+let RILQUIRKS_EXTRA_UINT32_2ND_CALL;
 // On the emulator we support querying the number of lock retries
-let RILQUIRKS_HAVE_QUERY_ICC_LOCK_RETRY_COUNT = libcutils.property_get("ro.moz.ril.query_icc_count", "false") == "true";
+let RILQUIRKS_HAVE_QUERY_ICC_LOCK_RETRY_COUNT;
 
 // Ril quirk to Send STK Profile Download
-let RILQUIRKS_SEND_STK_PROFILE_DOWNLOAD = libcutils.property_get("ro.moz.ril.send_stk_profile_dl", "false") == "true";
+let RILQUIRKS_SEND_STK_PROFILE_DOWNLOAD;
 
 // Ril quirk to attach data registration on demand.
-let RILQUIRKS_DATA_REGISTRATION_ON_DEMAND =
-  libcutils.property_get("ro.moz.ril.data_reg_on_demand", "false") == "true";
+let RILQUIRKS_DATA_REGISTRATION_ON_DEMAND;
 
 // Marker object.
 let PENDING_NETWORK_TYPE = {};
 
 let Buf = {
   __proto__: (function(){
     return require("resource://gre/modules/workers/worker_buf.js").Buf;
   })(),
@@ -106,39 +106,39 @@ let Buf = {
   init: function() {
     this._init();
 
     // This gets incremented each time we send out a parcel.
     this.mToken = 1;
 
     // Maps tokens we send out with requests to the request type, so that
     // when we get a response parcel back, we know what request it was for.
-    this.mTokenRequestMap = {};
+    this.mTokenRequestMap = new Map();
   },
 
   /**
    * Process one parcel.
    */
   processParcel: function() {
     let response_type = this.readInt32();
 
     let request_type, options;
     if (response_type == RESPONSE_TYPE_SOLICITED) {
       let token = this.readInt32();
       let error = this.readInt32();
 
-      options = this.mTokenRequestMap[token];
+      options = this.mTokenRequestMap.get(token);
       if (!options) {
         if (DEBUG) {
           debug("Suspicious uninvited request found: " + token + ". Ignored!");
         }
         return;
       }
 
-      delete this.mTokenRequestMap[token];
+      this.mTokenRequestMap.delete(token);
       request_type = options.rilRequestType;
 
       options.rilRequestError = error;
       if (DEBUG) {
         debug("Solicited response for request type " + request_type +
               ", token " + token + ", error " + error);
       }
     } else if (response_type == RESPONSE_TYPE_UNSOLICITED) {
@@ -169,17 +169,17 @@ let Buf = {
     this.writeInt32(type);
     this.writeInt32(this.mToken);
 
     if (!options) {
       options = {};
     }
     options.rilRequestType = type;
     options.rilRequestError = null;
-    this.mTokenRequestMap[this.mToken] = options;
+    this.mTokenRequestMap.set(this.mToken, options);
     this.mToken++;
     return this.mToken;
   },
 
   simpleRequest: function(type, options) {
     this.newParcel(type, options);
     this.sendParcel();
   },
@@ -2907,22 +2907,18 @@ let RIL = {
 
   /**
    * Check a given number against the list of emergency numbers provided by the RIL.
    *
    * @param number
    *        The number to look up.
    */
    _isEmergencyNumber: function(number) {
-     // Check read-write ecclist property first.
-     let numbers = libcutils.property_get("ril.ecclist");
-     if (!numbers) {
-       // Then read-only ecclist property since others RIL only uses this.
-       numbers = libcutils.property_get("ro.ril.ecclist");
-     }
+     // Check ril provided numbers first.
+     let numbers = RIL_EMERGENCY_NUMBERS;
 
      if (numbers) {
        numbers = numbers.split(",");
      } else {
        // No ecclist system property, so use our own list.
        numbers = DEFAULT_EMERGENCY_NUMBERS;
      }
 
@@ -3580,21 +3576,18 @@ let RIL = {
 
         if (newCall.state == CALL_STATE_INCOMING) {
           newCall.isOutgoing = false;
         } else if (newCall.state == CALL_STATE_DIALING) {
           newCall.isOutgoing = true;
         }
 
         // Set flag for outgoing emergency call.
-        if (newCall.isOutgoing && this._isEmergencyNumber(newCall.number)) {
-          newCall.isEmergency = true;
-        } else {
-          newCall.isEmergency = false;
-        }
+        newCall.isEmergency = newCall.isOutgoing &&
+                              this._isEmergencyNumber(newCall.number);
 
         // Add to our map.
         if (newCall.isMpty) {
           conferenceChanged = true;
           newCall.isConference = true;
           this.currentConference.participants[newCall.callIndex] = newCall;
         } else {
           newCall.isConference = false;
@@ -4957,16 +4950,26 @@ let RIL = {
     }
   },
 
   setInitialOptions: function(options) {
     DEBUG = DEBUG_WORKER || options.debug;
     CLIENT_ID = options.clientId;
     this.cellBroadcastDisabled = options.cellBroadcastDisabled;
     this.clirMode = options.clirMode;
+    RIL_EMERGENCY_NUMBERS = options.rilEmergencyNumbers;
+    let quirks = options.quirks;
+    RILQUIRKS_CALLSTATE_EXTRA_UINT32 = quirks.callstateExtraUint32;
+    RILQUIRKS_V5_LEGACY = quirks.v5Legacy;
+    RILQUIRKS_REQUEST_USE_DIAL_EMERGENCY_CALL = quirks.requestUseDialEmergencyCall;
+    RILQUIRKS_SIM_APP_STATE_EXTRA_FIELDS = quirks.simAppStateExtraFields;
+    RILQUIRKS_EXTRA_UINT32_2ND_CALL = quirks.extraUint2ndCall;
+    RILQUIRKS_HAVE_QUERY_ICC_LOCK_RETRY_COUNT = quirks.haveQueryIccLockRetryCount;
+    RILQUIRKS_SEND_STK_PROFILE_DOWNLOAD = quirks.sendStkProfileDownload;
+    RILQUIRKS_DATA_REGISTRATION_ON_DEMAND = quirks.dataRegistrationOnDemand;
   }
 };
 
 RIL.initRILState();
 
 RIL[REQUEST_GET_SIM_STATUS] = function(length, options) {
   if (options.rilRequestError) {
     return;
@@ -5785,29 +5788,29 @@ RIL[REQUEST_QUERY_CLIP] = function(lengt
         options.errorMsg = MMI_ERROR_KS_ERROR;
         break;
     }
   }
   this.sendChromeMessage(options);
 };
 RIL[REQUEST_LAST_DATA_CALL_FAIL_CAUSE] = null;
 
-RIL.readDataCall_v5 = function readDataCall_v5(options) {
+RIL.readDataCall_v5 = function(options) {
   if (!options) {
     options = {};
   }
   options.cid = Buf.readInt32().toString();
   options.active = Buf.readInt32(); // DATACALL_ACTIVE_*
   options.type = Buf.readString();
   options.apn = Buf.readString();
   options.address = Buf.readString();
   return options;
 };
 
-RIL.readDataCall_v6 = function readDataCall_v6(options) {
+RIL.readDataCall_v6 = function(options) {
   if (!options) {
     options = {};
   }
   options.status = Buf.readInt32();  // DATACALL_FAIL_*
   options.suggestedRetryTime = Buf.readInt32();
   options.cid = Buf.readInt32().toString();
   options.active = Buf.readInt32();  // DATACALL_ACTIVE_*
   options.type = Buf.readString();
@@ -5820,27 +5823,16 @@ RIL.readDataCall_v6 = function readDataC
   }
   //TODO for now we only support one address and gateway
   if (options.ipaddr) {
     options.ipaddr = options.ipaddr.split(" ")[0];
   }
   if (options.gw) {
     options.gw = options.gw.split(" ")[0];
   }
-  options.ip = null;
-  options.netmask = null;
-  options.broadcast = null;
-  if (options.ipaddr) {
-    options.ip = options.ipaddr.split("/")[0];
-    let ip_value = netHelpers.stringToIP(options.ip);
-    let prefix_len = options.ipaddr.split("/")[1];
-    let mask_value = netHelpers.makeMask(prefix_len);
-    options.netmask = netHelpers.ipToString(mask_value);
-    options.broadcast = netHelpers.ipToString((ip_value & mask_value) + ~mask_value);
-  }
   return options;
 };
 
 RIL[REQUEST_DATA_CALL_LIST] = function(length, options) {
   if (options.rilRequestError) {
     return;
   }
 
--- a/gfx/thebes/gfxAndroidPlatform.cpp
+++ b/gfx/thebes/gfxAndroidPlatform.cpp
@@ -139,16 +139,29 @@ gfxAndroidPlatform::CreateOffscreenSurfa
                                       gfxContentType contentType)
 {
     nsRefPtr<gfxASurface> newSurface;
     newSurface = new gfxImageSurface(size, OptimalFormatForContent(contentType));
 
     return newSurface.forget();
 }
 
+already_AddRefed<gfxASurface>
+gfxAndroidPlatform::OptimizeImage(gfxImageSurface *aSurface,
+                                  gfxImageFormat format)
+{
+    /* Android/Gonk have no special offscreen surfaces so we can avoid a copy */
+    if (OptimalFormatForContent(gfxASurface::ContentFromFormat(format)) ==
+        format) {
+        return nullptr;
+    }
+
+    return gfxPlatform::OptimizeImage(aSurface, format);
+}
+
 static bool
 IsJapaneseLocale()
 {
     static bool sInitialized = false;
     static bool sIsJapanese = false;
 
     if (!sInitialized) {
         sInitialized = true;
--- a/gfx/thebes/gfxAndroidPlatform.h
+++ b/gfx/thebes/gfxAndroidPlatform.h
@@ -30,16 +30,19 @@ public:
 
     static gfxAndroidPlatform *GetPlatform() {
         return (gfxAndroidPlatform*) gfxPlatform::GetPlatform();
     }
 
     virtual already_AddRefed<gfxASurface>
     CreateOffscreenSurface(const gfxIntSize& size,
                            gfxContentType contentType);
+    virtual already_AddRefed<gfxASurface>
+    OptimizeImage(gfxImageSurface *aSurface,
+                  gfxImageFormat format) MOZ_OVERRIDE;
     
     virtual gfxImageFormat GetOffscreenFormat() { return mOffscreenFormat; }
     
     mozilla::TemporaryRef<mozilla::gfx::ScaledFont>
       GetScaledFontForFont(mozilla::gfx::DrawTarget* aTarget, gfxFont *aFont);
 
     // to support IPC font list (sharing between chrome and content)
     void GetFontList(InfallibleTArray<FontListEntry>* retValue);
--- a/mobile/android/base/GeckoApp.java
+++ b/mobile/android/base/GeckoApp.java
@@ -2082,17 +2082,16 @@ public abstract class GeckoApp
         unregisterEventListener("Gecko:Ready");
         unregisterEventListener("Toast:Show");
         unregisterEventListener("DOMFullScreen:Start");
         unregisterEventListener("DOMFullScreen:Stop");
         unregisterEventListener("ToggleChrome:Hide");
         unregisterEventListener("ToggleChrome:Show");
         unregisterEventListener("ToggleChrome:Focus");
         unregisterEventListener("Permissions:Data");
-        unregisterEventListener("Tab:ViewportMetadata");
         unregisterEventListener("Session:StatePurged");
         unregisterEventListener("Bookmark:Insert");
         unregisterEventListener("Accessibility:Event");
         unregisterEventListener("Accessibility:Ready");
         unregisterEventListener("Shortcut:Remove");
         unregisterEventListener("WebApps:InstallApk");
         unregisterEventListener("WebApps:PreInstall");
         unregisterEventListener("WebApps:PostInstall");
@@ -2104,16 +2103,17 @@ public abstract class GeckoApp
         unregisterEventListener("Sanitize:ClearHistory");
         unregisterEventListener("Update:Check");
         unregisterEventListener("Update:Download");
         unregisterEventListener("Update:Install");
         unregisterEventListener("PrivateBrowsing:Data");
         unregisterEventListener("Contact:Add");
         unregisterEventListener("Intent:Open");
         unregisterEventListener("Intent:GetHandlers");
+        unregisterEventListener("Locale:Set");
 
         deleteTempFiles();
 
         if (mLayerView != null)
             mLayerView.destroy();
         if (mDoorHangerPopup != null)
             mDoorHangerPopup.destroy();
         if (mFormAssistPopup != null)
--- a/mobile/android/base/db/BrowserProvider.java
+++ b/mobile/android/base/db/BrowserProvider.java
@@ -1434,16 +1434,17 @@ public class BrowserProvider extends Con
             debug("Renaming bookmarks table to " + TABLE_BOOKMARKS_TMP);
             db.execSQL("ALTER TABLE " + TABLE_BOOKMARKS +
                        " RENAME TO " + TABLE_BOOKMARKS_TMP);
 
             debug("Dropping views and indexes related to " + TABLE_BOOKMARKS);
             db.execSQL("DROP VIEW IF EXISTS " + Obsolete.VIEW_BOOKMARKS_WITH_IMAGES);
 
             db.execSQL("DROP INDEX IF EXISTS bookmarks_url_index");
+            db.execSQL("DROP INDEX IF EXISTS bookmarks_type_deleted_index");
             db.execSQL("DROP INDEX IF EXISTS bookmarks_guid_index");
             db.execSQL("DROP INDEX IF EXISTS bookmarks_modified_index");
 
             createBookmarksTable(db);
             createBookmarksWithImagesView(db);
 
             createOrUpdateSpecialFolder(db, Bookmarks.PLACES_FOLDER_GUID,
                 R.string.bookmarks_folder_places, 0);
--- a/mobile/android/chrome/content/FindHelper.js
+++ b/mobile/android/chrome/content/FindHelper.js
@@ -60,18 +60,18 @@ var FindHelper = {
     this._finder.removeSelection();
     this._finder.removeResultListener(this);
     this._finder = null;
     this._targetTab = null;
     this._initialViewport = null;
     this._viewportChanged = false;
   },
 
-  onFindResult: function(aResult, aFindBackwards, aLinkURL) {
-    if (aResult == Ci.nsITypeAheadFind.FIND_NOTFOUND) {
+  onFindResult: function(aData) {
+    if (aData.result == Ci.nsITypeAheadFind.FIND_NOTFOUND) {
       if (this._viewportChanged) {
         if (this._targetTab != BrowserApp.selectedTab) {
           // this should never happen
           Cu.reportError("Warning: selected tab changed during find!");
           // fall through and restore viewport on the initial tab anyway
         }
         this._targetTab.setViewport(JSON.parse(this._initialViewport));
         this._targetTab.sendViewportUpdate();
--- a/toolkit/content/tests/browser/browser_findbar.js
+++ b/toolkit/content/tests/browser/browser_findbar.js
@@ -66,19 +66,19 @@ function promiseFindFinished(searchText,
   findbar.startFind(findbar.FIND_NORMAL);
   let highlightElement = findbar.getElement("highlight");
   if (highlightElement.checked != highlightOn)
     highlightElement.click();
   executeSoon(() => {
     findbar._findField.value = searchText;
 
     let resultListener;
-    let findTimeout = setTimeout(() => foundOrTimedout(true), 2000);
-    let foundOrTimedout = function(timedOut) {
-      if (timedOut)
+    let findTimeout = setTimeout(() => foundOrTimedout(null), 2000);
+    let foundOrTimedout = function(aData) {
+      if (aData === null)
         info("Result listener not called, timeout reached.");
       clearTimeout(findTimeout);
       findbar.browser.finder.removeResultListener(resultListener);
       deferred.resolve();
     }
 
     resultListener = {
       onFindResult: foundOrTimedout
--- a/toolkit/content/widgets/findbar.xml
+++ b/toolkit/content/widgets/findbar.xml
@@ -1121,25 +1121,23 @@
         -   If the search was done from the bottom to
         -   the top. This is used for right error messages
         -   when reaching "the end of the page".
         - @param aLinkURL
         -   When a link matched then its URK. Always null
         -   when not in FIND_LINKS mode.
         -->
       <method name="onFindResult">
-        <parameter name="aResult"/>
-        <parameter name="aFindBackwards"/>
-        <parameter name="aLinkURL" />
+        <parameter name="aData"/>
         <body><![CDATA[
-          this._updateStatusUI(aResult, aFindBackwards);
-          this._updateStatusUIBar(aLinkURL);
+          this._updateStatusUI(aData.result, aData.findBackwards);
+          this._updateStatusUIBar(aData.linkURL);
 
-          if (aResult == this.nsITypeAheadFind.FIND_NOTFOUND)
-            this._findFailedString = this.browser.finder.searchString;
+          if (aData.result == this.nsITypeAheadFind.FIND_NOTFOUND)
+            this._findFailedString = aData.searchString;
           else
             this._findFailedString = null;
 
           if (this._findMode != this.FIND_NORMAL && !this.hidden)
             this._setFindCloseTimeout();
         ]]></body>
       </method>
 
--- a/toolkit/devtools/server/actors/highlighter.js
+++ b/toolkit/devtools/server/actors/highlighter.js
@@ -159,16 +159,17 @@ let HighlighterActor = protocol.ActorCla
       let res = this._findAndAttachElement(event);
       if (this._hoveredNode !== res.node) {
         this._boxModelHighlighter.show(res.node.rawNode);
         events.emit(this._walker, "picker-node-hovered", res);
         this._hoveredNode = res.node;
       }
     };
 
+    this._tabActor.window.focus();
     this._startPickerListeners();
 
     return null;
   }),
 
   _findAndAttachElement: function(event) {
     let doc = event.target.ownerDocument;
 
@@ -440,17 +441,16 @@ BoxModelHighlighter.prototype = {
    */
   hide: function() {
     if (this.currentNode) {
       this._untrackMutations();
       this.currentNode = null;
       this._hideOutline();
       this._hideInfobar();
       this._detachPageListeners();
-      this.chromeWin.focus();
     }
   },
 
   /**
    * Hide the infobar
    */
   _hideInfobar: function() {
     this.nodeInfo.positioner.setAttribute("force-transitions", "true");
--- a/toolkit/modules/Finder.jsm
+++ b/toolkit/modules/Finder.jsm
@@ -51,20 +51,26 @@ Finder.prototype = {
       if (!this._textToSubURIService) {
         this._textToSubURIService = Cc["@mozilla.org/intl/texttosuburi;1"]
                                       .getService(Ci.nsITextToSubURI);
       }
 
       linkURL = this._textToSubURIService.unEscapeURIForUI(docCharset, foundLink.href);
     }
 
-    let rect = this._getResultRect();
+    let data = {
+      result: aResult,
+      findBackwards: aFindBackwards,
+      linkURL: linkURL,
+      rect: this._getResultRect(),
+      searchString: this._searchString,
+    };
 
     for (let l of this._listeners) {
-      l.onFindResult(aResult, aFindBackwards, linkURL, rect);
+      l.onFindResult(data);
     }
   },
 
   get searchString() {
     return this._searchString;
   },
 
   set caseSensitive(aSensitive) {
--- a/toolkit/modules/RemoteFinder.jsm
+++ b/toolkit/modules/RemoteFinder.jsm
@@ -29,18 +29,17 @@ RemoteFinder.prototype = {
   removeResultListener: function (aListener) {
     this._listeners = this._listeners.filter(l => l != aListener);
   },
 
   receiveMessage: function (aMessage) {
     this._searchString = aMessage.data.searchString;
 
     for (let l of this._listeners) {
-      l.onFindResult(aMessage.data.result, aMessage.data.findBackwards,
-                     aMessage.data.linkURL, aMessage.data.rect);
+      l.onFindResult(aMessage.data);
     }
   },
 
   get searchString() {
     return this._searchString;
   },
 
   set caseSensitive(aSensitive) {
@@ -103,24 +102,18 @@ RemoteFinderListener.prototype = {
     "Finder:FindAgain",
     "Finder:Highlight",
     "Finder:EnableSelection",
     "Finder:RemoveSelection",
     "Finder:FocusContent",
     "Finder:KeyPress"
   ],
 
-  onFindResult: function (aResult, aFindBackwards, aLinkURL, aRect) {
-    this._global.sendAsyncMessage("Finder:Result", {
-      result: aResult,
-      findBackwards: aFindBackwards,
-      linkURL: aLinkURL,
-      rect: aRect,
-      searchString: this._finder.searchString,
-    });
+  onFindResult: function (aData) {
+    this._global.sendAsyncMessage("Finder:Result", aData);
   },
 
   //XXXmikedeboer-20131016: implement |shouldFocusContent| here to mitigate
   //                        issues like bug 921338 and bug 921308.
   shouldFocusContent: function () {
     return true;
   },
 
--- a/toolkit/modules/tests/browser/browser_Finder.js
+++ b/toolkit/modules/tests/browser/browser_Finder.js
@@ -29,24 +29,24 @@ function startTests () {
   let finder = browser.finder;
   let listener = {
     onFindResult: function () {
       ok(false, "callback wasn't replaced");
     }
   };
   finder.addResultListener(listener);
 
-  listener.onFindResult = function (result) {
+  listener.onFindResult = function ({result}) {
     ok(result == Ci.nsITypeAheadFind.FIND_FOUND, "should find string");
 
-    listener.onFindResult = function (result) {
+    listener.onFindResult = function ({result}) {
       ok(result == Ci.nsITypeAheadFind.FIND_NOTFOUND, "should not find string");
 
       let first = true;
-      listener.onFindResult = function (result) {
+      listener.onFindResult = function ({result}) {
         ok(result == Ci.nsITypeAheadFind.FIND_FOUND, "should find link");
 
         browser.messageManager.addMessageListener("OutlineTest", function f(aMessage) {
           browser.messageManager.removeMessageListener("OutlineTest", f);
 
 
           if (first) {
             ok(aMessage.data.ok, "content script should send okay");