Bug 541656 - Display hyperlink URLs at bottom of window (instead of right side of location bar). r=gavin a=b
authorDão Gottwald <dao@mozilla.com>
Thu, 03 Feb 2011 07:48:39 +0100
changeset 61827 d384e2adf22e4c1382bae2a827f55436d68ac2d9
parent 61826 ec65b5c5f68a74841ed43a6be7c937664a51fca9
child 61828 7961753fcc67b2b78b1c747baf3a213a9e5d0f0e
push id18512
push userdgottwald@mozilla.com
push dateThu, 03 Feb 2011 06:49:10 +0000
treeherdermozilla-central@d384e2adf22e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgavin, b
bugs541656
milestone2.0b12pre
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
Bug 541656 - Display hyperlink URLs at bottom of window (instead of right side of location bar). r=gavin a=b
browser/base/content/browser.css
browser/base/content/browser.js
browser/base/content/test/Makefile.in
browser/base/content/test/browser_overLinkInLocationBar.js
browser/base/content/urlbarBindings.xml
browser/themes/gnomestripe/browser/browser.css
browser/themes/gnomestripe/browser/jar.mn
browser/themes/gnomestripe/browser/urlbar-over-link-arrow-rtl.png
browser/themes/gnomestripe/browser/urlbar-over-link-arrow.png
browser/themes/pinstripe/browser/browser.css
browser/themes/pinstripe/browser/jar.mn
browser/themes/pinstripe/browser/urlbar-over-link-arrow-rtl.png
browser/themes/pinstripe/browser/urlbar-over-link-arrow.png
browser/themes/winstripe/browser/browser.css
browser/themes/winstripe/browser/jar.mn
browser/themes/winstripe/browser/urlbar-over-link-arrow-rtl.png
browser/themes/winstripe/browser/urlbar-over-link-arrow.png
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -205,82 +205,16 @@ splitmenu {
 .uri-element-right-align:-moz-locale-dir(rtl),
 html|input.uri-element-right-align:-moz-locale-dir(rtl),
 .ac-url-text:-moz-locale-dir(rtl),
 .ac-title:-moz-locale-dir(rtl) > description {
   direction: ltr !important;
   text-align: right !important;
 }
 
-.urlbar-over-link-box:-moz-locale-dir(rtl) {
-  -moz-box-direction: reverse;
-}
-
-/* over-link in location bar */
-
-.urlbar-textbox-container[overlinkstate="fade-in"],
-.urlbar-over-link-layer[overlinkstate="fade-out"] {
-  -moz-transition-property: color;
-  -moz-transition-duration: 150ms;
-  color: transparent;
-}
-
-.urlbar-over-link-layer[overlinkstate="fade-in"],
-.urlbar-textbox-container[overlinkstate="fade-out"] {
-  -moz-transition-property: color;
-  -moz-transition-duration: 150ms;
-  -moz-transition-timing-function: cubic-bezier(0.0, 1.0, 1.0, 1.0);
-}
-
-.urlbar-over-link-box[overlinkstate="fade-in"] {
-  -moz-transition-property: opacity;
-  -moz-transition-duration: 150ms;
-  opacity: 1;
-}
-
-.urlbar-over-link-box[overlinkstate="fade-out"] {
-  -moz-transition-property: opacity;
-  -moz-transition-duration: 150ms;
-  -moz-transition-timing-function: cubic-bezier(0.0, 1.0, 1.0, 1.0);
-  opacity: 0;
-}
-
-.urlbar-textbox-container-children[overlinkstate="fade-in"] {
-  -moz-transition-property: opacity;
-  -moz-transition-duration: 150ms;
-  opacity: 0;
-}
-
-.urlbar-textbox-container-children[overlinkstate="fade-out"] {
-  -moz-transition-property: opacity;
-  -moz-transition-duration: 150ms;
-  -moz-transition-timing-function: cubic-bezier(0.0, 1.0, 1.0, 1.0);
-  opacity: 1;
-}
-
-.urlbar-textbox-container[overlinkstate="showing"] {
-  color: transparent;
-}
-
-.urlbar-over-link-box[overlinkstate="showing"] {
-  opacity: 1;
-}
-
-.urlbar-textbox-container-children[overlinkstate="showing"] {
-  opacity: 0;
-}
-
-.urlbar-over-link-layer:not([overlinkstate]) {
-  color: transparent;
-}
-
-.urlbar-over-link-box:not([overlinkstate]) {
-  opacity: 0;
-}
-
 /* For results that are actions, their description text is shown instead of
    the URL - this needs to follow the locale's direction, unlike URLs. */
 panel:not([noactions]) > richlistbox > richlistitem[type~="action"]:-moz-locale-dir(rtl) > .ac-url-box {
   direction: rtl;
 }
 
 panel[noactions] > richlistbox > richlistitem[type~="action"] > .ac-url-box > .ac-url > .ac-action-text,
 panel[noactions] > richlistbox > richlistitem[type~="action"] > .ac-url-box > .ac-action-icon {
@@ -521,24 +455,27 @@ browser[tabmodalPromptShowing] {
 
 /* Status panel */
 
 statuspanel {
   -moz-binding: url("chrome://browser/content/tabbrowser.xml#statuspanel");
   position: fixed;
   margin-top: -3em;
   left: 0;
+  max-width: 50%;
+  -moz-transition: opacity 100ms ease-out;
 }
 
 statuspanel:-moz-locale-dir(ltr)[mirror],
 statuspanel:-moz-locale-dir(rtl):not([mirror]) {
   left: auto;
   right: 0;
 }
 
 statuspanel[label=""] {
-  visibility: collapse;
+  opacity: 0;
+  pointer-events: none;
 }
 
 .statuspanel-inner {
   height: 3em;
   -moz-box-align: end;
 }
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -4017,16 +4017,17 @@ function mimeTypeIsTextBased(aMimeType)
 }
 
 var XULBrowserWindow = {
   // Stored Status, Link and Loading values
   status: "",
   defaultStatus: "",
   jsStatus: "",
   jsDefaultStatus: "",
+  overLink: "",
   startTime: 0,
   statusText: "",
   isBusy: false,
   inContentWhitelist: ["about:addons"],
 
   QueryInterface: function (aIID) {
     if (aIID.equals(Ci.nsIWebProgressListener) ||
         aIID.equals(Ci.nsIWebProgressListener2) ||
@@ -4089,28 +4090,27 @@ var XULBrowserWindow = {
   },
 
   setDefaultStatus: function (status) {
     this.defaultStatus = status;
     this.updateStatusField();
   },
 
   setOverLink: function (url, anchorElt) {
-    if (gURLBar) {
-      // Encode bidirectional formatting characters.
-      // (RFC 3987 sections 3.2 and 4.1 paragraph 6)
-      url = url.replace(/[\u200e\u200f\u202a\u202b\u202c\u202d\u202e]/g,
-                        encodeURIComponent);
-      gURLBar.setOverLink(url);
-    }
-  }, 
+    // Encode bidirectional formatting characters.
+    // (RFC 3987 sections 3.2 and 4.1 paragraph 6)
+    this.overLink = url.replace(/[\u200e\u200f\u202a\u202b\u202c\u202d\u202e]/g,
+                                encodeURIComponent)
+                       .replace(/^http:\/\//, "");
+    LinkTargetDisplay.update();
+  },
 
   updateStatusField: function () {
-    var text;
-    if (this._busyUI)
+    var text = this.overLink;
+    if (!text && this._busyUI)
       text = this.status;
     if (!text)
       text = this.jsStatus || this.jsDefaultStatus || this.defaultStatus;
 
     // check the current value so we don't trigger an attribute change
     // and cause needless (slow!) UI updates
     if (this.statusText != text) {
       this.statusTextField.label = text;
@@ -4537,16 +4537,68 @@ var XULBrowserWindow = {
     var notification = Components.isSuccessCode(aStatus) ? "EndDocumentLoad" : "FailDocumentLoad";
     try {
       Services.obs.notifyObservers(content, notification, urlStr);
     } catch (e) {
     }
   }
 };
 
+var LinkTargetDisplay = {
+  DELAY_SHOW: 70,
+  DELAY_HIDE: 150,
+  _timer: 0,
+
+  get _isVisible () XULBrowserWindow.statusTextField.label != "",
+
+  update: function () {
+    clearTimeout(this._timer);
+    window.removeEventListener("mousemove", this, true);
+
+    if (!XULBrowserWindow.overLink) {
+      if (XULBrowserWindow.hideOverLinkImmediately)
+        this._hide();
+      else
+        this._timer = setTimeout(this._hide.bind(this), this.DELAY_HIDE);
+      return;
+    }
+
+    if (this._isVisible) {
+      XULBrowserWindow.updateStatusField();
+    } else {
+      // Let the display appear when the mouse doesn't move within the delay
+      this._showDelayed();
+      window.addEventListener("mousemove", this, true);
+    }
+  },
+
+  handleEvent: function (event) {
+    switch (event.type) {
+      case "mousemove":
+        // Restart the delay since the mouse was moved
+        clearTimeout(this._timer);
+        this._showDelayed();
+        break;
+    }
+  },
+
+  _showDelayed: function () {
+    this._timer = setTimeout(function (self) {
+      XULBrowserWindow.updateStatusField();
+      window.removeEventListener("mousemove", self, true);
+    }, this.DELAY_SHOW, this);
+  },
+
+  _hide: function () {
+    clearTimeout(this._timer);
+
+    XULBrowserWindow.updateStatusField();
+  }
+};
+
 var CombinedStopReload = {
   init: function () {
     if (this._initialized)
       return;
 
     var urlbar = document.getElementById("urlbar-container");
     var reload = document.getElementById("reload-button");
     var stop = document.getElementById("stop-button");
--- a/browser/base/content/test/Makefile.in
+++ b/browser/base/content/test/Makefile.in
@@ -227,17 +227,16 @@ endif
                  plugin_both.html \
                  plugin_both2.html \
                  alltabslistener.html \
                  zoom_test.html \
                  dummy_page.html \
                  browser_tabMatchesInAwesomebar.js \
                  file_bug550565_popup.html \
                  file_bug550565_favicon.ico \
-                 browser_overLinkInLocationBar.js \
                  browser_aboutHome.js \
                  app_bug575561.html \
                  app_subframe_bug575561.html \
                  browser_contentAreaClick.js \
                  browser_addon_bar_close_button.js \
                  browser_addon_bar_shortcut.js \
                  $(NULL)
 
deleted file mode 100644
--- a/browser/base/content/test/browser_overLinkInLocationBar.js
+++ /dev/null
@@ -1,264 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is browser test code.
- *
- * The Initial Developer of the Original Code is
- * the Mozilla Foundation.
- * Portions created by the Initial Developer are Copyright (C) 2010
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Drew Willcoxon <adw@mozilla.com> (Original Author)
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-/**
- * This tests the "over-link" that appears in the location bar when the user
- * mouses over a link.  See bug 587908.
- */
-
-var gTestIter;
-
-// TESTS //////////////////////////////////////////////////////////////////////
-
-let gTests = [
-
-  function smokeTestGenerator() {
-    // Make sure the location bar is not focused.
-    gBrowser.contentWindow.focus();
-
-    if (ensureOverLinkHidden())
-      yield;
-
-    setOverLinkWait("http://example.com/");
-    yield;
-    checkURLBar(true);
-
-    setOverLinkWait("");
-    yield;
-    checkURLBar(false);
-  },
-
-  function hostPathLabels() {
-    updateOverLink("http://example.com/");
-    hostLabelIs("http://example.com/");
-    pathLabelIs("");
-
-    updateOverLink("http://example.com/foo");
-    hostLabelIs("http://example.com/");
-    pathLabelIs("foo");
-
-    updateOverLink("javascript:popup('http://example.com/')");
-    hostLabelIs("");
-    pathLabelIs("javascript:popup('http://example.com/')");
-
-    updateOverLink("javascript:popup('http://example.com/foo')");
-    hostLabelIs("");
-    pathLabelIs("javascript:popup('http://example.com/foo')");
-
-    updateOverLink("about:home");
-    hostLabelIs("");
-    pathLabelIs("about:home");
-  }
-
-];
-
-function test() {
-  waitForExplicitFinish();
-  runNextTest();
-}
-
-function runNextTest() {
-  let nextTest = gTests.shift();
-  if (nextTest) {
-    dump("Running next test: " + nextTest.name + "\n");
-    gTestIter = nextTest();
-
-    // If the test is a generator, advance it.  Otherwise, we just ran the test.
-    if (gTestIter)
-      cont();
-    else
-      runNextTest();
-  }
-  else
-    finish();
-}
-
-// HELPERS ////////////////////////////////////////////////////////////////////
-
-/**
- * Advances the test iterator.  When all iterations have completed, the entire
- * suite is finish()ed.
- */
-function cont() {
-  try {
-    gTestIter.next();
-  }
-  catch (err if err instanceof StopIteration) {
-    runNextTest();
-  }
-  catch (err) {
-    // Depending on who calls us, sometimes exceptions are eaten by event
-    // handlers...  Make sure we fail.
-    ok(false, "Exception: " + err);
-    throw err;
-  }
-}
-
-/**
- * Asserts that the location bar looks like it should.
- *
- * @param shouldShowOverLink
- *        True if you expect the over-link to be showing and false otherwise.
- */
-function checkURLBar(shouldShowOverLink) {
-  let overLink = window.getComputedStyle(gURLBar._overLinkBox, null);
-  let origin = window.getComputedStyle(gURLBar._originLabel, null);
-  let editLayer = window.getComputedStyle(gURLBar._textboxContainer, null);
-  if (shouldShowOverLink) {
-    isnot(origin.color, "transparent",
-          "Origin color in over-link layer should not be transparent");
-    is(overLink.opacity, 1, "Over-link should be opaque");
-    is(editLayer.color, "transparent",
-       "Edit layer color should be transparent");
-  }
-  else {
-    is(origin.color, "transparent",
-       "Origin color in over-link layer should be transparent");
-    is(overLink.opacity, 0, "Over-link should be transparent");
-    isnot(editLayer.color, "transparent",
-          "Edit layer color should not be transparent");
-  }
-}
-
-/**
- * Sets the over-link.  This assumes that str will cause the over-link to fade
- * in or out.  When its transition has finished, the test iterator is
- * incremented, so you should yield after calling.
- *
- * @param str
- *        The over-link will be set to this string or cleared if this is falsey.
- */
-function setOverLinkWait(str) {
-  dump("Setting over-link and waiting: " + str + "\n");
-
-  let overLink = gURLBar._overLinkBox;
-  let opacity = window.getComputedStyle(overLink, null).opacity;
-  dump("Opacity is " + opacity + "\n");
-
-  ok(str || opacity != 0,
-     "Test assumption: either showing or if hiding, not already hidden");
-  ok(!str || opacity != 1,
-     "Test assumption: either hiding or if showing, not already shown");
-
-  overLink.addEventListener("transitionend", function onTrans(event) {
-    dump("transitionend received: " + (event.target == overLink) + " " +
-         event.propertyName + "\n");
-    if (event.target == overLink && event.propertyName == "opacity") {
-      dump("target transitionend received\n");
-      overLink.removeEventListener("transitionend", onTrans, false);
-      cont();
-    }
-  }, false);
-  gURLBar.setOverLink(str);
-}
-
-/**
- * Sets the over-link but unlike setOverLinkWait does not assume that a
- * transition will occur and therefore does not wait.
- *
- * @param str
- *        The over-link will be set to this string or cleared if this is falsey.
- */
-function setOverLink(str) {
-  dump("Setting over-link but not waiting: " + str + "\n");
-
-  let overLink = gURLBar._overLinkBox;
-  let opacity = window.getComputedStyle(overLink, null).opacity;
-  dump("Opacity is " + opacity + "\n");
-
-  ok(str || opacity == 0,
-     "Test assumption: either showing or if hiding, already hidden");
-  ok(!str || opacity == 1,
-     "Test assumption: either hiding or if showing, already shown");
-
-  gURLBar.setOverLink(str);
-}
-
-/**
- * Calls gURLBar._updateOverLink(str), which updates the over-link but does not
- * change its visibility.
- *
- * @param str
- *        The over-link will be set to this string.  Note that setting this to
- *        falsey doesn't make sense for this function.
- */
-function updateOverLink(str) {
-  gURLBar._updateOverLink(str);
-}
-
-/**
- * If the over-link is hidden, returns false.  Otherwise, hides the overlink and
- * returns true.  When the overlink is hidden, the test iterator is incremented,
- * so if this function returns true, you should yield after calling.
- *
- * @return True if you should yield and calling and false if not.
- */
-function ensureOverLinkHidden() {
-  dump("Ensuring over-link is hidden" + "\n");
-
-  let overLink = gURLBar._overLinkBox;
-  let opacity = window.getComputedStyle(overLink, null).opacity;
-  dump("Opacity is " + opacity + "\n");
-
-  if (opacity == 0)
-    return false;
-
-  setOverLinkWait("");
-  return true;
-}
-
-/**
- * Asserts that the over-link host label is a given string.
- *
- * @param str
- *        The host label should be this string.
- */
-function hostLabelIs(str) {
-  let host = gURLBar._overLinkHostLabel;
-  is(host.value, str, "Over-link host label should be correct");
-}
-
-/**
- * Asserts that the over-link path label is a given string.
- *
- * @param str
- *        The path label should be this string.
- */
-function pathLabelIs(str) {
-  let path = gURLBar._overLinkPathLabel;
-  is(path.value, str, "Over-link path label should be correct");
-}
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -47,63 +47,39 @@
 <bindings id="urlbarBindings" xmlns="http://www.mozilla.org/xbl"
           xmlns:html="http://www.w3.org/1999/xhtml"
           xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
           xmlns:xbl="http://www.mozilla.org/xbl">
 
   <binding id="urlbar" extends="chrome://global/content/bindings/autocomplete.xml#autocomplete">
 
     <content sizetopopup="pref">
-      <xul:hbox class="urlbar-frontcap-and-textbox" flex="1">
-        <xul:hbox class="urlbar-frontcap">
-          <children includes="image|deck|stack|box">
-            <xul:image class="autocomplete-icon" allowevents="true"/>
-          </children>
+      <children includes="image|deck|stack|box">
+        <xul:image class="autocomplete-icon" allowevents="true"/>
+      </children>
+      <xul:hbox anonid="textbox-container"
+                class="autocomplete-textbox-container urlbar-textbox-container"
+                flex="1" xbl:inherits="focused">
+        <xul:hbox anonid="textbox-input-box"
+                  class="textbox-input-box urlbar-input-box"
+                  flex="1" xbl:inherits="tooltiptext=inputtooltiptext">
+          <children/>
+          <html:input anonid="input"
+                      class="autocomplete-textbox urlbar-input textbox-input uri-element-right-align"
+                      flex="1" allowevents="true"
+                      xbl:inherits="tooltiptext=inputtooltiptext,onfocus,onblur,value,type,maxlength,disabled,size,readonly,placeholder,tabindex,accesskey"/>
         </xul:hbox>
-        <xul:stack anonid="stack" class="urlbar-stack" flex="1">
-          <xul:scrollbox class="urlbar-over-link-layer" flex="1"
-                         xbl:inherits="overlinkstate" align="center">
-            <xul:label anonid="origin-label" class="urlbar-origin-label" flex="1"
-                       crop="end"/>
-            <xul:hbox anonid="over-link-box" class="urlbar-over-link-box"
-                      xbl:inherits="overlinkstate" align="center">
-              <xul:label anonid="over-link-host-label"
-                         class="urlbar-over-link-host-label uri-element-right-align"/>
-              <xul:label anonid="over-link-path-label"
-                         class="urlbar-over-link-path-label uri-element-right-align" flex="1"/>
-            </xul:hbox>
-          </xul:scrollbox>
-          <xul:hbox anonid="textbox-container"
-                    class="autocomplete-textbox-container urlbar-textbox-container"
-                    flex="1" xbl:inherits="focused,overlinkstate">
-            <xul:hbox anonid="textbox-input-box"
-                      class="textbox-input-box urlbar-input-box"
-                      flex="1" xbl:inherits="tooltiptext=inputtooltiptext">
-              <xul:hbox class="urlbar-textbox-container-children"
-                        xbl:inherits="overlinkstate">
-                <children/>
-              </xul:hbox>
-              <html:input anonid="input"
-                          class="autocomplete-textbox urlbar-input textbox-input uri-element-right-align"
-                          flex="1" allowevents="true"
-                          xbl:inherits="tooltiptext=inputtooltiptext,onfocus,onblur,value,type,maxlength,disabled,size,readonly,placeholder,tabindex,accesskey"/>
-            </xul:hbox>
-            <xul:hbox class="urlbar-textbox-container-children"
-                      xbl:inherits="overlinkstate">
-              <children includes="hbox"/>
-            </xul:hbox>
-          </xul:hbox>
-        </xul:stack>
-        <xul:dropmarker anonid="historydropmarker"
-                        class="autocomplete-history-dropmarker urlbar-history-dropmarker"
-                        allowevents="true"
-                        xbl:inherits="open,enablehistory,parentfocused=focused"/>
-        <xul:popupset anonid="popupset"
-                      class="autocomplete-result-popupset"/>
+        <children includes="hbox"/>
       </xul:hbox>
+      <xul:dropmarker anonid="historydropmarker"
+                      class="autocomplete-history-dropmarker urlbar-history-dropmarker"
+                      allowevents="true"
+                      xbl:inherits="open,enablehistory,parentfocused=focused"/>
+      <xul:popupset anonid="popupset"
+                    class="autocomplete-result-popupset"/>
       <children includes="toolbarbutton"/>
     </content>
 
     <implementation implements="nsIObserver, nsIDOMEventListener">
       <constructor><![CDATA[
         this._prefs = Components.classes["@mozilla.org/preferences-service;1"]
                                 .getService(Components.interfaces.nsIPrefService)
                                 .getBranch("browser.urlbar.")
@@ -118,17 +94,16 @@
         this._urlTooltip = document.getElementById("urlTooltip");
 
         this.inputField.controllers.insertControllerAt(0, this._copyCutController);
         this.inputField.addEventListener("mousedown", this, false);
         this.inputField.addEventListener("mousemove", this, false);
         this.inputField.addEventListener("mouseout", this, false);
         this.inputField.addEventListener("overflow", this, false);
         this.inputField.addEventListener("underflow", this, false);
-        this._overLinkBox.addEventListener("transitionend", this, false);
 
         const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
         var textBox = document.getAnonymousElementByAttribute(this,
                                                 "anonid", "textbox-input-box");
         var cxmenu = document.getAnonymousElementByAttribute(textBox,
                                             "anonid", "input-box-contextmenu");
         var pasteAndGo;
         cxmenu.addEventListener("popupshowing", function() {
@@ -162,17 +137,16 @@
         this._prefs.removeObserver("", this);
         this._prefs = null;
         this.inputField.controllers.removeController(this._copyCutController);
         this.inputField.removeEventListener("mousedown", this, false);
         this.inputField.removeEventListener("mousemove", this, false);
         this.inputField.removeEventListener("mouseout", this, false);
         this.inputField.removeEventListener("overflow", this, false);
         this.inputField.removeEventListener("underflow", this, false);
-        this._overLinkBox.removeEventListener("transitionend", this, false);
       ]]></destructor>
 
       <field name="_value"></field>
 
       <!--
         onBeforeValueGet is called by the base-binding's .value getter.
         It can return an object with a "value" property, to override the
         return value of the getter.
@@ -187,17 +161,16 @@
 
       <!--
         onBeforeValueSet is called by the base-binding's .value setter.
         It should return the value that the setter should use.
       -->
       <method name="onBeforeValueSet">
         <parameter name="aValue"/>
         <body><![CDATA[
-          this._hideOverLink();
           this._value = aValue;
           var returnValue = aValue;
           var action = this._parseActionUrl(aValue);
           if (action) {
             returnValue = action.param;
             this.setAttribute("actiontype", action.type);
           } else {
             this.removeAttribute("actiontype");
@@ -545,22 +518,16 @@
               break;
             case "overflow":
               this._contentIsCropped = true;
               break;
             case "underflow":
               this._contentIsCropped = false;
               this._hideURLTooltip();
               break;
-            case "transitionend":
-              if (aEvent.target == this._overLinkBox &&
-                  aEvent.propertyName == "opacity") {
-                this._overLinkTransitioning = false;
-              }
-              break;
           }
         ]]></body>
       </method>
 
       <property name="textValue"
                 onget="return this.value;">
         <setter>
           <![CDATA[
@@ -589,210 +556,16 @@
             return null;
 
           // url is in the format moz-action:ACTION,PARAM
           let [, action, param] = aUrl.match(/^moz-action:([^,]+),(.*)$/);
           return {type: action, param: param};
         ]]></body>
       </method>
 
-      <field name="_stack" readonly="true"><![CDATA[
-        document.getAnonymousElementByAttribute(this, "anonid", "stack");
-      ]]></field>
-
-      <field name="_originLabel" readonly="true"><![CDATA[
-        document.getAnonymousElementByAttribute(this, "anonid", "origin-label");
-      ]]></field>
-
-      <field name="_overLinkBox" readonly="true"><![CDATA[
-        document.getAnonymousElementByAttribute(this, "anonid",
-                                                "over-link-box");
-      ]]></field>
-
-      <field name="_overLinkHostLabel" readonly="true"><![CDATA[
-        document.getAnonymousElementByAttribute(this, "anonid",
-                                                "over-link-host-label");
-      ]]></field>
-
-      <field name="_overLinkPathLabel" readonly="true"><![CDATA[
-        document.getAnonymousElementByAttribute(this, "anonid",
-                                                "over-link-path-label");
-      ]]></field>
-
-      <field name="_textboxContainer" readonly="true"><![CDATA[
-        document.getAnonymousElementByAttribute(this, "anonid",
-                                                "textbox-container");
-      ]]></field>
-
-      <field name="_overLinkIntervalDelay" readonly="true"><![CDATA[
-        100
-      ]]></field>
-
-      <field name="_overLinkInterval"><![CDATA[
-        null
-      ]]></field>
-
-      <method name="setOverLink">
-        <parameter name="aURL"/>
-        <body><![CDATA[
-          // NOTE: This method is called many times in a row very quickly when
-          // the user mouses over a bookmarks menu, tabs menu, or long list of
-          // links in a page, or leaves the cursor over a page with many links
-          // while scrolling.  Therefore it's important that it be fast.  Don't
-          // regress performance when you modify it!
-
-          // Hide the over-link immediately if necessary.
-          if ((!aURL && (XULBrowserWindow.hideOverLinkImmediately ||
-                         this._hideOverLinkImmediately)) ||
-              this.focused) {
-            this._clearOverLinkInterval();
-            this._setOverLinkState(null);
-            return;
-          }
-
-          // Update and show it immediately if it's in transition.
-          if (aURL && this._overLinkTransitioning) {
-            this._clearOverLinkInterval();
-            this._updateOverLink(aURL);
-            this._setOverLinkState("showing");
-            return;
-          }
-
-          this._overLinkURL = aURL;
-          this._seenNewOverLink = true;
-
-          // If the user is continually mousing over links, make this method
-          // basically a no-op.
-          if (this._overLinkInterval)
-            return;
-
-          // Otherwise, the user has just moused over or focused a single link.
-          // Start the interval and signal that we should potentially show the
-          // over-link the first time it fires by unsetting _seenNewOverLink.
-          this._seenNewOverLink = false;
-          this._overLinkInterval = setInterval(this._overLinkIntervalCallback,
-                                               this._overLinkIntervalDelay,
-                                               this);
-        ]]></body>
-      </method>
-
-      <method name="_overLinkIntervalCallback">
-        <parameter name="self"/>
-        <body><![CDATA[
-          // If the user is still mousing over links, bail out early.
-          if (self._seenNewOverLink) {
-            self._seenNewOverLink = false;
-            return;
-          }
-
-          // Otherwise, the user has stopped over a link.  Clear the interval
-          // and update the over-link.
-          self._clearOverLinkInterval();
-          if (self._overLinkURL) {
-            self._updateOverLink(self._overLinkURL);
-            self._setOverLinkState("fade-in");
-          }
-          else {
-            self._setOverLinkState("fade-out");
-          }
-        ]]></body>
-      </method>
-
-      <method name="_hideOverLink">
-        <body><![CDATA[
-          this._hideOverLinkImmediately = true;
-          this.setOverLink("");
-          this._hideOverLinkImmediately = false;
-        ]]></body>
-      </method>
-
-      <method name="_clearOverLinkInterval">
-        <body><![CDATA[
-          if (this._overLinkInterval) {
-            clearInterval(this._overLinkInterval);
-            this._overLinkInterval = null;
-          }
-        ]]></body>
-      </method>
-
-      <method name="_setOverLinkState">
-        <parameter name="aVal"/>
-        <body><![CDATA[
-          switch (aVal) {
-          case "fade-in":
-            var style = window.getComputedStyle(this._overLinkBox);
-            this._overLinkTransitioning = style.opacity != 1;
-            this.setAttribute("overlinkstate", aVal);
-            break;
-          case "fade-out":
-            style = window.getComputedStyle(this._overLinkBox);
-            this._overLinkTransitioning = style.opacity != 0;
-            this.setAttribute("overlinkstate", aVal);
-            break;
-          case "showing":
-            this._overLinkTransitioning = false;
-            this.setAttribute("overlinkstate", aVal);
-            break;
-          default:
-            this._overLinkTransitioning = false;
-            this.removeAttribute("overlinkstate");
-            break;
-          }
-        ]]></body>
-      </method>
-
-      <method name="_updateOverLink">
-        <parameter name="aURL"/>
-        <body><![CDATA[
-          // Get the width of the bar before we go modifying it.
-          var barWidth = this._stack.boxObject.width;
-
-          // Determine the pre-path and path of the over-link.  Include the
-          // path's leading slash in the pre-path so that if the path is
-          // truncated its leading slash is visible.
-          var re = new RegExp("^([a-z0-9+.-]+://[^/]+/)(.*)$");
-          var match = re.exec(aURL);
-          var host = match ? match[1] : "";
-          var path = match ? match[2] : aURL;
-
-          var overLink = this._overLinkBox;
-          var overLinkHost = this._overLinkHostLabel;
-          var overLinkPath = this._overLinkPathLabel;
-
-          overLinkHost.value = host;
-          overLinkPath.value = path;
-
-          // Remove restrictions on the over-link's width.
-          overLinkHost.flex = 0;
-          overLinkHost.crop = "none";
-          overLinkPath.crop = "none";
-          overLink.style.minWidth = "";
-          overLink.style.maxWidth = "";
-
-          // Cap the width of the over-link to 2/3 of the location bar's.
-          var maxWidth = barWidth * 0.67;
-          var overLinkWidth = overLinkHost.boxObject.width +
-                              overLinkPath.boxObject.width;
-          if (overLinkWidth > maxWidth) {
-            // If the host is wider than the cap and therefore the path is not
-            // visible at all, crop the host at the end.
-            if (overLinkHost.boxObject.width > maxWidth) {
-              overLinkHost.flex = 1;
-              overLinkHost.crop = "end";
-            }
-            overLinkPath.crop = host ? "start" : "end";
-            overLink.style.minWidth = maxWidth + "px";
-            overLink.style.maxWidth = maxWidth + "px";
-          }
-
-          var action = this._parseActionUrl(this._value);
-          this._originLabel.value = action ? action.param : this._value;
-        ]]></body>
-      </method>
-
       <field name="_numNoActionsKeys"><![CDATA[
         0
       ]]></field>
 
       <method name="_clearNoActions">
         <parameter name="aURL"/>
         <body><![CDATA[
           this._numNoActionsKeys = 0;
@@ -855,17 +628,16 @@
         dt.setData("text/unicode", urlString);
         dt.setData("text/html", htmlString);
 
         dt.effectAllowed = "copyLink";
         event.stopPropagation();
       ]]></handler>
 
       <handler event="focus" phase="capturing"><![CDATA[
-        this._hideOverLink();
         this._hideURLTooltip();
       ]]></handler>
 
       <handler event="dragover" phase="capturing" action="this.onDragOver(event, this);"/>
       <handler event="drop" phase="capturing" action="this.onDrop(event, this);"/>
       <handler event="select"><![CDATA[
         if (!Cc["@mozilla.org/widget/clipboard;1"]
                .getService(Ci.nsIClipboard)
--- a/browser/themes/gnomestripe/browser/browser.css
+++ b/browser/themes/gnomestripe/browser/browser.css
@@ -903,17 +903,17 @@ toolbar[iconsize="small"] #feed-button {
 /* Location bar */
 #urlbar {
   width: 7em;
   min-width: 7em;
   -moz-appearance: textfield;
   padding: 0;
 }
 
-.urlbar-frontcap-and-textbox {
+.urlbar-textbox-container {
   -moz-appearance: none;
 }
 
 .urlbar-history-dropmarker {
   -moz-appearance: toolbarbutton-dropdown;
 }
 
 #urlbar-container {
@@ -949,57 +949,16 @@ toolbar[iconsize="small"] #feed-button {
 }
 
 #urlbar-display {
   margin-top: 0;
   margin-bottom: 0;
   color: GrayText;
 }
 
-/* over-link in location bar */
-
-.urlbar-over-link-layer {
-  margin: -2px 0;
-  -moz-margin-start: 0;
-}
-
-.urlbar-origin-label {
-  padding-top: 0;
-  padding-bottom: 0;
-  -moz-padding-start: 4px;
-  -moz-padding-end: 0;
-  margin: 0;
-}
-
-.urlbar-over-link-box {
-  position: relative;
-  color: GrayText;
-  min-height: 22px;
-  padding-top: 0;
-  padding-bottom: 0;
-  -moz-padding-start: 18px;
-  -moz-padding-end: 5px;
-}
-
-.urlbar-over-link-box:-moz-locale-dir(ltr) {
-  background: url(chrome://browser/skin/urlbar-over-link-arrow.png) no-repeat left center;
-  right: 0;
-}
-
-.urlbar-over-link-box:-moz-locale-dir(rtl) {
-  background: url(chrome://browser/skin/urlbar-over-link-arrow-rtl.png) no-repeat right center;
-  left: 0;
-}
-
-.urlbar-over-link-host-label,
-.urlbar-over-link-path-label {
-  padding: 0;
-  margin: 0;
-}
-
 /* Favicon */
 #page-proxy-favicon,
 #urlbar-throbber {
   width: 16px;
   height: 16px;
 }
 
 #page-proxy-stack {
--- a/browser/themes/gnomestripe/browser/jar.mn
+++ b/browser/themes/gnomestripe/browser/jar.mn
@@ -1,13 +1,11 @@
 browser.jar:
 % skin browser classic/1.0 %skin/classic/browser/
 % override chrome://global/skin/icons/warning-16.png moz-icon://stock/gtk-dialog-warning?size=menu
-  skin/classic/browser/urlbar-over-link-arrow.png
-  skin/classic/browser/urlbar-over-link-arrow-rtl.png
   skin/classic/browser/sanitizeDialog.css             (sanitizeDialog.css)
 * skin/classic/browser/aboutPrivateBrowsing.css             (aboutPrivateBrowsing.css)
 * skin/classic/browser/aboutSessionRestore.css        (aboutSessionRestore.css)
   skin/classic/browser/aboutSessionRestore-window-icon.png
   skin/classic/browser/aboutCertError.css             (aboutCertError.css)
 #ifdef MOZ_SERVICES_SYNC
   skin/classic/browser/aboutSyncTabs.css
 #endif
deleted file mode 100644
index ed37d2aa68e194ad78317bace98647e7a302753a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 9493770ccc9105527150d4bc8f61848cce2700fc..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/pinstripe/browser/browser.css
+++ b/browser/themes/pinstripe/browser/browser.css
@@ -892,52 +892,16 @@ toolbar[mode="icons"] #zoom-in-button {
   margin-bottom: 0;
   color: GrayText;
 }
 
 #PopupAutoCompleteRichResult {
   margin-top: 2px;
 }
 
-/* over-link in location bar */
-
-.urlbar-origin-label {
-  padding-top: 0;
-  padding-bottom: 0;
-  -moz-padding-start: 1px;
-  -moz-padding-end: 0;
-  margin: 0;
-}
-
-.urlbar-over-link-box {
-  position: relative;
-  color: GrayText;
-  min-height: 20px;
-  padding-top: 0;
-  padding-bottom: 0;
-  -moz-padding-start: 18px;
-  -moz-padding-end: 5px;
-}
-
-.urlbar-over-link-box:-moz-locale-dir(ltr) {
-  background: url(chrome://browser/skin/urlbar-over-link-arrow.png) no-repeat left center;
-  right: 0;
-}
-
-.urlbar-over-link-box:-moz-locale-dir(rtl) {
-  background: url(chrome://browser/skin/urlbar-over-link-arrow-rtl.png) no-repeat right center;
-  left: 0;
-}
-
-.urlbar-over-link-host-label,
-.urlbar-over-link-path-label {
-  padding: 0;
-  margin: 0;
-}
-
 /* ----- AUTOCOMPLETE ----- */
 
 #treecolAutoCompleteImage {
   max-width: 36px;
 }
 
 .ac-result-type-bookmark,
 .autocomplete-treebody::-moz-tree-image(bookmark, treecolAutoCompleteImage) {
--- a/browser/themes/pinstripe/browser/jar.mn
+++ b/browser/themes/pinstripe/browser/jar.mn
@@ -1,12 +1,10 @@
 browser.jar:
 % skin browser classic/1.0 %skin/classic/browser/
-  skin/classic/browser/urlbar-over-link-arrow.png
-  skin/classic/browser/urlbar-over-link-arrow-rtl.png
   skin/classic/browser/sanitizeDialog.css                   (sanitizeDialog.css)
 * skin/classic/browser/aboutPrivateBrowsing.css             (aboutPrivateBrowsing.css)
 * skin/classic/browser/aboutSessionRestore.css              (aboutSessionRestore.css)
   skin/classic/browser/aboutSessionRestore-window-icon.png
   skin/classic/browser/aboutCertError.css                   (aboutCertError.css)
 #ifdef MOZ_SERVICES_SYNC
   skin/classic/browser/aboutSyncTabs.css
 #endif
deleted file mode 100644
index 12aed59d03277435bf2f192eafe30c2292c1b309..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 9493770ccc9105527150d4bc8f61848cce2700fc..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/winstripe/browser/browser.css
+++ b/browser/themes/winstripe/browser/browser.css
@@ -1047,39 +1047,24 @@ toolbar:not([iconsize="small"])[mode="ic
   width: 7em;
   min-width: 7em;
 }
 
 #urlbar,
 .searchbar-textbox {
   -moz-appearance: none;
   margin: 1px 3px;
+  padding: 2px;
   background-clip: padding-box;
   border: 1px solid ThreeDDarkShadow;
   border-radius: 4px;
   box-shadow: 0 1px 0 rgba(0,0,0,.1) inset,
               0 1px 0 rgba(255,255,255,.4);
 }
 
-.urlbar-textbox-container {
-  margin-top: 2px;
-  margin-bottom: 2px;
-  margin-right: 2px;
-}
-
-.urlbar-frontcap {
-  margin-top: 2px;
-  margin-bottom: 2px;
-  margin-left: 2px;
-}
-
-.searchbar-textbox {
-  padding: 2px;
-}
-
 @media all and (-moz-windows-default-theme) {
   #urlbar,
   .searchbar-textbox {
     @navbarTextboxCustomBorder@
   }
 }
 
 #urlbar:-moz-lwtheme,
@@ -1125,69 +1110,29 @@ html|*.urlbar-input:-moz-lwtheme:-moz-pl
   background: transparent;
 }
 
 #urlbar-search-splitter + #urlbar-container > #urlbar ,
 #urlbar-search-splitter + #search-container > #searchbar > .searchbar-textbox {
   -moz-margin-start: 0;
 }
 
-.urlbar-frontcap-and-textbox {
-  -moz-box-align: stretch;
-}
-
 #urlbar-display-box {
   margin-top: -2px;
   margin-bottom: -2px;
   -moz-border-end: 1px solid #AAA;
   -moz-margin-end: 3px;
 }
 
 #urlbar-display {
   margin-top: 0;
   margin-bottom: 0;
   color: GrayText;
 }
 
-/* over-link in location bar */
-
-.urlbar-origin-label {
-  padding-top: 0;
-  padding-bottom: 0;
-  -moz-padding-start: 4px;
-  -moz-padding-end: 0;
-  margin: 0;
-}
-
-.urlbar-over-link-box {
-  position: relative;
-  color: GrayText;
-  min-height: 20px;
-  padding-top: 0;
-  padding-bottom: 0;
-  -moz-padding-start: 18px;
-  -moz-padding-end: 5px;
-}
-
-.urlbar-over-link-box:-moz-locale-dir(ltr) {
-  background: url(chrome://browser/skin/urlbar-over-link-arrow.png) no-repeat left center;
-  right: 0;
-}
-
-.urlbar-over-link-box:-moz-locale-dir(rtl) {
-  background: url(chrome://browser/skin/urlbar-over-link-arrow-rtl.png) no-repeat right center;
-  left: 0;
-}
-
-.urlbar-over-link-host-label,
-.urlbar-over-link-path-label {
-  padding: 0;
-  margin: 0;
-}
-
 /* identity box */
 
 #identity-box {
   background-color: -moz-dialog;
   background-image: -moz-linear-gradient(rgba(255,255,255,.25), rgba(0,0,0,.15));
   color: -moz-dialogText;
   border-radius: 2px;
 }
@@ -1370,16 +1315,18 @@ richlistitem[type~="action"][actiontype=
   -moz-image-region: rect(16px, 16px, 32px, 0px);
 }
 
 /* combined go/reload/stop button in location bar */
 
 #urlbar > toolbarbutton {
   -moz-appearance: none;
   list-style-image: url("chrome://browser/skin/reload-stop-go.png");
+  margin: -2px;
+  -moz-margin-start: 0;
   padding: 0 3px;
   background-origin: border-box;
   border: none;
   -moz-border-start: 1px solid rgba(0,0,0,.25);
 }
 
 #urlbar:-moz-locale-dir(ltr) > toolbarbutton {
   border-top-right-radius: 2px;
--- a/browser/themes/winstripe/browser/jar.mn
+++ b/browser/themes/winstripe/browser/jar.mn
@@ -1,15 +1,13 @@
 browser.jar:
 % skin browser classic/1.0 %skin/classic/browser/ os=WINNT osversion<6
 % skin browser classic/1.0 %skin/classic/browser/ os!=WINNT
 # NOTE: If you add a new file here, you'll need to add it to the aero
 # section at the bottom of this file
-        skin/classic/browser/urlbar-over-link-arrow.png
-        skin/classic/browser/urlbar-over-link-arrow-rtl.png
         skin/classic/browser/sanitizeDialog.css                      (sanitizeDialog.css)
 *       skin/classic/browser/aboutPrivateBrowsing.css                (aboutPrivateBrowsing.css)
 *       skin/classic/browser/aboutSessionRestore.css                 (aboutSessionRestore.css)
         skin/classic/browser/aboutSessionRestore-window-icon.png     (aboutSessionRestore-window-icon.png)
         skin/classic/browser/aboutCertError.css                      (aboutCertError.css)
 #ifdef MOZ_SERVICES_SYNC
         skin/classic/browser/aboutSyncTabs.css
 #endif
@@ -111,18 +109,16 @@ browser.jar:
         skin/classic/browser/syncSetup.css
         skin/classic/browser/syncCommon.css
         skin/classic/browser/syncQuota.css
 #endif
 
 #ifdef XP_WIN
 browser.jar:
 % skin browser classic/1.0 %skin/classic/aero/browser/ os=WINNT osversion>=6
-        skin/classic/aero/browser/urlbar-over-link-arrow.png
-        skin/classic/aero/browser/urlbar-over-link-arrow-rtl.png
         skin/classic/aero/browser/sanitizeDialog.css                       (sanitizeDialog.css)
 *       skin/classic/aero/browser/aboutPrivateBrowsing.css           (aboutPrivateBrowsing.css)
 *       skin/classic/aero/browser/aboutSessionRestore.css            (aboutSessionRestore.css)
         skin/classic/aero/browser/aboutSessionRestore-window-icon.png (aboutSessionRestore-window-icon-aero.png)
         skin/classic/aero/browser/aboutCertError.css                 (aboutCertError.css)
 #ifdef MOZ_SERVICES_SYNC
         skin/classic/aero/browser/aboutSyncTabs.css
 #endif
deleted file mode 100644
index de82cfb59002a09bb9c0a25bec07fa3fd339b9f1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 9493770ccc9105527150d4bc8f61848cce2700fc..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001