author | Ryan VanderMeulen <ryanvm@gmail.com> |
Fri, 25 Apr 2014 16:24:02 -0400 | |
changeset 180254 | 0e91262606a631fbc4e0ea24c1447c0604787de1 |
parent 180234 | 992ddc6bd0a9faa9ea107783abc2ef1596b33050 (current diff) |
parent 180253 | 8364bff2be23003f9293b769d9efaa81427c4d45 (diff) |
child 180255 | 1f67e8c65ce54e60d2c4bc0cb6c6ea1c02329326 |
child 180260 | a9d318e1cc9df09b72a3e2e6dbfde4f65196e3ad |
child 180289 | d353282fc0a6f001e30003c136ede5525dd03f87 |
child 180333 | ea4e380efa0ad3422e017a0e4c74cc61c9ed5187 |
push id | 26658 |
push user | ryanvm@gmail.com |
push date | Fri, 25 Apr 2014 20:24:05 +0000 |
treeherder | mozilla-central@0e91262606a6 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
milestone | 31.0a1 |
first release with | nightly linux32
0e91262606a6
/
31.0a1
/
20140426030204
/
files
nightly linux64
0e91262606a6
/
31.0a1
/
20140426030204
/
files
nightly mac
0e91262606a6
/
31.0a1
/
20140426030204
/
files
nightly win32
0e91262606a6
/
31.0a1
/
20140426030204
/
files
nightly win64
0e91262606a6
/
31.0a1
/
20140426030204
/
files
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
releases | nightly linux32
31.0a1
/
20140426030204
/
pushlog to previous
nightly linux64
31.0a1
/
20140426030204
/
pushlog to previous
nightly mac
31.0a1
/
20140426030204
/
pushlog to previous
nightly win32
31.0a1
/
20140426030204
/
pushlog to previous
nightly win64
31.0a1
/
20140426030204
/
pushlog to previous
|
browser/themes/shared/devtools/images/option-icon.png | file | annotate | diff | comparison | revisions | |
mobile/android/base/tests/testFilterOpenTab.java | file | annotate | diff | comparison | revisions |
--- a/addon-sdk/source/test/test-ui-sidebar.js +++ b/addon-sdk/source/test/test-ui-sidebar.js @@ -1206,17 +1206,17 @@ exports.testShowToOpenXToClose = functio let sidebar = Sidebar({ id: testName, title: testName, url: url, onShow: function() { assert.ok(isChecked(menuitem), 'menuitem is checked'); - let closeButton = window.document.querySelector('#sidebar-header > toolbarbutton.tabs-closebutton'); + let closeButton = window.document.querySelector('#sidebar-header > toolbarbutton.close-icon'); simulateCommand(closeButton); }, onHide: function() { assert.ok(!isChecked(menuitem), 'menuitem is not checked'); sidebar.destroy(); done(); }
--- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -452,23 +452,16 @@ pref("browser.tabs.loadBookmarksInBackgr pref("browser.tabs.tabClipWidth", 140); pref("browser.tabs.animate", true); #ifdef UNIX_BUT_NOT_MAC pref("browser.tabs.drawInTitlebar", false); #else pref("browser.tabs.drawInTitlebar", true); #endif -// Where to show tab close buttons: -// 0 on active tab only -// 1 on all tabs until tabClipWidth is reached, then active tab only -// 2 no close buttons at all -// 3 at the end of the tabstrip -pref("browser.tabs.closeButtons", 1); - // When tabs opened by links in other tabs via a combination of // browser.link.open_newwindow being set to 3 and target="_blank" etc are // closed: // true return to the tab that opened this tab (its owner) // false return to the adjacent tab (old default) pref("browser.tabs.selectOwnerOnClose", true); pref("browser.ctrlTab.previews", false); @@ -1158,17 +1151,16 @@ pref("services.sync.prefs.sync.browser.l pref("services.sync.prefs.sync.browser.offline-apps.notify", true); pref("services.sync.prefs.sync.browser.safebrowsing.enabled", true); pref("services.sync.prefs.sync.browser.safebrowsing.malware.enabled", true); pref("services.sync.prefs.sync.browser.search.selectedEngine", true); pref("services.sync.prefs.sync.browser.search.update", true); pref("services.sync.prefs.sync.browser.sessionstore.restore_on_demand", true); pref("services.sync.prefs.sync.browser.startup.homepage", true); pref("services.sync.prefs.sync.browser.startup.page", true); -pref("services.sync.prefs.sync.browser.tabs.closeButtons", true); pref("services.sync.prefs.sync.browser.tabs.loadInBackground", true); pref("services.sync.prefs.sync.browser.tabs.warnOnClose", true); pref("services.sync.prefs.sync.browser.tabs.warnOnOpen", true); pref("services.sync.prefs.sync.browser.urlbar.autocomplete.enabled", true); pref("services.sync.prefs.sync.browser.urlbar.default.behavior", true); pref("services.sync.prefs.sync.browser.urlbar.maxRichResults", true); pref("services.sync.prefs.sync.dom.disable_open_during_load", true); pref("services.sync.prefs.sync.dom.disable_window_flip", true);
--- a/browser/base/content/browser.css +++ b/browser/base/content/browser.css @@ -484,20 +484,16 @@ toolbar[mode="full"] #bookmarks-menu-but menupopup[emptyplacesresult="true"] > .hide-if-empty-places-result { display: none; } menuitem.spell-suggestion { font-weight: bold; } -#sidebar-header > .tabs-closebutton { - -moz-user-focus: normal; -} - /* apply Fitts' law to the notification bar's close button */ window[sizemode="maximized"] #content .notification-inner { border-right: 0px !important; } /* Hide extension toolbars that neglected to set the proper class */ window[chromehidden~="location"][chromehidden~="toolbar"] toolbar:not(.chromeclass-menubar), window[chromehidden~="toolbar"] toolbar:not(.toolbar-primary):not(.chromeclass-menubar) {
--- a/browser/base/content/browser.xul +++ b/browser/base/content/browser.xul @@ -544,17 +544,17 @@ <toolbar id="TabsToolbar" class="toolbar-primary" fullscreentoolbar="true" customizable="true" mode="icons" iconsize="small" aria-label="&tabsToolbar.label;" context="toolbar-context-menu" - defaultset="tabbrowser-tabs,new-tab-button,alltabs-button,tabs-closebutton" + defaultset="tabbrowser-tabs,new-tab-button,alltabs-button" collapsed="true"> #if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT) <hbox id="private-browsing-indicator" skipintoolbarset="true"/> #endif <tabs id="tabbrowser-tabs" @@ -595,23 +595,16 @@ label="&viewTabGroups.label;" command="Browser:ToggleTabView" cui-areatype="toolbar" observes="tabviewGroupsNumber"/> <menuseparator id="alltabs-popup-separator"/> </menupopup> </toolbarbutton> - <toolbarbutton id="tabs-closebutton" - class="close-button tabs-closebutton close-icon" - command="cmd_close" - label="&closeTab.label;" - cui-areatype="toolbar" - tooltiptext="&closeTab.label;"/> - #if !defined(MOZ_WIDGET_GTK) && !defined(MOZ_WIDGET_QT) <hbox class="private-browsing-indicator" skipintoolbarset="true"/> #endif #ifdef CAN_DRAW_IN_TITLEBAR <hbox class="titlebar-placeholder" type="caption-buttons" id="titlebar-placeholder-on-TabsToolbar-for-captions-buttons" persist="width" #ifndef XP_MACOSX ordinal="1000" @@ -1049,17 +1042,17 @@ <deck id="content-deck" flex="1"> <hbox flex="1" id="browser"> <vbox id="browser-border-start" hidden="true" layer="true"/> <vbox id="sidebar-box" hidden="true" class="chromeclass-extrachrome"> <sidebarheader id="sidebar-header" align="center"> <label id="sidebar-title" persist="value" flex="1" crop="end" control="sidebar"/> <image id="sidebar-throbber"/> - <toolbarbutton class="tabs-closebutton close-icon" tooltiptext="&sidebarCloseButton.tooltip;" oncommand="toggleSidebar();"/> + <toolbarbutton class="close-icon tabbable" tooltiptext="&sidebarCloseButton.tooltip;" oncommand="toggleSidebar();"/> </sidebarheader> <browser id="sidebar" flex="1" autoscroll="false" disablehistory="true" style="min-width: 14em; width: 18em; max-width: 36em;"/> </vbox> <splitter id="sidebar-splitter" class="chromeclass-extrachrome sidebar-splitter" hidden="true"/> <vbox id="appcontent" flex="1"> <tabbrowser id="content"
--- a/browser/base/content/tabbrowser.css +++ b/browser/base/content/tabbrowser.css @@ -7,22 +7,21 @@ } .tabbrowser-arrowscrollbox { -moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser-arrowscrollbox"); } .tab-close-button { -moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser-close-tab-button"); - display: none; } -.tabbrowser-tabs[closebuttons="activetab"] > * > * > * > .tab-close-button:not([pinned])[selected="true"], -.tabbrowser-tabs[closebuttons="alltabs"] > * > * > * > .tab-close-button:not([pinned]) { - display: -moz-box; +.tab-close-button[pinned], +.tabbrowser-tabs[closebuttons="activetab"] > * > * > * > .tab-close-button:not([selected="true"]) { + display: none; } .tab-label[pinned] { width: 0; margin-left: 0 !important; margin-right: 0 !important; padding-left: 0 !important; padding-right: 0 !important;
--- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -1908,17 +1908,17 @@ } } var closeWindow = false; var newTab = false; if (this.tabs.length - this._removingTabs.length == 1) { closeWindow = aCloseWindowWithLastTab != null ? aCloseWindowWithLastTab : !window.toolbar.visible || - this.tabContainer._closeWindowWithLastTab; + Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab"); // Closing the tab and replacing it with a blank one is notably slower // than closing the window right away. If the caller opts in, take // the fast path. if (closeWindow && aCloseWindowFastpath && this._removingTabs.length == 0) { // This call actually closes the window, unless the user @@ -3367,44 +3367,34 @@ style="width: 0;"/> </xul:arrowscrollbox> </content> <implementation implements="nsIDOMEventListener"> <constructor> <![CDATA[ this.mTabClipWidth = Services.prefs.getIntPref("browser.tabs.tabClipWidth"); - this.mCloseButtons = Services.prefs.getIntPref("browser.tabs.closeButtons"); - this._closeWindowWithLastTab = Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab"); var tab = this.firstChild; tab.label = this.tabbrowser.mStringBundle.getString("tabs.emptyTabTitle"); tab.setAttribute("crop", "end"); tab.setAttribute("onerror", "this.removeAttribute('image');"); - this.adjustTabstrip(); - - Services.prefs.addObserver("browser.tabs.", this._prefObserver, false); + window.addEventListener("resize", this, false); window.addEventListener("load", this, false); try { this._tabAnimationLoggingEnabled = Services.prefs.getBoolPref("browser.tabs.animationLogging.enabled"); } catch (ex) { this._tabAnimationLoggingEnabled = false; } this._browserNewtabpageEnabled = Services.prefs.getBoolPref("browser.newtabpage.enabled"); ]]> </constructor> - <destructor> - <![CDATA[ - Services.prefs.removeObserver("browser.tabs.", this._prefObserver); - ]]> - </destructor> - <field name="tabbrowser" readonly="true"> document.getElementById(this.getAttribute("tabbrowser")); </field> <field name="tabbox" readonly="true"> this.tabbrowser.mTabBox; </field> @@ -3466,32 +3456,16 @@ let hoveredTab = this._hoveredTab; if (hoveredTab) { hoveredTab._mouseleave(); hoveredTab._mouseenter(); } ]]></body> </method> - <field name="_prefObserver"><![CDATA[({ - tabContainer: this, - - observe: function (subject, topic, data) { - switch (data) { - case "browser.tabs.closeButtons": - this.tabContainer.mCloseButtons = Services.prefs.getIntPref(data); - this.tabContainer.adjustTabstrip(); - break; - case "browser.tabs.closeWindowWithLastTab": - this.tabContainer._closeWindowWithLastTab = Services.prefs.getBoolPref(data); - this.tabContainer.adjustTabstrip(); - break; - } - } - });]]></field> <field name="_blockDblClick">false</field> <field name="_tabDropIndicator"> document.getAnonymousElementByAttribute(this, "anonid", "tab-drop-indicator"); </field> <field name="_dragOverDelay">350</field> <field name="_dragTime">0</field> @@ -3558,52 +3532,33 @@ this.visible = true; ]]></body> </method> <method name="adjustTabstrip"> <body><![CDATA[ let numTabs = this.childNodes.length - this.tabbrowser._removingTabs.length; - // modes for tabstrip - // 0 - button on active tab only - // 1 - close buttons on all tabs - // 2 - no close buttons at all - // 3 - close button at the end of the tabstrip - switch (this.mCloseButtons) { - case 0: - this.setAttribute("closebuttons", "activetab"); - break; - case 1: - if (numTabs <= 2) { - // This is an optimization to avoid layout flushes by calling - // getBoundingClientRect() when we just opened a second tab. In - // this case it's highly unlikely that the tab width is smaller - // than mTabClipWidth and the tab close button obscures too much - // of the tab's label. In the edge case of the window being too - // narrow (or if tabClipWidth has been set to a way higher value), - // we'll correct the 'closebuttons' attribute after the tabopen - // animation has finished. - this.setAttribute("closebuttons", "alltabs"); - } else { - let tab = this.tabbrowser.visibleTabs[this.tabbrowser._numPinnedTabs]; - if (tab && tab.getBoundingClientRect().width > this.mTabClipWidth) - this.setAttribute("closebuttons", "alltabs"); - else - this.setAttribute("closebuttons", "activetab"); + if (numTabs > 2) { + // This is an optimization to avoid layout flushes by calling + // getBoundingClientRect() when we just opened a second tab. In + // this case it's highly unlikely that the tab width is smaller + // than mTabClipWidth and the tab close button obscures too much + // of the tab's label. In the edge case of the window being too + // narrow (or if tabClipWidth has been set to a way higher value), + // we'll correct the 'closebuttons' attribute after the tabopen + // animation has finished. + + let tab = this.tabbrowser.visibleTabs[this.tabbrowser._numPinnedTabs]; + if (tab && tab.getBoundingClientRect().width <= this.mTabClipWidth) { + this.setAttribute("closebuttons", "activetab"); + return; } - break; - case 2: - case 3: - this.setAttribute("closebuttons", "never"); - break; } - var tabstripClosebutton = document.getElementById("tabs-closebutton"); - if (tabstripClosebutton && tabstripClosebutton.parentNode == this._container) - tabstripClosebutton.collapsed = this.mCloseButtons != 3; + this.removeAttribute("closebuttons"); ]]></body> </method> <method name="_handleTabSelect"> <parameter name="aSmoothScroll"/> <body><![CDATA[ if (this.getAttribute("overflow") == "true") this.mTabstrip.ensureElementIsVisible(this.selectedItem, aSmoothScroll); @@ -4267,18 +4222,17 @@ } ]]></handler> <handler event="click"><![CDATA[ if (event.button != 1) return; if (event.target.localName == "tab") { - if (this.childNodes.length > 1 || !this._closeWindowWithLastTab) - this.tabbrowser.removeTab(event.target, {animate: true, byMouse: true}); + this.tabbrowser.removeTab(event.target, {animate: true, byMouse: true}); } else if (event.originalTarget.localName == "box") { BrowserOpenTab(); } else { return; } event.stopPropagation(); ]]></handler>
--- a/browser/components/customizableui/src/CustomizableUI.jsm +++ b/browser/components/customizableui/src/CustomizableUI.jsm @@ -219,17 +219,16 @@ let CustomizableUIInternal = { #endif this.registerArea(CustomizableUI.AREA_TABSTRIP, { legacy: true, type: CustomizableUI.TYPE_TOOLBAR, defaultPlacements: [ "tabbrowser-tabs", "new-tab-button", "alltabs-button", - "tabs-closebutton", ], defaultCollapsed: null, }, true); this.registerArea(CustomizableUI.AREA_BOOKMARKS, { legacy: true, type: CustomizableUI.TYPE_TOOLBAR, defaultPlacements: [ "personal-bookmarks",
--- a/browser/components/customizableui/src/CustomizeMode.jsm +++ b/browser/components/customizableui/src/CustomizeMode.jsm @@ -174,20 +174,20 @@ CustomizeMode.prototype = { CustomizableUI.dispatchToolboxEvent("beforecustomization", {}, window); CustomizableUI.notifyStartCustomizing(this.window); // Add a keypress listener to the document so that we can quickly exit // customization mode when pressing ESC. document.addEventListener("keypress", this); - // Same goes for the menu button - if we're customizing, a mousedown to the + // Same goes for the menu button - if we're customizing, a click on the // menu button means a quick exit from customization mode. window.PanelUI.hide(); - window.PanelUI.menuButton.addEventListener("mousedown", this); + window.PanelUI.menuButton.addEventListener("command", this); window.PanelUI.menuButton.open = true; window.PanelUI.beginBatchUpdate(); // The menu panel is lazy, and registers itself when the popup shows. We // need to force the menu panel to register itself, or else customization // is really not going to work. We pass "true" to ensureRegistered to // indicate that we're handling calling startBatchUpdate and // endBatchUpdate. @@ -326,17 +326,17 @@ CustomizeMode.prototype = { this.panelUIContents.removeAttribute("showoutline"); } this._removeExtraToolbarsIfEmpty(); CustomizableUI.removeListener(this); this.document.removeEventListener("keypress", this); - this.window.PanelUI.menuButton.removeEventListener("mousedown", this); + this.window.PanelUI.menuButton.removeEventListener("command", this); this.window.PanelUI.menuButton.open = false; this.window.PanelUI.beginBatchUpdate(); this._removePanelCustomizationPlaceholders(); let window = this.window; let document = this.document; @@ -1176,23 +1176,23 @@ CustomizeMode.prototype = { this._onDragDrop(aEvent); break; case "dragexit": this._onDragExit(aEvent); break; case "dragend": this._onDragEnd(aEvent); break; - case "mousedown": - if (aEvent.button == 0 && - (aEvent.originalTarget == this.window.PanelUI.menuButton)) { + case "command": + if (aEvent.originalTarget == this.window.PanelUI.menuButton) { this.exit(); aEvent.preventDefault(); - return; } + break; + case "mousedown": this._onMouseDown(aEvent); break; case "mouseup": this._onMouseUp(aEvent); break; case "keypress": if (aEvent.keyCode == aEvent.DOM_VK_ESCAPE) { this.exit();
--- a/browser/components/customizableui/test/browser.ini +++ b/browser/components/customizableui/test/browser.ini @@ -60,16 +60,29 @@ skip-if = e10s # Bug ?????? - test uses [browser_940107_home_button_in_bookmarks_toolbar.js] [browser_940307_panel_click_closure_handling.js] [browser_940946_removable_from_navbar_customizemode.js] [browser_941083_invalidate_wrapper_cache_createWidget.js] [browser_942581_unregisterArea_keeps_placements.js] [browser_943683_migration_test.js] [browser_944887_destroyWidget_should_destroy_in_palette.js] [browser_945739_showInPrivateBrowsing_customize_mode.js] +[browser_947914_button_addons.js] +[browser_947914_button_copy.js] +[browser_947914_button_cut.js] +[browser_947914_button_find.js] +[browser_947914_button_history.js] +[browser_947914_button_newPrivateWindow.js] +[browser_947914_button_newWindow.js] +[browser_947914_button_paste.js] +[browser_947914_button_print.js] +[browser_947914_button_savePage.js] +[browser_947914_button_zoomIn.js] +[browser_947914_button_zoomOut.js] +[browser_947914_button_zoomReset.js] [browser_947987_removable_default.js] [browser_948985_non_removable_defaultArea.js] [browser_952963_areaType_getter_no_area.js] [browser_956602_remove_special_widget.js] [browser_962884_opt_in_disable_hyphens.js] [browser_963639_customizing_attribute_non_customizable_toolbar.js] [browser_967000_button_charEncoding.js] skip-if = e10s # Bug ?????? - test uses promiseTabLoadEvent() which isn't e10s friendly.
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_addons.js @@ -0,0 +1,34 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check addons button existence and functionality"); + + let initialLocation = gBrowser.currentURI.spec; + + yield PanelUI.show(); + + let addonsButton = document.getElementById("add-ons-button"); + ok(addonsButton, "Add-ons button exists in Panel Menu"); + addonsButton.click(); + + yield waitForCondition(function() gBrowser.currentURI && + gBrowser.currentURI.spec == "about:addons"); + + let addonsPage = gBrowser.selectedBrowser.contentWindow.document. + getElementById("addons-page"); + ok(addonsPage, "Add-ons page was opened"); + + // close the add-ons tab + if(gBrowser.tabs.length > 1) { + gBrowser.removeTab(gBrowser.selectedTab); + } + else { + var tabToRemove = gBrowser.selectedTab; + gBrowser.addTab(initialLocation); + gBrowser.removeTab(tabToRemove); + } +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_copy.js @@ -0,0 +1,51 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check copy button existence and functionality"); + + var testText = "copy text test"; + let initialLocation = gBrowser.currentURI.spec; + + yield PanelUI.show(); + + let copyButton = document.getElementById("copy-button"); + ok(copyButton, "Copy button exists in Panel Menu"); + is(copyButton.getAttribute("disabled"), "true", "Copy button is initially disabled"); + + // copy text from URL bar + gURLBar.value = testText; + gURLBar.focus(); + gURLBar.select(); + yield PanelUI.show(); + + ok(!copyButton.hasAttribute("disabled"), "Copy button gets enabled"); + + copyButton.click(); + is(gURLBar.value, testText, "Selected text is unaltered when clicking copy"); + + // check that the text was added to the clipboard + let clipboard = Services.clipboard; + let transferable = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable); + const globalClipboard = clipboard.kGlobalClipboard; + + transferable.init(null); + transferable.addDataFlavor("text/unicode"); + clipboard.getData(transferable, globalClipboard); + let str = {}, strLength = {}; + transferable.getTransferData("text/unicode", str, strLength); + let clipboardValue = ""; + + if (str.value) { + str.value.QueryInterface(Ci.nsISupportsString); + clipboardValue = str.value.data; + } + is(clipboardValue, testText, "Data was copied to the clipboard."); + + // restore the tab location and clear the clipboard + Services.clipboard.emptyClipboard(globalClipboard); + gURLBar.value = initialLocation; +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_cut.js @@ -0,0 +1,50 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check cut button existence and functionality"); + + var testText = "cut text test"; + let initialLocation = gBrowser.currentURI.spec; + + yield PanelUI.show(); + + let cutButton = document.getElementById("cut-button"); + ok(cutButton, "Cut button exists in Panel Menu"); + ok(cutButton.getAttribute("disabled"), "Cut button is disabled"); + + // cut text from URL bar + gURLBar.value = testText; + gURLBar.focus(); + gURLBar.select(); + yield PanelUI.show(); + + ok(!cutButton.hasAttribute("disabled"), "Cut button gets enabled"); + cutButton.click(); + is(gURLBar.value, "", "Selected text is removed from source when clicking on cut"); + + // check that the text was added to the clipboard + let clipboard = Services.clipboard; + let transferable = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable); + const globalClipboard = clipboard.kGlobalClipboard; + + transferable.init(null); + transferable.addDataFlavor("text/unicode"); + clipboard.getData(transferable, globalClipboard); + let str = {}, strLength = {}; + transferable.getTransferData("text/unicode", str, strLength); + let clipboardValue = ""; + + if (str.value) { + str.value.QueryInterface(Ci.nsISupportsString); + clipboardValue = str.value.data; + } + is(clipboardValue, testText, "Data was copied to the clipboard."); + + // restore the tab location and clear the clipboard + gBrowser.value = initialLocation; + Services.clipboard.emptyClipboard(globalClipboard); +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_find.js @@ -0,0 +1,20 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check find button existence and functionality"); + + yield PanelUI.show(); + + let findButton = document.getElementById("find-button"); + ok(findButton, "Find button exists in Panel Menu"); + + findButton.click(); + ok(!gFindBar.hasAttribute("hidden"), "Findbar opened successfully"); + + // close find bar + gFindBar.close(); +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_history.js @@ -0,0 +1,22 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check history button existence and functionality"); + + yield PanelUI.show(); + + let historyButton = document.getElementById("history-panelmenu"); + ok(historyButton, "History button appears in Panel Menu"); + + historyButton.click(); + let historyPanel = document.getElementById("PanelUI-history"); + ok(historyPanel.getAttribute("current"), "History Panel is in view"); + + let panelHiddenPromise = promisePanelHidden(window); + PanelUI.hide(); + yield panelHiddenPromise +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_newPrivateWindow.js @@ -0,0 +1,45 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check private browsing button existence and functionality"); + yield PanelUI.show(); + + var windowWasHandled = false; + let privateWindow = null; + + let observerWindowOpened = { + observe: function(aSubject, aTopic, aData) { + if (aTopic == "domwindowopened") { + privateWindow = aSubject.QueryInterface(Components.interfaces.nsIDOMWindow); + privateWindow.addEventListener("load", function newWindowHandler() { + privateWindow.removeEventListener("load", newWindowHandler, false); + is(privateWindow.location.href, "chrome://browser/content/browser.xul", + "A new browser window was opened"); + ok(PrivateBrowsingUtils.isWindowPrivate(privateWindow), "Window is private"); + windowWasHandled = true; + }, false); + } + } + } + + Services.ww.registerNotification(observerWindowOpened); + + let privateBrowsingButton = document.getElementById("privatebrowsing-button"); + ok(privateBrowsingButton, "Private browsing button exists in Panel Menu"); + privateBrowsingButton.click(); + + try{ + yield waitForCondition(() => windowWasHandled); + yield promiseWindowClosed(privateWindow); + } + catch(e) { + ok(false, "The new private browser window was not properly handled"); + } + finally { + Services.ww.unregisterNotification(observerWindowOpened); + } +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_newWindow.js @@ -0,0 +1,45 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check new window button existence and functionality"); + yield PanelUI.show(); + + var windowWasHandled = false; + var newWindow = null; + + let observerWindowOpened = { + observe: function(aSubject, aTopic, aData) { + if (aTopic == "domwindowopened") { + newWindow = aSubject.QueryInterface(Components.interfaces.nsIDOMWindow); + newWindow.addEventListener("load", function newWindowHandler() { + newWindow.removeEventListener("load", newWindowHandler, false); + is(newWindow.location.href, "chrome://browser/content/browser.xul", + "A new browser window was opened"); + ok(!PrivateBrowsingUtils.isWindowPrivate(newWindow), "Window is not private"); + windowWasHandled = true; + }, false); + } + } + } + + Services.ww.registerNotification(observerWindowOpened); + + let newWindowButton = document.getElementById("new-window-button"); + ok(newWindowButton, "New Window button exists in Panel Menu"); + newWindowButton.click(); + + try{ + yield waitForCondition(() => windowWasHandled); + yield promiseWindowClosed(newWindow); + } + catch(e) { + ok(false, "The new browser window was not properly handled"); + } + finally { + Services.ww.unregisterNotification(observerWindowOpened); + } +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_paste.js @@ -0,0 +1,35 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check paste button existence and functionality"); + + let initialLocation = gBrowser.currentURI.spec; + let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper); + const globalClipboard = Services.clipboard.kGlobalClipboard; + + yield PanelUI.show(); + + let pasteButton = document.getElementById("paste-button"); + ok(pasteButton, "Paste button exists in Panel Menu"); + + // add text to clipboard + var text = "Sample text for testing"; + clipboard.copyString(text); + + // test paste button by pasting text to URL bar + gURLBar.focus(); + yield PanelUI.show(); + + ok(!pasteButton.hasAttribute("disabled"), "Paste button is enabled"); + pasteButton.click(); + + is(gURLBar.value, text, "Text pasted successfully"); + + // clear the clipboard and restore the tab location as it was at the begining of the test + Services.clipboard.emptyClipboard(globalClipboard); + gURLBar.value = initialLocation; +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_print.js @@ -0,0 +1,32 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const isOSX = (Services.appinfo.OS === "Darwin"); + +add_task(function() { + info("Check print button existence and functionality"); + + yield PanelUI.show(); + + let printButton = document.getElementById("print-button"); + ok(printButton, "Print button exists in Panel Menu"); + + if(isOSX) { + let panelHiddenPromise = promisePanelHidden(window); + PanelUI.hide(); + yield panelHiddenPromise; + } + else { + printButton.click(); + yield waitForCondition(() => window.gInPrintPreviewMode); + + ok(window.gInPrintPreviewMode, "Entered print preview mode"); + + // close print preview + PrintUtils.exitPrintPreview(); + yield waitForCondition(() => !window.gInPrintPreviewMode); + } +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_savePage.js @@ -0,0 +1,18 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check save page button existence"); + + yield PanelUI.show(); + + let savePageButton = document.getElementById("save-page-button"); + ok(savePageButton, "Save Page button exists in Panel Menu"); + + let panelHiddenPromise = promisePanelHidden(window); + PanelUI.hide(); + yield panelHiddenPromise; +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_zoomIn.js @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check zoom in button existence and functionality"); + + let initialPageZoom = ZoomManager.zoom; + is(initialPageZoom, 1, "Initial zoom factor should be 1"); + + yield PanelUI.show(); + + let zoomInButton = document.getElementById("zoom-in-button"); + ok(zoomInButton, "Zoom in button exists in Panel Menu"); + + zoomInButton.click(); + let pageZoomLevel = parseInt(ZoomManager.zoom * 100); + let zoomResetButton = document.getElementById("zoom-reset-button"); + let expectedZoomLevel = parseInt(zoomResetButton.getAttribute("label"), 10); + ok(pageZoomLevel > 100 && pageZoomLevel == expectedZoomLevel, "Page zoomed in correctly"); + + // close the Panel + let panelHiddenPromise = promisePanelHidden(window); + PanelUI.hide(); + yield panelHiddenPromise; + + // reset zoom level + ZoomManager.zoom = initialPageZoom; +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_zoomOut.js @@ -0,0 +1,32 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check zoom out button existence and functionality"); + + let initialPageZoom = ZoomManager.zoom; + is(initialPageZoom, 1, "Initial zoom factor should be 1"); + + yield PanelUI.show(); + + let zoomOutButton = document.getElementById("zoom-out-button"); + ok(zoomOutButton, "Zoom out button exists in Panel Menu"); + + zoomOutButton.click(); + let pageZoomLevel = Math.round(ZoomManager.zoom*100); + + let zoomResetButton = document.getElementById("zoom-reset-button"); + let expectedZoomLevel = parseInt(zoomResetButton.getAttribute("label"), 10); + ok(pageZoomLevel < 100 && pageZoomLevel == expectedZoomLevel, "Page zoomed out correctly"); + + // close the panel + let panelHiddenPromise = promisePanelHidden(window); + PanelUI.hide(); + yield panelHiddenPromise; + + // reset zoom level + ZoomManager.zoom = initialPageZoom; +});
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_947914_button_zoomReset.js @@ -0,0 +1,30 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +add_task(function() { + info("Check zoom reset button existence and functionality"); + + let initialPageZoom = ZoomManager.zoom; + is(initialPageZoom, 1, "Initial zoom factor should be 1"); + ZoomManager.zoom = 0.5; + yield PanelUI.show(); + + let zoomResetButton = document.getElementById("zoom-reset-button"); + ok(zoomResetButton, "Zoom reset button exists in Panel Menu"); + + zoomResetButton.click(); + let pageZoomLevel = parseInt(ZoomManager.zoom * 100); + let expectedZoomLevel = parseInt(zoomResetButton.getAttribute("label"), 10); + ok(pageZoomLevel == expectedZoomLevel && pageZoomLevel == 100, "Page zoom reset correctly"); + + // close the panel + let panelHiddenPromise = promisePanelHidden(window); + PanelUI.hide(); + yield panelHiddenPromise; + + //reset the zoom level + ZoomManager.zoom = initialPageZoom; +});
--- a/browser/components/search/test/browser_bing.js +++ b/browser/components/search/test/browser_bing.js @@ -98,16 +98,21 @@ function test() { value: "MOZSPG", purpose: "homepage", }, { name: "form", value: "MOZLBR", purpose:"keyword", }, + { + name: "form", + value: "MOZTSB", + purpose: "newtab", + }, ], mozparams: {}, }, ], }, }; isSubObjectOf(EXPECTED_ENGINE, engine, "Bing");
--- a/browser/components/search/test/browser_bing_behavior.js +++ b/browser/components/search/test/browser_bing_behavior.js @@ -62,17 +62,17 @@ function test() { registerCleanupFunction(function () { sb.value = ""; }); EventUtils.synthesizeKey("VK_RETURN", {}); } }, { name: "new tab search", - searchURL: base, + searchURL: base + "&form=MOZTSB", run: function () { function doSearch(doc) { // Re-add the listener, and perform a search gBrowser.addProgressListener(listener); doc.getElementById("newtab-search-text").value = "foo"; doc.getElementById("newtab-search-submit").click(); }
--- a/browser/components/tabview/test/browser_tabview_bug606905.js +++ b/browser/components/tabview/test/browser_tabview_bug606905.js @@ -15,17 +15,17 @@ function test() { executeSoon(function() { is(gBrowser.tabContainer.getAttribute("closebuttons"), "activetab", "Only show button on selected tab."); // move a tab to another group and check the closebuttons attribute TabView._initFrame(function() { TabView.moveTabTo(newTabs[newTabs.length - 1], null); ok(gBrowser.visibleTabs[0].getBoundingClientRect().width > gBrowser.tabContainer.mTabClipWidth, "Tab width is bigger than tab clip width"); - is(gBrowser.tabContainer.getAttribute("closebuttons"), "alltabs", "Show button on all tabs.") + is(gBrowser.tabContainer.getAttribute("closebuttons"), "", "Show button on all tabs.") // clean up and finish newTabs.forEach(function(tab) { gBrowser.removeTab(tab); }); finish(); }); });
--- a/browser/locales/en-US/chrome/browser/browser.dtd +++ b/browser/locales/en-US/chrome/browser/browser.dtd @@ -442,17 +442,16 @@ These should match what Safari and other <!ENTITY bookmarkPageCmd2.label "Bookmark This Page"> <!ENTITY bookmarkPageCmd2.accesskey "m"> <!ENTITY bookmarkThisLinkCmd.label "Bookmark This Link"> <!ENTITY bookmarkThisLinkCmd.accesskey "L"> <!ENTITY bookmarkThisFrameCmd.label "Bookmark This Frame"> <!ENTITY bookmarkThisFrameCmd.accesskey "m"> <!ENTITY emailPageCmd.label "Email Link…"> <!ENTITY emailPageCmd.accesskey "E"> -<!ENTITY switchToMetroCmd.label "Relaunch in Windows 8 style &brandShortName;"> <!ENTITY savePageCmd.label "Save Page As…"> <!ENTITY savePageCmd.accesskey "A"> <!-- alternate for content area context menu --> <!ENTITY savePageCmd.accesskey2 "P"> <!ENTITY savePageCmd.commandkey "s"> <!ENTITY saveFrameCmd.label "Save Frame As…"> <!ENTITY saveFrameCmd.accesskey "F"> <!ENTITY printFrameCmd.label "Print Frame…"> @@ -734,52 +733,12 @@ just addresses the organization to follo <!ENTITY tabCrashed.header "Tab crashed"> <!ENTITY tabCrashed.message "Well, this is embarrassing. We tried to display this Web page, but it's not responding."> <!ENTITY tabCrashed.checkSendReport "Tell &vendorShortName; about this crash so they can fix it."> <!ENTITY tabCrashed.tryAgain "Try Again"> <!ENTITY uiTour.infoPanel.close "Close"> -<!-- LOCALIZATION NOTE: the following strings are unused in Australis, they're - kept here to avoid warnings from l10n tools like compare-locales on - l10n-central. They will be definitely removed when Australis is ready - for mozilla-aurora. --> +<!ENTITY appMenuSidebars.label "Sidebars"> -<!ENTITY navbarCmd.accesskey "N"> -<!ENTITY addonBarCmd.label "Add-on Bar"> -<!ENTITY addonBarCmd.accesskey "A"> -<!ENTITY throbberItem.title "Activity Indicator"> -<!ENTITY appMenuButton.label "Menu"> -<!ENTITY appMenuButton.tooltip "Open &brandShortName; menu"> -<!ENTITY feedButton.label "Subscribe"> -<!ENTITY feedButton.tooltip "Subscribe to this page…"> -<!ENTITY bookmarksButton.tooltip "Display your bookmarks"> -<!ENTITY historyButton.tooltip "Display pages you've viewed recently"> -<!ENTITY viewTabsOnTop.label "Tabs on Top"> -<!ENTITY viewTabsOnTop.accesskey "T"> -<!ENTITY appMenuEdit.label "Edit"> -<!ENTITY appMenuToolbarLayout.label "Toolbar Layout…"> -<!ENTITY appMenuSidebars.label "Sidebars"> -<!ENTITY appMenuFind.label "Find…"> -<!ENTITY appMenuUnsorted.label "Unsorted Bookmarks"> -<!ENTITY appMenuWebDeveloper.label "Web Developer"> -<!ENTITY appMenuGettingStarted.label "Getting Started"> -<!ENTITY appMenuSafeMode.label "Restart with Add-ons Disabled…"> -<!ENTITY appMenuSafeMode.accesskey "R"> -<!ENTITY cutButton.tooltip "Cut"> -<!ENTITY copyButton.tooltip "Copy"> -<!ENTITY pasteButton.tooltip "Paste"> -<!ENTITY zoomOutButton.tooltip "Zoom out"> -<!ENTITY zoomInButton.tooltip "Zoom in"> -<!ENTITY zoomControls.label "Zoom Controls"> -<!ENTITY addonBarCloseButton.tooltip "Close Add-on Bar"> -<!ENTITY toggleAddonBarCmd.key "/"> -<!ENTITY backForwardItem.title "Back/Forward"> -<!ENTITY viewBookmarksSidebar.label "Show in Sidebar"> -<!ENTITY bookmarksItem.title "Bookmarks"> -<!ENTITY openLocationCmd.label "Open Location…"> -<!ENTITY openLocationCmd.accesskey "L"> -<!ENTITY bookmarksMenuButton.tooltip "Display your bookmarks"> <!ENTITY switchToMetroCmd2.label "Relaunch in &brandShortName; for Windows 8 Touch"> -<!ENTITY tabGroupsButton.tooltip "Group your tabs"> -<!-- end of strings to be removed post-Australis -->
--- a/browser/locales/en-US/searchplugins/amazondotcom.xml +++ b/browser/locales/en-US/searchplugins/amazondotcom.xml @@ -2,16 +2,18 @@ - 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/. --> <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> <ShortName>Amazon.com</ShortName> <Description>Amazon.com Search</Description> <InputEncoding>ISO-8859-1</InputEncoding> <Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAC0AQAAJgAAACAgAAAAAAAA6QIAANoBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAF7SURBVDjLlZPLasJAFIaFRF+iVV+h6hO0GF+gVB9AaHwDt64qCG03tQgtdCFIuyhUelmGli66MXThSt24kNiFBUlAYi6ezjnNxSuawB/ITP7v/HNmJgQAEaZzpgHs/gwcTyTEXuXl2U6nA8ViEbK5HKler28CVRAwnB9ptVrAh8MrQuCaZ4iA8fzIqSgCxwzpTIaSuN/RWGwdYLwCUBQFZFkGSZLgqdmEE7YEN8VOAKyaSKUW4nNBAFmnYiKZpDRX1WqwBBzP089n5f/NEQsFL4WqqtsBWJlzDAJr5PwSMM1awEzzdxIbGI3Hvc6jCZeVFgRQRwpY7Qcw3ktgfpR8wLRxCPaot/X4GS95MppfF6DX9n2A3f+kAZycaT8bAZjU6r6B/duD6d3BYg9wQq/tkYzHY1blEiz5lmQyGc95mrO6r2CxgpjCBXgNsJVviolpXJiraeOIjJRE10juUa4sR8V+mO17VvmGqtuOcdNlwut8zTQJcJ0njifyB2bgTdKh6w4BAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACsElEQVRYw71XQWsTURBe2LQgeNKLB+tVemt6txcteNSD/QGC6VEIGDx5s+eKPQqFgJhLNdFLBWMP7cU0oSAWjB70koC9WHbVQ5SO8+XtS14mr7svyaYDH9m87Jv55puZt1nPi4yIzjMeMj7T9OwjI88455nGC1cZX+nsDESumJmPFDwIAqrX6z00Gg1qt9vjkJgFgUeuO16Vy3RjeZkyMzM9+MY1fsM9I9h9zyV7ZAznZrA4FAoFVwJ1z+WuOysrg1lnMolkHJX4k0igzI5sARYWF7vEZEk0rvO6iyUSuJfLJUqM7zYSqRDIra4OOUZPmNZsNrsl8UVTpkJAjh1GzmaSpJ8mAWmYeZB5urHRhW5SNOfUCCDo47W1bvPZsp2qAhipy3Nz1kaLG8dUCEBqM5AvpgElqFar01NgIZsdco7Zb7VasU2YigIYL5tjqCL7Q5YkFQXKlcqQ7DbHthIALk/IWAKor82xPIhshxWABCYioDMz51sexcVi0XoG4DPLIyvJjkTArK3scDQnRvO0MdTrUHGiKZCP4tNgO6BAEI08EQH9Z2Qow0hyPypJGIa9p6JWKCn4SA8jSKmJIDgyRvPJkcRxjfUwNGr/i8+Mo32iHzWiThBD4NM60bet9P77/ubA728RlTjMiwiH6zEEfvIrwdZFtQmMJ7W/ofIDBZD5m3mVZGwJcOP2kmILIlCkE45HoPWurwCSg0+UQRD4ZyXxId+T7gQb9+4q9sioY5ltrOG3L5vqXiiJffDx/aUi83ZJ7jr2ohcEu8Hh6/m+I7OWGiVxbWKHsz+O3vSOakqFQdsFgQeJUiKD7Wv9YKXBgCeSUC3v2kM5EJhlHDh3NcgcPlG1BXZu98sDmTuBa4fsMnz9fniJUaGzs+eMC540XuR0aDO2L8Y3qPyMcdOM+R/8XcqRA3qp9gAAAABJRU5ErkJggg==</Image> +<Image width="65" height="26">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAYAAADovjFxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk1RjU4MDYwQkU0RDExRTNBNkI0RTM0MDNENDQ0Q0QxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjk1RjU4MDYxQkU0RDExRTNBNkI0RTM0MDNENDQ0Q0QxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTVGNTgwNUVCRTREMTFFM0E2QjRFMzQwM0Q0NDRDRDEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTVGNTgwNUZCRTREMTFFM0E2QjRFMzQwM0Q0NDRDRDEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4FxGXPAAAGU0lEQVR42uyYe2xU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</Image> +<Image width="130" height="52">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAYAAABGkOCVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk1RjU4MDVDQkU0RDExRTNBNkI0RTM0MDNENDQ0Q0QxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjk1RjU4MDVEQkU0RDExRTNBNkI0RTM0MDNENDQ0Q0QxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTVGNTgwNUFCRTREMTFFM0E2QjRFMzQwM0Q0NDRDRDEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTVGNTgwNUJCRTREMTFFM0E2QjRFMzQwM0Q0NDRDRDEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5AOR4OAAAOI0lEQVR42uxcC3BU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</Image> <Url type="text/html" method="GET" template="http://www.amazon.com/exec/obidos/external-search/"> <Param name="field-keywords" value="{searchTerms}"/> <Param name="mode" value="blended"/> <Param name="tag" value="mozilla-20"/> <Param name="sourceid" value="Mozilla-search"/> </Url> <SearchForm>http://www.amazon.com/</SearchForm> </SearchPlugin>
--- a/browser/locales/en-US/searchplugins/bing.xml +++ b/browser/locales/en-US/searchplugins/bing.xml @@ -2,23 +2,26 @@ - 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/. --> <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> <ShortName>Bing</ShortName> <Description>Bing. Search by Microsoft.</Description> <InputEncoding>UTF-8</InputEncoding> <Image width="16" height="16">data:image/x-icon;base64,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</Image> + <Image width="65" height="26">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAYAAADovjFxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkVBOTQzNENBQzQxNDExRTM5RURBRUU5NUU4QkU3NjA4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkVBOTQzNENCQzQxNDExRTM5RURBRUU5NUU4QkU3NjA4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzU2RTRERkZDMzc1MTFFMzlFREFFRTk1RThCRTc2MDgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzU2RTRFMDBDMzc1MTFFMzlFREFFRTk1RThCRTc2MDgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz76XOiPAAAD1ElEQVR42uyYeUgVQRzH9+nLNE07kMKIiqAkSaUIMgUpyu6eHdBhVBSBZQf1R4XkP0WHFUURWBlRmGGHdkI3nWIXVHZIaNkhFXmWYni+vhPfhWHZfbvvqVjZDz7Mzs6w8+Y3v2ue3eFwPFUU5R64CG6BRqWDiReIBCvBNfAeHAXjOpoSqqV+H7AQbO1oStCTz/+VoCjONlpvDdgPelqc3x8kgMD2UEJbSTRIAkMszhfB+jhIbU8lxIIZrbjeV7b1FudngefgansqoQ5kg3cgDUwBXVthXavutoXZ61x7KuEBOAkGgESap0ijGWAeCPZwXZv0bNf0PZFObuzX7klM2Kjp9wDzQSYVcgWsAqFubD4fjAIloAE0g0sgXDN/Li1xBPt+IAcks3+KViXc6xmYbrDuGBaETVzvFegHloKzVpRQBK4bjHUB48FeUADyQDcX32pmuxPkgkr6vahaJ9P/Q3Vi0mD2fbjRdeAln4VSboIIPkdp1lzA8RjuQ1h2CA9wH4i3mh2SLc4bCQJMYozCDDEbDOVpDwPLOHZGml/KtlpSongOArV0g5lgLFguxRFVxGaP0VrCQByYA7pT+b7ie1aV8ASMBhdM5jWY3D3UgLiLpizLAfCGP3agi2/4s43RvE+jucdKbpfEdjV4reNqVSLQu1Mn3AYOxoTcFgawHIPxbLZhJsHtg0Ga/cJxVdkTdKxLlnxFL1JKvqcn4oQWMai0RAk/DcarpFjjSmpN3E2uOOX6RCuNrpTQWdPvC9ZL5uVqk3YL7mBUJ4SwLTdZx2gNb4P1vA3c1McoRZaBxXwWAWgbM0SShZN+KJ2mnqgm3MtgXE1xL1qpDiowca8IReM/ClNUMH1OpKG3YIML91DlB1jL7FDjYp56Grt1xmbRzfJcmK9VUS0ik+0OnTmbWf3WeEkbPMQSdRqVkGrxtncYDAJ7LMwNlE6mhEXXRLAdnOZYgjTfTxNLbJrvaCVI009nPRDH+0c8mMrALIrAQuFaduZeUUAcAZeliGom92kl7mSKeqbRSSyYMqSxYiqgWHpXw/l1ko+LfoXB98s1dUoTrfMEFREnjQ1nbbHE5nA4vvOCFGlxI2UsntI9MNNARn7V3KNobd/AI535AaSSirAxnjTyd2glmK6g507hDPBCsXf47qN4J5SQyELDihykAir+gT+U/KmQIi9WasKn75qYfjRvkn+bAoINAud5Pqeo+baQ5WYK2KT5EySFwe9vFF+6Win/kxAn35sls3oLzbLrpI0b3PRjsMIk5f3pYmPsSuC1WZVPrH9+hwGb0+lUOrr8EmAAiqTecoRlgJMAAAAASUVORK5CYII=</Image> + <Image width="130" height="52">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAYAAABGkOCVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc1NkU0REZEQzM3NTExRTM5RURBRUU5NUU4QkU3NjA4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjc1NkU0REZFQzM3NTExRTM5RURBRUU5NUU4QkU3NjA4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzU2RTRERkJDMzc1MTFFMzlFREFFRTk1RThCRTc2MDgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzU2RTRERkNDMzc1MTFFMzlFREFFRTk1RThCRTc2MDgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5lzzn9AAAIPUlEQVR42uxdCWwV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</Image> <Url type="application/x-suggestions+json" template="http://api.bing.com/osjson.aspx"> <Param name="query" value="{searchTerms}"/> <Param name="form" value="OSDJAS"/> <Param name="language" value="{moz:locale}"/> </Url> <Url type="text/html" method="GET" template="http://www.bing.com/search"> <Param name="q" value="{searchTerms}"/> <MozParam name="pc" condition="pref" pref="ms-pc"/> <MozParam name="form" condition="purpose" purpose="contextmenu" value="MOZCON"/> <MozParam name="form" condition="purpose" purpose="searchbar" value="MOZSBR"/> <MozParam name="form" condition="purpose" purpose="homepage" value="MOZSPG"/> <MozParam name="form" condition="purpose" purpose="keyword" value="MOZLBR"/> + <MozParam name="form" condition="purpose" purpose="newtab" value="MOZTSB"/> </Url> <SearchForm>http://www.bing.com/search</SearchForm> </SearchPlugin>
--- a/browser/modules/BrowserUITelemetry.jsm +++ b/browser/modules/BrowserUITelemetry.jsm @@ -57,17 +57,16 @@ XPCOMUtils.defineLazyGetter(this, "DEFAU // in the document. "toolbar-menubar": [ "menubar-items", ], "TabsToolbar": [ "tabbrowser-tabs", "new-tab-button", "alltabs-button", - "tabs-closebutton", ], "PersonalToolbar": [ "personal-bookmarks", ], }; let showCharacterEncoding = Services.prefs.getComplexValue( "browser.menu.showCharacterEncoding",
--- a/browser/themes/linux/browser.css +++ b/browser/themes/linux/browser.css @@ -1767,71 +1767,37 @@ richlistitem[type~="action"][actiontype= /* Tab drag and drop */ .tab-drop-indicator { list-style-image: url(chrome://browser/skin/tabbrowser/tabDragIndicator.png); margin-bottom: -9px; z-index: 3; } -/* In-tab close button */ -.tab-close-button > .toolbarbutton-icon { - /* XXX Buttons have padding in widget/ that we don't want here but can't override with good CSS, so we must - use evil CSS to give the impression of smaller content */ - margin: -4px; -} - -/* Tabstrip close button */ -.tabs-closebutton, -.tab-close-button { - -moz-appearance: none; - height: 16px; - width: 16px; -} - -.tabs-closebutton:not([selected]):not(:hover), +/* Tab close button */ .tab-close-button:not([selected]):not(:hover) { background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 64, 16, 48); } -.tabs-closebutton:not([selected]):not(:hover):-moz-lwtheme-brighttext, .tab-close-button:not([selected]):not(:hover):-moz-lwtheme-brighttext { background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 80, 16, 64); } -.tabs-closebutton:not([selected]):not(:hover):-moz-lwtheme-darktext, .tab-close-button:not([selected]):not(:hover):-moz-lwtheme-darktext { background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 96, 16, 80); } /* Tabstrip new tab button */ .tabs-newtab-button, #TabsToolbar > #new-tab-button , #TabsToolbar > #wrapper-new-tab-button > #new-tab-button { list-style-image: url("moz-icon://stock/gtk-add?size=menu"); -moz-image-region: auto; } -.customization-tipPanel-closeBox > .close-icon { - -moz-appearance: none; - width: 16px; - height: 16px; -} - -/* The :hover:active style from toolkit doesn't seem to work in this panel so just use :active. */ -.customization-tipPanel-closeBox > .close-icon:active { - background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 48, 16, 32); -} - -.tabs-closebutton > .toolbarbutton-icon { - /* XXX Buttons have padding in widget/ that we don't want here but can't override with good CSS, so we must - use evil CSS to give the impression of smaller content */ - margin: -2px; -} - /* Tabbrowser arrowscrollbox arrows */ .tabbrowser-arrowscrollbox > .scrollbutton-up, .tabbrowser-arrowscrollbox > .scrollbutton-down { -moz-appearance: none; margin: 0 0 @tabToolbarNavbarOverlap@; } .tabbrowser-arrowscrollbox > .scrollbutton-up { @@ -1898,21 +1864,16 @@ richlistitem[type~="action"][actiontype= } .alltabs-item[tabIsVisible] { /* box-shadow instead of background-color to work around native styling */ box-shadow: inset -5px 0 ThreeDShadow; } /* Sidebar */ -#sidebar-header > .tabs-closebutton { - margin-bottom: 0px !important; - padding: 0px 2px 0px 2px !important; -} - #sidebar-throbber[loading="true"] { list-style-image: url("chrome://global/skin/icons/loading_16.png"); -moz-margin-end: 4px; } toolbarbutton.chevron { list-style-image: url("chrome://global/skin/toolbar/chevron.gif") !important; } @@ -2230,16 +2191,21 @@ chatbox { #main-window[customize-entered] #TabsToolbar { -moz-appearance: none; background-clip: padding-box; border-right: 3px solid transparent; border-left: 3px solid transparent; } +/* The :hover:active style from toolkit doesn't seem to work in this panel so just use :active. */ +.customization-tipPanel-closeBox > .close-icon:active { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 48, 16, 32); +} + /* End customization mode */ #main-window[privatebrowsingmode=temporary] #private-browsing-indicator { background: url("chrome://browser/skin/privatebrowsing-mask.png") center no-repeat; width: 40px; }
--- a/browser/themes/linux/devtools/netmonitor.css +++ b/browser/themes/linux/devtools/netmonitor.css @@ -4,17 +4,17 @@ %include ../../shared/devtools/netmonitor.inc.css #headers-summary-resend { padding: 4px; } .requests-menu-status-and-method { - width: 7em; + width: 9em; } .requests-menu-domain { width: 16vw; } .requests-menu-size { width: 6em;
--- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -223,17 +223,16 @@ browser.jar: * skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css) * skin/classic/browser/devtools/splitview.css (../shared/devtools/splitview.css) skin/classic/browser/devtools/styleeditor.css (../shared/devtools/styleeditor.css) * skin/classic/browser/devtools/webaudioeditor.css (devtools/webaudioeditor.css) skin/classic/browser/devtools/magnifying-glass.png (../shared/devtools/images/magnifying-glass.png) skin/classic/browser/devtools/magnifying-glass@2x.png (../shared/devtools/images/magnifying-glass@2x.png) skin/classic/browser/devtools/magnifying-glass-light.png (../shared/devtools/images/magnifying-glass-light.png) skin/classic/browser/devtools/magnifying-glass-light@2x.png (../shared/devtools/images/magnifying-glass-light@2x.png) - skin/classic/browser/devtools/option-icon.png (../shared/devtools/images/option-icon.png) skin/classic/browser/devtools/itemToggle.png (../shared/devtools/images/itemToggle.png) skin/classic/browser/devtools/itemToggle-light.png (../shared/devtools/images/itemToggle-light.png) skin/classic/browser/devtools/itemArrow-dark-rtl.png (../shared/devtools/images/itemArrow-dark-rtl.png) skin/classic/browser/devtools/itemArrow-dark-ltr.png (../shared/devtools/images/itemArrow-dark-ltr.png) skin/classic/browser/devtools/itemArrow-rtl.svg (../shared/devtools/images/itemArrow-rtl.svg) skin/classic/browser/devtools/itemArrow-ltr.svg (../shared/devtools/images/itemArrow-ltr.svg) skin/classic/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png) skin/classic/browser/devtools/noise.png (devtools/noise.png)
--- a/browser/themes/osx/browser.css +++ b/browser/themes/osx/browser.css @@ -2618,20 +2618,16 @@ sidebarheader { font-weight: bold; } .sidebar-throbber[loading="true"], #sidebar-throbber[loading="true"] { list-style-image: url("chrome://global/skin/icons/loading_16.png"); } -sidebarheader > .tabs-closebutton > .toolbarbutton-text { - display: none; -} - /* ----- CONTENT ----- */ .browserContainer > findbar { background: @scopeBarBackground@; border-top: @scopeBarSeparatorBorder@; color: -moz-DialogText; text-shadow: none; } @@ -3174,28 +3170,16 @@ toolbarbutton.chevron > .toolbarbutton-m list-style-image: url("chrome://global/skin/icons/loading_16.png") !important; } .alltabs-item[tabIsVisible] { /* box-shadow instead of background-color to work around native styling */ box-shadow: inset -5px 0 ThreeDShadow; } -/* Tabstrip close button */ -.tabs-closebutton { - -moz-padding-end: 4px; - border: none; -} - -@media (min-resolution: 2dppx) { - .tabs-closebutton > .toolbarbutton-icon { - width: 16px; - } -} - /* Bookmarks toolbar */ #PlacesToolbarDropIndicator { list-style-image: url(chrome://browser/skin/places/toolbarDropMarker.png); } /* Bookmark drag and drop styles */ .bookmark-item[dragover-into="true"] {
--- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -344,17 +344,16 @@ browser.jar: * skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css) * skin/classic/browser/devtools/splitview.css (../shared/devtools/splitview.css) skin/classic/browser/devtools/styleeditor.css (../shared/devtools/styleeditor.css) * skin/classic/browser/devtools/webaudioeditor.css (devtools/webaudioeditor.css) skin/classic/browser/devtools/magnifying-glass.png (../shared/devtools/images/magnifying-glass.png) skin/classic/browser/devtools/magnifying-glass@2x.png (../shared/devtools/images/magnifying-glass@2x.png) skin/classic/browser/devtools/magnifying-glass-light.png (../shared/devtools/images/magnifying-glass-light.png) skin/classic/browser/devtools/magnifying-glass-light@2x.png (../shared/devtools/images/magnifying-glass-light@2x.png) - skin/classic/browser/devtools/option-icon.png (../shared/devtools/images/option-icon.png) skin/classic/browser/devtools/itemToggle.png (../shared/devtools/images/itemToggle.png) skin/classic/browser/devtools/itemToggle-light.png (../shared/devtools/images/itemToggle-light.png) skin/classic/browser/devtools/itemArrow-dark-rtl.png (../shared/devtools/images/itemArrow-dark-rtl.png) skin/classic/browser/devtools/itemArrow-dark-ltr.png (../shared/devtools/images/itemArrow-dark-ltr.png) skin/classic/browser/devtools/itemArrow-rtl.svg (../shared/devtools/images/itemArrow-rtl.svg) skin/classic/browser/devtools/itemArrow-ltr.svg (../shared/devtools/images/itemArrow-ltr.svg) skin/classic/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png) skin/classic/browser/devtools/noise.png (devtools/noise.png)
--- a/browser/themes/shared/customizableui/panelUIOverlay.inc.css +++ b/browser/themes/shared/customizableui/panelUIOverlay.inc.css @@ -723,17 +723,17 @@ menuitem.subviewbutton@menuStateHover@, background-color: hsla(210,4%,10%,.08); border-color: hsla(210,4%,10%,.11); } .toolbaritem-combined-buttons@inAnyPanel@@buttonStateHover@ { border-color: hsla(210,4%,10%,.11); } -panelview .toolbarbutton-1@buttonStateActive@, +panelview .toolbarbutton-1:-moz-any(@buttonStateActive@,[checked=true]), toolbarbutton.subviewbutton@buttonStateActive@, menu.subviewbutton@menuStateActive@, menuitem.subviewbutton@menuStateActive@, .widget-overflow-list .toolbarbutton-1@buttonStateActive@, .toolbaritem-combined-buttons@inAnyPanel@ > toolbarbutton@buttonStateActive@ { background-color: hsla(210,4%,10%,.12); border-color: hsla(210,4%,10%,.14); box-shadow: 0 1px 0 hsla(210,4%,10%,.03) inset;
deleted file mode 100644 index afdc6a209726575db92b96eb5e0529f8b85c5b96..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@<O00001
--- a/browser/themes/shared/devtools/toolbars.inc.css +++ b/browser/themes/shared/devtools/toolbars.inc.css @@ -114,24 +114,24 @@ } .theme-dark .devtools-toolbarbutton[checked=true]:hover:active { background-color: hsla(210,8%,5%,.2) !important; } .devtools-option-toolbarbutton { -moz-appearance: none; - list-style-image: url("chrome://browser/skin/devtools/option-icon.png"); - -moz-image-region: rect(0px 16px 16px 0px); + list-style-image: url("chrome://browser/skin/devtools/tool-options.svg"); background: none; + opacity: .8; border: none; } .devtools-option-toolbarbutton[open=true] { - -moz-image-region: rect(0px 32px 16px 16px); + opacity: 1; } .devtools-menulist > .menulist-label-box { text-align: center; } .devtools-menulist > .menulist-dropmarker { -moz-appearance: none; @@ -787,17 +787,16 @@ filter: url(filters.svg#invert); } /* Since selected backgrounds are blue, we want to use the normal * (light) icons. */ .theme-light .command-button-invertable[checked=true]:not(:active) > image, .theme-light .devtools-tab[icon-invertable][selected] > image, .theme-light .devtools-tab[icon-invertable][highlighted] > image, -.theme-light .devtools-option-toolbarbutton[open] > image, .theme-light #resume[checked] > image { filter: none !important; } .theme-light .command-button:hover { background-color: inherit; }
--- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css @@ -1761,16 +1761,23 @@ toolbarbutton[type="socialmark"] > .tool #sidebar { background-color: Window; } #sidebar-title { -moz-padding-start: 0px; } +#sidebar-header > .close-icon { + -moz-appearance: none; + padding: 4px 2px; + margin: 0; + border: none; +} + .browserContainer > findbar { background-color: -moz-dialog; color: -moz-DialogText; text-shadow: none; } /* Tabstrip */ @@ -1992,30 +1999,16 @@ toolbarbutton[type="socialmark"] > .tool list-style-image: url("chrome://global/skin/icons/loading_16.png"); } .alltabs-item[tabIsVisible] { /* box-shadow instead of background-color to work around native styling */ box-shadow: inset -5px 0 ThreeDShadow; } -/* Tabstrip close button */ -.tabs-closebutton { - -moz-appearance: none; - padding: 4px 2px; - margin: 0px; - border: none; -} - -.tabs-closebutton > .toolbarbutton-icon { - -moz-margin-end: 0px !important; - -moz-padding-end: 2px !important; - -moz-padding-start: 2px !important; -} - toolbarbutton.chevron { list-style-image: url("chrome://global/skin/toolbar/chevron.gif") !important; } toolbarbutton.chevron:-moz-locale-dir(rtl) > .toolbarbutton-icon { transform: scaleX(-1); }
--- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -260,17 +260,16 @@ browser.jar: * skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css) * skin/classic/browser/devtools/splitview.css (../shared/devtools/splitview.css) skin/classic/browser/devtools/styleeditor.css (../shared/devtools/styleeditor.css) * skin/classic/browser/devtools/webaudioeditor.css (devtools/webaudioeditor.css) skin/classic/browser/devtools/magnifying-glass.png (../shared/devtools/images/magnifying-glass.png) skin/classic/browser/devtools/magnifying-glass@2x.png (../shared/devtools/images/magnifying-glass@2x.png) skin/classic/browser/devtools/magnifying-glass-light.png (../shared/devtools/images/magnifying-glass-light.png) skin/classic/browser/devtools/magnifying-glass-light@2x.png (../shared/devtools/images/magnifying-glass-light@2x.png) - skin/classic/browser/devtools/option-icon.png (../shared/devtools/images/option-icon.png) skin/classic/browser/devtools/itemToggle.png (../shared/devtools/images/itemToggle.png) skin/classic/browser/devtools/itemToggle-light.png (../shared/devtools/images/itemToggle-light.png) skin/classic/browser/devtools/itemArrow-dark-rtl.png (../shared/devtools/images/itemArrow-dark-rtl.png) skin/classic/browser/devtools/itemArrow-dark-ltr.png (../shared/devtools/images/itemArrow-dark-ltr.png) skin/classic/browser/devtools/itemArrow-rtl.svg (../shared/devtools/images/itemArrow-rtl.svg) skin/classic/browser/devtools/itemArrow-ltr.svg (../shared/devtools/images/itemArrow-ltr.svg) skin/classic/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png) skin/classic/browser/devtools/noise.png (devtools/noise.png) @@ -623,17 +622,16 @@ browser.jar: * skin/classic/aero/browser/devtools/scratchpad.css (devtools/scratchpad.css) * skin/classic/aero/browser/devtools/shadereditor.css (devtools/shadereditor.css) * skin/classic/aero/browser/devtools/splitview.css (../shared/devtools/splitview.css) skin/classic/aero/browser/devtools/styleeditor.css (../shared/devtools/styleeditor.css) skin/classic/aero/browser/devtools/magnifying-glass.png (../shared/devtools/images/magnifying-glass.png) skin/classic/aero/browser/devtools/magnifying-glass@2x.png (../shared/devtools/images/magnifying-glass@2x.png) skin/classic/aero/browser/devtools/magnifying-glass-light.png (../shared/devtools/images/magnifying-glass-light.png) skin/classic/aero/browser/devtools/magnifying-glass-light@2x.png (../shared/devtools/images/magnifying-glass-light@2x.png) - skin/classic/aero/browser/devtools/option-icon.png (../shared/devtools/images/option-icon.png) skin/classic/aero/browser/devtools/itemToggle.png (../shared/devtools/images/itemToggle.png) skin/classic/aero/browser/devtools/itemToggle-light.png (../shared/devtools/images/itemToggle-light.png) skin/classic/aero/browser/devtools/itemArrow-dark-rtl.png (../shared/devtools/images/itemArrow-dark-rtl.png) skin/classic/aero/browser/devtools/itemArrow-dark-ltr.png (../shared/devtools/images/itemArrow-dark-ltr.png) skin/classic/aero/browser/devtools/itemArrow-rtl.svg (../shared/devtools/images/itemArrow-rtl.svg) skin/classic/aero/browser/devtools/itemArrow-ltr.svg (../shared/devtools/images/itemArrow-ltr.svg) skin/classic/aero/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png) skin/classic/aero/browser/devtools/noise.png (devtools/noise.png)
--- a/mobile/android/base/TabsAccessor.java +++ b/mobile/android/base/TabsAccessor.java @@ -16,17 +16,16 @@ import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.util.Log; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.regex.Pattern; public final class TabsAccessor { private static final String LOGTAG = "GeckoTabsAccessor"; private static final String[] CLIENTS_AVAILABILITY_PROJECTION = new String[] { BrowserContract.Clients.GUID }; @@ -45,17 +44,16 @@ public final class TabsAccessor { NAME }; private static final String CLIENTS_SELECTION = BrowserContract.Clients.GUID + " IS NOT NULL"; private static final String TABS_SELECTION = BrowserContract.Tabs.CLIENT_GUID + " IS NOT NULL"; private static final String LOCAL_CLIENT_SELECTION = BrowserContract.Clients.GUID + " IS NULL"; private static final String LOCAL_TABS_SELECTION = BrowserContract.Tabs.CLIENT_GUID + " IS NULL"; - private static final Pattern FILTERED_URL_PATTERN = Pattern.compile("^(about|chrome|wyciwyg|file):.*$"); public static class RemoteTab { public String title; public String url; public String guid; public String name; } @@ -146,19 +144,19 @@ public final class TabsAccessor { */ private static void insertLocalTabs(final ContentResolver cr, final Iterable<Tab> tabs) { // Reuse this for serializing individual history URLs as JSON. JSONArray history = new JSONArray(); ArrayList<ContentValues> valuesToInsert = new ArrayList<ContentValues>(); int position = 0; for (Tab tab : tabs) { - // Skip this tab if it has a null URL or is in private browsing mode, or is a filtered URL. + // Skip this tab if it has a null URL or is in private browsing mode String url = tab.getURL(); - if (url == null || tab.isPrivate() || isFilteredURL(url)) + if (url == null || tab.isPrivate()) continue; ContentValues values = new ContentValues(); values.put(BrowserContract.Tabs.URL, url); values.put(BrowserContract.Tabs.TITLE, tab.getTitle()); values.put(BrowserContract.Tabs.LAST_USED, tab.getLastUsed()); String favicon = tab.getFaviconURL(); @@ -189,18 +187,9 @@ public final class TabsAccessor { } // Deletes all local tabs and replaces them with a new list of tabs. public static synchronized void persistLocalTabs(final ContentResolver cr, final Iterable<Tab> tabs) { deleteLocalTabs(cr); insertLocalTabs(cr, tabs); updateLocalClient(cr); } - - /** - * Matches the supplied URL string against the set of URLs to filter. - * - * @return true if the supplied URL should be skipped; false otherwise. - */ - private static boolean isFilteredURL(String url) { - return FILTERED_URL_PATTERN.matcher(url).matches(); - } }
--- a/mobile/android/base/db/BrowserContract.java +++ b/mobile/android/base/db/BrowserContract.java @@ -342,16 +342,19 @@ public class BrowserContract { public static final String DATASET_ID = "dataset_id"; public static final String URL = "url"; public static final String TITLE = "title"; public static final String DESCRIPTION = "description"; public static final String IMAGE_URL = "image_url"; public static final String CREATED = "created"; public static final String FILTER = "filter"; + + public static final String[] DEFAULT_PROJECTION = + new String[] { _ID, DATASET_ID, URL, TITLE, DESCRIPTION, IMAGE_URL, FILTER }; } /* * Contains names and schema definitions for tables and views * no longer being used by current ContentProviders. These values are used * to make incremental updates to the schema during a database upgrade. Will be * removed with bug 947018. */
--- a/mobile/android/base/db/HomeProvider.java +++ b/mobile/android/base/db/HomeProvider.java @@ -80,22 +80,27 @@ public class HomeProvider extends SQLite throw new IllegalArgumentException("All queries should contain a dataset ID parameter"); } selection = DBUtils.concatenateWhere(selection, HomeItems.DATASET_ID + " = ?"); selectionArgs = DBUtils.appendSelectionArgs(selectionArgs, new String[] { datasetId }); // Otherwise, let the SQLiteContentProvider implementation take care of this query for us! - final Cursor c = super.query(uri, projection, selection, selectionArgs, sortOrder); - if (c != null) { - final ContentResolver cr = getContext().getContentResolver(); - c.setNotificationUri(cr, getDatasetNotificationUri(datasetId)); + Cursor c = super.query(uri, projection, selection, selectionArgs, sortOrder); + + // SQLiteBridgeContentProvider may return a null Cursor if the database hasn't been created yet. + // However, we need a non-null cursor in order to listen for notifications. + if (c == null) { + c = new MatrixCursor(projection != null ? projection : HomeItems.DEFAULT_PROJECTION); } + final ContentResolver cr = getContext().getContentResolver(); + c.setNotificationUri(cr, getDatasetNotificationUri(datasetId)); + return c; } /** * Returns a cursor populated with static fake data. */ private Cursor queryFakeItems(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { JSONArray items = null; @@ -105,27 +110,17 @@ public class HomeProvider extends SQLite } catch (IOException e) { Log.e(LOGTAG, "Error getting fake home items", e); return null; } catch (JSONException e) { Log.e(LOGTAG, "Error parsing fake_home_items.json", e); return null; } - final String[] itemsColumns = new String[] { - HomeItems._ID, - HomeItems.DATASET_ID, - HomeItems.URL, - HomeItems.TITLE, - HomeItems.DESCRIPTION, - HomeItems.IMAGE_URL, - HomeItems.FILTER - }; - - final MatrixCursor c = new MatrixCursor(itemsColumns); + final MatrixCursor c = new MatrixCursor(HomeItems.DEFAULT_PROJECTION); for (int i = 0; i < items.length(); i++) { try { final JSONObject item = items.getJSONObject(i); c.addRow(new Object[] { item.getInt("id"), item.getString("dataset_id"), item.getString("url"), item.getString("title"),
--- a/mobile/android/base/home/PanelGridView.java +++ b/mobile/android/base/home/PanelGridView.java @@ -14,54 +14,64 @@ import org.mozilla.gecko.home.HomeConfig import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; import org.mozilla.gecko.home.PanelLayout.DatasetBacked; import org.mozilla.gecko.home.PanelLayout.FilterManager; import org.mozilla.gecko.home.PanelLayout.OnItemOpenListener; import org.mozilla.gecko.home.PanelLayout.PanelView; import android.content.Context; import android.database.Cursor; +import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.GridView; public class PanelGridView extends GridView implements DatasetBacked, PanelView { private static final String LOGTAG = "GeckoPanelGridView"; private final ViewConfig viewConfig; private final PanelViewAdapter adapter; private PanelViewItemHandler itemHandler; + private OnItemOpenListener itemOpenListener; public PanelGridView(Context context, ViewConfig viewConfig) { super(context, null, R.attr.panelGridViewStyle); this.viewConfig = viewConfig; itemHandler = new PanelViewItemHandler(viewConfig); adapter = new PanelViewAdapter(context, viewConfig); setAdapter(adapter); setOnItemClickListener(new PanelGridItemClickListener()); } @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + itemHandler.setOnItemOpenListener(itemOpenListener); + } + + @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); itemHandler.setOnItemOpenListener(null); } @Override public void setDataset(Cursor cursor) { + Log.d(LOGTAG, "Setting dataset: " + viewConfig.getDatasetId()); adapter.swapCursor(cursor); } @Override public void setOnItemOpenListener(OnItemOpenListener listener) { itemHandler.setOnItemOpenListener(listener); + itemOpenListener = listener; } @Override public void setFilterManager(FilterManager filterManager) { adapter.setFilterManager(filterManager); itemHandler.setFilterManager(filterManager); }
--- a/mobile/android/base/home/PanelListView.java +++ b/mobile/android/base/home/PanelListView.java @@ -22,54 +22,62 @@ import android.util.Log; import android.view.View; import android.widget.AdapterView; public class PanelListView extends HomeListView implements DatasetBacked, PanelView { private static final String LOGTAG = "GeckoPanelListView"; - private final PanelViewAdapter mAdapter; - private final ViewConfig mViewConfig; - private final PanelViewItemHandler mItemHandler; + private final ViewConfig viewConfig; + private final PanelViewAdapter adapter; + private final PanelViewItemHandler itemHandler; + private OnItemOpenListener itemOpenListener; public PanelListView(Context context, ViewConfig viewConfig) { super(context); - mViewConfig = viewConfig; - mItemHandler = new PanelViewItemHandler(viewConfig); + this.viewConfig = viewConfig; + itemHandler = new PanelViewItemHandler(viewConfig); - mAdapter = new PanelViewAdapter(context, viewConfig); - setAdapter(mAdapter); + adapter = new PanelViewAdapter(context, viewConfig); + setAdapter(adapter); setOnItemClickListener(new PanelListItemClickListener()); } + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + itemHandler.setOnItemOpenListener(itemOpenListener); + } + @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); - mItemHandler.setOnItemOpenListener(null); + itemHandler.setOnItemOpenListener(null); } @Override public void setDataset(Cursor cursor) { - Log.d(LOGTAG, "Setting dataset: " + mViewConfig.getDatasetId()); - mAdapter.swapCursor(cursor); + Log.d(LOGTAG, "Setting dataset: " + viewConfig.getDatasetId()); + adapter.swapCursor(cursor); } @Override public void setOnItemOpenListener(OnItemOpenListener listener) { - mItemHandler.setOnItemOpenListener(listener); + itemHandler.setOnItemOpenListener(listener); + itemOpenListener = listener; } @Override public void setFilterManager(FilterManager filterManager) { - mAdapter.setFilterManager(filterManager); - mItemHandler.setFilterManager(filterManager); + adapter.setFilterManager(filterManager); + itemHandler.setFilterManager(filterManager); } private class PanelListItemClickListener implements AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - mItemHandler.openItemAtPosition(mAdapter.getCursor(), position); + itemHandler.openItemAtPosition(adapter.getCursor(), position); } } }
--- a/mobile/android/base/tests/robocop.ini +++ b/mobile/android/base/tests/robocop.ini @@ -27,17 +27,16 @@ skip-if = android_version == "10" # disabled on 2.3; bug 979603 skip-if = android_version == "10" [testBrowserSearchVisibility] [testClearPrivateData] # disabled on x86 and 2.3; bug 948591 skip-if = android_version == "10" || processor == "x86" [testDistribution] [testDoorHanger] -[testFilterOpenTab] # disabled on 2.3; bug 986172 skip-if = android_version == "10" [testFindInPage] # disabled on Android 2.3; bug 975155 skip-if = android_version == "10" [testFlingCorrectness] # disabled on x86 only; bug 927476 skip-if = processor == "x86"
deleted file mode 100644 --- a/mobile/android/base/tests/testFilterOpenTab.java +++ /dev/null @@ -1,125 +0,0 @@ -package org.mozilla.gecko.tests; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.Callable; - -import org.mozilla.gecko.PrivateTab; -import org.mozilla.gecko.Tab; -import org.mozilla.gecko.TabsAccessor; -import org.mozilla.gecko.db.BrowserContract; -import org.mozilla.gecko.db.TabsProvider; - -import android.content.ContentProvider; -import android.content.Context; -import android.database.Cursor; - -/** - * Tests that local tabs are filtered prior to upload. - * - create a set of tabs and perists them through TabsAccessor. - * - verifies that tabs are filtered by querying. - */ -public class testFilterOpenTab extends ContentProviderTest { - private static final String[] TABS_PROJECTION_COLUMNS = new String[] { - BrowserContract.Tabs.TITLE, - BrowserContract.Tabs.URL, - BrowserContract.Clients.GUID, - BrowserContract.Clients.NAME - }; - - private static final String LOCAL_TABS_SELECTION = BrowserContract.Tabs.CLIENT_GUID + " IS NULL"; - - /** - * Factory function that makes new ContentProvider instances. - * <p> - * We want a fresh provider each test, so this should be invoked in - * <code>setUp</code> before each individual test. - */ - protected static Callable<ContentProvider> sTabProviderCallable = new Callable<ContentProvider>() { - @Override - public ContentProvider call() { - return new TabsProvider(); - } - }; - - private Cursor getTabsFromLocalClient() throws Exception { - return mProvider.query(BrowserContract.Tabs.CONTENT_URI, - TABS_PROJECTION_COLUMNS, - LOCAL_TABS_SELECTION, - null, - null); - } - - private Tab createTab(int id, String url, boolean external, int parentId, String title) { - return new Tab((Context) getActivity(), id, url, external, parentId, title); - } - - private Tab createPrivateTab(int id, String url, boolean external, int parentId, String title) { - return new PrivateTab((Context) getActivity(), id, url, external, parentId, title); - } - - @Override - public void setUp() throws Exception { - super.setUp(sTabProviderCallable, BrowserContract.TABS_AUTHORITY, "tabs.db"); - mTests.add(new TestInsertLocalTabs()); - } - - public void testFilterOpenTab() throws Exception { - for (int i = 0; i < mTests.size(); i++) { - Runnable test = mTests.get(i); - - setTestName(test.getClass().getSimpleName()); - test.run(); - } - } - - private class TestInsertLocalTabs extends TestCase { - @Override - public void test() throws Exception { - final String TITLE1 = "Google"; - final String URL1 = "http://www.google.com/"; - final String TITLE2 = "Mozilla Start Page"; - final String URL2 = "about:home"; - final String TITLE3 = "Chrome Weave URL"; - final String URL3 = "chrome://weave/"; - final String TITLE4 = "What You Cache Is What You Get"; - final String URL4 = "wyciwyg://1/test.com"; - final String TITLE5 = "Root Folder"; - final String URL5 = "file:///"; - - // Create a list of local tabs. - List<Tab> tabs = new ArrayList<Tab>(6); - Tab tab1 = createTab(1, URL1, false, 0, TITLE1); - Tab tab2 = createTab(2, URL2, false, 0, TITLE2); - Tab tab3 = createTab(3, URL3, false, 0, TITLE3); - Tab tab4 = createTab(4, URL4, false, 0, TITLE4); - Tab tab5 = createTab(5, URL5, false, 0, TITLE5); - Tab tab6 = createPrivateTab(6, URL1, false, 0, TITLE1); - tabs.add(tab1); - tabs.add(tab2); - tabs.add(tab3); - tabs.add(tab4); - tabs.add(tab5); - tabs.add(tab6); - - // Persist the created tabs. - TabsAccessor.persistLocalTabs(mResolver, tabs); - - // Get the persisted tab and check if urls are filtered. - Cursor c = getTabsFromLocalClient(); - assertCountIsAndClose(c, 1, 1 + " tabs entries found"); - } - } - - /** - * Assert that the provided cursor has the expected number of rows, - * closing the cursor afterwards. - */ - private void assertCountIsAndClose(Cursor c, int expectedCount, String message) { - try { - mAsserter.is(c.getCount(), expectedCount, message); - } finally { - c.close(); - } - } -}
--- a/toolkit/themes/linux/global/global.css +++ b/toolkit/themes/linux/global/global.css @@ -305,16 +305,19 @@ notification > button { .autoscroller[scrolldir="EW"] { background-position: right bottom; } /* :::::: Close button icons ::::: */ .close-icon { + -moz-appearance: none; + height: 16px; + width: 16px; background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 16, 16, 0); background-position: center center; background-repeat: no-repeat; } .close-icon:hover { background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 32, 16, 16); }
--- a/toolkit/themes/linux/global/notification.css +++ b/toolkit/themes/linux/global/notification.css @@ -47,19 +47,16 @@ notification[type="critical"] { list-style-image: url("moz-icon://stock/gtk-dialog-warning?size=menu"); } .messageImage[type="critical"] { list-style-image: url("moz-icon://stock/gtk-dialog-error?size=menu"); } .messageCloseButton { - -moz-appearance: none; - width: 16px; - height: 16px; padding-left: 11px; padding-right: 11px; } /* Popup notification */ .popup-notification-description { max-width: 24em;
--- a/uriloader/exthandler/android/nsMIMEInfoAndroid.cpp +++ b/uriloader/exthandler/android/nsMIMEInfoAndroid.cpp @@ -12,35 +12,41 @@ using namespace mozilla::widget::android; NS_IMPL_ISUPPORTS2(nsMIMEInfoAndroid, nsIMIMEInfo, nsIHandlerInfo) NS_IMETHODIMP nsMIMEInfoAndroid::LaunchDefaultWithFile(nsIFile* aFile) { - LaunchWithFile(aFile); - return NS_OK; + return LaunchWithFile(aFile); } NS_IMETHODIMP nsMIMEInfoAndroid::LoadUriInternal(nsIURI * aURI) { nsCString uriSpec; aURI->GetSpec(uriSpec); nsCString uriScheme; aURI->GetScheme(uriScheme); - return mozilla::widget::android::GeckoAppShell::OpenUriExternal(NS_ConvertUTF8toUTF16(uriSpec), - (mType.Equals(uriScheme) || mType.Equals(uriSpec)) ? - EmptyString() : NS_ConvertUTF8toUTF16(mType)) ? NS_OK : NS_ERROR_FAILURE; + nsAutoString mimeType; + if (mType.Equals(uriScheme) || mType.Equals(uriSpec)) { + mimeType = EmptyString(); + } else { + mimeType = NS_ConvertUTF8toUTF16(mType); + } + + if (GeckoAppShell::OpenUriExternal(NS_ConvertUTF8toUTF16(uriSpec), mimeType)) { + return NS_OK; + } + return NS_ERROR_FAILURE; } - bool nsMIMEInfoAndroid::GetMimeInfoForMimeType(const nsACString& aMimeType, nsMIMEInfoAndroid** aMimeInfo) { nsRefPtr<nsMIMEInfoAndroid> info = new nsMIMEInfoAndroid(aMimeType); mozilla::AndroidBridge* bridge = mozilla::AndroidBridge::Bridge(); // we don't have access to the bridge, so just assume we can handle // the mime type for now and let the system deal with it @@ -53,44 +59,44 @@ nsMIMEInfoAndroid::GetMimeInfoForMimeTyp if (!IsUTF8(aMimeType, true)) return false; NS_ConvertUTF8toUTF16 mimeType(aMimeType); bridge->GetHandlersForMimeType(mimeType, info->mHandlerApps, &systemDefault); - + if (systemDefault) info->mPrefApp = systemDefault; nsAutoCString fileExt; bridge->GetExtensionFromMimeType(aMimeType, fileExt); info->SetPrimaryExtension(fileExt); - + uint32_t len; info->mHandlerApps->GetLength(&len); if (len == 1) { info.forget(aMimeInfo); return false; } - + info.forget(aMimeInfo); return true; } - + bool nsMIMEInfoAndroid::GetMimeInfoForFileExt(const nsACString& aFileExt, nsMIMEInfoAndroid **aMimeInfo) { nsCString mimeType; if (mozilla::AndroidBridge::Bridge()) mozilla::AndroidBridge::Bridge()-> GetMimeTypeFromExtensions(aFileExt, mimeType); - + // "*/*" means that the bridge didn't know. if (mimeType.Equals(nsDependentCString("*/*"), nsCaseInsensitiveCStringComparator())) return false; bool found = GetMimeInfoForMimeType(mimeType, aMimeInfo); (*aMimeInfo)->SetPrimaryExtension(aFileExt); return found; } @@ -101,47 +107,47 @@ nsMIMEInfoAndroid::GetMimeInfoForFileExt nsresult nsMIMEInfoAndroid::GetMimeInfoForURL(const nsACString &aURL, bool *found, nsIHandlerInfo **info) { nsMIMEInfoAndroid *mimeinfo = new nsMIMEInfoAndroid(aURL); NS_ADDREF(*info = mimeinfo); *found = true; - + mozilla::AndroidBridge* bridge = mozilla::AndroidBridge::Bridge(); if (!bridge) { // we don't have access to the bridge, so just assume we can handle // the protocol for now and let the system deal with it return NS_OK; } nsIHandlerApp* systemDefault = nullptr; bridge->GetHandlersForURL(NS_ConvertUTF8toUTF16(aURL), mimeinfo->mHandlerApps, &systemDefault); - + if (systemDefault) mimeinfo->mPrefApp = systemDefault; nsAutoCString fileExt; nsAutoCString mimeType; mimeinfo->GetType(mimeType); bridge->GetExtensionFromMimeType(mimeType, fileExt); mimeinfo->SetPrimaryExtension(fileExt); - + uint32_t len; mimeinfo->mHandlerApps->GetLength(&len); if (len == 1) { // Code that calls this requires an object regardless if the OS has // something for us, so we return the empty object. *found = false; return NS_OK; } - + return NS_OK; } NS_IMETHODIMP nsMIMEInfoAndroid::GetType(nsACString& aType) { aType.Assign(mType); return NS_OK; @@ -354,18 +360,17 @@ nsMIMEInfoAndroid::GetPossibleLocalHandl return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsMIMEInfoAndroid::LaunchWithFile(nsIFile *aFile) { nsCOMPtr<nsIURI> uri; NS_NewFileURI(getter_AddRefs(uri), aFile); - LoadUriInternal(uri); - return NS_OK; + return LoadUriInternal(uri); } nsMIMEInfoAndroid::nsMIMEInfoAndroid(const nsACString& aMIMEType) : mType(aMIMEType), mAlwaysAsk(true), mPrefAction(nsIMIMEInfo::useHelperApp) { mPrefApp = new nsMIMEInfoAndroid::SystemChooser(this); nsresult rv;