diff -Nru firefox-29.0~b4+build1/browser/app/blocklist.xml firefox-29.0~b6+build1/browser/app/blocklist.xml --- firefox-29.0~b4+build1/browser/app/blocklist.xml 2014-04-02 09:03:56.000000000 +0000 +++ firefox-29.0~b6+build1/browser/app/blocklist.xml 2014-04-10 20:46:04.000000000 +0000 @@ -1,5 +1,5 @@ - + @@ -1038,8 +1038,8 @@ - - + + @@ -1417,6 +1417,12 @@ + + + + + + diff -Nru firefox-29.0~b4+build1/browser/base/content/browser.css firefox-29.0~b6+build1/browser/base/content/browser.css --- firefox-29.0~b4+build1/browser/base/content/browser.css 2014-04-02 09:03:56.000000000 +0000 +++ firefox-29.0~b6+build1/browser/base/content/browser.css 2014-04-10 20:46:04.000000000 +0000 @@ -922,6 +922,7 @@ /* Customize mode */ #navigator-toolbox, +#browser-bottombox, #content-deck { transition-property: margin-left, margin-right; transition-duration: 150ms; diff -Nru firefox-29.0~b4+build1/browser/base/content/browser-places.js firefox-29.0~b6+build1/browser/base/content/browser-places.js --- firefox-29.0~b4+build1/browser/base/content/browser-places.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/base/content/browser-places.js 2014-04-10 20:46:19.000000000 +0000 @@ -1003,6 +1003,11 @@ return this.notifier = document.getElementById("bookmarked-notification-anchor"); }, + get dropmarkerNotifier() { + delete this.dropmarkerNotifier; + return this.dropmarkerNotifier = document.getElementById("bookmarked-notification-dropmarker-anchor"); + }, + get broadcaster() { delete this.broadcaster; let broadcaster = document.getElementById("bookmarkThisPageBroadcaster"); @@ -1332,57 +1337,65 @@ }, _showBookmarkedNotification: function BUI_showBookmarkedNotification() { - /* - * We're dynamically setting pointer-events to none here for the duration - * of the bookmark menu button's dropmarker animation in order to avoid - * having it end up in the overflow menu. This happens because it gaining - * focus triggers a style change which triggers an overflow event, even - * though this does not happen if no focus change occurs. The core issue - * is tracked in https://bugzilla.mozilla.org/show_bug.cgi?id=981637 - */ - let onDropmarkerAnimationEnd = () => { - this.button.removeEventListener("animationend", onDropmarkerAnimationEnd); - this.button.style.removeProperty("pointer-events"); - }; - let onDropmarkerAnimationStart = () => { - this.button.removeEventListener("animationstart", onDropmarkerAnimationStart); - this.button.style.pointerEvents = 'none'; - }; - + function getCenteringTransformForRects(rectToPosition, referenceRect) { + let topDiff = referenceRect.top - rectToPosition.top; + let leftDiff = referenceRect.left - rectToPosition.left; + let heightDiff = referenceRect.height - rectToPosition.height; + let widthDiff = referenceRect.width - rectToPosition.width; + return [(leftDiff + .5 * widthDiff) + "px", (topDiff + .5 * heightDiff) + "px"]; + } + if (this._notificationTimeout) { clearTimeout(this._notificationTimeout); } if (this.notifier.style.transform == '') { + // Get all the relevant nodes and computed style objects + let dropmarker = document.getAnonymousElementByAttribute(this.button, "anonid", "dropmarker"); + let dropmarkerIcon = document.getAnonymousElementByAttribute(dropmarker, "class", "dropmarker-icon"); + let dropmarkerStyle = getComputedStyle(dropmarkerIcon); + + // Check for RTL and get bounds let isRTL = getComputedStyle(this.button).direction == "rtl"; let buttonRect = this.button.getBoundingClientRect(); let notifierRect = this.notifier.getBoundingClientRect(); - let topDiff = buttonRect.top - notifierRect.top; - let leftDiff = buttonRect.left - notifierRect.left; - let heightDiff = buttonRect.height - notifierRect.height; - let widthDiff = buttonRect.width - notifierRect.width; - let translateX = (leftDiff + .5 * widthDiff) + "px"; - let translateY = (topDiff + .5 * heightDiff) + "px"; - let transform = "translate(" + translateX + ", " + translateY + ")"; + let dropmarkerRect = dropmarkerIcon.getBoundingClientRect(); + let dropmarkerNotifierRect = this.dropmarkerNotifier.getBoundingClientRect(); + + // Compute, but do not set, transform for star icon + let [translateX, translateY] = getCenteringTransformForRects(notifierRect, buttonRect); + let starIconTransform = "translate(" + translateX + ", " + translateY + ")"; if (isRTL) { - transform += " scaleX(-1)"; + starIconTransform += " scaleX(-1)"; } - this.notifier.style.transform = transform; + + // Compute, but do not set, transform for dropmarker + [translateX, translateY] = getCenteringTransformForRects(dropmarkerNotifierRect, dropmarkerRect); + let dropmarkerTransform = "translate(" + translateX + ", " + translateY + ")"; + + // Do all layout invalidation in one go: + this.notifier.style.transform = starIconTransform; + this.dropmarkerNotifier.style.transform = dropmarkerTransform; + + let dropmarkerAnimationNode = this.dropmarkerNotifier.firstChild; + dropmarkerAnimationNode.style.MozImageRegion = dropmarkerStyle.MozImageRegion; + dropmarkerAnimationNode.style.listStyleImage = dropmarkerStyle.listStyleImage; } let isInOverflowPanel = this.button.getAttribute("overflowedItem") == "true"; if (!isInOverflowPanel) { this.notifier.setAttribute("notification", "finish"); this.button.setAttribute("notification", "finish"); - this.button.addEventListener('animationstart', onDropmarkerAnimationStart); - this.button.addEventListener("animationend", onDropmarkerAnimationEnd); + this.dropmarkerNotifier.setAttribute("notification", "finish"); } this._notificationTimeout = setTimeout( () => { this.notifier.removeAttribute("notification"); this.button.removeAttribute("notification"); + this.dropmarkerNotifier.removeAttribute("notification"); + + this.dropmarkerNotifier.style.transform = ''; this.notifier.style.transform = ''; - this.button.style.removeProperty("pointer-events"); }, 1000); }, diff -Nru firefox-29.0~b4+build1/browser/base/content/browser.xul firefox-29.0~b6+build1/browser/base/content/browser.xul --- firefox-29.0~b4+build1/browser/base/content/browser.xul 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/base/content/browser.xul 2014-04-10 20:46:04.000000000 +0000 @@ -477,6 +477,9 @@ + + + -#ifdef XP_LINUX +#if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT) #endif diff -Nru firefox-29.0~b4+build1/browser/base/content/sync/customize.js firefox-29.0~b6+build1/browser/base/content/sync/customize.js --- firefox-29.0~b4+build1/browser/base/content/sync/customize.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/base/content/sync/customize.js 2014-04-10 20:46:04.000000000 +0000 @@ -4,6 +4,20 @@ "use strict"; +const {classes: Cc, interfaces: Ci, utils: Cu} = Components; + +Cu.import("resource://gre/modules/Services.jsm"); + +let service = Cc["@mozilla.org/weave/service;1"] + .getService(Ci.nsISupports) + .wrappedJSObject; + +if (!service.allowPasswordsEngine) { + let checkbox = document.getElementById("fxa-pweng-chk"); + checkbox.checked = false; + checkbox.disabled = true; +} + addEventListener("dialogaccept", function () { window.arguments[0].accepted = true; }); diff -Nru firefox-29.0~b4+build1/browser/base/content/sync/customize.xul firefox-29.0~b6+build1/browser/base/content/sync/customize.xul --- firefox-29.0~b4+build1/browser/base/content/sync/customize.xul 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/base/content/sync/customize.xul 2014-04-10 20:46:04.000000000 +0000 @@ -44,7 +44,8 @@ - = 6.2 - return osName == "Windows_NT" && version >= 6.2; + if (!Services.metro) + return false; + return Services.metro.supported; } function addSwitchToMetroButtonInWindows8(areaPanelPlacements) { diff -Nru firefox-29.0~b4+build1/browser/components/preferences/in-content/tests/browser.ini firefox-29.0~b6+build1/browser/components/preferences/in-content/tests/browser.ini --- firefox-29.0~b4+build1/browser/components/preferences/in-content/tests/browser.ini 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/browser/components/preferences/in-content/tests/browser.ini 2014-04-10 20:46:05.000000000 +0000 @@ -5,6 +5,7 @@ [browser_advanced_update.js] [browser_bug410900.js] +skip-if = os == 'linux' && debug # crashing when split into chunks and run on ec2 [browser_bug731866.js] [browser_connection.js] [browser_privacypane_1.js] diff -Nru firefox-29.0~b4+build1/browser/components/preferences/security.js firefox-29.0~b6+build1/browser/components/preferences/security.js --- firefox-29.0~b4+build1/browser/components/preferences/security.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/components/preferences/security.js 2014-04-10 20:46:05.000000000 +0000 @@ -173,6 +173,9 @@ this.changeMasterPassword(); this._initMasterPasswordUI(); + + // We might want to hide sync's password engine. + gSyncPane.updateWeavePrefs(); }, /** diff -Nru firefox-29.0~b4+build1/browser/components/preferences/sync.js firefox-29.0~b6+build1/browser/components/preferences/sync.js --- firefox-29.0~b4+build1/browser/components/preferences/sync.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/components/preferences/sync.js 2014-04-10 20:46:05.000000000 +0000 @@ -154,6 +154,17 @@ for (let checkbox of engines.querySelectorAll("checkbox")) { checkbox.disabled = enginesListDisabled; } + + let checkbox = document.getElementById("fxa-pweng-chk"); + let help = document.getElementById("fxa-pweng-help"); + let allowPasswordsEngine = service.allowPasswordsEngine; + + if (!allowPasswordsEngine) { + checkbox.checked = false; + } + + checkbox.disabled = !allowPasswordsEngine; + help.hidden = allowPasswordsEngine; }); // If fxAccountEnabled is false and we are in a "not configured" state, // then fxAccounts is probably fully disabled rather than just unconfigured, diff -Nru firefox-29.0~b4+build1/browser/components/preferences/sync.xul firefox-29.0~b6+build1/browser/components/preferences/sync.xul --- firefox-29.0~b4+build1/browser/components/preferences/sync.xul 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/components/preferences/sync.xul 2014-04-10 20:46:05.000000000 +0000 @@ -266,9 +266,23 @@ - + + + + + + + + + + diff -Nru firefox-29.0~b4+build1/browser/components/preferences/tests/browser.ini firefox-29.0~b6+build1/browser/components/preferences/tests/browser.ini --- firefox-29.0~b4+build1/browser/components/preferences/tests/browser.ini 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/browser/components/preferences/tests/browser.ini 2014-04-10 20:46:05.000000000 +0000 @@ -5,6 +5,7 @@ [browser_advanced_update.js] [browser_bug410900.js] +skip-if = os == 'linux' && debug # crashing when split into chunks and run on ec2 [browser_bug705422.js] [browser_chunk_permissions.js] [browser_permissions.js] diff -Nru firefox-29.0~b4+build1/browser/devtools/framework/test/browser.ini firefox-29.0~b6+build1/browser/devtools/framework/test/browser.ini --- firefox-29.0~b4+build1/browser/devtools/framework/test/browser.ini 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/browser/devtools/framework/test/browser.ini 2014-04-10 20:46:06.000000000 +0000 @@ -20,6 +20,7 @@ # skip-if = os == "win" [browser_toolbox_ready.js] [browser_toolbox_select_event.js] +skip-if = os == 'linux' && debug # bug 987892 - failing on ec2 debug tests in 3 chunks [browser_toolbox_sidebar.js] [browser_toolbox_tabsswitch_shortcuts.js] [browser_toolbox_tool_ready.js] diff -Nru firefox-29.0~b4+build1/browser/devtools/inspector/test/browser.ini firefox-29.0~b6+build1/browser/devtools/inspector/test/browser.ini --- firefox-29.0~b4+build1/browser/devtools/inspector/test/browser.ini 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/browser/devtools/inspector/test/browser.ini 2014-04-10 20:46:06.000000000 +0000 @@ -43,6 +43,7 @@ [browser_inspector_scrolling.js] [browser_inspector_select_last_selected.js] [browser_inspector_sidebarstate.js] +skip-if = os == 'linux' && debug # bug 987892 - failing on ec2 debug tests in 3 chunks [browser_inspector_bug_848731_reset_selection_on_delete.js] [browser_inspector_bug_922125_destroy_on_navigate.js] [browser_inspector_bug_952294_tooltips_dimensions.js] diff -Nru firefox-29.0~b4+build1/browser/devtools/sourceeditor/test/browser.ini firefox-29.0~b6+build1/browser/devtools/sourceeditor/test/browser.ini --- firefox-29.0~b4+build1/browser/devtools/sourceeditor/test/browser.ini 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/browser/devtools/sourceeditor/test/browser.ini 2014-04-10 20:46:06.000000000 +0000 @@ -25,4 +25,5 @@ [browser_css_autocompletion.js] [browser_css_statemachine.js] [browser_vimemacs.js] +skip-if = os == 'linux' && debug # bug 987892 - failing on ec2 debug tests in 3 chunks [browser_sourceeditor_initialization.js] diff -Nru firefox-29.0~b4+build1/browser/devtools/sourceeditor/test/head.js firefox-29.0~b6+build1/browser/devtools/sourceeditor/test/head.js --- firefox-29.0~b4+build1/browser/devtools/sourceeditor/test/head.js 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/browser/devtools/sourceeditor/test/head.js 2014-04-10 20:46:06.000000000 +0000 @@ -69,7 +69,10 @@ let input = channel.open(); scriptableStream.init(input); - let data = scriptableStream.read(input.available()); + let data = ""; + while (input.available()) { + data = data.concat(scriptableStream.read(input.available())); + } scriptableStream.close(); input.close(); diff -Nru firefox-29.0~b4+build1/browser/devtools/styleeditor/test/browser_styleeditor_filesave.js firefox-29.0~b6+build1/browser/devtools/styleeditor/test/browser_styleeditor_filesave.js --- firefox-29.0~b4+build1/browser/devtools/styleeditor/test/browser_styleeditor_filesave.js 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/browser/devtools/styleeditor/test/browser_styleeditor_filesave.js 2014-04-10 20:46:06.000000000 +0000 @@ -74,7 +74,10 @@ let input = channel.open(); scriptableStream.init(input); - let data = scriptableStream.read(input.available()); + let data = ""; + while (input.available()) { + data = data.concat(scriptableStream.read(input.available())); + } scriptableStream.close(); input.close(); diff -Nru firefox-29.0~b4+build1/browser/devtools/styleeditor/test/browser_styleeditor_sourcemap_watching.js firefox-29.0~b6+build1/browser/devtools/styleeditor/test/browser_styleeditor_sourcemap_watching.js --- firefox-29.0~b4+build1/browser/devtools/styleeditor/test/browser_styleeditor_sourcemap_watching.js 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/browser/devtools/styleeditor/test/browser_styleeditor_sourcemap_watching.js 2014-04-10 20:46:06.000000000 +0000 @@ -151,7 +151,10 @@ let input = channel.open(); scriptableStream.init(input); - let data = scriptableStream.read(input.available()); + let data = ""; + while (input.available()) { + data = data.concat(scriptableStream.read(input.available())); + } scriptableStream.close(); input.close(); diff -Nru firefox-29.0~b4+build1/browser/modules/test/browser.ini firefox-29.0~b6+build1/browser/modules/test/browser.ini --- firefox-29.0~b4+build1/browser/modules/test/browser.ini 2014-04-02 09:03:58.000000000 +0000 +++ firefox-29.0~b6+build1/browser/modules/test/browser.ini 2014-04-10 20:46:06.000000000 +0000 @@ -11,6 +11,7 @@ skip-if = os == "linux" # Intermittent failures, bug 951965 [browser_UITour2.js] [browser_UITour3.js] +skip-if = os == "linux" # Bug 986760, Bug 989101 [browser_UITour_availableTargets.js] [browser_UITour_detach_tab.js] [browser_UITour_annotation_size_attributes.js] diff -Nru firefox-29.0~b4+build1/browser/themes/linux/browser.css firefox-29.0~b6+build1/browser/themes/linux/browser.css --- firefox-29.0~b4+build1/browser/themes/linux/browser.css 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/linux/browser.css 2014-04-10 20:46:06.000000000 +0000 @@ -53,7 +53,7 @@ #nav-bar { background-image: linear-gradient(@toolbarHighlight@, rgba(255,255,255,0)); box-shadow: 0 1px 0 @toolbarHighlight@ inset; - margin-top: -1px; /* Move up 1px into the TabsToolbar */ + margin-top: -@tabToolbarNavbarOverlap@; /* Move up into the TabsToolbar */ padding-top: 2px; padding-bottom: 2px; /* Position the toolbar above the bottom of background tabs */ @@ -161,6 +161,17 @@ opacity: 0; } +#bookmarked-notification-dropmarker-anchor { + z-index: -1; + position: relative; +} + +#bookmarked-notification-dropmarker-icon { + width: 18px; + height: 18px; + visibility: hidden; +} + #bookmarked-notification-anchor[notification="finish"] > #bookmarked-notification { background-image: url("chrome://browser/skin/places/bookmarks-notification-finish.png"); animation: animation-bookmarkAdded 800ms; @@ -168,6 +179,11 @@ } #bookmarks-menu-button[notification="finish"] > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon { + list-style-image: none !important; +} + +#bookmarked-notification-dropmarker-anchor[notification="finish"] > #bookmarked-notification-dropmarker-icon { + visibility: visible; animation: animation-bookmarkPulse 300ms; animation-delay: 600ms; animation-timing-function: ease-out; @@ -1539,7 +1555,7 @@ #TabsToolbar::after { content: ""; position: absolute; - bottom: 1px; + bottom: @tabToolbarNavbarOverlap@; left: 0; right: 0; z-index: 0; @@ -1646,7 +1662,7 @@ .tabbrowser-arrowscrollbox > .scrollbutton-up, .tabbrowser-arrowscrollbox > .scrollbutton-down { -moz-appearance: none; - margin: 0; + margin: 0 0 @tabToolbarNavbarOverlap@; } .tabbrowser-arrowscrollbox > .scrollbutton-up { @@ -1680,6 +1696,10 @@ border-image: url("chrome://browser/skin/tabbrowser/tab-overflow-border.png") 0 2 0 2 fill; } +#TabsToolbar .toolbarbutton-1 { + margin-bottom: @tabToolbarNavbarOverlap@; +} + #TabsToolbar .toolbarbutton-1 > .toolbarbutton-icon, #TabsToolbar .toolbarbutton-1 > .toolbarbutton-menu-dropmarker, #TabsToolbar .toolbarbutton-1 > .toolbarbutton-menubutton-button > .toolbarbutton-icon { @@ -2020,6 +2040,7 @@ background-attachment: fixed; } +#main-window[customize-entered] #browser-bottombox, #main-window[customize-entered] #navigator-toolbox > toolbar:not(#toolbar-menubar):not(#TabsToolbar), #main-window[customize-entered] #customization-container { border: 3px solid hsla(0,0%,0%,.1); @@ -2031,6 +2052,7 @@ -moz-border-left-colors: hsla(0,0%,0%,.05) hsla(0,0%,0%,.1) hsla(0,0%,0%,.2); } +#main-window[customize-entered] #customization-container, #main-window[customize-entered] #navigator-toolbox > toolbar:not(#toolbar-menubar):not(#TabsToolbar) { border-bottom-width: 0; } diff -Nru firefox-29.0~b4+build1/browser/themes/linux/preferences/preferences.css firefox-29.0~b6+build1/browser/themes/linux/preferences/preferences.css --- firefox-29.0~b4+build1/browser/themes/linux/preferences/preferences.css 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/linux/preferences/preferences.css 2014-04-10 20:46:06.000000000 +0000 @@ -165,4 +165,8 @@ margin-bottom: 0.6em; } +#fxa-pweng-help-link > label { + margin: 0; +} + %endif diff -Nru firefox-29.0~b4+build1/browser/themes/osx/browser.css firefox-29.0~b6+build1/browser/themes/osx/browser.css --- firefox-29.0~b4+build1/browser/themes/osx/browser.css 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/osx/browser.css 2014-04-10 20:46:19.000000000 +0000 @@ -97,7 +97,7 @@ background-position: 0 1px, 0 0; box-shadow: inset 0 1px 0 hsla(0,0%,100%,.4); - margin-top: -1px; + margin-top: -@tabToolbarNavbarOverlap@; /* Position the toolbar above the bottom of background tabs */ position: relative; z-index: 1; @@ -395,6 +395,17 @@ opacity: 0; } +#bookmarked-notification-dropmarker-anchor { + z-index: -1; + position: relative; +} + +#bookmarked-notification-dropmarker-icon { + width: 18px; + height: 18px; + visibility: hidden; +} + #bookmarked-notification-anchor[notification="finish"] > #bookmarked-notification { background-image: url("chrome://browser/skin/places/bookmarks-notification-finish.png"); animation: animation-bookmarkAdded 800ms; @@ -408,6 +419,11 @@ } #bookmarks-menu-button[notification="finish"] > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon { + list-style-image: none !important; +} + +#bookmarked-notification-dropmarker-anchor[notification="finish"] > #bookmarked-notification-dropmarker-icon { + visibility: visible; animation: animation-bookmarkPulse 300ms; animation-delay: 600ms; animation-timing-function: ease-out; @@ -1583,11 +1599,12 @@ #zoom-controls[cui-areatype="toolbar"]:not([overflowedItem=true]) > #zoom-reset-button { min-width: 0; margin: 0; + -moz-box-orient: horizontal; + -moz-box-align: center; } #zoom-controls[cui-areatype="toolbar"]:not([overflowedItem=true]) > #zoom-reset-button > .toolbarbutton-text { - padding-top: 4px; - margin: 2px; + margin-top: 0; } /* ----- FULLSCREEN WINDOW CONTROLS ----- */ @@ -2731,8 +2748,8 @@ content: ''; display: block; -moz-appearance: toolbar; - height: calc(@tabHeight@ + 1px); - margin-bottom: calc(-1px - @tabHeight@); + height: @tabHeight@; + margin-bottom: -@tabHeight@; visibility: hidden; } @@ -2766,7 +2783,7 @@ * ordinal group value (see bug 853415). */ -moz-box-ordinal-group: 1001; position: absolute; - bottom: 1px; + bottom: @tabToolbarNavbarOverlap@; left: 0; right: 0; z-index: 0; @@ -2837,7 +2854,7 @@ .tabbrowser-arrowscrollbox > .scrollbutton-up, .tabbrowser-arrowscrollbox > .scrollbutton-down { -moz-image-region: rect(0, 13px, 20px, 0); - margin: 0; + margin: 0 0 @tabToolbarNavbarOverlap@; padding: 0 4px; border: none; } @@ -2961,8 +2978,9 @@ #TabsToolbar .toolbarbutton-1 > .toolbarbutton-menubutton-button, #TabsToolbar .toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker { -moz-appearance: none; + margin: 0; /* !important flags needed because of bug 561154: */ - margin: 0 !important; + /* Bug 990390: -moz-any is no longer used in the selector so the !important aren't necessary for that anymore. */ padding: 0 !important; border: none !important; border-radius: 0 !important; @@ -2972,10 +2990,13 @@ #TabsToolbar .toolbarbutton-1:not([type="menu-button"]), #TabsToolbar .toolbarbutton-1 > .toolbarbutton-menubutton-button { - margin: 0; padding: 0 1px; } +#TabsToolbar .toolbarbutton-1 { + margin-bottom: @tabToolbarNavbarOverlap@; +} + #TabsToolbar .toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker { padding-left: 4px; padding-right: 4px; @@ -3839,19 +3860,17 @@ /* Lion Fullscreen window styling */ @media (-moz-mac-lion-theme) { #navigator-toolbox[inFullscreen]:not(:-moz-lwtheme)::before { - height: calc(@tabHeight@ + 11px) !important; + /* Adjust by the full element height of #titlebar, since that element is + * not displayed in native full-screen. + * Also add the height of the tabs, since we're calculating the + * total height of this pseudo-element, not just the top-padding. */ + height: calc(@tabHeight@ + @spaceAboveTabbar@) !important; } #main-window[inFullscreen][privatebrowsingmode=temporary], #main-window[inFullscreen]:-moz-lwtheme { - /* This additional padding matches the change in height in the pseudo-element - * above. */ - padding-top: 11px; - } - #main-window[inFullscreen]:not([privatebrowsingmode=temporary]):-moz-lwtheme { - /* In combination with the previous rule, forces the top 22px of the - * background image to be hidden, so the image doesn't jump around with - * the loss of the titlebar. */ - background-position: right -11px; + /* Adjust by the full element height of #titlebar, since that element is + * not displayed in native full-screen. */ + padding-top: @spaceAboveTabbar@; } } @@ -4215,6 +4234,7 @@ background-attachment: fixed; } +#main-window[customize-entered] #browser-bottombox, #main-window[customize-entered] #navigator-toolbox > toolbar:not(#TabsToolbar), #main-window[customize-entered] #customization-container { border: 3px solid hsla(0,0%,0%,.1); @@ -4226,6 +4246,7 @@ -moz-border-left-colors: hsla(0,0%,0%,.05) hsla(0,0%,0%,.1) hsla(0,0%,0%,.2); } +#main-window[customize-entered] #customization-container, #main-window[customize-entered] #navigator-toolbox > toolbar:not(#TabsToolbar) { border-bottom-width: 0; } diff -Nru firefox-29.0~b4+build1/browser/themes/osx/preferences/preferences.css firefox-29.0~b6+build1/browser/themes/osx/preferences/preferences.css --- firefox-29.0~b4+build1/browser/themes/osx/preferences/preferences.css 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/osx/preferences/preferences.css 2014-04-10 20:46:06.000000000 +0000 @@ -230,4 +230,8 @@ margin-bottom: 0.6em; } +#fxa-pweng-help-link > label { + margin: 0; +} + %endif diff -Nru firefox-29.0~b4+build1/browser/themes/shared/browser.inc firefox-29.0~b6+build1/browser/themes/shared/browser.inc --- firefox-29.0~b4+build1/browser/themes/shared/browser.inc 2014-04-02 09:03:58.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/shared/browser.inc 2014-04-10 20:46:06.000000000 +0000 @@ -11,3 +11,4 @@ %endif %define inAnyPanel :-moz-any(:not([cui-areatype="toolbar"]), [overflowedItem=true]) +%define tabToolbarNavbarOverlap 1px diff -Nru firefox-29.0~b4+build1/browser/themes/shared/customizableui/customizeMode.inc.css firefox-29.0~b6+build1/browser/themes/shared/customizableui/customizeMode.inc.css --- firefox-29.0~b4+build1/browser/themes/shared/customizableui/customizeMode.inc.css 2014-04-02 09:03:58.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/shared/customizableui/customizeMode.inc.css 2014-04-10 20:46:06.000000000 +0000 @@ -4,10 +4,12 @@ /* Customization mode */ -#main-window:-moz-any([customize-entering],[customize-entered]) #content-deck { - margin: 0 2em 2em; +#main-window:-moz-any([customize-entering],[customize-entered]) #browser-bottombox { + margin-bottom: 2em; } +#main-window:-moz-any([customize-entering],[customize-entered]) #content-deck, +#main-window:-moz-any([customize-entering],[customize-entered]) #browser-bottombox, #main-window:-moz-any([customize-entering],[customize-entered]) #navigator-toolbox { margin-left: 2em; margin-right: 2em; @@ -103,8 +105,12 @@ background-image: linear-gradient(to bottom, #3e86ce, #3878ba); } +#main-window:-moz-any([customize-entering],[customize-entered]) #browser-bottombox, #customization-footer { background-color: rgb(236,236,236); +} + +#customization-footer { border-top: 1px solid rgb(221,221,221); padding: 15px; } diff -Nru firefox-29.0~b4+build1/browser/themes/shared/customizableui/panelUIOverlay.inc.css firefox-29.0~b6+build1/browser/themes/shared/customizableui/panelUIOverlay.inc.css --- firefox-29.0~b4+build1/browser/themes/shared/customizableui/panelUIOverlay.inc.css 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/shared/customizableui/panelUIOverlay.inc.css 2014-04-10 20:46:06.000000000 +0000 @@ -21,7 +21,7 @@ %include ../browser.inc #PanelUI-popup #PanelUI-contents:empty { - height: 128px; + height: 128px; } #PanelUI-popup #PanelUI-contents:empty::before { @@ -340,6 +340,16 @@ margin: 4px auto; } +#PanelUI-multiView[viewtype="subview"] > .panel-viewcontainer > .panel-viewstack > .panel-mainview > #PanelUI-mainView { + background-color: hsla(210,4%,10%,.1); +} + +#PanelUI-multiView[viewtype="subview"] #PanelUI-mainView > #PanelUI-contents-scroller > #PanelUI-contents > .panel-wide-item, +#PanelUI-multiView[viewtype="subview"] #PanelUI-mainView > #PanelUI-contents-scroller > #PanelUI-contents > .toolbarbutton-1:not([panel-multiview-anchor="true"]), +#PanelUI-multiView[viewtype="subview"] #PanelUI-mainView > #PanelUI-footer { + opacity: .5; +} + /* * XXXgijs: this is a workaround for a layout issue that was caused by these iframes, * which was affecting subview display. Because of this, we're hiding the iframe *only* diff -Nru firefox-29.0~b4+build1/browser/themes/shared/tabs.inc.css firefox-29.0~b6+build1/browser/themes/shared/tabs.inc.css --- firefox-29.0~b4+build1/browser/themes/shared/tabs.inc.css 2014-04-02 09:03:58.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/shared/tabs.inc.css 2014-04-10 20:46:07.000000000 +0000 @@ -273,7 +273,7 @@ .tabbrowser-tab[pinned][titlechanged]:not([selected="true"]) > .tab-stack > .tab-content { background-image: radial-gradient(farthest-corner at center bottom, rgb(255,255,255) 3%, rgba(186,221,251,0.75) 20%, rgba(127,179,255,0.25) 40%, rgba(127,179,255,0) 70%); - background-position: center bottom 1px; + background-position: center bottom @tabToolbarNavbarOverlap@; background-repeat: no-repeat; background-size: 85% 100%; } @@ -286,12 +286,11 @@ -moz-margin-start: -1.5px; -moz-margin-end: -1.5px; background-image: url(chrome://browser/skin/tabbrowser/tab-separator.png); - background-position: left bottom; + background-position: left bottom @tabToolbarNavbarOverlap@; background-repeat: no-repeat; background-size: 3px 100%; content: ""; display: -moz-box; - margin-bottom: 1px; width: 3px; } diff -Nru firefox-29.0~b4+build1/browser/themes/windows/browser.css firefox-29.0~b6+build1/browser/themes/windows/browser.css --- firefox-29.0~b4+build1/browser/themes/windows/browser.css 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/windows/browser.css 2014-04-10 20:46:19.000000000 +0000 @@ -266,7 +266,7 @@ #nav-bar { background-image: linear-gradient(@toolbarHighlight@, rgba(255,255,255,0)); box-shadow: 0 1px 0 @toolbarHighlight@ inset; - margin-top: -1px; /* Move up 1px into the TabsToolbar */ + margin-top: -@tabToolbarNavbarOverlap@; /* Move up into the TabsToolbar */ /* Position the toolbar above the bottom of background tabs */ position: relative; z-index: 1; @@ -424,6 +424,17 @@ opacity: 0; } +#bookmarked-notification-dropmarker-anchor { + z-index: -1; + position: relative; +} + +#bookmarked-notification-dropmarker-icon { + width: 18px; + height: 18px; + visibility: hidden; +} + #bookmarked-notification-anchor[notification="finish"] > #bookmarked-notification { background-image: url("chrome://browser/skin/places/bookmarks-notification-finish.png"); animation: animation-bookmarkAdded 800ms; @@ -431,6 +442,11 @@ } #bookmarks-menu-button[notification="finish"] > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon { + list-style-image: none !important; +} + +#bookmarked-notification-dropmarker-anchor[notification="finish"] > #bookmarked-notification-dropmarker-icon { + visibility: visible; animation: animation-bookmarkPulse 300ms; animation-delay: 600ms; animation-timing-function: ease-out; @@ -617,7 +633,8 @@ #nav-bar .toolbarbutton-1 > .toolbarbutton-icon, #nav-bar .toolbarbutton-1 > .toolbarbutton-text, #nav-bar .toolbarbutton-1 > .toolbarbutton-badge-container, - #nav-bar .toolbarbutton-1 > .toolbarbutton-menubutton-button > .toolbarbutton-icon { + #nav-bar .toolbarbutton-1 > .toolbarbutton-menubutton-button > .toolbarbutton-icon, + #nav-bar .toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon { background-color: hsla(210,32%,93%,0); background-origin: padding-box; border-radius: 2px; @@ -816,6 +833,10 @@ padding: 0 3px; } +#TabsToolbar .toolbarbutton-1 { + margin-bottom: @tabToolbarNavbarOverlap@; +} + #TabsToolbar .toolbarbutton-1:not([disabled=true]):hover, #TabsToolbar .toolbarbutton-1[open], #TabsToolbar .toolbarbutton-1 > .toolbarbutton-menubutton-button:not([disabled=true]):hover, @@ -1836,7 +1857,7 @@ .tabbrowser-arrowscrollbox > .scrollbutton-up, .tabbrowser-arrowscrollbox > .scrollbutton-down { list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-left.png"); - margin: 0; + margin: 0 0 @tabToolbarNavbarOverlap@; padding-right: 2px; border-right: 2px solid transparent; background-origin: border-box; @@ -2731,12 +2752,17 @@ background-attachment: fixed; } -#customization-container { +#main-window[customize-entered] #browser-bottombox, +#main-window[customize-entered] #customization-container { border-left: 1px solid @toolbarShadowColor@; border-right: 1px solid @toolbarShadowColor@; background-clip: padding-box; } +#main-window[customize-entered] #browser-bottombox { + border-bottom: 1px solid @toolbarShadowColor@; +} + #customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="left"] { margin-right: -2px; } diff -Nru firefox-29.0~b4+build1/browser/themes/windows/preferences/preferences.css firefox-29.0~b6+build1/browser/themes/windows/preferences/preferences.css --- firefox-29.0~b4+build1/browser/themes/windows/preferences/preferences.css 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/browser/themes/windows/preferences/preferences.css 2014-04-10 20:46:07.000000000 +0000 @@ -155,4 +155,8 @@ margin-bottom: 0.6em; } +#fxa-pweng-help-link > label { + margin: 0; +} + %endif diff -Nru firefox-29.0~b4+build1/build/defines.sh firefox-29.0~b6+build1/build/defines.sh --- firefox-29.0~b4+build1/build/defines.sh 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/build/defines.sh 2014-04-10 20:46:07.000000000 +0000 @@ -1,3 +1,3 @@ # Define indicating that this build is prior to one of the early betas. To be # unset mid-way through the beta cycle. -EARLY_BETA_OR_EARLIER=1 +EARLY_BETA_OR_EARLIER= diff -Nru firefox-29.0~b4+build1/content/base/src/CSPUtils.jsm firefox-29.0~b6+build1/content/base/src/CSPUtils.jsm --- firefox-29.0~b4+build1/content/base/src/CSPUtils.jsm 2014-04-02 09:03:59.000000000 +0000 +++ firefox-29.0~b6+build1/content/base/src/CSPUtils.jsm 2014-04-10 20:46:07.000000000 +0000 @@ -54,22 +54,21 @@ // port = ":" ( 1*DIGIT / "*" ) const R_PORT = new RegExp ("(\\:([0-9]+|\\*))", 'i'); -// path -const R_PATH = new RegExp("(\\/(([a-zA-Z0-9\\-\\_]+)\\/?)*)", 'i'); - -// file -const R_FILE = new RegExp("(\\/([a-zA-Z0-9\\-\\_]+)\\.([a-zA-Z]+))", 'i'); - // host-source = [ scheme "://" ] host [ port path file ] -const R_HOSTSRC = new RegExp ("^((((" + R_SCHEME.source + "\\:\\/\\/)?(" +const R_HOSTSRC = new RegExp ("^((" + R_SCHEME.source + "\\:\\/\\/)?(" + R_HOST.source + ")" - + R_PORT.source + "?)" - + R_PATH.source + "?)" - + R_FILE.source + "?)$", 'i'); + + R_PORT.source + "?)$", 'i'); + +function STRIP_INPUTDELIM(re) { + return re.replace(/(^\^)|(\$$)/g, ""); +} // ext-host-source = host-source "/" *( ) // ; ext-host-source is reserved for future use. -const R_EXTHOSTSRC = new RegExp ("^" + R_HOSTSRC.source + "\\/[:print:]+$", 'i'); +const R_VCHAR_EXCEPT = new RegExp("[!-+--:<-~]"); // ranges exclude , and ; +const R_EXTHOSTSRC = new RegExp ("^" + STRIP_INPUTDELIM(R_HOSTSRC.source) + + "\\/" + + R_VCHAR_EXCEPT.source + "*$", 'i'); // keyword-source = "'self'" / "'unsafe-inline'" / "'unsafe-eval'" const R_KEYWORDSRC = new RegExp ("^('self'|'unsafe-inline'|'unsafe-eval')$", 'i'); @@ -90,6 +89,7 @@ // source-exp = scheme-source / host-source / keyword-source const R_SOURCEEXP = new RegExp (R_SCHEMESRC.source + "|" + R_HOSTSRC.source + "|" + + R_EXTHOSTSRC.source + "|" + R_KEYWORDSRC.source + "|" + R_NONCESRC.source + "|" + R_HASHSRC.source, 'i'); @@ -1343,7 +1343,13 @@ sObj._scheme = schemeMatch[0]; } - // get array of matches to the R_HOST regular expression + // Bug 916054: in CSP 1.0, source-expressions that are paths should have + // the path after the origin ignored and only the origin enforced. + if (R_EXTHOSTSRC.test(aStr)) { + var extHostMatch = R_EXTHOSTSRC.exec(aStr); + aStr = extHostMatch[1]; + } + var hostMatch = R_HOSTSRC.exec(aStr); if (!hostMatch) { cspError(aCSPRep, CSPLocalizer.getFormatStr("couldntParseInvalidSource", @@ -1351,24 +1357,20 @@ return null; } // Host regex gets scheme, so remove scheme from aStr. Add 3 for '://' - if (schemeMatch) + if (schemeMatch) { hostMatch = R_HOSTSRC.exec(aStr.substring(schemeMatch[0].length + 3)); - - // Bug 916054: in CSP 1.0, source-expressions that are paths should have - // the path after the origin ignored and only the origin enforced. - hostMatch[0] = hostMatch[0].replace(R_FILE, ""); - hostMatch[0] = hostMatch[0].replace(R_PATH, ""); + } var portMatch = R_PORT.exec(hostMatch); - // Host regex also gets port, so remove the port here. - if (portMatch) + if (portMatch) { hostMatch = R_HOSTSRC.exec(hostMatch[0].substring(0, hostMatch[0].length - portMatch[0].length)); + } sObj._host = CSPHost.fromString(hostMatch[0]); if (!portMatch) { // gets the default port for the given scheme - defPort = Services.io.getProtocolHandler(sObj._scheme).defaultPort; + var defPort = Services.io.getProtocolHandler(sObj._scheme).defaultPort; if (!defPort) { cspError(aCSPRep, CSPLocalizer.getFormatStr("couldntParseInvalidSource", @@ -1391,12 +1393,14 @@ } // check for a nonce-source match - if (R_NONCESRC.test(aStr)) + if (R_NONCESRC.test(aStr)) { return CSPNonceSource.fromString(aStr, aCSPRep); + } // check for a hash-source match - if (R_HASHSRC.test(aStr)) + if (R_HASHSRC.test(aStr)) { return CSPHashSource.fromString(aStr, aCSPRep); + } // check for 'self' (case insensitive) if (aStr.toLowerCase() === "'self'") { diff -Nru firefox-29.0~b4+build1/content/base/src/FragmentOrElement.cpp firefox-29.0~b6+build1/content/base/src/FragmentOrElement.cpp --- firefox-29.0~b4+build1/content/base/src/FragmentOrElement.cpp 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/content/base/src/FragmentOrElement.cpp 2014-04-10 20:46:07.000000000 +0000 @@ -520,10 +520,6 @@ if (mAttributeMap) { mAttributeMap->DropReference(); } - - if (mClassList) { - mClassList->DropReference(); - } } void @@ -582,10 +578,7 @@ mContainingShadow = nullptr; mChildrenList = nullptr; mUndoManager = nullptr; - if (mClassList) { - mClassList->DropReference(); - mClassList = nullptr; - } + mClassList = nullptr; } size_t @@ -1218,10 +1211,10 @@ if (tmp->HasProperties()) { if (tmp->IsHTML()) { - tmp->DeleteProperty(nsGkAtoms::microdataProperties); - tmp->DeleteProperty(nsGkAtoms::itemtype); - tmp->DeleteProperty(nsGkAtoms::itemref); - tmp->DeleteProperty(nsGkAtoms::itemprop); + nsIAtom*** props = nsGenericHTMLElement::PropertiesToTraverseAndUnlink(); + for (uint32_t i = 0; props[i]; ++i) { + tmp->DeleteProperty(*props[i]); + } } } @@ -1765,15 +1758,12 @@ if (tmp->HasProperties()) { if (tmp->IsHTML()) { - nsISupports* property = static_cast - (tmp->GetProperty(nsGkAtoms::microdataProperties)); - cb.NoteXPCOMChild(property); - property = static_cast(tmp->GetProperty(nsGkAtoms::itemref)); - cb.NoteXPCOMChild(property); - property = static_cast(tmp->GetProperty(nsGkAtoms::itemprop)); - cb.NoteXPCOMChild(property); - property = static_cast(tmp->GetProperty(nsGkAtoms::itemtype)); - cb.NoteXPCOMChild(property); + nsIAtom*** props = nsGenericHTMLElement::PropertiesToTraverseAndUnlink(); + for (uint32_t i = 0; props[i]; ++i) { + nsISupports* property = + static_cast(tmp->GetProperty(*props[i])); + cb.NoteXPCOMChild(property); + } } } diff -Nru firefox-29.0~b4+build1/content/base/src/nsDOMTokenList.cpp firefox-29.0~b6+build1/content/base/src/nsDOMTokenList.cpp --- firefox-29.0~b4+build1/content/base/src/nsDOMTokenList.cpp 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/content/base/src/nsDOMTokenList.cpp 2014-04-10 20:46:08.000000000 +0000 @@ -29,7 +29,7 @@ nsDOMTokenList::~nsDOMTokenList() { } -NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(nsDOMTokenList) +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(nsDOMTokenList, mElement) NS_INTERFACE_MAP_BEGIN(nsDOMTokenList) NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY @@ -40,12 +40,6 @@ NS_IMPL_CYCLE_COLLECTING_ADDREF(nsDOMTokenList) NS_IMPL_CYCLE_COLLECTING_RELEASE(nsDOMTokenList) -void -nsDOMTokenList::DropReference() -{ - mElement = nullptr; -} - const nsAttrValue* nsDOMTokenList::GetParsedAttr() { diff -Nru firefox-29.0~b4+build1/content/base/src/nsDOMTokenList.h firefox-29.0~b6+build1/content/base/src/nsDOMTokenList.h --- firefox-29.0~b4+build1/content/base/src/nsDOMTokenList.h 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/content/base/src/nsDOMTokenList.h 2014-04-10 20:46:08.000000000 +0000 @@ -37,8 +37,6 @@ nsDOMTokenList(Element* aElement, nsIAtom* aAttrAtom); - void DropReference(); - virtual JSObject* WrapObject(JSContext *cx, JS::Handle scope) MOZ_OVERRIDE; @@ -80,7 +78,7 @@ const nsTArray& aTokens); inline const nsAttrValue* GetParsedAttr(); - Element* mElement; + nsCOMPtr mElement; nsCOMPtr mAttrAtom; }; diff -Nru firefox-29.0~b4+build1/content/base/test/csp/test_csp_regexp_parsing.html firefox-29.0~b6+build1/content/base/test/csp/test_csp_regexp_parsing.html --- firefox-29.0~b4+build1/content/base/test/csp/test_csp_regexp_parsing.html 2014-04-02 09:03:59.000000000 +0000 +++ firefox-29.0~b6+build1/content/base/test/csp/test_csp_regexp_parsing.html 2014-04-10 20:46:08.000000000 +0000 @@ -27,6 +27,7 @@ ["allowed", "test1.example.com/path-1/path_2/file_1.js"], ["allowed", "test1.example.com/path-1/path_2/file-2.js"], ["allowed", "test1.example.com/path-1/path_2/f.js"], + ["allowed", "test1.example.com/path-1/path_2/f.oo.js"], ["allowed", "*.example.com"], ["allowed", "*.example.com/"], ["allowed", "*.example.com/path-1"], @@ -36,6 +37,7 @@ ["allowed", "*.example.com/path-1/path_2/file_1.js"], ["allowed", "*.example.com/path-1/path_2/file-2.js"], ["allowed", "*.example.com/path-1/path_2/f.js"], + ["allowed", "*.example.com/path-1/path_2/f.oo.js"], ["allowed", "test1.example.com:80"], ["allowed", "test1.example.com:80/"], ["allowed", "test1.example.com:80/path-1"], @@ -43,6 +45,7 @@ ["allowed", "test1.example.com:80/path-1/path_2"], ["allowed", "test1.example.com:80/path-1/path_2/"], ["allowed", "test1.example.com:80/path-1/path_2/file.js"], + ["allowed", "test1.example.com:80/path-1/path_2/f.ile.js"], ["allowed", "test1.example.com:*"], ["allowed", "test1.example.com:*/"], ["allowed", "test1.example.com:*/path-1"], @@ -50,13 +53,9 @@ ["allowed", "test1.example.com:*/path-1/path_2"], ["allowed", "test1.example.com:*/path-1/path_2/"], ["allowed", "test1.example.com:*/path-1/path_2/file.js"], + ["allowed", "test1.example.com:*/path-1/path_2/f.ile.js"], // the following tests should fail - ["blocked", "test1.example.com/path-1//path_2"], - ["blocked", "test1.example.com/path-1/file.js.cpp"], ["blocked", "test1.example.com:88path-1/"], - ["blocked", "test1.example.com:80//"], - ["blocked", "test1.example.com:80//path-1"], - ["blocked", "test1.example.com:80/.js"], ["blocked", "test1.example.com:80.js"], ["blocked", "test1.example.com:*.js"], ["blocked", "test1.example.com:*."] diff -Nru firefox-29.0~b4+build1/content/base/test/unit/test_csp_ignores_path.js firefox-29.0~b6+build1/content/base/test/unit/test_csp_ignores_path.js --- firefox-29.0~b4+build1/content/base/test/unit/test_csp_ignores_path.js 2014-04-02 09:03:59.000000000 +0000 +++ firefox-29.0~b6+build1/content/base/test/unit/test_csp_ignores_path.js 2014-04-10 20:46:08.000000000 +0000 @@ -12,6 +12,32 @@ .getService(Ci.nsIIOService); var self = ioService.newURI("http://test1.example.com:80", null, null); +function testValidSRCsHostSourceWithSchemeAndPath() { + var csps = [ + "http://test1.example.com", + "http://test1.example.com/", + "http://test1.example.com/path-1", + "http://test1.example.com/path-1/", + "http://test1.example.com/path-1/path_2/", + "http://test1.example.com/path-1/path_2/file.js", + "http://test1.example.com/path-1/path_2/file_1.js", + "http://test1.example.com/path-1/path_2/file-2.js", + "http://test1.example.com/path-1/path_2/f.js", + "http://test1.example.com/path-1/path_2/f.oo.js" + ] + + var obj; + var expected = "http://test1.example.com:80"; + for (let i in csps) { + var src = csps[i]; + obj = CSPSourceList.fromString(src, undefined, self); + dump("expected: " + expected + "\n"); + dump("got: " + obj._sources[0] + "\n"); + do_check_eq(1, obj._sources.length); + do_check_eq(obj._sources[0], expected); + } +} + function testValidSRCsRegularHost() { var csps = [ "test1.example.com", @@ -22,7 +48,8 @@ "test1.example.com/path-1/path_2/file.js", "test1.example.com/path-1/path_2/file_1.js", "test1.example.com/path-1/path_2/file-2.js", - "test1.example.com/path-1/path_2/f.js" + "test1.example.com/path-1/path_2/f.js", + "test1.example.com/path-1/path_2/f.oo.js" ] var obj; @@ -46,6 +73,7 @@ "*.example.com/path-1/path_2/file_1.js", "*.example.com/path-1/path_2/file-2.js", "*.example.com/path-1/path_2/f.js", + "*.example.com/path-1/path_2/f.oo.js" ] var obj; @@ -66,7 +94,8 @@ "test1.example.com:80/path-1/", "test1.example.com:80/path-1/path_2", "test1.example.com:80/path-1/path_2/", - "test1.example.com:80/path-1/path_2/file.js" + "test1.example.com:80/path-1/path_2/file.js", + "test1.example.com:80/path-1/path_2/f.ile.js" ] var obj; @@ -87,7 +116,8 @@ "test1.example.com:*/path-1/", "test1.example.com:*/path-1/path_2", "test1.example.com:*/path-1/path_2/", - "test1.example.com:*/path-1/path_2/file.js" + "test1.example.com:*/path-1/path_2/file.js", + "test1.example.com:*/path-1/path_2/f.ile.js" ] var obj; @@ -103,12 +133,7 @@ function testInvalidSRCs() { var csps = [ - "test1.example.com/path-1//path_2", - "test1.example.com/path-1/file.js.cpp", "test1.example.com:88path-1/", - "test1.example.com:80//", - "test1.example.com:80//path-1", - "test1.example.com:80/.js", "test1.example.com:80.js", "test1.example.com:*.js", "test1.example.com:*." @@ -124,6 +149,7 @@ } function run_test() { + testValidSRCsHostSourceWithSchemeAndPath(); testValidSRCsRegularHost(); testValidSRCsWildCardHost(); testValidSRCsRegularPort(); diff -Nru firefox-29.0~b4+build1/content/html/content/src/HTMLOutputElement.cpp firefox-29.0~b6+build1/content/html/content/src/HTMLOutputElement.cpp --- firefox-29.0~b4+build1/content/html/content/src/HTMLOutputElement.cpp 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/content/html/content/src/HTMLOutputElement.cpp 2014-04-10 20:46:08.000000000 +0000 @@ -30,9 +30,6 @@ HTMLOutputElement::~HTMLOutputElement() { - if (mTokenList) { - mTokenList->DropReference(); - } } NS_IMPL_CYCLE_COLLECTION_CLASS(HTMLOutputElement) @@ -40,10 +37,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(HTMLOutputElement, nsGenericHTMLFormElement) NS_IMPL_CYCLE_COLLECTION_UNLINK(mValidity) - if (tmp->mTokenList) { - tmp->mTokenList->DropReference(); - NS_IMPL_CYCLE_COLLECTION_UNLINK(mTokenList) - } + NS_IMPL_CYCLE_COLLECTION_UNLINK(mTokenList) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(HTMLOutputElement, nsGenericHTMLFormElement) diff -Nru firefox-29.0~b4+build1/content/html/content/src/nsGenericHTMLElement.cpp firefox-29.0~b6+build1/content/html/content/src/nsGenericHTMLElement.cpp --- firefox-29.0~b4+build1/content/html/content/src/nsGenericHTMLElement.cpp 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/content/html/content/src/nsGenericHTMLElement.cpp 2014-04-10 20:46:08.000000000 +0000 @@ -3196,13 +3196,42 @@ { nsDOMSettableTokenList* list = static_cast(aPropertyValue); - list->DropReference(); NS_RELEASE(list); } +static nsIAtom** sPropertiesToTraverseAndUnlink[] = + { + &nsGkAtoms::microdataProperties, + &nsGkAtoms::itemtype, + &nsGkAtoms::itemref, + &nsGkAtoms::itemprop, + &nsGkAtoms::sandbox, + nullptr + }; + +// static +nsIAtom*** +nsGenericHTMLElement::PropertiesToTraverseAndUnlink() +{ + return sPropertiesToTraverseAndUnlink; +} + nsDOMSettableTokenList* nsGenericHTMLElement::GetTokenList(nsIAtom* aAtom) { +#ifdef DEBUG + nsIAtom*** props = + nsGenericHTMLElement::PropertiesToTraverseAndUnlink(); + bool found = false; + for (uint32_t i = 0; props[i]; ++i) { + if (*props[i] == aAtom) { + found = true; + break; + } + } + MOZ_ASSERT(found, "Trying to use an unknown tokenlist!"); +#endif + nsDOMSettableTokenList* list = nullptr; if (HasProperties()) { list = static_cast(GetProperty(aAtom)); diff -Nru firefox-29.0~b4+build1/content/html/content/src/nsGenericHTMLElement.h firefox-29.0~b6+build1/content/html/content/src/nsGenericHTMLElement.h --- firefox-29.0~b4+build1/content/html/content/src/nsGenericHTMLElement.h 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/content/html/content/src/nsGenericHTMLElement.h 2014-04-10 20:46:08.000000000 +0000 @@ -302,6 +302,7 @@ return rcFrame.height; } + static nsIAtom*** PropertiesToTraverseAndUnlink(); protected: // These methods are used to implement element-specific behavior of Get/SetItemValue // when an element has @itemprop but no @itemscope. diff -Nru firefox-29.0~b4+build1/content/html/content/src/TextTrackManager.cpp firefox-29.0~b6+build1/content/html/content/src/TextTrackManager.cpp --- firefox-29.0~b4+build1/content/html/content/src/TextTrackManager.cpp 2014-04-02 09:04:00.000000000 +0000 +++ firefox-29.0~b6+build1/content/html/content/src/TextTrackManager.cpp 2014-04-10 20:46:08.000000000 +0000 @@ -20,7 +20,7 @@ namespace mozilla { namespace dom { -NS_IMPL_CYCLE_COLLECTION_3(TextTrackManager, mTextTracks, +NS_IMPL_CYCLE_COLLECTION_4(TextTrackManager, mMediaElement, mTextTracks, mPendingTextTracks, mNewCues) NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(TextTrackManager, AddRef) NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(TextTrackManager, Release) diff -Nru firefox-29.0~b4+build1/content/html/content/src/TextTrackManager.h firefox-29.0~b6+build1/content/html/content/src/TextTrackManager.h --- firefox-29.0~b4+build1/content/html/content/src/TextTrackManager.h 2014-04-02 09:04:00.000000000 +0000 +++ firefox-29.0~b6+build1/content/html/content/src/TextTrackManager.h 2014-04-10 20:46:08.000000000 +0000 @@ -76,10 +76,7 @@ private: // The HTMLMediaElement that this TextTrackManager manages the TextTracks of. - // This is a weak reference as the life time of TextTrackManager is dependent - // on the HTMLMediaElement, so it should not be trying to hold the - // HTMLMediaElement alive. - HTMLMediaElement* mMediaElement; + nsRefPtr mMediaElement; // List of the TextTrackManager's owning HTMLMediaElement's TextTracks. nsRefPtr mTextTracks; // List of text track objects awaiting loading. diff -Nru firefox-29.0~b4+build1/content/media/AudioNodeEngine.cpp firefox-29.0~b6+build1/content/media/AudioNodeEngine.cpp --- firefox-29.0~b4+build1/content/media/AudioNodeEngine.cpp 2014-04-02 09:04:00.000000000 +0000 +++ firefox-29.0~b6+build1/content/media/AudioNodeEngine.cpp 2014-04-10 20:46:09.000000000 +0000 @@ -15,10 +15,15 @@ void AllocateAudioBlock(uint32_t aChannelCount, AudioChunk* aChunk) { + CheckedInt size = WEBAUDIO_BLOCK_SIZE; + size *= aChannelCount; + size *= sizeof(float); + if (!size.isValid()) { + MOZ_CRASH(); + } // XXX for SIMD purposes we should do something here to make sure the // channel buffers are 16-byte aligned. - nsRefPtr buffer = - SharedBuffer::Create(WEBAUDIO_BLOCK_SIZE*aChannelCount*sizeof(float)); + nsRefPtr buffer = SharedBuffer::Create(size.value()); aChunk->mDuration = WEBAUDIO_BLOCK_SIZE; aChunk->mChannelData.SetLength(aChannelCount); float* data = static_cast(buffer->Data()); diff -Nru firefox-29.0~b4+build1/content/media/MediaDecoder.cpp firefox-29.0~b6+build1/content/media/MediaDecoder.cpp --- firefox-29.0~b4+build1/content/media/MediaDecoder.cpp 2014-04-02 09:04:00.000000000 +0000 +++ firefox-29.0~b6+build1/content/media/MediaDecoder.cpp 2014-04-10 20:46:09.000000000 +0000 @@ -753,7 +753,6 @@ bool MediaDecoder::IsDataCachedToEndOfResource() { - NS_ASSERTION(!mShuttingDown, "Don't call during shutdown!"); ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); return (mResource && mResource->IsDataCachedToEndOfResource(mDecoderPosition)); diff -Nru firefox-29.0~b4+build1/content/media/SharedBuffer.h firefox-29.0~b6+build1/content/media/SharedBuffer.h --- firefox-29.0~b4+build1/content/media/SharedBuffer.h 2014-04-02 09:04:00.000000000 +0000 +++ firefox-29.0~b6+build1/content/media/SharedBuffer.h 2014-04-10 20:46:09.000000000 +0000 @@ -6,6 +6,7 @@ #ifndef MOZILLA_SHAREDBUFFER_H_ #define MOZILLA_SHAREDBUFFER_H_ +#include "mozilla/CheckedInt.h" #include "mozilla/mozalloc.h" #include "nsCOMPtr.h" #include "nsAutoPtr.h" @@ -36,7 +37,12 @@ static already_AddRefed Create(size_t aSize) { - void* m = moz_xmalloc(sizeof(SharedBuffer) + aSize); + CheckedInt size = sizeof(SharedBuffer); + size += aSize; + if (!size.isValid()) { + MOZ_CRASH(); + } + void* m = moz_xmalloc(size.value()); nsRefPtr p = new (m) SharedBuffer(); NS_ASSERTION((reinterpret_cast(p.get() + 1) - reinterpret_cast(p.get())) % 4 == 0, "SharedBuffers should be at least 4-byte aligned"); diff -Nru firefox-29.0~b4+build1/debian/changelog firefox-29.0~b6+build1/debian/changelog --- firefox-29.0~b4+build1/debian/changelog 2014-04-02 09:35:23.000000000 +0000 +++ firefox-29.0~b6+build1/debian/changelog 2014-04-10 21:11:10.000000000 +0000 @@ -1,3 +1,11 @@ +firefox (29.0~b6+build1-0ubuntu0.12.10.1) quantal; urgency=medium + + * New upstream release from the beta channel (FIREFOX_29_0b6_BUILD1) + + * Don't display the option to toggle the menubar in Unity + + -- Chris Coulson Thu, 10 Apr 2014 21:17:29 +0100 + firefox (29.0~b4+build1-0ubuntu0.12.10.1) quantal; urgency=medium * New upstream release from the beta channel (FIREFOX_29_0b4_BUILD1) diff -Nru firefox-29.0~b4+build1/debian/patches/unity-menubar.patch firefox-29.0~b6+build1/debian/patches/unity-menubar.patch --- firefox-29.0~b4+build1/debian/patches/unity-menubar.patch 2014-04-02 09:35:23.000000000 +0000 +++ firefox-29.0~b6+build1/debian/patches/unity-menubar.patch 2014-04-10 21:11:10.000000000 +0000 @@ -1,7 +1,7 @@ -Index: firefox-trunk-29.0~a1~hg20140119r164234/browser/base/content/browser-menubar.inc +Index: firefox-29.0~b6+build1/browser/base/content/browser-menubar.inc =================================================================== ---- firefox-trunk-29.0~a1~hg20140119r164234.orig/browser/base/content/browser-menubar.inc 2014-01-20 09:02:33.917947448 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/browser/base/content/browser-menubar.inc 2014-01-20 09:02:33.897947447 +0000 +--- firefox-29.0~b6+build1.orig/browser/base/content/browser-menubar.inc 2014-04-10 21:46:04.000000000 +0100 ++++ firefox-29.0~b6+build1/browser/base/content/browser-menubar.inc 2014-04-10 22:00:43.000000000 +0100 @@ -5,7 +5,11 @@ -Index: firefox-trunk-29.0~a1~hg20140119r164234/browser/components/places/content/places.xul +Index: firefox-29.0~b6+build1/browser/components/places/content/places.xul =================================================================== ---- firefox-trunk-29.0~a1~hg20140119r164234.orig/browser/components/places/content/places.xul 2014-01-20 09:02:33.917947448 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/browser/components/places/content/places.xul 2014-01-20 09:02:33.897947447 +0000 +--- firefox-29.0~b6+build1.orig/browser/components/places/content/places.xul 2014-04-10 21:46:05.000000000 +0100 ++++ firefox-29.0~b6+build1/browser/components/places/content/places.xul 2014-04-10 22:00:43.000000000 +0100 @@ -157,7 +157,7 @@ @@ -62,11 +62,11 @@ -Index: firefox-trunk-29.0~a1~hg20140119r164234/toolkit/content/xul.css +Index: firefox-29.0~b6+build1/toolkit/content/xul.css =================================================================== ---- firefox-trunk-29.0~a1~hg20140119r164234.orig/toolkit/content/xul.css 2014-01-20 09:02:33.917947448 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/toolkit/content/xul.css 2014-01-20 09:02:33.901947447 +0000 -@@ -293,6 +293,18 @@ +--- firefox-29.0~b6+build1.orig/toolkit/content/xul.css 2014-04-10 21:46:11.000000000 +0100 ++++ firefox-29.0~b6+build1/toolkit/content/xul.css 2014-04-10 22:00:43.000000000 +0100 +@@ -295,6 +295,18 @@ } %endif @@ -85,10 +85,10 @@ toolbarseparator { -moz-binding: url("chrome://global/content/bindings/toolbar.xml#toolbardecoration"); } -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsDbusmenu.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsDbusmenu.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsDbusmenu.cpp 2014-01-20 09:02:33.901947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsDbusmenu.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -149,10 +149,10 @@ + + return NS_OK; +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsDbusmenu.h +Index: firefox-29.0~b6+build1/widget/gtk/nsDbusmenu.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsDbusmenu.h 2014-01-20 09:02:33.901947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsDbusmenu.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -253,10 +253,10 @@ +#define dbusmenu_menuitem_property_set_shortcut nsDbusmenuFunctions::s_dbusmenu_menuitem_property_set_shortcut + +#endif /* __nsDbusmenu_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenu.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsMenu.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenu.cpp 2014-01-20 09:02:33.901947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenu.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,866 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -1124,10 +1124,10 @@ + + MaybeAddPlaceholderItem(); +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenu.h +Index: firefox-29.0~b6+build1/widget/gtk/nsMenu.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenu.h 2014-01-20 09:02:33.901947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenu.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,166 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -1295,10 +1295,10 @@ +}; + +#endif /* __nsMenu_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuBar.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuBar.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuBar.cpp 2014-01-20 09:02:33.901947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuBar.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,544 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -1844,10 +1844,10 @@ + DebugOnly rv = RemoveChild(aChild); + NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to remove item from menubar"); +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuBar.h +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuBar.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuBar.h 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuBar.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -1961,10 +1961,10 @@ +}; + +#endif /* __nsMenuBar_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuContainer.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuContainer.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuContainer.cpp 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuContainer.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,179 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -2145,10 +2145,10 @@ + + return aContent; +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuContainer.h +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuContainer.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuContainer.h 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuContainer.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -2216,10 +2216,10 @@ +}; + +#endif /* __nsMenuContainer_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuItem.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuItem.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuItem.cpp 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuItem.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,739 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -2960,10 +2960,10 @@ + UpdateIcon(sc); + } +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuItem.h +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuItem.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuItem.h 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuItem.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -3072,10 +3072,10 @@ +}; + +#endif /* __nsMenuItem_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuObject.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuObject.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuObject.cpp 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuObject.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,704 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -3781,10 +3781,10 @@ + weak = weak->GetPrevious(); + } +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuObject.h +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuObject.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuObject.h 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuObject.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,242 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -4028,10 +4028,10 @@ +}; + +#endif /* __nsMenuObject_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuSeparator.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuSeparator.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuSeparator.cpp 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuSeparator.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,90 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -4123,10 +4123,10 @@ + UpdateVisibility(sc); + } +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuSeparator.h +Index: firefox-29.0~b6+build1/widget/gtk/nsMenuSeparator.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsMenuSeparator.h 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsMenuSeparator.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,41 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -4169,10 +4169,10 @@ +}; + +#endif /* __nsMenuSeparator_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuAtomList.h +Index: firefox-29.0~b6+build1/widget/gtk/nsNativeMenuAtomList.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuAtomList.h 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsNativeMenuAtomList.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,11 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -4185,10 +4185,10 @@ +WIDGET_ATOM2(_moz_menupopupstate, "_moz-menupopupstate") +WIDGET_ATOM(openedwithkey) +WIDGET_ATOM(shellshowingmenubar) -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuAtoms.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsNativeMenuAtoms.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuAtoms.cpp 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsNativeMenuAtoms.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,39 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -4229,10 +4229,10 @@ +{ + NS_RegisterStaticAtoms(gAtoms); +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuAtoms.h +Index: firefox-29.0~b6+build1/widget/gtk/nsNativeMenuAtoms.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuAtoms.h 2014-01-20 09:02:33.905947447 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsNativeMenuAtoms.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,25 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -4259,10 +4259,10 @@ +}; + +#endif /* __nsNativeMenuAtoms_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuDocListener.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsNativeMenuDocListener.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuDocListener.cpp 2014-01-20 09:02:33.909947448 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsNativeMenuDocListener.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,369 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -4633,10 +4633,10 @@ + CancelFlush(this); + mPendingMutations.Clear(); +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuDocListener.h +Index: firefox-29.0~b6+build1/widget/gtk/nsNativeMenuDocListener.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuDocListener.h 2014-01-20 09:02:33.909947448 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsNativeMenuDocListener.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,152 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -4790,10 +4790,10 @@ +}; + +#endif /* __nsNativeMenuDocListener_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuService.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsNativeMenuService.cpp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuService.cpp 2014-01-20 09:02:33.909947448 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsNativeMenuService.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,506 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -5301,10 +5301,10 @@ + + return NS_OK; +} -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuService.h +Index: firefox-29.0~b6+build1/widget/gtk/nsNativeMenuService.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuService.h 2014-01-20 09:02:33.909947448 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsNativeMenuService.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,88 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -5394,10 +5394,10 @@ +}; + +#endif /* __nsNativeMenuService_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuUtils.h +Index: firefox-29.0~b6+build1/widget/gtk/nsNativeMenuUtils.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsNativeMenuUtils.h 2014-01-20 09:02:33.909947448 +0000 ++++ firefox-29.0~b6+build1/widget/gtk/nsNativeMenuUtils.h 2014-04-10 22:00:43.000000000 +0100 @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: @@ -5458,10 +5458,10 @@ +}; + +#endif /* __nsNativeMenuUtils_h__ */ -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsWidgetFactory.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsWidgetFactory.cpp =================================================================== ---- firefox-trunk-29.0~a1~hg20140119r164234.orig/widget/gtk/nsWidgetFactory.cpp 2014-01-20 09:02:33.917947448 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsWidgetFactory.cpp 2014-01-20 09:02:33.909947448 +0000 +--- firefox-29.0~b6+build1.orig/widget/gtk/nsWidgetFactory.cpp 2014-04-10 21:46:13.000000000 +0100 ++++ firefox-29.0~b6+build1/widget/gtk/nsWidgetFactory.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -43,6 +43,9 @@ #include "GfxInfoX11.h" #endif @@ -5472,7 +5472,7 @@ #include "nsNativeThemeGTK.h" #include "nsIComponentRegistrar.h" -@@ -116,6 +119,9 @@ +@@ -115,6 +118,9 @@ } #endif @@ -5482,7 +5482,7 @@ #ifdef NS_PRINTING NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecGTK) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintOptionsGTK, Init) -@@ -243,6 +249,7 @@ +@@ -242,6 +248,7 @@ NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID); NS_DEFINE_NAMED_CID(NS_GFXINFO_CID); #endif @@ -5490,7 +5490,7 @@ static const mozilla::Module::CIDEntry kWidgetCIDs[] = { -@@ -277,6 +284,7 @@ +@@ -276,6 +283,7 @@ { &kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceGTKConstructor }, { &kNS_GFXINFO_CID, false, nullptr, mozilla::widget::GfxInfoConstructor }, #endif @@ -5498,7 +5498,7 @@ { nullptr } }; -@@ -312,6 +320,7 @@ +@@ -311,6 +319,7 @@ { "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID }, { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID }, #endif @@ -5506,7 +5506,7 @@ { nullptr } }; -@@ -326,13 +335,22 @@ +@@ -325,13 +334,22 @@ nsAppShellShutdown(); } @@ -5530,11 +5530,11 @@ nsWidgetGtk2ModuleDtor }; -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsWindow.cpp +Index: firefox-29.0~b6+build1/widget/gtk/nsWindow.cpp =================================================================== ---- firefox-trunk-29.0~a1~hg20140119r164234.orig/widget/gtk/nsWindow.cpp 2014-01-20 09:02:33.917947448 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsWindow.cpp 2014-01-20 09:02:33.909947448 +0000 -@@ -4739,6 +4739,11 @@ +--- firefox-29.0~b6+build1.orig/widget/gtk/nsWindow.cpp 2014-04-10 21:46:13.000000000 +0100 ++++ firefox-29.0~b6+build1/widget/gtk/nsWindow.cpp 2014-04-10 22:00:43.000000000 +0100 +@@ -4748,6 +4748,11 @@ return NS_OK; } @@ -5546,10 +5546,10 @@ bool nsWindow::CheckForRollup(gdouble aMouseX, gdouble aMouseY, bool aIsWheel, bool aAlwaysRollup) -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsWindow.h +Index: firefox-29.0~b6+build1/widget/gtk/nsWindow.h =================================================================== ---- firefox-trunk-29.0~a1~hg20140119r164234.orig/widget/gtk/nsWindow.h 2014-01-20 09:02:33.917947448 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/nsWindow.h 2014-01-20 09:02:33.913947448 +0000 +--- firefox-29.0~b6+build1.orig/widget/gtk/nsWindow.h 2014-04-10 21:46:13.000000000 +0100 ++++ firefox-29.0~b6+build1/widget/gtk/nsWindow.h 2014-04-10 22:00:43.000000000 +0100 @@ -34,6 +34,8 @@ #include "nsGtkIMModule.h" @@ -5559,7 +5559,7 @@ #undef LOG #ifdef MOZ_LOGGING -@@ -155,6 +157,8 @@ +@@ -154,6 +156,8 @@ NS_IMETHOD MakeFullScreen(bool aFullScreen); NS_IMETHOD HideWindowChrome(bool aShouldHide); @@ -5568,7 +5568,7 @@ /** * GetLastUserInputTime returns a timestamp for the most recent user input * event. This is intended for pointer grab requests (including drags). -@@ -461,6 +465,8 @@ +@@ -460,6 +464,8 @@ * however, IME doesn't work at that time. */ nsRefPtr mIMModule; @@ -5577,10 +5577,10 @@ }; class nsChildWindow : public nsWindow { -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/moz.build +Index: firefox-29.0~b6+build1/widget/moz.build =================================================================== ---- firefox-trunk-29.0~a1~hg20140119r164234.orig/widget/moz.build 2014-01-20 09:02:33.917947448 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/moz.build 2014-01-20 09:02:33.913947448 +0000 +--- firefox-29.0~b6+build1.orig/widget/moz.build 2014-04-10 21:46:13.000000000 +0100 ++++ firefox-29.0~b6+build1/widget/moz.build 2014-04-10 22:00:43.000000000 +0100 @@ -37,8 +37,7 @@ 'nsITaskbarProgress.idl', ] @@ -5601,10 +5601,10 @@ TEST_TOOL_DIRS += ['tests'] # Don't build the DSO under the 'build' directory as windows does. -Index: firefox-trunk-29.0~a1~hg20140119r164234/xpfe/appshell/src/nsWebShellWindow.cpp +Index: firefox-29.0~b6+build1/xpfe/appshell/src/nsWebShellWindow.cpp =================================================================== ---- firefox-trunk-29.0~a1~hg20140119r164234.orig/xpfe/appshell/src/nsWebShellWindow.cpp 2014-01-20 09:02:33.917947448 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/xpfe/appshell/src/nsWebShellWindow.cpp 2014-01-20 09:02:33.913947448 +0000 +--- firefox-29.0~b6+build1.orig/xpfe/appshell/src/nsWebShellWindow.cpp 2014-04-10 21:46:19.000000000 +0100 ++++ firefox-29.0~b6+build1/xpfe/appshell/src/nsWebShellWindow.cpp 2014-04-10 22:00:43.000000000 +0100 @@ -57,6 +57,7 @@ #include "nsIScreen.h" @@ -5637,10 +5637,10 @@ if (nms && menubarContent) nms->CreateNativeMenuBar(aParentWindow, menubarContent); } -Index: firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/moz.build +Index: firefox-29.0~b6+build1/widget/gtk/moz.build =================================================================== ---- firefox-trunk-29.0~a1~hg20140119r164234.orig/widget/gtk/moz.build 2014-01-20 09:02:33.917947448 +0000 -+++ firefox-trunk-29.0~a1~hg20140119r164234/widget/gtk/moz.build 2014-01-20 09:02:33.913947448 +0000 +--- firefox-29.0~b6+build1.orig/widget/gtk/moz.build 2014-04-10 21:46:13.000000000 +0100 ++++ firefox-29.0~b6+build1/widget/gtk/moz.build 2014-04-10 22:00:43.000000000 +0100 @@ -19,11 +19,20 @@ 'mozcontainer.c', 'nsBidiKeyboard.cpp', @@ -5678,3 +5678,16 @@ '/layout/xul', '/other-licenses/atk-1.0', ] +Index: firefox-29.0~b6+build1/browser/base/content/browser.js +=================================================================== +--- firefox-29.0~b6+build1.orig/browser/base/content/browser.js 2014-04-10 21:46:19.000000000 +0100 ++++ firefox-29.0~b6+build1/browser/base/content/browser.js 2014-04-10 22:02:01.809018595 +0100 +@@ -4288,6 +4288,8 @@ + let toolbarNodes = Array.slice(gNavToolbox.childNodes); + toolbarNodes = toolbarNodes.concat(gNavToolbox.externalToolbars); + toolbarNodes = toolbarNodes.filter(node => node.getAttribute("toolbarname")); ++ if (document.documentElement.getAttribute("shellshowingmenubar") == "true") ++ toolbarNodes = toolbarNodes.filter(node => node.id != "toolbar-menubar"); + return toolbarNodes; + } + diff -Nru firefox-29.0~b4+build1/docshell/test/file_bug668513.html firefox-29.0~b6+build1/docshell/test/file_bug668513.html --- firefox-29.0~b4+build1/docshell/test/file_bug668513.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-29.0~b6+build1/docshell/test/file_bug668513.html 2014-04-10 20:46:11.000000000 +0000 @@ -0,0 +1,107 @@ + + + + Test file for Bug 668513 + + + +
+ +
+ + diff -Nru firefox-29.0~b4+build1/docshell/test/file_framedhistoryframes.html firefox-29.0~b6+build1/docshell/test/file_framedhistoryframes.html --- firefox-29.0~b4+build1/docshell/test/file_framedhistoryframes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-29.0~b6+build1/docshell/test/file_framedhistoryframes.html 2014-04-10 20:46:11.000000000 +0000 @@ -0,0 +1,16 @@ + + + + + + + diff -Nru firefox-29.0~b4+build1/docshell/test/mochitest.ini firefox-29.0~b6+build1/docshell/test/mochitest.ini --- firefox-29.0~b4+build1/docshell/test/mochitest.ini 2014-04-02 09:04:01.000000000 +0000 +++ firefox-29.0~b6+build1/docshell/test/mochitest.ini 2014-04-10 20:46:11.000000000 +0000 @@ -68,6 +68,7 @@ [test_bug660404.html] [test_bug662170.html] [test_bug668513.html] +support-files = file_bug668513.html [test_bug669671.html] [test_bug675587.html] [test_bug680257.html] @@ -78,5 +79,6 @@ [test_bug728939.html] [test_bug797909.html] [test_framedhistoryframes.html] +support-files = file_framedhistoryframes.html [test_pushState_after_document_open.html] [test_windowedhistoryframes.html] diff -Nru firefox-29.0~b4+build1/docshell/test/test_bug668513.html firefox-29.0~b6+build1/docshell/test/test_bug668513.html --- firefox-29.0~b4+build1/docshell/test/test_bug668513.html 2014-04-02 09:04:01.000000000 +0000 +++ firefox-29.0~b6+build1/docshell/test/test_bug668513.html 2014-04-10 20:46:11.000000000 +0000 @@ -7,110 +7,21 @@ Test for Bug 668513 - Mozilla Bug 668513 -
- -

 
 
diff -Nru firefox-29.0~b4+build1/docshell/test/test_framedhistoryframes.html firefox-29.0~b6+build1/docshell/test/test_framedhistoryframes.html --- firefox-29.0~b4+build1/docshell/test/test_framedhistoryframes.html 2014-04-02 09:04:01.000000000 +0000 +++ firefox-29.0~b6+build1/docshell/test/test_framedhistoryframes.html 2014-04-10 20:46:11.000000000 +0000 @@ -12,7 +12,6 @@ Mozilla Bug 602256

-
 
diff -Nru firefox-29.0~b4+build1/dom/imptests/failures/html/html/browsers/the-window-object/test_window-properties.html.json firefox-29.0~b6+build1/dom/imptests/failures/html/html/browsers/the-window-object/test_window-properties.html.json
--- firefox-29.0~b4+build1/dom/imptests/failures/html/html/browsers/the-window-object/test_window-properties.html.json	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/dom/imptests/failures/html/html/browsers/the-window-object/test_window-properties.html.json	2014-04-10 20:46:12.000000000 +0000
@@ -2,29 +2,6 @@
   "EventTarget method: addEventListener": true,
   "EventTarget method: removeEventListener": true,
   "EventTarget method: dispatchEvent": true,
-  "Window method: close": true,
-  "Window method: stop": true,
-  "Window method: focus": true,
-  "Window method: blur": true,
-  "Window method: open": true,
-  "Window method: alert": true,
-  "Window method: confirm": true,
-  "Window method: prompt": true,
-  "Window method: print": true,
-  "Window method: showModalDialog": true,
-  "Window method: postMessage": true,
-  "Window method: btoa": true,
-  "Window method: atob": true,
-  "Window method: setTimeout": true,
-  "Window method: clearTimeout": true,
-  "Window method: setInterval": true,
-  "Window method: clearInterval": true,
-  "Window method: getSelection": true,
-  "Window method: getComputedStyle": true,
-  "Window method: matchMedia": true,
-  "Window method: scroll": true,
-  "Window method: scrollTo": true,
-  "Window method: scrollBy": true,
   "Window readonly attribute: history": true,
   "Window readonly attribute: parent": true,
   "Window readonly attribute: frameElement": true,
@@ -44,93 +21,14 @@
   "Window readonly attribute: screenY": true,
   "Window readonly attribute: outerWidth": true,
   "Window readonly attribute: outerHeight": true,
-  "Window attribute: name": true,
-  "Window attribute: status": true,
-  "Window attribute: opener": true,
-  "Window attribute: onabort": true,
-  "Window attribute: onafterprint": true,
-  "Window attribute: onbeforeprint": true,
-  "Window attribute: onbeforeunload": true,
-  "Window attribute: onblur": true,
   "Window attribute: oncancel": true,
-  "Window attribute: oncanplay": true,
-  "Window attribute: oncanplaythrough": true,
-  "Window attribute: onchange": true,
-  "Window attribute: onclick": true,
   "Window attribute: onclose": true,
-  "Window attribute: oncontextmenu": true,
   "Window attribute: oncuechange": true,
-  "Window attribute: ondblclick": true,
-  "Window attribute: ondrag": true,
-  "Window attribute: ondragend": true,
-  "Window attribute: ondragenter": true,
-  "Window attribute: ondragleave": true,
-  "Window attribute: ondragover": true,
-  "Window attribute: ondragstart": true,
-  "Window attribute: ondrop": true,
-  "Window attribute: ondurationchange": true,
-  "Window attribute: onemptied": true,
-  "Window attribute: onended": true,
-  "Window attribute: onerror": true,
-  "Window attribute: onfocus": true,
-  "Window attribute: onhashchange": true,
-  "Window attribute: oninput": true,
-  "Window attribute: oninvalid": true,
-  "Window attribute: onkeydown": true,
-  "Window attribute: onkeypress": true,
-  "Window attribute: onkeyup": true,
-  "Window attribute: oncancel": true,
-  "Window attribute: onclose": true,
-  "Window attribute: oncuechange": true,
-  "Window attribute: onmousewheel": true,
-  "Window attribute: onload": true,
-  "Window attribute: onloadeddata": true,
-  "Window attribute: onloadedmetadata": true,
-  "Window attribute: onloadstart": true,
-  "Window attribute: onmessage": true,
-  "Window attribute: onmousedown": true,
-  "Window attribute: onmousemove": true,
-  "Window attribute: onmouseout": true,
-  "Window attribute: onmouseover": true,
-  "Window attribute: onmouseup": true,
   "Window attribute: onmousewheel": true,
-  "Window attribute: onoffline": true,
-  "Window attribute: ononline": true,
-  "Window attribute: onpause": true,
-  "Window attribute: onplay": true,
-  "Window attribute: onplaying": true,
-  "Window attribute: onpagehide": true,
-  "Window attribute: onpageshow": true,
-  "Window attribute: onpopstate": true,
-  "Window attribute: onprogress": true,
-  "Window attribute: onratechange": true,
-  "Window attribute: onreset": true,
-  "Window attribute: onresize": true,
-  "Window attribute: onscroll": true,
-  "Window attribute: onseeked": true,
-  "Window attribute: onseeking": true,
-  "Window attribute: onselect": true,
-  "Window attribute: onshow": true,
-  "Window attribute: onstalled": true,
   "Window attribute: onstorage": true,
-  "Window attribute: onsubmit": true,
-  "Window attribute: onsuspend": true,
-  "Window attribute: ontimeupdate": true,
-  "Window attribute: onunload": true,
-  "Window attribute: onvolumechange": true,
-  "Window attribute: onwaiting": true,
   "Window unforgeable attribute: window": true,
   "Window unforgeable attribute: document": true,
   "Window unforgeable attribute: location": true,
   "Window unforgeable attribute: top": true,
-  "Window replaceable attribute: self": true,
-  "Window replaceable attribute: locationbar": true,
-  "Window replaceable attribute: menubar": true,
-  "Window replaceable attribute: personalbar": true,
-  "Window replaceable attribute: scrollbars": true,
-  "Window replaceable attribute: statusbar": true,
-  "Window replaceable attribute: toolbar": true,
-  "Window replaceable attribute: frames": true,
-  "Window replaceable attribute: length": true,
   "constructor": true
 }
diff -Nru firefox-29.0~b4+build1/dom/imptests/html/html/browsers/the-window-object/test_window-properties.html firefox-29.0~b6+build1/dom/imptests/html/html/browsers/the-window-object/test_window-properties.html
--- firefox-29.0~b4+build1/dom/imptests/html/html/browsers/the-window-object/test_window-properties.html	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/dom/imptests/html/html/browsers/the-window-object/test_window-properties.html	2014-04-10 20:46:12.000000000 +0000
@@ -264,8 +264,9 @@
     test(function() {
       var WindowProto = Window.prototype;
       assert_true(id in window, id + " in window");
-      assert_false(id in WindowProto, id + " in Window.prototype");
-      assert_data_propdesc(Object.getOwnPropertyDescriptor(window, id),
+      assert_true(id in WindowProto, id + " in Window.prototype");
+      assert_equals(window[id], WindowProto[id]);
+      assert_data_propdesc(Object.getOwnPropertyDescriptor(WindowProto, id),
                            true, true, true);
     }, "Window method: " + id);
   });
@@ -273,8 +274,8 @@
     test(function() {
       var WindowProto = Window.prototype;
       assert_true(id in window, id + " in window");
-      assert_false(id in WindowProto, id + " in Window.prototype");
-      assert_accessor_propdesc(Object.getOwnPropertyDescriptor(window, id),
+      assert_true(id in WindowProto, id + " in Window.prototype");
+      assert_accessor_propdesc(Object.getOwnPropertyDescriptor(WindowProto, id),
                                false, true, true);
     }, "Window readonly attribute: " + id);
   });
@@ -282,8 +283,8 @@
     test(function() {
       var WindowProto = Window.prototype;
       assert_true(id in window, id + " in window");
-      assert_false(id in WindowProto, id + " in Window.prototype");
-      assert_accessor_propdesc(Object.getOwnPropertyDescriptor(window, id),
+      assert_true(id in WindowProto, id + " in Window.prototype");
+      assert_accessor_propdesc(Object.getOwnPropertyDescriptor(WindowProto, id),
                                true, true, true);
     }, "Window attribute: " + id);
   });
@@ -291,18 +292,18 @@
     test(function() {
       var WindowProto = Window.prototype;
       assert_true(id in window, id + " in window");
-      assert_false(id in WindowProto, id + " in Window.prototype");
       // location has a [PutForwards] extended attribute.
       assert_accessor_propdesc(Object.getOwnPropertyDescriptor(window, id),
                                id === "location", true, false);
+      assert_false(id in WindowProto, id + " in Window.prototype");
     }, "Window unforgeable attribute: " + id);
   });
   replacableAttributes.forEach(function(id) {
     test(function() {
       var WindowProto = Window.prototype;
       assert_true(id in window, id + " in window");
-      assert_false(id in WindowProto, id + " in Window.prototype");
-      assert_accessor_propdesc(Object.getOwnPropertyDescriptor(window, id),
+      assert_true(id in WindowProto, id + " in Window.prototype");
+      assert_accessor_propdesc(Object.getOwnPropertyDescriptor(WindowProto, id),
                                true, true, true);
     }, "Window replaceable attribute: " + id);
   });
diff -Nru firefox-29.0~b4+build1/dom/promise/Promise.cpp firefox-29.0~b6+build1/dom/promise/Promise.cpp
--- firefox-29.0~b4+build1/dom/promise/Promise.cpp	2014-04-02 09:04:10.000000000 +0000
+++ firefox-29.0~b6+build1/dom/promise/Promise.cpp	2014-04-10 20:46:12.000000000 +0000
@@ -189,11 +189,10 @@
 NS_IMPL_CYCLE_COLLECTION_CLASS(Promise)
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Promise)
-  tmp->MaybeReportRejected();
+  tmp->MaybeReportRejectedOnce();
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mResolveCallbacks);
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mRejectCallbacks);
-  tmp->mResult = JS::UndefinedValue();
   NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
@@ -232,8 +231,7 @@
 
 Promise::~Promise()
 {
-  MaybeReportRejected();
-  mResult = JS::UndefinedValue();
+  MaybeReportRejectedOnce();
   mozilla::DropJSObjects(this);
   MOZ_COUNT_DTOR(Promise);
 }
@@ -819,6 +817,9 @@
   if (aRejectCallback) {
     mHadRejectCallback = true;
     mRejectCallbacks.AppendElement(aRejectCallback);
+
+    // Now that there is a callback, we don't need to report anymore.
+    RemoveFeature();
   }
 
   // If promise's state is resolved, queue a task to process our resolve
@@ -1059,8 +1060,46 @@
 
   SetResult(aValue);
   SetState(aState);
+
+  // If the Promise was rejected, and there is no reject handler already setup,
+  // watch for thread shutdown.
+  if (aState == PromiseState::Rejected &&
+      !mHadRejectCallback &&
+      !NS_IsMainThread()) {
+    WorkerPrivate* worker = GetCurrentThreadWorkerPrivate();
+    MOZ_ASSERT(worker);
+    worker->AssertIsOnWorkerThread();
+
+    mFeature = new PromiseReportRejectFeature(this);
+    if (NS_WARN_IF(!worker->AddFeature(worker->GetJSContext(), mFeature))) {
+      // Worker is shutting down, report rejection immediately since it is
+      // unlikely that reject callbacks will be added after this point.
+      MaybeReportRejected();
+    }
+  }
+
   RunTask();
 }
 
+void
+Promise::RemoveFeature()
+{
+  if (mFeature) {
+    WorkerPrivate* worker = GetCurrentThreadWorkerPrivate();
+    MOZ_ASSERT(worker);
+    worker->RemoveFeature(worker->GetJSContext(), mFeature);
+    mFeature = nullptr;
+  }
+}
+
+bool
+PromiseReportRejectFeature::Notify(JSContext* aCx, workers::Status aStatus)
+{
+  MOZ_ASSERT(aStatus > workers::Running);
+  mPromise->MaybeReportRejectedOnce();
+  // After this point, `this` has been deleted by RemoveFeature!
+  return true;
+}
+
 } // namespace dom
 } // namespace mozilla
diff -Nru firefox-29.0~b4+build1/dom/promise/Promise.h firefox-29.0~b6+build1/dom/promise/Promise.h
--- firefox-29.0~b4+build1/dom/promise/Promise.h	2014-04-02 09:04:10.000000000 +0000
+++ firefox-29.0~b6+build1/dom/promise/Promise.h	2014-04-10 20:46:12.000000000 +0000
@@ -17,6 +17,8 @@
 #include "nsPIDOMWindow.h"
 #include "js/TypeDecls.h"
 
+#include "mozilla/dom/workers/bindings/WorkerFeature.h"
+
 namespace mozilla {
 namespace dom {
 
@@ -25,6 +27,23 @@
 class PromiseInit;
 class PromiseNativeHandler;
 
+class Promise;
+class PromiseReportRejectFeature : public workers::WorkerFeature
+{
+  // The Promise that owns this feature.
+  Promise* mPromise;
+
+public:
+  PromiseReportRejectFeature(Promise* aPromise)
+    : mPromise(aPromise)
+  {
+    MOZ_ASSERT(mPromise);
+  }
+
+  virtual bool
+  Notify(JSContext* aCx, workers::Status aStatus) MOZ_OVERRIDE;
+};
+
 class Promise MOZ_FINAL : public nsISupports,
                           public nsWrapperCache
 {
@@ -32,6 +51,7 @@
   friend class PromiseResolverMixin;
   friend class PromiseResolverTask;
   friend class PromiseTask;
+  friend class PromiseReportRejectFeature;
   friend class RejectPromiseCallback;
   friend class ResolvePromiseCallback;
   friend class WorkerPromiseResolverTask;
@@ -137,8 +157,15 @@
 
   // If we have been rejected and our mResult is a JS exception,
   // report it to the error console.
+  // Use MaybeReportRejectedOnce() for actual calls.
   void MaybeReportRejected();
 
+  void MaybeReportRejectedOnce() {
+    MaybeReportRejected();
+    RemoveFeature();
+    mResult = JS::UndefinedValue();
+  }
+
   void MaybeResolveInternal(JSContext* aCx,
                             JS::Handle aValue,
                             PromiseTaskSync aSync = AsyncTask);
@@ -175,6 +202,8 @@
 
   void HandleException(JSContext* aCx);
 
+  void RemoveFeature();
+
   nsRefPtr mWindow;
 
   nsTArray > mResolveCallbacks;
@@ -186,6 +215,12 @@
   bool mHadRejectCallback;
 
   bool mResolvePending;
+
+  // If a rejected promise on a worker has no reject callbacks attached, it
+  // needs to know when the worker is shutting down, to report the error on the
+  // console before the worker's context is deleted. This feature is used for
+  // that purpose.
+  nsAutoPtr mFeature;
 };
 
 } // namespace dom
diff -Nru firefox-29.0~b4+build1/dom/xbl/nsXBLBinding.cpp firefox-29.0~b6+build1/dom/xbl/nsXBLBinding.cpp
--- firefox-29.0~b4+build1/dom/xbl/nsXBLBinding.cpp	2014-04-02 09:04:04.000000000 +0000
+++ firefox-29.0~b6+build1/dom/xbl/nsXBLBinding.cpp	2014-04-10 20:46:13.000000000 +0000
@@ -114,6 +114,12 @@
   finalize = XBLFinalize;
 }
 
+bool
+nsXBLJSClass::IsXBLJSClass(const JSClass* aClass)
+{
+  return aClass->finalize == XBLFinalize;
+}
+
 nsrefcnt
 nsXBLJSClass::Destroy()
 {
@@ -989,7 +995,7 @@
   if (!::JS_LookupPropertyWithFlags(cx, global, className.get(), 0, &val))
     return NS_ERROR_OUT_OF_MEMORY;
 
-  if (val.isObject()) {
+  if (val.isObject() && nsXBLJSClass::IsXBLJSClass(JS_GetClass(&val.toObject()))) {
     *aNew = false;
     proto = &val.toObject();
   } else {
diff -Nru firefox-29.0~b4+build1/dom/xbl/nsXBLService.h firefox-29.0~b6+build1/dom/xbl/nsXBLService.h
--- firefox-29.0~b4+build1/dom/xbl/nsXBLService.h	2014-04-02 09:04:04.000000000 +0000
+++ firefox-29.0~b6+build1/dom/xbl/nsXBLService.h	2014-04-10 20:46:13.000000000 +0000
@@ -162,6 +162,8 @@
   nsrefcnt AddRef() { return Hold(); }
   nsrefcnt Release() { return Drop(); }
 
+  static bool IsXBLJSClass(const JSClass* aClass);
+
   // Downcast from a pointer to const JSClass to a pointer to non-const
   // nsXBLJSClass.
   //
@@ -174,6 +176,7 @@
   static nsXBLJSClass*
   fromJSClass(const JSClass* c)
   {
+    MOZ_ASSERT(IsXBLJSClass(c));
     nsXBLJSClass* x = const_cast(static_cast(c));
     MOZ_ASSERT(nsXBLService::getClass(x->mKey) == x);
     return x;
diff -Nru firefox-29.0~b4+build1/gfx/2d/2D.h firefox-29.0~b6+build1/gfx/2d/2D.h
--- firefox-29.0~b4+build1/gfx/2d/2D.h	2014-04-02 09:04:04.000000000 +0000
+++ firefox-29.0~b6+build1/gfx/2d/2D.h	2014-04-10 20:46:14.000000000 +0000
@@ -334,6 +334,16 @@
    * DataSourceSurface's data can be accessed directly.
    */
   virtual TemporaryRef GetDataSurface() = 0;
+
+  void AddUserData(UserDataKey *key, void *userData, void (*destroy)(void*)) {
+    mUserData.Add(key, userData, destroy);
+  }
+  void *GetUserData(UserDataKey *key) {
+    return mUserData.Get(key);
+  }
+
+protected:
+  UserData mUserData;
 };
 
 class DataSourceSurface : public SourceSurface
diff -Nru firefox-29.0~b4+build1/gfx/2d/Path.cpp firefox-29.0~b6+build1/gfx/2d/Path.cpp
--- firefox-29.0~b4+build1/gfx/2d/Path.cpp	2014-04-02 09:04:10.000000000 +0000
+++ firefox-29.0~b6+build1/gfx/2d/Path.cpp	2014-04-10 20:46:03.000000000 +0000
@@ -10,6 +10,15 @@
 namespace mozilla {
 namespace gfx {
 
+static float CubicRoot(float aValue) {
+  if (aValue < 0.0) {
+    return -CubicRoot(-aValue);
+  }
+  else {
+    return powf(aValue, 1.0f / 3.0f);
+  }
+}
+
 struct BezierControlPoints
 {
   BezierControlPoints() {}
@@ -269,8 +278,8 @@
 
     if (cp21.x == 0 && cp21.y == 0) {
       // In this case s3 becomes lim[n->0] (cp41.x * n) / n - (cp41.y * n) / n = cp41.x - cp41.y.
-      *aMin = aT - pow(aTolerance / (cp41.x - cp41.y), Float(1. / 3.));
-      *aMax = aT + pow(aTolerance / (cp41.x - cp41.y), Float(1. / 3.));;
+      *aMin = aT - CubicRoot(double(aTolerance / (cp41.x - cp41.y)));
+      *aMax = aT + CubicRoot(aTolerance / (cp41.x - cp41.y));
       return;
     }
 
@@ -285,7 +294,7 @@
       return;
     }
 
-    Float tf = pow(abs(aTolerance / s3), Float(1. / 3.));
+    Float tf = CubicRoot(abs(aTolerance / s3));
 
     *aMin = aT - tf * (1 - aT);
     *aMax = aT + tf * (1 - aT);
@@ -445,7 +454,7 @@
                 &remainingCP, t1min);
     FlattenBezierCurveSegment(prevCPs, aSink, aTolerance);
   }
-  if (t1max < 1.0 && (count == 1 || t2min > t1max)) {
+  if (t1max >= 0 && t1max < 1.0 && (count == 1 || t2min > t1max)) {
     // The second inflection point's approximation range begins after the end
     // of the first, approximate the first inflection point by a line and
     // subsequently flatten up until the end or the next inflection point.
diff -Nru firefox-29.0~b4+build1/gfx/thebes/gfxFont.cpp firefox-29.0~b6+build1/gfx/thebes/gfxFont.cpp
--- firefox-29.0~b4+build1/gfx/thebes/gfxFont.cpp	2014-04-02 09:03:57.000000000 +0000
+++ firefox-29.0~b6+build1/gfx/thebes/gfxFont.cpp	2014-04-10 20:46:05.000000000 +0000
@@ -40,6 +40,10 @@
 #include "gfxSVGGlyphs.h"
 #include "gfx2DGlue.h"
 
+#if defined(XP_MACOSX)
+#include "nsCocoaFeatures.h"
+#endif
+
 #include "cairo.h"
 #include "gfxFontTest.h"
 
@@ -1291,9 +1295,19 @@
         (mFaceNamesInitialized || !aNeedFullnamePostscriptNames))
         return;
 
+    bool asyncFontLoaderDisabled = false;
+
+#if defined(XP_MACOSX)
+    // bug 975460 - async font loader crashes sometimes under 10.6, disable
+    if (!nsCocoaFeatures::OnLionOrLater()) {
+        asyncFontLoaderDisabled = true;
+    }
+#endif
+
     if (!mOtherFamilyNamesInitialized &&
         aFontInfoData &&
-        aFontInfoData->mLoadOtherNames)
+        aFontInfoData->mLoadOtherNames &&
+        !asyncFontLoaderDisabled)
     {
         nsAutoTArray otherFamilyNames;
         bool foundOtherNames =
diff -Nru firefox-29.0~b4+build1/gfx/thebes/gfxMacPlatformFontList.mm firefox-29.0~b6+build1/gfx/thebes/gfxMacPlatformFontList.mm
--- firefox-29.0~b4+build1/gfx/thebes/gfxMacPlatformFontList.mm	2014-04-02 09:03:57.000000000 +0000
+++ firefox-29.0~b6+build1/gfx/thebes/gfxMacPlatformFontList.mm	2014-04-10 20:46:05.000000000 +0000
@@ -61,6 +61,7 @@
 #include "nsDirectoryServiceDefs.h"
 #include "nsISimpleEnumerator.h"
 #include "nsCharTraits.h"
+#include "nsCocoaFeatures.h"
 #include "gfxFontConstants.h"
 
 #include "mozilla/MemoryReporting.h"
@@ -588,7 +589,9 @@
 public:
     gfxSingleFaceMacFontFamily(nsAString& aName) :
         gfxFontFamily(aName)
-    {}
+    {
+        mFaceNamesInitialized = true; // omit from face name lists
+    }
 
     virtual ~gfxSingleFaceMacFontFamily() {}
 
@@ -1036,7 +1039,10 @@
 
     virtual void Load() {
         nsAutoreleasePool localPool;
-        FontInfoData::Load();
+        // bug 975460 - async font loader crashes sometimes under 10.6, disable
+        if (nsCocoaFeatures::OnLionOrLater()) {
+            FontInfoData::Load();
+        }
     }
 
     // loads font data for all members of a given family
diff -Nru firefox-29.0~b4+build1/gfx/thebes/gfxPlatform.cpp firefox-29.0~b6+build1/gfx/thebes/gfxPlatform.cpp
--- firefox-29.0~b4+build1/gfx/thebes/gfxPlatform.cpp	2014-04-02 09:03:57.000000000 +0000
+++ firefox-29.0~b6+build1/gfx/thebes/gfxPlatform.cpp	2014-04-10 20:46:19.000000000 +0000
@@ -701,6 +701,18 @@
   delete static_cast(srcSurfUD);
 }
 
+UserDataKey kThebesSurface;
+
+struct DependentSourceSurfaceUserData
+{
+  nsRefPtr mSurface;
+};
+
+void SourceSurfaceDestroyed(void *aData)
+{
+  delete static_cast(aData);
+}
+
 #if MOZ_TREE_CAIRO
 void SourceSnapshotDetached(cairo_surface_t *nullSurf)
 {
@@ -723,6 +735,34 @@
   aSurface->SetData(&kSourceSurface, nullptr, nullptr);
 }
 
+static TemporaryRef
+CopySurface(gfxASurface* aSurface)
+{
+  const nsIntSize size = aSurface->GetSize();
+  gfxImageFormat format = gfxPlatform::GetPlatform()->OptimalFormatForContent(aSurface->GetContentType());
+  RefPtr data =
+    Factory::CreateDataSourceSurface(ToIntSize(size),
+                                     ImageFormatToSurfaceFormat(format));
+  if (!data) {
+    return nullptr;
+  }
+
+  DataSourceSurface::MappedSurface map;
+  DebugOnly result = data->Map(DataSourceSurface::WRITE, &map);
+  MOZ_ASSERT(result, "Should always succeed mapping raw data surfaces!");
+
+  nsRefPtr image = new gfxImageSurface(map.mData, size, map.mStride, format);
+  nsRefPtr ctx = new gfxContext(image);
+
+  ctx->SetSource(aSurface);
+  ctx->SetOperator(gfxContext::OPERATOR_SOURCE);
+  ctx->Paint();
+
+  data->Unmap();
+
+  return data;
+}
+
 RefPtr
 gfxPlatform::GetSourceSurfaceForSurface(DrawTarget *aTarget, gfxASurface *aSurface)
 {
@@ -791,18 +831,24 @@
     }
   }
 
+  bool dependsOnData = false;
   if (!srcBuffer) {
     nsRefPtr imgSurface = aSurface->GetAsImageSurface();
 
-    bool isWin32ImageSurf = imgSurface &&
-                            aSurface->GetType() == gfxSurfaceType::Win32;
-
+    RefPtr copy;
     if (!imgSurface) {
-      imgSurface = new gfxImageSurface(aSurface->GetSize(), OptimalFormatForContent(aSurface->GetContentType()));
-      nsRefPtr ctx = new gfxContext(imgSurface);
-      ctx->SetSource(aSurface);
-      ctx->SetOperator(gfxContext::OPERATOR_SOURCE);
-      ctx->Paint();
+      copy = CopySurface(aSurface);
+
+      if (!copy) {
+        return nullptr;
+      }
+
+      DataSourceSurface::MappedSurface map;
+      DebugOnly result = copy->Map(DataSourceSurface::WRITE, &map);
+      MOZ_ASSERT(result, "Should always succeed mapping raw data surfaces!");
+
+      imgSurface = new gfxImageSurface(map.mData, aSurface->GetSize(), map.mStride,
+                                       SurfaceFormatToImageFormat(copy->GetFormat()));
     }
 
     gfxImageFormat cairoFormat = imgSurface->Format();
@@ -829,38 +875,56 @@
                                                      imgSurface->Stride(),
                                                      format);
 
+    if (copy) {
+      copy->Unmap();
+    }
+
     if (!srcBuffer) {
-      // We need to check if our gfxASurface will keep the underlying data
-      // alive. This is true if gfxASurface actually -is- an ImageSurface or
-      // if it is a gfxWindowsSurface which supports GetAsImageSurface.
-      if (imgSurface != aSurface && !isWin32ImageSurf) {
-        return nullptr;
+      // If we had to make a copy, then just return that. Otherwise aSurface
+      // must have supported GetAsImageSurface, so we can just wrap that data.
+      if (copy) {
+        srcBuffer = copy;
+      } else {
+        srcBuffer = Factory::CreateWrappingDataSourceSurface(imgSurface->Data(),
+                                                             imgSurface->Stride(),
+                                                             size, format);
+        dependsOnData = true;
       }
+    }
 
-      srcBuffer = Factory::CreateWrappingDataSourceSurface(imgSurface->Data(),
-                                                           imgSurface->Stride(),
-                                                           size, format);
-
+    if (!srcBuffer) {
+      return nullptr;
     }
 
+    if (!dependsOnData) {
 #if MOZ_TREE_CAIRO
-    cairo_surface_t *nullSurf =
-	cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA);
-    cairo_surface_set_user_data(nullSurf,
-                                &kSourceSurface,
-                                imgSurface,
-                                nullptr);
-    cairo_surface_attach_snapshot(imgSurface->CairoSurface(), nullSurf, SourceSnapshotDetached);
-    cairo_surface_destroy(nullSurf);
+      cairo_surface_t *nullSurf =
+      cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA);
+      cairo_surface_set_user_data(nullSurf,
+                                  &kSourceSurface,
+                                  imgSurface,
+                                  nullptr);
+      cairo_surface_attach_snapshot(imgSurface->CairoSurface(), nullSurf, SourceSnapshotDetached);
+      cairo_surface_destroy(nullSurf);
 #else
-    cairo_surface_set_mime_data(imgSurface->CairoSurface(), "mozilla/magic", (const unsigned char*) "data", 4, SourceSnapshotDetached, imgSurface.get());
+      cairo_surface_set_mime_data(imgSurface->CairoSurface(), "mozilla/magic", (const unsigned char*) "data", 4, SourceSnapshotDetached, imgSurface.get());
 #endif
+    }
   }
 
-  SourceSurfaceUserData *srcSurfUD = new SourceSurfaceUserData;
-  srcSurfUD->mBackendType = aTarget->GetType();
-  srcSurfUD->mSrcSurface = srcBuffer;
-  aSurface->SetData(&kSourceSurface, srcSurfUD, SourceBufferDestroy);
+  if (dependsOnData) {
+    // If we wrapped the underlying data of aSurface, then we need to add user data
+    // to make sure aSurface stays alive until we are done with the data.
+    DependentSourceSurfaceUserData *srcSurfUD = new DependentSourceSurfaceUserData;
+    srcSurfUD->mSurface = aSurface;
+    srcBuffer->AddUserData(&kThebesSurface, srcSurfUD, SourceSurfaceDestroyed);
+  } else {
+    // Otherwise add user data to aSurface so we can cache lookups in the future.
+    SourceSurfaceUserData *srcSurfUD = new SourceSurfaceUserData;
+    srcSurfUD->mBackendType = aTarget->GetType();
+    srcSurfUD->mSrcSurface = srcBuffer;
+    aSurface->SetData(&kSourceSurface, srcSurfUD, SourceBufferDestroy);
+  }
 
   return srcBuffer;
 }
diff -Nru firefox-29.0~b4+build1/intl/hyphenation/src/nsHyphenationManager.cpp firefox-29.0~b6+build1/intl/hyphenation/src/nsHyphenationManager.cpp
--- firefox-29.0~b4+build1/intl/hyphenation/src/nsHyphenationManager.cpp	2014-04-02 09:04:10.000000000 +0000
+++ firefox-29.0~b6+build1/intl/hyphenation/src/nsHyphenationManager.cpp	2014-04-10 20:46:05.000000000 +0000
@@ -66,6 +66,7 @@
 nsHyphenationManager::Shutdown()
 {
   delete sInstance;
+  sInstance = nullptr;
 }
 
 nsHyphenationManager::nsHyphenationManager()
diff -Nru firefox-29.0~b4+build1/js/src/gc/RootMarking.cpp firefox-29.0~b6+build1/js/src/gc/RootMarking.cpp
--- firefox-29.0~b4+build1/js/src/gc/RootMarking.cpp	2014-04-02 09:04:00.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/gc/RootMarking.cpp	2014-04-10 20:46:08.000000000 +0000
@@ -797,7 +797,7 @@
          * no need to do this for minor GCs.
          */
         for (CompartmentsIter c(rt, SkipAtoms); !c.done(); c.next())
-            c->mark(trc);
+            c->markRoots(trc);
 
         /*
          * The embedding can register additional roots here.
diff -Nru firefox-29.0~b4+build1/js/src/gc/Zone.cpp firefox-29.0~b6+build1/js/src/gc/Zone.cpp
--- firefox-29.0~b4+build1/js/src/gc/Zone.cpp	2014-04-02 09:04:00.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/gc/Zone.cpp	2014-04-10 20:46:19.000000000 +0000
@@ -24,7 +24,6 @@
 JS::Zone::Zone(JSRuntime *rt)
   : JS::shadow::Zone(rt, &rt->gcMarker),
     allocator(this),
-    hold(false),
     ionUsingBarriers_(false),
     active(false),
     gcScheduled(false),
diff -Nru firefox-29.0~b4+build1/js/src/gc/Zone.h firefox-29.0~b6+build1/js/src/gc/Zone.h
--- firefox-29.0~b4+build1/js/src/gc/Zone.h	2014-04-02 09:04:00.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/gc/Zone.h	2014-04-10 20:46:19.000000000 +0000
@@ -104,8 +104,6 @@
 
     js::CompartmentVector        compartments;
 
-    bool                         hold;
-
   private:
     bool                         ionUsingBarriers_;
 
diff -Nru firefox-29.0~b4+build1/js/src/jit/AsmJS.cpp firefox-29.0~b6+build1/js/src/jit/AsmJS.cpp
--- firefox-29.0~b4+build1/js/src/jit/AsmJS.cpp	2014-04-02 09:04:01.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit/AsmJS.cpp	2014-04-10 20:46:09.000000000 +0000
@@ -4031,17 +4031,17 @@
       case AsmJSMathBuiltin_abs:    return CheckMathAbs(f, callNode, retType, def, type);
       case AsmJSMathBuiltin_sqrt:   return CheckMathSqrt(f, callNode, retType, def, type);
       case AsmJSMathBuiltin_fround: return CheckMathFRound(f, callNode, retType, def, type);
-      case AsmJSMathBuiltin_sin:    arity = 1; doubleCallee = AsmJSImm_SinD; floatCallee = AsmJSImm_SinF;      break;
-      case AsmJSMathBuiltin_cos:    arity = 1; doubleCallee = AsmJSImm_CosD; floatCallee = AsmJSImm_CosF;      break;
-      case AsmJSMathBuiltin_tan:    arity = 1; doubleCallee = AsmJSImm_TanD; floatCallee = AsmJSImm_TanF;      break;
-      case AsmJSMathBuiltin_asin:   arity = 1; doubleCallee = AsmJSImm_ASinD; floatCallee = AsmJSImm_ASinF;    break;
-      case AsmJSMathBuiltin_acos:   arity = 1; doubleCallee = AsmJSImm_ACosD; floatCallee = AsmJSImm_ACosF;    break;
-      case AsmJSMathBuiltin_atan:   arity = 1; doubleCallee = AsmJSImm_ATanD; floatCallee = AsmJSImm_ATanF;    break;
+      case AsmJSMathBuiltin_sin:    arity = 1; doubleCallee = AsmJSImm_SinD;   floatCallee = AsmJSImm_Invalid; break;
+      case AsmJSMathBuiltin_cos:    arity = 1; doubleCallee = AsmJSImm_CosD;   floatCallee = AsmJSImm_Invalid; break;
+      case AsmJSMathBuiltin_tan:    arity = 1; doubleCallee = AsmJSImm_TanD;   floatCallee = AsmJSImm_Invalid; break;
+      case AsmJSMathBuiltin_asin:   arity = 1; doubleCallee = AsmJSImm_ASinD;  floatCallee = AsmJSImm_Invalid; break;
+      case AsmJSMathBuiltin_acos:   arity = 1; doubleCallee = AsmJSImm_ACosD;  floatCallee = AsmJSImm_Invalid; break;
+      case AsmJSMathBuiltin_atan:   arity = 1; doubleCallee = AsmJSImm_ATanD;  floatCallee = AsmJSImm_Invalid; break;
       case AsmJSMathBuiltin_ceil:   arity = 1; doubleCallee = AsmJSImm_CeilD; floatCallee = AsmJSImm_CeilF;    break;
       case AsmJSMathBuiltin_floor:  arity = 1; doubleCallee = AsmJSImm_FloorD; floatCallee = AsmJSImm_FloorF;  break;
-      case AsmJSMathBuiltin_exp:    arity = 1; doubleCallee = AsmJSImm_ExpD; floatCallee = AsmJSImm_ExpF;      break;
-      case AsmJSMathBuiltin_log:    arity = 1; doubleCallee = AsmJSImm_LogD; floatCallee = AsmJSImm_LogF;      break;
-      case AsmJSMathBuiltin_pow:    arity = 2; doubleCallee = AsmJSImm_PowD; floatCallee = AsmJSImm_Invalid;   break;
+      case AsmJSMathBuiltin_exp:    arity = 1; doubleCallee = AsmJSImm_ExpD;   floatCallee = AsmJSImm_Invalid; break;
+      case AsmJSMathBuiltin_log:    arity = 1; doubleCallee = AsmJSImm_LogD;   floatCallee = AsmJSImm_Invalid; break;
+      case AsmJSMathBuiltin_pow:    arity = 2; doubleCallee = AsmJSImm_PowD;   floatCallee = AsmJSImm_Invalid; break;
       case AsmJSMathBuiltin_atan2:  arity = 2; doubleCallee = AsmJSImm_ATan2D; floatCallee = AsmJSImm_Invalid; break;
       default: MOZ_ASSUME_UNREACHABLE("unexpected mathBuiltin");
     }
diff -Nru firefox-29.0~b4+build1/js/src/jit/AsmJSModule.cpp firefox-29.0~b6+build1/js/src/jit/AsmJSModule.cpp
--- firefox-29.0~b4+build1/js/src/jit/AsmJSModule.cpp	2014-04-02 09:04:01.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit/AsmJSModule.cpp	2014-04-10 20:46:09.000000000 +0000
@@ -246,28 +246,16 @@
         return RedirectCall(FuncCast(NumberMod), Args_Double_DoubleDouble);
       case AsmJSImm_SinD:
         return RedirectCall(FuncCast(sin), Args_Double_Double);
-      case AsmJSImm_SinF:
-        return RedirectCall(FuncCast(sinf), Args_Float32_Float32);
       case AsmJSImm_CosD:
         return RedirectCall(FuncCast(cos), Args_Double_Double);
-      case AsmJSImm_CosF:
-        return RedirectCall(FuncCast(cosf), Args_Float32_Float32);
       case AsmJSImm_TanD:
         return RedirectCall(FuncCast(tan), Args_Double_Double);
-      case AsmJSImm_TanF:
-        return RedirectCall(FuncCast(tanf), Args_Float32_Float32);
       case AsmJSImm_ASinD:
         return RedirectCall(FuncCast(asin), Args_Double_Double);
-      case AsmJSImm_ASinF:
-        return RedirectCall(FuncCast(asinf), Args_Float32_Float32);
       case AsmJSImm_ACosD:
         return RedirectCall(FuncCast(acos), Args_Double_Double);
-      case AsmJSImm_ACosF:
-        return RedirectCall(FuncCast(acosf), Args_Float32_Float32);
       case AsmJSImm_ATanD:
         return RedirectCall(FuncCast(atan), Args_Double_Double);
-      case AsmJSImm_ATanF:
-        return RedirectCall(FuncCast(atanf), Args_Float32_Float32);
       case AsmJSImm_CeilD:
         return RedirectCall(FuncCast(ceil), Args_Double_Double);
       case AsmJSImm_CeilF:
@@ -278,12 +266,8 @@
         return RedirectCall(FuncCast(floorf), Args_Float32_Float32);
       case AsmJSImm_ExpD:
         return RedirectCall(FuncCast(exp), Args_Double_Double);
-      case AsmJSImm_ExpF:
-        return RedirectCall(FuncCast(expf), Args_Float32_Float32);
       case AsmJSImm_LogD:
         return RedirectCall(FuncCast(log), Args_Double_Double);
-      case AsmJSImm_LogF:
-        return RedirectCall(FuncCast(logf), Args_Float32_Float32);
       case AsmJSImm_PowD:
         return RedirectCall(FuncCast(ecmaPow), Args_Double_DoubleDouble);
       case AsmJSImm_ATan2D:
diff -Nru firefox-29.0~b4+build1/js/src/jit/CodeGenerator.cpp firefox-29.0~b6+build1/js/src/jit/CodeGenerator.cpp
--- firefox-29.0~b4+build1/js/src/jit/CodeGenerator.cpp	2014-04-02 09:04:01.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit/CodeGenerator.cpp	2014-04-10 20:46:09.000000000 +0000
@@ -4321,14 +4321,6 @@
 
     void *funptr = nullptr;
     switch (ins->mir()->function()) {
-      case MMathFunction::Log:   funptr = JS_FUNC_TO_DATA_PTR(void *, logf);   break;
-      case MMathFunction::Sin:   funptr = JS_FUNC_TO_DATA_PTR(void *, sinf);   break;
-      case MMathFunction::Cos:   funptr = JS_FUNC_TO_DATA_PTR(void *, cosf);   break;
-      case MMathFunction::Exp:   funptr = JS_FUNC_TO_DATA_PTR(void *, expf);   break;
-      case MMathFunction::Tan:   funptr = JS_FUNC_TO_DATA_PTR(void *, tanf);   break;
-      case MMathFunction::ATan:  funptr = JS_FUNC_TO_DATA_PTR(void *, atanf);  break;
-      case MMathFunction::ASin:  funptr = JS_FUNC_TO_DATA_PTR(void *, asinf);  break;
-      case MMathFunction::ACos:  funptr = JS_FUNC_TO_DATA_PTR(void *, acosf);  break;
       case MMathFunction::Floor: funptr = JS_FUNC_TO_DATA_PTR(void *, floorf); break;
       case MMathFunction::Ceil:  funptr = JS_FUNC_TO_DATA_PTR(void *, ceilf);  break;
       default:
diff -Nru firefox-29.0~b4+build1/js/src/jit/MCallOptimize.cpp firefox-29.0~b6+build1/js/src/jit/MCallOptimize.cpp
--- firefox-29.0~b4+build1/js/src/jit/MCallOptimize.cpp	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit/MCallOptimize.cpp	2014-04-10 20:46:09.000000000 +0000
@@ -248,6 +248,12 @@
         if (initLength >= JSObject::NELEMENTS_LIMIT)
             return InliningStatus_NotInlined;
 
+        // Make sure initLength matches the template object's length. This is
+        // not guaranteed to be the case, for instance if we're inlining the
+        // MConstant may come from an outer script.
+        if (initLength != templateObject->as().length())
+            return InliningStatus_NotInlined;
+
         if (initLength <= ArrayObject::EagerAllocationMaxLength)
             allocating = MNewArray::NewArray_Allocating;
     }
diff -Nru firefox-29.0~b4+build1/js/src/jit/MIR.h firefox-29.0~b6+build1/js/src/jit/MIR.h
--- firefox-29.0~b4+build1/js/src/jit/MIR.h	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit/MIR.h	2014-04-10 20:46:09.000000000 +0000
@@ -2628,6 +2628,9 @@
     AliasSet getAliasSet() const {
         return AliasSet::None();
     }
+    bool congruentTo(MDefinition *ins) const {
+        return false;
+    }
     TypePolicy *typePolicy() {
         return this;
     }
@@ -3923,10 +3926,7 @@
     static const char *FunctionName(Function function);
 
     bool isFloat32Commutative() const {
-        return function_ == Log || function_ == Sin || function_ == Cos
-               || function_ == Exp || function_ == Tan || function_ == ATan
-               || function_ == ASin || function_ == ACos || function_ == Floor
-               || function_ == Ceil;
+        return function_ == Floor || function_ == Ceil;
     }
     void trySpecializeFloat32(TempAllocator &alloc);
     void computeRange(TempAllocator &alloc);
@@ -4397,6 +4397,9 @@
     bool possiblyCalls() const {
         return true;
     }
+    bool congruentTo(MDefinition *ins) const {
+        return false;
+    }
     virtual AliasSet getAliasSet() const {
         // Although this instruction returns a new array, we don't have to mark
         // it as store instruction, see also MNewArray.
diff -Nru firefox-29.0~b4+build1/js/src/jit/shared/Assembler-shared.h firefox-29.0~b6+build1/js/src/jit/shared/Assembler-shared.h
--- firefox-29.0~b4+build1/js/src/jit/shared/Assembler-shared.h	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit/shared/Assembler-shared.h	2014-04-10 20:46:09.000000000 +0000
@@ -691,25 +691,17 @@
 #endif
     AsmJSImm_ModD,
     AsmJSImm_SinD,
-    AsmJSImm_SinF,
     AsmJSImm_CosD,
-    AsmJSImm_CosF,
     AsmJSImm_TanD,
-    AsmJSImm_TanF,
     AsmJSImm_ASinD,
-    AsmJSImm_ASinF,
     AsmJSImm_ACosD,
-    AsmJSImm_ACosF,
     AsmJSImm_ATanD,
-    AsmJSImm_ATanF,
     AsmJSImm_CeilD,
     AsmJSImm_CeilF,
     AsmJSImm_FloorD,
     AsmJSImm_FloorF,
     AsmJSImm_ExpD,
-    AsmJSImm_ExpF,
     AsmJSImm_LogD,
-    AsmJSImm_LogF,
     AsmJSImm_PowD,
     AsmJSImm_ATan2D,
     AsmJSImm_Invalid
diff -Nru firefox-29.0~b4+build1/js/src/jit/x86/CodeGenerator-x86.cpp firefox-29.0~b6+build1/js/src/jit/x86/CodeGenerator-x86.cpp
--- firefox-29.0~b4+build1/js/src/jit/x86/CodeGenerator-x86.cpp	2014-04-02 09:04:10.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit/x86/CodeGenerator-x86.cpp	2014-04-10 20:46:09.000000000 +0000
@@ -691,13 +691,17 @@
         return;
 
     if (mir->type() == MIRType_Float32) {
-        Operand op(esp, -sizeof(float));
+        masm.reserveStack(sizeof(float));
+        Operand op(esp, 0);
         masm.fstp32(op);
         masm.loadFloat32(op, ReturnFloatReg);
+        masm.freeStack(sizeof(float));
     } else {
-        Operand op(esp, -sizeof(double));
+        masm.reserveStack(sizeof(double));
+        Operand op(esp, 0);
         masm.fstp(op);
         masm.loadDouble(op, ReturnFloatReg);
+        masm.freeStack(sizeof(double));
     }
 }
 
diff -Nru firefox-29.0~b4+build1/js/src/jit/x86/MacroAssembler-x86.h firefox-29.0~b6+build1/js/src/jit/x86/MacroAssembler-x86.h
--- firefox-29.0~b4+build1/js/src/jit/x86/MacroAssembler-x86.h	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit/x86/MacroAssembler-x86.h	2014-04-10 20:46:09.000000000 +0000
@@ -982,15 +982,8 @@
 
     // Note: this function clobbers the source register.
     void convertUInt32ToFloat32(const Register &src, const FloatRegister &dest) {
-        // src is [0, 2^32-1]
-        subl(Imm32(0x80000000), src);
-
-        // Do it the GCC way
-        convertInt32ToFloat32(src, dest);
-
-        // dest is now a double with the int range.
-        // correct the double value by adding 0x80000000.
-        addConstantFloat32(2147483648.f, dest);
+        convertUInt32ToDouble(src, dest);
+        convertDoubleToFloat32(dest, dest);
     }
 
     void inc64(AbsoluteAddress dest) {
diff -Nru firefox-29.0~b4+build1/js/src/jit-test/tests/asm.js/testBug989166.js firefox-29.0~b6+build1/js/src/jit-test/tests/asm.js/testBug989166.js
--- firefox-29.0~b4+build1/js/src/jit-test/tests/asm.js/testBug989166.js	1970-01-01 00:00:00.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit-test/tests/asm.js/testBug989166.js	2014-04-10 20:46:08.000000000 +0000
@@ -0,0 +1,8 @@
+(function(stdlib) {
+    "use asm";
+    var pow = stdlib.Math.pow
+    function f() {
+        return +pow(.0, .0)
+    }
+    return f
+})(this, {}, ArrayBuffer)()
diff -Nru firefox-29.0~b4+build1/js/src/jit-test/tests/asm.js/testFloat32.js firefox-29.0~b6+build1/js/src/jit-test/tests/asm.js/testFloat32.js
--- firefox-29.0~b4+build1/js/src/jit-test/tests/asm.js/testFloat32.js	2014-04-02 09:04:00.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit-test/tests/asm.js/testFloat32.js	2014-04-10 20:46:08.000000000 +0000
@@ -86,6 +86,9 @@
 
 UINT32_MAX = Math.pow(2, 32)-1;
 assertEq(asmLink(asmCompile('glob', USE_ASM + TO_FLOAT32 + "function f(x) { x = x|0; return toF(x >>> 0); } return f"), this)(-1), Math.fround(UINT32_MAX));
+var tof = asmLink(asmCompile('glob', USE_ASM + TO_FLOAT32 + "function f(x) { x = x|0; return toF(x>>>0) } return f"), this);
+for (x of [0, 1, 10, 64, 1025, 65000, Math.pow(2,30), Math.pow(2,31), Math.pow(2,32)-2, Math.pow(2,32)-1])
+    assertEq(tof(x), Math.fround(x));
 
 // Global variables imports
 assertAsmTypeFail('glob', USE_ASM + "var x = toF(); function f() {} return f");
@@ -132,22 +135,29 @@
 
 // float?s
 assertEq(asmLink(asmCompile('glob', 'ffi', 'heap', USE_ASM + HEAP32 + TO_FLOAT32 + "var sqrt = glob.Math.sqrt; function f(x) { x = toF(x); f32[0] = x; return toF(sqrt(f32[0])) } return f"), this, null, heap)(64), Math.fround(8));
-assertEq(asmLink(asmCompile('glob', 'ffi', 'heap', USE_ASM + HEAP32 + TO_FLOAT32 + "var cos = glob.Math.cos; function f(x) { x = toF(x); f32[0] = x; return toF(cos(f32[0])) } return f"), this, null, heap)(3.141592653), -1);
 
-// All Math functions with arity 1 behave like cos and sin
-var cosModule = asmLink(asmCompile('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.cos; function f(x) {x = toF(x); return toF(g(x))} return f"), this);
-for (v of [0, 3.141592653, Math.Infinity, NaN])
-    assertEq(cosModule(v), Math.fround(Math.cos(Math.fround(v))));
-
-var sinModule = asmLink(asmCompile('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.sin; function f(x) {x = toF(x); return toF(g(x))} return f"), this);
-for (v of [0, 3.141592653, Math.Infinity, NaN])
-    assertEq(sinModule(v), Math.fround(Math.sin(Math.fround(v))));
+// The only other Math functions that can receive float32 as arguments and that strictly commute are floor and ceil (see
+// also bug 969203).
+var floorModule = asmLink(asmCompile('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.floor; function f(x) {x = toF(x); return toF(g(x))} return f"), this);
+for (v of [-10.5, -1.2345, -1, 0, 1, 3.141592653, 13.37, Math.Infinity, NaN])
+    assertEq(floorModule(v), Math.fround(Math.floor(Math.fround(v))));
+assertEq(asmLink(asmCompile('glob', 'ffi', 'heap', USE_ASM + HEAP32 + TO_FLOAT32 + "var floor = glob.Math.floor; function f(x) { x = toF(x); f32[0] = x; return toF(floor(f32[0])) } return f"), this, null, heap)(13.37), 13);
+
+var ceilModule = asmLink(asmCompile('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.ceil; function f(x) {x = toF(x); return toF(g(x))} return f"), this);
+for (v of [-10.5, -1.2345, -1, 0, 1, 3.141592653, 13.37, Math.Infinity, NaN])
+    assertEq(ceilModule(v), Math.fround(Math.ceil(Math.fround(v))));
+assertEq(asmLink(asmCompile('glob', 'ffi', 'heap', USE_ASM + HEAP32 + TO_FLOAT32 + "var ceil = glob.Math.ceil; function f(x) { x = toF(x); f32[0] = x; return toF(ceil(f32[0])) } return f"), this, null, heap)(13.37), 14);
+
+assertAsmTypeFail('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.cos; function f(x) {x = toF(x); return toF(g(x))} return f");
+assertAsmTypeFail('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.cos; function f(x) {x = +x; return toF(g(+x))} return f");
 
 assertAsmTypeFail('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.cos; function f(x) {x = toF(x); return +(g(x))} return f");
 assertAsmTypeFail('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.cos; function f(x) {x = +x; return toF(g(x))} return f");
 assertAsmTypeFail('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.cos; function f(x) {x = x|0; return toF(g(x))} return f");
 assertAsmTypeFail('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.cos; function f(x) {x = toF(x); return g(x) | 0} return f");
 
+assertEq(asmLink(asmCompile('glob', 'ffi', 'heap', USE_ASM + HEAP32 + TO_FLOAT32 + "var g = glob.Math.cos; function f(x) { x = toF(x); return toF(+g(+x)) } return f"), this, null, heap)(3.14159265358), -1);
+
 // Math functions with arity of two are not specialized for floats, so we shouldn't feed them with floats arguments or
 // return type
 assertAsmTypeFail('glob', USE_ASM + TO_FLOAT32 + "var g = glob.Math.pow; function f(x) {x = toF(x); return toF(g(x, 2.))} return f");
diff -Nru firefox-29.0~b4+build1/js/src/jit-test/tests/gc/bug-986864.js firefox-29.0~b6+build1/js/src/jit-test/tests/gc/bug-986864.js
--- firefox-29.0~b4+build1/js/src/jit-test/tests/gc/bug-986864.js	1970-01-01 00:00:00.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit-test/tests/gc/bug-986864.js	2014-04-10 20:46:09.000000000 +0000
@@ -0,0 +1,8 @@
+// |jit-test| slow
+function x() {}
+for (var j = 0; j < 9999; ++j) {
+    (function() {
+        x += x.watch("endsWith", ArrayBuffer);
+        return 0 >> Function(x)
+    })()
+}
diff -Nru firefox-29.0~b4+build1/js/src/jit-test/tests/ion/bug969203.js firefox-29.0~b6+build1/js/src/jit-test/tests/ion/bug969203.js
--- firefox-29.0~b4+build1/js/src/jit-test/tests/ion/bug969203.js	1970-01-01 00:00:00.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit-test/tests/ion/bug969203.js	2014-04-10 20:46:09.000000000 +0000
@@ -0,0 +1,4 @@
+var f = function (x) {
+    return Math.tan(Math.fround(Math.log(Math.fround(Math.exp(x)))));
+}
+assertEq(f(1), f(1));
diff -Nru firefox-29.0~b4+build1/js/src/jit-test/tests/ion/bug989586.js firefox-29.0~b6+build1/js/src/jit-test/tests/ion/bug989586.js
--- firefox-29.0~b4+build1/js/src/jit-test/tests/ion/bug989586.js	1970-01-01 00:00:00.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit-test/tests/ion/bug989586.js	2014-04-10 20:46:09.000000000 +0000
@@ -0,0 +1,15 @@
+function t() {
+    var iter = 0;
+    function a(w) {
+	var a = new Array(w);
+	assertEq(a.length, w);
+    }
+    function r() {
+	a(3);
+	a(4);
+    }
+    for (var i=0; i<100; i++) {
+	r();
+    }
+}
+t();
diff -Nru firefox-29.0~b4+build1/js/src/jit-test/tests/ion/testFloat32.js firefox-29.0~b6+build1/js/src/jit-test/tests/ion/testFloat32.js
--- firefox-29.0~b4+build1/js/src/jit-test/tests/ion/testFloat32.js	2014-04-02 09:04:01.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit-test/tests/ion/testFloat32.js	2014-04-10 20:46:09.000000000 +0000
@@ -164,32 +164,32 @@
 }
 test(refuseAbs);
 
-function acceptTrigo() {
+function refuseTrigo() {
     var res = Math.cos(f32[0]);
     f32[0] = res;
-    assertFloat32(res, true);
+    assertFloat32(res, false);
 
     var res = Math.sin(f32[0]);
     f32[0] = res;
-    assertFloat32(res, true);
+    assertFloat32(res, false);
 
     var res = Math.tan(f32[0]);
     f32[0] = res;
-    assertFloat32(res, true);
+    assertFloat32(res, false);
 
     var res = Math.acos(f32[0]);
     f32[0] = res;
-    assertFloat32(res, true);
+    assertFloat32(res, false);
 
     var res = Math.asin(f32[0]);
     f32[0] = res;
-    assertFloat32(res, true);
+    assertFloat32(res, false);
 
     res = Math.atan(f32[0]);
     f32[0] = res;
-    assertFloat32(res, true);
+    assertFloat32(res, false);
 }
-test(acceptTrigo);
+test(refuseTrigo);
 
 function refuseMath() {
     var res = Math.log10(f32[0]);
@@ -298,7 +298,7 @@
         assertFloat32(x, true);
     } else {
         if (n < -10) {
-            x = Math.fround(Math.cos(y));
+            x = Math.fround(Math.sqrt(y));
             assertFloat32(x, true);
         } else {
             x = x - 1;
@@ -323,7 +323,7 @@
         assertFloat32(x, false);
     } else {
         if (n < -10) {
-            x = Math.fround(Math.cos(y)); // new producer
+            x = Math.fround(Math.sqrt(y)); // new producer
             assertFloat32(x, true);
         } else {
             x = x - 1; // non consumer because of (1)
diff -Nru firefox-29.0~b4+build1/js/src/jit-test/tests/ion/testFloat32-trigo.js firefox-29.0~b6+build1/js/src/jit-test/tests/ion/testFloat32-trigo.js
--- firefox-29.0~b4+build1/js/src/jit-test/tests/ion/testFloat32-trigo.js	2014-04-02 09:04:01.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jit-test/tests/ion/testFloat32-trigo.js	1970-01-01 00:00:00.000000000 +0000
@@ -1,346 +0,0 @@
-// These tests have been separated, for several reasons:
-// - If we try to run them in a loop (i.e. running through all values in the array),
-// it doesn't get Ion compiled because of the size of the overall function.
-// - If we try to make, for each Math function, a closure that tests all values, the
-// order of running functions has an influence on whether the tests pass or fail (due
-// to bailouts).
-//
-// These tests have been generated by a Python script.
-//
-setJitCompilerOption("ion.usecount.trigger", 50);
-
-// MMath
-function repeat(f) {
-    for (var i = 200; i; i--) {
-        f();
-    }
-}
-
-function assertNear(a, b) {
-    var r = (a != a && b != b) || Math.abs(a-b) < 1e-7 || a === b;
-    if (!r) {
-        print('Precision error: ');
-        print(new Error().stack);
-        print('Got', a, ', expected near', b);
-        assertEq(false, true);
-    }
-}
-
-var trigoInputs = [0, Math.PI / 3, Math.PI, Math.PI * 3 / 4, 1, 1/3, -.5, NaN];
-var f32 = new Float32Array(8);
-for(var i = 0; i < trigoInputs.length; i++) {
-    f32[i] = trigoInputs[i];
-}
-
-function testcos () {
-        var r32, r64;
-
-        r32 = Math.fround(Math.cos(f32[0]));
-        assertFloat32(r32, true);
-        r64 = Math.cos(f32[0]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.cos(f32[1]));
-        assertFloat32(r32, true);
-        r64 = Math.cos(f32[1]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.cos(f32[2]));
-        assertFloat32(r32, true);
-        r64 = Math.cos(f32[2]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.cos(f32[3]));
-        assertFloat32(r32, true);
-        r64 = Math.cos(f32[3]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.cos(f32[4]));
-        assertFloat32(r32, true);
-        r64 = Math.cos(f32[4]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.cos(f32[5]));
-        assertFloat32(r32, true);
-        r64 = Math.cos(f32[5]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.cos(f32[6]));
-        assertFloat32(r32, true);
-        r64 = Math.cos(f32[6]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.cos(f32[7]));
-        assertFloat32(r32, true);
-        r64 = Math.cos(f32[7]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-}
-repeat(testcos);
-function testacos () {
-        var r32, r64;
-
-        r32 = Math.fround(Math.acos(f32[0]));
-        assertFloat32(r32, true);
-        r64 = Math.acos(f32[0]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.acos(f32[1]));
-        assertFloat32(r32, true);
-        r64 = Math.acos(f32[1]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.acos(f32[2]));
-        assertFloat32(r32, true);
-        r64 = Math.acos(f32[2]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.acos(f32[3]));
-        assertFloat32(r32, true);
-        r64 = Math.acos(f32[3]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.acos(f32[4]));
-        assertFloat32(r32, true);
-        r64 = Math.acos(f32[4]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.acos(f32[5]));
-        assertFloat32(r32, true);
-        r64 = Math.acos(f32[5]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.acos(f32[6]));
-        assertFloat32(r32, true);
-        r64 = Math.acos(f32[6]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.acos(f32[7]));
-        assertFloat32(r32, true);
-        r64 = Math.acos(f32[7]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-}
-repeat(testacos);
-function testsin () {
-        var r32, r64;
-
-        r32 = Math.fround(Math.sin(f32[0]));
-        assertFloat32(r32, true);
-        r64 = Math.sin(f32[0]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.sin(f32[1]));
-        assertFloat32(r32, true);
-        r64 = Math.sin(f32[1]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.sin(f32[2]));
-        assertFloat32(r32, true);
-        r64 = Math.sin(f32[2]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.sin(f32[3]));
-        assertFloat32(r32, true);
-        r64 = Math.sin(f32[3]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.sin(f32[4]));
-        assertFloat32(r32, true);
-        r64 = Math.sin(f32[4]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.sin(f32[5]));
-        assertFloat32(r32, true);
-        r64 = Math.sin(f32[5]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.sin(f32[6]));
-        assertFloat32(r32, true);
-        r64 = Math.sin(f32[6]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.sin(f32[7]));
-        assertFloat32(r32, true);
-        r64 = Math.sin(f32[7]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-}
-repeat(testsin);
-function testasin () {
-        var r32, r64;
-
-        r32 = Math.fround(Math.asin(f32[0]));
-        assertFloat32(r32, true);
-        r64 = Math.asin(f32[0]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.asin(f32[1]));
-        assertFloat32(r32, true);
-        r64 = Math.asin(f32[1]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.asin(f32[2]));
-        assertFloat32(r32, true);
-        r64 = Math.asin(f32[2]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.asin(f32[3]));
-        assertFloat32(r32, true);
-        r64 = Math.asin(f32[3]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.asin(f32[4]));
-        assertFloat32(r32, true);
-        r64 = Math.asin(f32[4]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.asin(f32[5]));
-        assertFloat32(r32, true);
-        r64 = Math.asin(f32[5]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.asin(f32[6]));
-        assertFloat32(r32, true);
-        r64 = Math.asin(f32[6]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.asin(f32[7]));
-        assertFloat32(r32, true);
-        r64 = Math.asin(f32[7]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-}
-repeat(testasin);
-function testtan () {
-        var r32, r64;
-
-        r32 = Math.fround(Math.tan(f32[0]));
-        assertFloat32(r32, true);
-        r64 = Math.tan(f32[0]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.tan(f32[1]));
-        assertFloat32(r32, true);
-        r64 = Math.tan(f32[1]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.tan(f32[2]));
-        assertFloat32(r32, true);
-        r64 = Math.tan(f32[2]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.tan(f32[3]));
-        assertFloat32(r32, true);
-        r64 = Math.tan(f32[3]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.tan(f32[4]));
-        assertFloat32(r32, true);
-        r64 = Math.tan(f32[4]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.tan(f32[5]));
-        assertFloat32(r32, true);
-        r64 = Math.tan(f32[5]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.tan(f32[6]));
-        assertFloat32(r32, true);
-        r64 = Math.tan(f32[6]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.tan(f32[7]));
-        assertFloat32(r32, true);
-        r64 = Math.tan(f32[7]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-}
-repeat(testtan);
-function testatan () {
-        var r32, r64;
-
-        r32 = Math.fround(Math.atan(f32[0]));
-        assertFloat32(r32, true);
-        r64 = Math.atan(f32[0]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.atan(f32[1]));
-        assertFloat32(r32, true);
-        r64 = Math.atan(f32[1]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.atan(f32[2]));
-        assertFloat32(r32, true);
-        r64 = Math.atan(f32[2]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.atan(f32[3]));
-        assertFloat32(r32, true);
-        r64 = Math.atan(f32[3]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.atan(f32[4]));
-        assertFloat32(r32, true);
-        r64 = Math.atan(f32[4]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.atan(f32[5]));
-        assertFloat32(r32, true);
-        r64 = Math.atan(f32[5]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.atan(f32[6]));
-        assertFloat32(r32, true);
-        r64 = Math.atan(f32[6]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-
-        r32 = Math.fround(Math.atan(f32[7]));
-        assertFloat32(r32, true);
-        r64 = Math.atan(f32[7]);
-        assertFloat32(r64, false);
-        assertNear(r32, r64);
-}
-repeat(testatan);
diff -Nru firefox-29.0~b4+build1/js/src/jsapi.cpp firefox-29.0~b6+build1/js/src/jsapi.cpp
--- firefox-29.0~b4+build1/js/src/jsapi.cpp	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jsapi.cpp	2014-04-10 20:46:09.000000000 +0000
@@ -2414,23 +2414,32 @@
 
 namespace {
 
-class AutoHoldZone
+class AutoCompartmentRooter : private JS::CustomAutoRooter
 {
   public:
-    explicit AutoHoldZone(Zone *zone
-                          MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
-      : holdp(&zone->hold)
+    explicit AutoCompartmentRooter(JSContext *cx, JSCompartment *comp
+                                   MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
+      : CustomAutoRooter(cx), compartment(comp)
     {
         MOZ_GUARD_OBJECT_NOTIFIER_INIT;
-        *holdp = true;
     }
 
-    ~AutoHoldZone() {
-        *holdp = false;
+    operator JSCompartment *() {
+        return compartment;
+    }
+
+    JSCompartment *operator->() {
+        return compartment;
+    }
+
+  protected:
+    virtual void trace(JSTracer *trc)
+    {
+        compartment->mark();
     }
 
   private:
-    bool *holdp;
+    JSCompartment *compartment;
     MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
 };
 
@@ -2518,7 +2527,7 @@
     else
         zone = static_cast(options.zonePointer());
 
-    JSCompartment *compartment = NewCompartment(cx, zone, principals, options);
+    AutoCompartmentRooter compartment(cx, NewCompartment(cx, zone, principals, options));
     if (!compartment)
         return nullptr;
 
@@ -2528,8 +2537,6 @@
         rt->systemZone->isSystem = true;
     }
 
-    AutoHoldZone hold(compartment->zone());
-
     Rooted global(cx);
     {
         AutoCompartment ac(cx, compartment);
diff -Nru firefox-29.0~b4+build1/js/src/jscompartment.cpp firefox-29.0~b6+build1/js/src/jscompartment.cpp
--- firefox-29.0~b4+build1/js/src/jscompartment.cpp	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jscompartment.cpp	2014-04-10 20:46:09.000000000 +0000
@@ -540,7 +540,7 @@
 }
 
 void
-JSCompartment::mark(JSTracer *trc)
+JSCompartment::markRoots(JSTracer *trc)
 {
     JS_ASSERT(!trc->runtime->isHeapMinorCollecting());
 
diff -Nru firefox-29.0~b4+build1/js/src/jscompartment.h firefox-29.0~b6+build1/js/src/jscompartment.h
--- firefox-29.0~b4+build1/js/src/jscompartment.h	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jscompartment.h	2014-04-10 20:46:09.000000000 +0000
@@ -326,7 +326,7 @@
         WrapperEnum(JSCompartment *c) : js::WrapperMap::Enum(c->crossCompartmentWrappers) {}
     };
 
-    void mark(JSTracer *trc);
+    void markRoots(JSTracer *trc);
     bool isDiscardingJitCode(JSTracer *trc);
     void sweep(js::FreeOp *fop, bool releaseTypes);
     void sweepCrossCompartmentWrappers();
diff -Nru firefox-29.0~b4+build1/js/src/jsfun.cpp firefox-29.0~b6+build1/js/src/jsfun.cpp
--- firefox-29.0~b4+build1/js/src/jsfun.cpp	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jsfun.cpp	2014-04-10 20:46:19.000000000 +0000
@@ -1208,8 +1208,8 @@
         JS_ASSERT(lazy->source()->hasSourceData());
 
         // Parse and compile the script from source.
-        SourceDataCache::AutoSuppressPurge asp(cx);
-        const jschar *chars = lazy->source()->chars(cx, asp);
+        SourceDataCache::AutoHoldEntry holder;
+        const jschar *chars = lazy->source()->chars(cx, holder);
         if (!chars)
             return false;
 
diff -Nru firefox-29.0~b4+build1/js/src/jsgc.cpp firefox-29.0~b6+build1/js/src/jsgc.cpp
--- firefox-29.0~b4+build1/js/src/jsgc.cpp	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jsgc.cpp	2014-04-10 20:46:19.000000000 +0000
@@ -2811,7 +2811,7 @@
     while (read < end) {
         Zone *zone = *read++;
 
-        if (!zone->hold && zone->wasGCStarted()) {
+        if (zone->wasGCStarted()) {
             if (zone->allocator.arenas.arenaListsAreEmpty() || lastGC) {
                 zone->allocator.arenas.checkEmptyFreeLists();
                 if (callback)
@@ -2991,7 +2991,7 @@
         }
 
         zone->scheduledForDestruction = false;
-        zone->maybeAlive = zone->hold;
+        zone->maybeAlive = false;
         zone->setPreservingCode(false);
     }
 
diff -Nru firefox-29.0~b4+build1/js/src/jsscript.cpp firefox-29.0~b6+build1/js/src/jsscript.cpp
--- firefox-29.0~b4+build1/js/src/jsscript.cpp	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jsscript.cpp	2014-04-10 20:46:09.000000000 +0000
@@ -1152,33 +1152,77 @@
     return scriptSource()->substring(cx, sourceStart(), sourceEnd());
 }
 
-SourceDataCache::AutoSuppressPurge::AutoSuppressPurge(JSContext *cx)
- : cache_(cx->runtime()->sourceDataCache)
+SourceDataCache::AutoHoldEntry::AutoHoldEntry()
+  : cache_(nullptr), source_(nullptr), charsToFree_(nullptr)
 {
-    oldValue_ = cache_.numSuppressPurges_++;
 }
 
-SourceDataCache::AutoSuppressPurge::~AutoSuppressPurge()
+void
+SourceDataCache::AutoHoldEntry::holdEntry(SourceDataCache *cache, ScriptSource *source)
+{
+    // Initialise the holder for a specific cache and script source. This will
+    // hold on to the cached source chars in the event that the cache is purged.
+    JS_ASSERT(!cache_ && !source_ && !charsToFree_);
+    cache_ = cache;
+    source_ = source;
+}
+
+void
+SourceDataCache::AutoHoldEntry::deferDelete(const jschar *chars)
+{
+    // Take ownership of source chars now the cache is being purged. Remove our
+    // reference to the ScriptSource which might soon be destroyed.
+    JS_ASSERT(cache_ && source_ && !charsToFree_);
+    cache_ = nullptr;
+    source_ = nullptr;
+    charsToFree_ = chars;
+}
+
+SourceDataCache::AutoHoldEntry::~AutoHoldEntry()
+{
+    // The holder is going out of scope. If it has taken ownership of cached
+    // chars then delete them, otherwise unregister ourself with the cache.
+    if (charsToFree_) {
+        JS_ASSERT(!cache_ && !source_);
+        js_free(const_cast(charsToFree_));
+    } else if (cache_) {
+        JS_ASSERT(source_);
+        cache_->releaseEntry(*this);
+    }
+}
+
+void
+SourceDataCache::holdEntry(AutoHoldEntry &holder, ScriptSource *ss)
 {
-    cache_.numSuppressPurges_--;
-    JS_ASSERT(cache_.numSuppressPurges_ == oldValue_);
+    JS_ASSERT(!holder_);
+    holder.holdEntry(this, ss);
+    holder_ = &holder;
+}
+
+void
+SourceDataCache::releaseEntry(AutoHoldEntry &holder)
+{
+    JS_ASSERT(holder_ == &holder);
+    holder_ = nullptr;
 }
 
 const jschar *
-SourceDataCache::lookup(ScriptSource *ss, const AutoSuppressPurge &asp)
+SourceDataCache::lookup(ScriptSource *ss, AutoHoldEntry &holder)
 {
-    JS_ASSERT(this == &asp.cache());
+    JS_ASSERT(!holder_);
     if (!map_)
         return nullptr;
-    if (Map::Ptr p = map_->lookup(ss))
+    if (Map::Ptr p = map_->lookup(ss)) {
+        holdEntry(holder, ss);
         return p->value();
+    }
     return nullptr;
 }
 
 bool
-SourceDataCache::put(ScriptSource *ss, const jschar *str, const AutoSuppressPurge &asp)
+SourceDataCache::put(ScriptSource *ss, const jschar *str, AutoHoldEntry &holder)
 {
-    JS_ASSERT(this == &asp.cache());
+    JS_ASSERT(!holder_);
 
     if (!map_) {
         map_ = js_new();
@@ -1192,17 +1236,28 @@
         }
     }
 
-    return map_->put(ss, str);
+    if (!map_->put(ss, str))
+        return false;
+
+    holdEntry(holder, ss);
+    return true;
 }
 
 void
 SourceDataCache::purge()
 {
-    if (!map_ || numSuppressPurges_ > 0)
+    if (!map_)
         return;
 
-    for (Map::Range r = map_->all(); !r.empty(); r.popFront())
-        js_delete(const_cast(r.front().value()));
+    for (Map::Range r = map_->all(); !r.empty(); r.popFront()) {
+        const jschar *chars = r.front().value();
+        if (holder_ && r.front().key() == holder_->source()) {
+            holder_->deferDelete(chars);
+            holder_ = nullptr;
+        } else {
+            js_free(const_cast(chars));
+        }
+    }
 
     js_delete(map_);
     map_ = nullptr;
@@ -1223,7 +1278,7 @@
 }
 
 const jschar *
-ScriptSource::chars(JSContext *cx, const SourceDataCache::AutoSuppressPurge &asp)
+ScriptSource::chars(JSContext *cx, SourceDataCache::AutoHoldEntry &holder)
 {
     if (const jschar *chars = getOffThreadCompressionChars(cx))
         return chars;
@@ -1231,9 +1286,9 @@
 
 #ifdef USE_ZLIB
     if (compressed()) {
-        if (const jschar *decompressed = cx->runtime()->sourceDataCache.lookup(this, asp))
+        if (const jschar *decompressed = cx->runtime()->sourceDataCache.lookup(this, holder))
             return decompressed;
-      
+
         const size_t nbytes = sizeof(jschar) * (length_ + 1);
         jschar *decompressed = static_cast(js_malloc(nbytes));
         if (!decompressed)
@@ -1248,7 +1303,7 @@
 
         decompressed[length_] = 0;
 
-        if (!cx->runtime()->sourceDataCache.put(this, decompressed, asp)) {
+        if (!cx->runtime()->sourceDataCache.put(this, decompressed, holder)) {
             JS_ReportOutOfMemory(cx);
             js_free(decompressed);
             return nullptr;
@@ -1264,8 +1319,8 @@
 ScriptSource::substring(JSContext *cx, uint32_t start, uint32_t stop)
 {
     JS_ASSERT(start <= stop);
-    SourceDataCache::AutoSuppressPurge asp(cx);
-    const jschar *chars = this->chars(cx, asp);
+    SourceDataCache::AutoHoldEntry holder;
+    const jschar *chars = this->chars(cx, holder);
     if (!chars)
         return nullptr;
     JSFlatString *flatStr = js_NewStringCopyN(cx, chars + start, stop - start);
@@ -3362,13 +3417,13 @@
         return false;
     }
 
-    SourceDataCache::AutoSuppressPurge asp(cx);
+    SourceDataCache::AutoHoldEntry holder;
 
-    const jschar *scriptChars = script->scriptSource()->chars(cx, asp);
+    const jschar *scriptChars = script->scriptSource()->chars(cx, holder);
     if (!scriptChars)
         return false;
 
-    const jschar *lazyChars = lazy->source()->chars(cx, asp);
+    const jschar *lazyChars = lazy->source()->chars(cx, holder);
     if (!lazyChars)
         return false;
 
diff -Nru firefox-29.0~b4+build1/js/src/jsscript.h firefox-29.0~b6+build1/js/src/jsscript.h
--- firefox-29.0~b4+build1/js/src/jsscript.h	2014-04-02 09:04:02.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/jsscript.h	2014-04-10 20:46:19.000000000 +0000
@@ -331,28 +331,41 @@
                     const jschar *,
                     DefaultHasher,
                     SystemAllocPolicy> Map;
-    Map *map_;
-    size_t numSuppressPurges_;
 
   public:
-    SourceDataCache() : map_(nullptr), numSuppressPurges_(0) {}
-
-    class AutoSuppressPurge
+    // Hold an entry in the source data cache and prevent it from being purged on GC.
+    class AutoHoldEntry
     {
-        SourceDataCache &cache_;
-        mozilla::DebugOnly oldValue_;
+        SourceDataCache *cache_;
+        ScriptSource *source_;
+        const jschar *charsToFree_;
       public:
-        explicit AutoSuppressPurge(JSContext *cx);
-        ~AutoSuppressPurge();
-        SourceDataCache &cache() const { return cache_; }
+        explicit AutoHoldEntry();
+        ~AutoHoldEntry();
+      private:
+        void holdEntry(SourceDataCache *cache, ScriptSource *source);
+        void deferDelete(const jschar *chars);
+        ScriptSource *source() const { return source_; }
+        friend class SourceDataCache;
     };
 
-    const jschar *lookup(ScriptSource *ss, const AutoSuppressPurge &asp);
-    bool put(ScriptSource *ss, const jschar *chars, const AutoSuppressPurge &asp);
+  private:
+    Map *map_;
+    AutoHoldEntry *holder_;
+
+  public:
+    SourceDataCache() : map_(nullptr), holder_(nullptr) {}
+
+    const jschar *lookup(ScriptSource *ss, AutoHoldEntry &asp);
+    bool put(ScriptSource *ss, const jschar *chars, AutoHoldEntry &asp);
 
     void purge();
 
     size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf);
+
+  private:
+    void holdEntry(AutoHoldEntry &holder, ScriptSource *ss);
+    void releaseEntry(AutoHoldEntry &holder);
 };
 
 class ScriptSource
@@ -427,7 +440,7 @@
         JS_ASSERT(hasSourceData());
         return argumentsNotIncluded_;
     }
-    const jschar *chars(JSContext *cx, const SourceDataCache::AutoSuppressPurge &asp);
+    const jschar *chars(JSContext *cx, SourceDataCache::AutoHoldEntry &asp);
     JSStableString *substring(JSContext *cx, uint32_t start, uint32_t stop);
     size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf);
 
diff -Nru firefox-29.0~b4+build1/js/src/yarr/YarrPattern.cpp firefox-29.0~b6+build1/js/src/yarr/YarrPattern.cpp
--- firefox-29.0~b4+build1/js/src/yarr/YarrPattern.cpp	2014-04-02 09:04:10.000000000 +0000
+++ firefox-29.0~b6+build1/js/src/yarr/YarrPattern.cpp	2014-04-10 20:46:12.000000000 +0000
@@ -281,6 +281,7 @@
 public:
     YarrPatternConstructor(YarrPattern& pattern)
         : m_pattern(pattern)
+        , m_stackBase(nullptr)
         , m_characterClassConstructor(pattern.m_ignoreCase)
         , m_invertParentheticalAssertion(false)
     {
@@ -573,6 +574,14 @@
     ErrorCode setupAlternativeOffsets(PatternAlternative* alternative, unsigned currentCallFrameSize, unsigned initialInputPosition,
                                       unsigned *callFrameSizeOut)
     {
+        /*
+         * Attempt detection of over-recursion:
+         * "1MB should be enough stack for anyone."
+         */
+        uint8_t stackDummy_;
+        if (m_stackBase - &stackDummy_ > 1024*1024)
+            return PatternTooLarge;
+
         alternative->m_hasFixedSize = true;
         Checked currentInputPosition = initialInputPosition;
 
@@ -841,8 +850,13 @@
         }
     }
 
+    void setStackBase(uint8_t *stackBase) {
+        m_stackBase = stackBase;
+    }
+
 private:
     YarrPattern& m_pattern;
+    uint8_t * m_stackBase;
     PatternAlternative* m_alternative;
     CharacterClassConstructor m_characterClassConstructor;
     bool m_invertCharacterClass;
@@ -873,6 +887,9 @@
         ASSERT(numSubpatterns == m_numSubpatterns);
     }
 
+    uint8_t stackDummy_;
+    constructor.setStackBase(&stackDummy_);
+
     constructor.checkForTerminalParentheses();
     constructor.optimizeDotStarWrappedExpressions();
     constructor.optimizeBOL();
diff -Nru firefox-29.0~b4+build1/js/xpconnect/loader/mozJSComponentLoader.cpp firefox-29.0~b6+build1/js/xpconnect/loader/mozJSComponentLoader.cpp
--- firefox-29.0~b4+build1/js/xpconnect/loader/mozJSComponentLoader.cpp	2014-04-02 09:03:55.000000000 +0000
+++ firefox-29.0~b6+build1/js/xpconnect/loader/mozJSComponentLoader.cpp	2014-04-10 20:46:03.000000000 +0000
@@ -569,7 +569,9 @@
       MOZ_CRASH();
   }
 
-  mThisObjects.Put(aScript, aThisObject);
+  if (js::GetObjectJSClass(aThisObject) == &kFakeBackstagePassJSClass) {
+    mThisObjects.Put(aScript, aThisObject);
+  }
 }
 
 /* static */ size_t
@@ -1002,10 +1004,13 @@
 
     *aTableScript = tableScript;
 
-    // tableScript stays in the table until shutdown. To avoid it being
-    // collected and another script getting the same address, we root
-    // tableScript lower down in this function.
-    mThisObjects.Put(tableScript, obj);
+    if (js::GetObjectJSClass(obj) == &kFakeBackstagePassJSClass) {
+        MOZ_ASSERT(mReuseLoaderGlobal);
+        // tableScript stays in the table until shutdown. To avoid it being
+        // collected and another script getting the same address, we root
+        // tableScript lower down in this function.
+        mThisObjects.Put(tableScript, obj);
+    }
     bool ok = false;
 
     {
diff -Nru firefox-29.0~b4+build1/js/xpconnect/src/XPCWrappedNative.cpp firefox-29.0~b6+build1/js/xpconnect/src/XPCWrappedNative.cpp
--- firefox-29.0~b4+build1/js/xpconnect/src/XPCWrappedNative.cpp	2014-04-02 09:04:10.000000000 +0000
+++ firefox-29.0~b6+build1/js/xpconnect/src/XPCWrappedNative.cpp	2014-04-10 20:46:04.000000000 +0000
@@ -1081,9 +1081,12 @@
                                          HandleObject aNewParent,
                                          nsISupports* aCOMObj)
 {
+    // Check if we're near the stack limit before we get anywhere near the
+    // transplanting code.
     AutoJSContext cx;
-    XPCNativeInterface* iface = XPCNativeInterface::GetISupports();
+    JS_CHECK_RECURSION(cx, return NS_ERROR_FAILURE);
 
+    XPCNativeInterface* iface = XPCNativeInterface::GetISupports();
     if (!iface)
         return NS_ERROR_FAILURE;
 
diff -Nru firefox-29.0~b4+build1/l10n/be/browser/chrome/browser/customizableui/customizableWidgets.properties firefox-29.0~b6+build1/l10n/be/browser/chrome/browser/customizableui/customizableWidgets.properties
--- firefox-29.0~b4+build1/l10n/be/browser/chrome/browser/customizableui/customizableWidgets.properties	2014-04-02 09:04:41.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/be/browser/chrome/browser/customizableui/customizableWidgets.properties	2014-04-10 20:46:47.000000000 +0000
@@ -41,7 +41,7 @@
 paste-button.tooltiptext2 = Уставіць (%S)
 feed-button.label = Падпісацца
 feed-button.tooltiptext = Падпісацца на гэтую старонку…
-characterencoding-button.label = Кадоўка знакаў
+characterencoding-button.label = ­Кадоўка знакаў
 characterencoding-button.tooltiptext2 = Паказаць наладжванні кадоўкі знакаў
 email-link-button.label = Даслаць спасылку
 email-link-button.tooltiptext2 = Даслаць спасылку…
diff -Nru firefox-29.0~b4+build1/l10n/be/dom/chrome/dom/dom.properties firefox-29.0~b6+build1/l10n/be/dom/chrome/dom/dom.properties
--- firefox-29.0~b4+build1/l10n/be/dom/chrome/dom/dom.properties	2014-04-02 09:04:41.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/be/dom/chrome/dom/dom.properties	2014-04-10 20:46:48.000000000 +0000
@@ -45,6 +45,7 @@
 CreateAttributeWarning = Ужыванне document.createAttribute() асуджана. Карыстайцеся element.setAttribute() замест.
 CreateAttributeNSWarning = Ужыванне document.createAttributeNS() асуджана. Карыстайцеся element.setAttributeNS() замест.
 SpecifiedWarning = Ужыванне атрыбута specified у атрыбутах асуджана. Ён заўсёды вяртае true.
+OwnerElementWarning = Ужыванне атрыбута ownerElement для атрыбутаў асуджана.
 NodeValueWarning = Ужыванне атрыбута nodeValue у атрыбутах асуджана. Карыстайцеся value замест.
 TextContentWarning = Ужыванне атрыбута attributes у атрыбутах асуджана. Карыстайцеся value замест.
 EnablePrivilegeWarning = Ужыванне enablePrivilege асуджана. Ужывайце, калі ласка, код, які выконваецца з сістэмнымі прывілеямі замест. (Напрыклад: пашырэнне).
diff -Nru firefox-29.0~b4+build1/l10n/be/webapprt/webapprt/overrides/dom.properties firefox-29.0~b6+build1/l10n/be/webapprt/webapprt/overrides/dom.properties
--- firefox-29.0~b4+build1/l10n/be/webapprt/webapprt/overrides/dom.properties	2014-04-02 09:04:41.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/be/webapprt/webapprt/overrides/dom.properties	2014-04-10 20:46:48.000000000 +0000
@@ -45,6 +45,7 @@
 CreateAttributeWarning = Ужыванне document.createAttribute() асуджана. Карыстайцеся element.setAttribute() замест.
 CreateAttributeNSWarning = Ужыванне document.createAttributeNS() асуджана. Карыстайцеся element.setAttributeNS() замест.
 SpecifiedWarning = Ужыванне атрыбута specified у атрыбутах асуджана. Ён заўсёды вяртае true.
+OwnerElementWarning = Ужыванне атрыбута ownerElement для атрыбутаў асуджана.
 NodeValueWarning = Ужыванне атрыбута nodeValue у атрыбутах асуджана. Карыстайцеся value замест.
 TextContentWarning = Ужыванне атрыбута textContent у атрыбутах асуджана. Карыстайцеся value замест.
 EnablePrivilegeWarning = Ужыванне enablePrivilege асуджана. Ужывайце, калі ласка, код, які выконваецца з сістэмнымі прывілеямі замест. (Напрыклад: пашырэнне).
diff -Nru firefox-29.0~b4+build1/l10n/changesets firefox-29.0~b6+build1/l10n/changesets
--- firefox-29.0~b4+build1/l10n/changesets	2014-04-02 09:11:21.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/changesets	2014-04-10 20:53:42.000000000 +0000
@@ -1,89 +1,89 @@
-ach 154:f6a6ef84976e
-af 376:799e81198950
-an 76:5b34e4d9186d
-ar 865:b2def773627e
-as 312:2a8cd635fb40
-ast 724:261f889cde9b
-be 962:4334e7687715
-bg 474:9e809234ae57
-bn-BD 455:51f42719f2a0
-bn-IN 394:07e9f08782cc
-br 573:f428480480a8
-bs 319:2952f017760c
-ca 1488:a738a83804a7
-cs 2711:5c2e4aece9a5
-csb 303:f55f70c69d67
-cy 456:7e5633067d77
-da 1229:b383e623b4b9
-de 3608:6331942dcdc3
-el 766:77b2bc174d91
-en-GB 1006:0e15ddecc4be
-en-ZA 297:05039e1ec018
-eo 602:a0a6baff3ed3
-es-AR 1655:9b8a42276b16
-es-CL 573:44395bfae11b
-es-ES 2877:6acf2cde78b2
-es-MX 484:8a7fd8178ff9
-et 1042:ba5263b8ddbc
-eu 800:37f336123cb7
-fa 628:7fcd5891519b
-ff 181:825dd81ef0f1
-fi 1302:732e08e0b1ee
-fr 5513:68996f920525
-fy-NL 1599:4de0c5762e6d
-ga-IE 1005:882f38a167d1
-gd 858:55b88ad7ba58
-gl 1110:e03ad8d1132b
-gu-IN 722:e6d0ca399bb9
-he 848:5871402b0150
-hi-IN 472:a9ff2e7241a3
-hr 1251:3493aedebdec
-hu 1282:bc8e4646d27e
-hy-AM 540:66da42a045ed
-id 850:a30c5d703e47
-is 669:d817f088e853
-it 3634:f5d28c79719e
-ja 1355:ca9bdb146d7e
-ja-JP-mac 1149:c7f69df895e8
-kk 430:f8b799e4a247
-km 231:0b0d6ec522f8
-kn 427:1a24bcd1fad1
-ko 1143:259b497f6870
-ku 354:63d5cb255bd8
-lij 486:661f24512ded
-lt 1977:6493e8f64054
-lv 565:5db7dd4475bc
-mai 338:63edaef80a55
-mk 383:21324ba9639a
-ml 494:4fb8c5e161a0
-mr 439:b94f3a14ab43
-ms 89:7d9194ba2339
-nb-NO 1751:9dd0f3ed571f
-nl 4084:e9aa675d5695
-nn-NO 952:a3d0b31877c7
-or 381:9ad8c81eb17f
-pa-IN 1109:6a76a6ce5e36
-pl 5163:b16ff199d27a
-pt-BR 1157:401f68784235
-pt-PT 2309:ec742cbcf625
-rm 702:edd1618ad49f
-ro 777:43ed01ab447b
-ru 2842:5771dfe60fe9
-si 762:3434b166d607
-sk 1195:d34b67c68fca
-sl 1145:161734d3f39b
-son 331:2bd099706923
-sq 1120:b5823ce68ecc
-sr 439:c2e7fc0515cd
-sv-SE 3646:d2166cb5d888
-sw 244:d83f043f5f5b
-ta 342:540375d908fb
-te 384:160fc0b43371
-th 661:361cb41c805e
-tr 1130:52b1e00e2a97
-uk 1800:09854e3e81c0
-vi 483:e48514326e50
-xh 74:b047418edd11
-zh-CN 1389:e99b8d974dd4
-zh-TW 1797:876abb561e2a
-zu 270:fa3853d57d72
+ach 156:c502701ff04d
+af 378:e3e649805394
+an 78:0e440de2276f
+ar 869:18476bd2b40c
+as 314:1b69715665cf
+ast 726:c71c5421fae9
+be 971:607eaac6a387
+bg 476:848f0f9a0c6d
+bn-BD 457:37d531787068
+bn-IN 396:3620ac7921d3
+br 576:272b37331dd1
+bs 321:02d2af0868b1
+ca 1496:4f200f6edb34
+cs 2719:8a598efa5e06
+csb 305:9eac99e32947
+cy 460:ff4e810b0213
+da 1233:3b8169061ad2
+de 3620:42d6e8bb3885
+el 768:49217cb167dd
+en-GB 1015:fff751d0bef0
+en-ZA 299:842beae2c262
+eo 606:0fec5c4a1fae
+es-AR 1668:4b2d7bf47ce6
+es-CL 577:41951f28c81b
+es-ES 2886:22d58746245e
+es-MX 486:456f8c88a820
+et 1046:072183998676
+eu 804:91e627b83308
+fa 630:e5628dcbbe03
+ff 183:4f39d7b76951
+fi 1310:685ce12cdc93
+fr 5521:cc637e6e0b49
+fy-NL 1603:a33997c0a588
+ga-IE 1009:3f918b5d1be9
+gd 860:bc32b04f62f7
+gl 1118:75c8c185c43f
+gu-IN 724:ded4517af3e8
+he 850:420892e07642
+hi-IN 474:5f7e96b8b572
+hr 1253:654b5395567d
+hu 1291:7af5fdd3fea9
+hy-AM 542:70a212b91d8f
+id 852:b5183e31af70
+is 671:0f72c4439407
+it 3642:469ef92b4604
+ja 1363:9323184d9d1b
+ja-JP-mac 1155:1566c909449e
+kk 432:3e78e8b885fd
+km 233:e37dbf334f53
+kn 429:cd0ec372863a
+ko 1148:01c7b810719e
+ku 356:6c72950e0c7b
+lij 488:4d2c746d2d67
+lt 1985:7dca6fbf0be6
+lv 567:7975e27e6227
+mai 340:e589488c384e
+mk 385:2a8fba2dc2ca
+ml 496:2329d091f4df
+mr 441:ec7f510cd49e
+ms 96:3a8a7ca95041
+nb-NO 1761:74024c5267e6
+nl 4093:b92ef4e46235
+nn-NO 958:518a1d0cfbf0
+or 383:bc73475de38f
+pa-IN 1113:8831c3a8006f
+pl 5171:e73e3048dd40
+pt-BR 1161:2b2005b43db4
+pt-PT 2317:d11acb528904
+rm 704:dd64638dbf04
+ro 781:6a681a48ef33
+ru 2850:e99b1bebd40b
+si 764:9d706c0532ff
+sk 1203:aaadf4b8276a
+sl 1149:0070c3230c4c
+son 333:af5216e5f569
+sq 1126:95f2aeb7e0f3
+sr 441:2adf446f3e12
+sv-SE 3654:116b6a794dba
+sw 246:dd74de7edd87
+ta 344:206db95e327d
+te 386:71a2bad08a20
+th 665:18409028442a
+tr 1138:cecca5d35ea6
+uk 1809:70fbbe924a1a
+vi 485:927c221a5e6f
+xh 76:2069dbaebf9b
+zh-CN 1397:da7bf13c8395
+zh-TW 1807:93743421a691
+zu 272:f123b007d57c
diff -Nru firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/aboutDialog.dtd firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/aboutDialog.dtd
--- firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/aboutDialog.dtd	2014-04-02 09:05:30.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/aboutDialog.dtd	2014-04-10 20:47:40.000000000 +0000
@@ -101,4 +101,4 @@
      channel.description.end create one sentence, with the current channel label inserted in between.
      example: You are currently on the _Stable_ update channel. -->
 
-
+
diff -Nru firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/browser.dtd firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/browser.dtd
--- firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/browser.dtd	2014-04-02 09:05:30.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/browser.dtd	2014-04-10 20:47:41.000000000 +0000
@@ -174,7 +174,7 @@
  
 
 
-
+
 
 
 
@@ -272,7 +272,7 @@
 
  
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/customizableui/customizableWidgets.properties firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/customizableui/customizableWidgets.properties
--- firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/customizableui/customizableWidgets.properties	2014-04-02 09:05:30.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/customizableui/customizableWidgets.properties	2014-04-10 20:47:40.000000000 +0000
@@ -6,26 +6,26 @@
 # LOCALIZATION NOTE(history-panelmenu.tooltiptext2): %S is the keyboard shortcut
 history-panelmenu.tooltiptext2 = Kürzlich besuchte Seiten anzeigen (%S)
 
-privatebrowsing-button.label = Neues privates Fenster
+privatebrowsing-button.label = \u00adPrivates Fenster
 # LOCALIZATION NOTE(privatebrowsing-button.tooltiptext): %S is the keyboard shortcut
 privatebrowsing-button.tooltiptext = Ein neues privates Fenster öffnen (%S)
 
-save-page-button.label = Seite speichern
+save-page-button.label = \u00adSeite speichern
 # LOCALIZATION NOTE(save-page-button.tooltiptext2): %S is the keyboard shortcut
 # Use the unicode ellipsis char, \u2026, or use "..." if \u2026 doesn't suit traditions in your locale.
-save-page-button.tooltiptext2 = Seite speichern untern… (%S)
+save-page-button.tooltiptext2 = Seite speichern unter… (%S)
 
 find-button.label = Suchen
 # LOCALIZATION NOTE(find-button.tooltiptext2): %S is the keyboard shortcut.
 # Use the unicode ellipsis char, \u2026, or use "..." if \u2026 doesn't suit traditions in your locale.
 find-button.tooltiptext2 = In dieser Seite suchen… (%S)
 
-open-file-button.label = Datei öffnen
+open-file-button.label = \u00adDatei öffnen
 # LOCALIZATION NOTE (open-file-button.tooltiptext2): %S is the keyboard shortcut.
 # Use the unicode ellipsis char, \u2026, or use "..." if \u2026 doesn't suit traditions in your locale.
 open-file-button.tooltiptext2 = Datei öffnen… (%S)
 
-developer-button.label = Entwickler-Werkzeuge
+developer-button.label = Entwickler-\u00adWerkzeuge
 # LOCALIZATION NOTE(developer-button.tooltiptext): %S is the keyboard shortcut
 developer-button.tooltiptext = Werkzeuge für Web-Entwickler (%S)
 
@@ -33,7 +33,7 @@
 # LOCALIZATION NOTE(add-ons-button.tooltiptext2): %S is the keyboard shortcut
 add-ons-button.tooltiptext2 = Add-ons-Manager öffnen (%S)
 
-switch-to-metro-button2.label = Windows 8 Touch
+switch-to-metro-button2.label = Windows 8\u00adTouch
 # LOCALIZATION NOTE(switch-to-metro-button2.tooltiptext): %S is the brand short name
 switch-to-metro-button2.tooltiptext = Als %S für Windows 8 Touch neu starten
 
@@ -83,10 +83,13 @@
 feed-button.label = Abonnieren
 feed-button.tooltiptext = Diese Seite abonnieren…
 
-characterencoding-button.label = Zeichenkodierung
+# LOCALIZATION NOTE (characterencoding-button.label): The \u00ad character at the beginning
+# of the string is used to disable auto hyphenation on the button text when it is displayed
+# in the menu panel.
+characterencoding-button.label = Zeichen\u00adkodierung
 characterencoding-button.tooltiptext2 = Einstellungen für die Zeichenkodierung anzeigen
 
-email-link-button.label = Link per E-Mail senden
+email-link-button.label = \u00adLink senden
 # LOCALIZATION NOTE (email-link-button.tooltiptext2): Use the unicode ellipsis char,
 # \u2026, or use "..." if \u2026 doesn't suit traditions in your locale.
 email-link-button.tooltiptext2 = Link per E-Mail senden…
diff -Nru firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/devtools/scratchpad.dtd firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/devtools/scratchpad.dtd
--- firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/devtools/scratchpad.dtd	2014-04-02 09:05:30.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/devtools/scratchpad.dtd	2014-04-10 20:47:40.000000000 +0000
@@ -98,7 +98,7 @@
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/devtools/scratchpad.properties firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/devtools/scratchpad.properties
--- firefox-29.0~b4+build1/l10n/de/browser/chrome/browser/devtools/scratchpad.properties	2014-04-02 09:05:30.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/de/browser/chrome/browser/devtools/scratchpad.properties	2014-04-10 20:47:40.000000000 +0000
@@ -76,7 +76,7 @@
 
 # LOCALIZATION NOTE (help.openDocumentationPage): This returns a localized link with
 # documentation for Scratchpad on MDN.
-help.openDocumentationPage=https://developer.mozilla.org/en/Tools/Scratchpad
+help.openDocumentationPage=https://developer.mozilla.org/de/docs/Tools/Scratchpad
 
 # LOCALIZATION NOTE (fileExists.notification): This is the message displayed
 # over the top of the the editor when a file does not exist.
diff -Nru firefox-29.0~b4+build1/l10n/de/dom/chrome/dom/dom.properties firefox-29.0~b6+build1/l10n/de/dom/chrome/dom/dom.properties
--- firefox-29.0~b4+build1/l10n/de/dom/chrome/dom/dom.properties	2014-04-02 09:05:30.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/de/dom/chrome/dom/dom.properties	2014-04-10 20:47:40.000000000 +0000
@@ -50,6 +50,7 @@
 CreateAttributeWarning=document.createAttribute() sollte nicht mehr verwendet werden. Verwenden Sie stattdessen element.setAttribute().
 CreateAttributeNSWarning=document.createAttributeNS() sollte nicht mehr verwendet werden. Verwenden Sie stattdessen element.setAttributeNS().
 SpecifiedWarning=Das specified-Attribut von Attributen sollte nicht mehr verwendet werden. Es liefert immer true.
+OwnerElementWarning=Das ownerElement-Attribut auf Attributen sollte nicht mehr verwendet werden.
 NodeValueWarning=Das nodeValue-Attribut von Attributen sollte nicht mehr verwendet werden. Verwenden Sie value stattdessen.
 TextContentWarning=Das textContent-Attribut von Attributen sollte nicht mehr verwendet werden. Verwenden Sie value stattdessen.
 EnablePrivilegeWarning=enablePrivilege sollte nicht mehr verwendet werden. Bitte verwenden Sie stattdessen Code, der mit dem System-Principal läuft (z.B. eine Erweiterung).
diff -Nru firefox-29.0~b4+build1/l10n/de/webapprt/webapprt/overrides/dom.properties firefox-29.0~b6+build1/l10n/de/webapprt/webapprt/overrides/dom.properties
--- firefox-29.0~b4+build1/l10n/de/webapprt/webapprt/overrides/dom.properties	2014-04-02 09:05:30.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/de/webapprt/webapprt/overrides/dom.properties	2014-04-10 20:47:40.000000000 +0000
@@ -50,6 +50,7 @@
 CreateAttributeWarning=document.createAttribute() sollte nicht mehr verwendet werden. Verwenden Sie stattdessen element.setAttribute().
 CreateAttributeNSWarning=document.createAttributeNS() sollte nicht mehr verwendet werden. Verwenden Sie stattdessen element.setAttributeNS().
 SpecifiedWarning=Das specified-Attribut von Attributen sollte nicht mehr verwendet werden. Es liefert immer true.
+OwnerElementWarning=Das ownerElement-Attribut auf Attributen sollte nicht mehr verwendet werden.
 NodeValueWarning=Das nodeValue-Attribut von Attributen sollte nicht mehr verwendet werden. Verwenden Sie value stattdessen.
 TextContentWarning=Das textContent-Attribut von Attributen sollte nicht mehr verwendet werden. Verwenden Sie value stattdessen.
 EnablePrivilegeWarning=enablePrivilege sollte nicht mehr verwendet werden. Bitte verwenden Sie stattdessen Code, der mit dem System-Principal läuft (z.B. eine Erweiterung).
diff -Nru firefox-29.0~b4+build1/l10n/en-GB/browser/chrome/browser/devtools/gclicommands.properties firefox-29.0~b6+build1/l10n/en-GB/browser/chrome/browser/devtools/gclicommands.properties
--- firefox-29.0~b4+build1/l10n/en-GB/browser/chrome/browser/devtools/gclicommands.properties	2014-04-02 09:05:39.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/en-GB/browser/chrome/browser/devtools/gclicommands.properties	2014-04-10 20:47:50.000000000 +0000
@@ -1154,7 +1154,7 @@
 # LOCALIZATION NOTE (callLogChromeEvalException) A string displayed as the
 # result of the 'calllog chromestart' command with a source type of javascript
 # and invalid JavaScript code.
-callLogChromeEvalException=Evaluated javascript threw the following exception
+callLogChromeEvalException=Evaluated JavaScript threw the following exception
 
 # LOCALIZATION NOTE (callLogChromeEvalNeedsObject) A string displayed as the
 # result of passing a non-JavaScript object creating source via the
diff -Nru firefox-29.0~b4+build1/l10n/es-AR/browser/chrome/browser/devtools/gclicommands.properties firefox-29.0~b6+build1/l10n/es-AR/browser/chrome/browser/devtools/gclicommands.properties
--- firefox-29.0~b4+build1/l10n/es-AR/browser/chrome/browser/devtools/gclicommands.properties	2014-04-02 09:05:51.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/es-AR/browser/chrome/browser/devtools/gclicommands.properties	2014-04-10 20:48:03.000000000 +0000
@@ -968,7 +968,7 @@
 # LOCALIZATION NOTE (jsbDesc) A very short description of the
 # 'jsb' command. This string is designed to be shown in a menu
 # alongside the command name, which is why it should be as short as possible.
-jsbDesc=Embellecedor de Javascript
+jsbDesc=Embellecedor de JavaScript
 
 # LOCALIZATION NOTE (jsbUrlDesc) A very short description of the
 # 'jsb ' parameter. This string is designed to be shown in a menu
@@ -1153,7 +1153,7 @@
 # LOCALIZATION NOTE (callLogChromeEvalException) A string displayed as the
 # result of the 'calllog chromestart' command with a source type of javascript
 # and invalid JavaScript code.
-callLogChromeEvalException=Javascript evaluado lanzó la siguiente excepción
+callLogChromeEvalException=JavaScript evaluado lanzó la siguiente excepción
 
 # LOCALIZATION NOTE (callLogChromeEvalNeedsObject) A string displayed as the
 # result of passing a non-JavaScript object creating source via the
diff -Nru firefox-29.0~b4+build1/l10n/es-CL/browser/chrome/browser/aboutDialog.dtd firefox-29.0~b6+build1/l10n/es-CL/browser/chrome/browser/aboutDialog.dtd
--- firefox-29.0~b4+build1/l10n/es-CL/browser/chrome/browser/aboutDialog.dtd	2014-04-02 09:05:55.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/es-CL/browser/chrome/browser/aboutDialog.dtd	2014-04-10 20:48:07.000000000 +0000
@@ -26,7 +26,7 @@
 
 
 
-
+
 
 
 
@@ -35,7 +35,7 @@
 
 
 
-
+
 
 
 
@@ -49,5 +49,5 @@
 
 
 
-
+
 
diff -Nru firefox-29.0~b4+build1/l10n/es-CL/browser/chrome/browser/devtools/netmonitor.dtd firefox-29.0~b6+build1/l10n/es-CL/browser/chrome/browser/devtools/netmonitor.dtd
--- firefox-29.0~b4+build1/l10n/es-CL/browser/chrome/browser/devtools/netmonitor.dtd	2014-04-02 09:05:55.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/es-CL/browser/chrome/browser/devtools/netmonitor.dtd	2014-04-10 20:48:07.000000000 +0000
@@ -11,8 +11,8 @@
   - A good criteria is the language in which you'd find the best
   - documentation on web development on the web. -->
 
-
-
+
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/es-CL/browser/chrome/browser/devtools/webConsole.dtd firefox-29.0~b6+build1/l10n/es-CL/browser/chrome/browser/devtools/webConsole.dtd
--- firefox-29.0~b4+build1/l10n/es-CL/browser/chrome/browser/devtools/webConsole.dtd	2014-04-02 09:05:55.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/es-CL/browser/chrome/browser/devtools/webConsole.dtd	2014-04-10 20:48:07.000000000 +0000
@@ -36,14 +36,14 @@
 
 
 
-
+
 
 
 
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/es-CL/dom/chrome/security/csp.properties firefox-29.0~b6+build1/l10n/es-CL/dom/chrome/security/csp.properties
--- firefox-29.0~b4+build1/l10n/es-CL/dom/chrome/security/csp.properties	2014-04-02 09:05:55.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/es-CL/dom/chrome/security/csp.properties	2014-04-10 20:48:07.000000000 +0000
@@ -17,7 +17,7 @@
 allowDirectiveIsDeprecated = la directiva allow esta obsoleta, use la directiva equivalente default-src en su lugar
 inlineScriptBlocked = Un intendo para ejecutar las secuencias de comandos integradas ha sido bloqueada
 inlineStyleBlocked = Un intento para aplicar hojas de estilo integradas ha sido bloqueado
-scriptFromStringBlocked = Un intento para llamar JavaScripts desde una cadena (llamando una función como eval) ha sido bloqueado
+scriptFromStringBlocked = Un intento para llamar JavaScript desde una cadena (llamando una función como eval) ha sido bloqueado
 hostNameMightBeKeyword = Interpretando %1$S como un nombre de servidor, no como palabra clave. Si quiere usarlo como palabra clave, use '%2$S' (entre comillas simples).
 policyURINotAlone = la directiva policy-uri sólo puede aparecer aislada
 noParentRequest = El policy-uri no puede ser recuperado sin una solicitud padre y un CSP.
diff -Nru firefox-29.0~b4+build1/l10n/fy-NL/dom/chrome/dom/dom.properties firefox-29.0~b6+build1/l10n/fy-NL/dom/chrome/dom/dom.properties
--- firefox-29.0~b4+build1/l10n/fy-NL/dom/chrome/dom/dom.properties	2014-04-02 09:06:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/fy-NL/dom/chrome/dom/dom.properties	2014-04-10 20:48:51.000000000 +0000
@@ -50,6 +50,7 @@
 CreateAttributeWarning=Gebrûk fan document.createAttribute() wurdt ôfret. Gebrûk yn stee dêrfan element.setAttribute().
 CreateAttributeNSWarning=Gebrûk fan document.createAttributeNS() wurdt ôfret. Gebrûk yn stee dêrfan element.setAttributeNS().
 SpecifiedWarning=Gebrûk fan attributes' specified attribute wurdt ôfret. It jout altyd wier werom.
+OwnerElementWarning=Gebrûk fan attributes' ownerElement attribute is net langer stipe.
 NodeValueWarning=Gebrûk fan attributes' nodeValue attribute wurdt ôfret. Gebrûk yn stee dêrfan wearde.
 TextContentWarning=Gebrûk fan attributes' textContent attribute wurdt ôfret. Gebrûk yn stee dêrfan waarde.
 EnablePrivilegeWarning=Gebrûk fan enablePrivilege wurdt ôfret.  Gebrûk yn stee dêrfan code dat gebrûk makket fan systeem opdrachtjouwers (byg. in útwreiding).
diff -Nru firefox-29.0~b4+build1/l10n/fy-NL/webapprt/webapprt/overrides/dom.properties firefox-29.0~b6+build1/l10n/fy-NL/webapprt/webapprt/overrides/dom.properties
--- firefox-29.0~b4+build1/l10n/fy-NL/webapprt/webapprt/overrides/dom.properties	2014-04-02 09:06:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/fy-NL/webapprt/webapprt/overrides/dom.properties	2014-04-10 20:48:51.000000000 +0000
@@ -50,6 +50,7 @@
 CreateAttributeWarning=Gebrûk fan document.createAttribute() wurdt ôfret. Gebrûk yn stee dêrfan element.setAttribute().
 CreateAttributeNSWarning=Gebrûk fan document.createAttributeNS() wurdt ôfret. Gebrûk yn stee dêrfan element.setAttributeNS().
 SpecifiedWarning=Gebrûk fan attributes' specified attribute wurdt ôfret. It jout altyd wier werom.
+OwnerElementWarning=Gebrûk fan attributes' ownerElement attribute is net langer stipe.
 NodeValueWarning=Gebrûk fan attributes' nodeValue attribute wurdt ôfret. Gebrûk yn stee dêrfan wearde.
 TextContentWarning=Gebrûk fan attributes' textContent attribute wurdt ôfret. Gebrûk yn stee dêrfan waarde.
 EnablePrivilegeWarning=Gebrûk fan enablePrivilege wurdt ôfret.  Gebrûk yn stee dêrfan code dat gebrûk makket fan systeem opdrachtjouwers (byg. in útwreiding).
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/aboutHome.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/aboutHome.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/aboutHome.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/aboutHome.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -24,7 +24,7 @@
 
 Ketahui hak anda...">
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/browser.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/browser.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/browser.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/browser.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -74,9 +74,9 @@
 
 
 
-
+
 
-
+
 
 
 
@@ -124,10 +124,10 @@
 
 
 
-
+
 
-
-
+
+
 
 
 
@@ -145,9 +145,9 @@
 
 
 
-
-
-
+
+
+
 
 
 
@@ -176,13 +176,13 @@
 
 
 
-
+
 
 
-
-
-
-
+
+
+
+
 
@@ -227,7 +227,7 @@
 
 
 
-
+
 
 
 
@@ -437,7 +437,7 @@
 
 
 
-
+
 
 
 
@@ -750,7 +750,7 @@
 
 
 
-
+
 
 
 
@@ -773,10 +773,10 @@
 
 
 
-
+
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/browser.properties firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/browser.properties
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/browser.properties	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/browser.properties	2014-04-10 20:50:52.000000000 +0000
@@ -101,7 +101,7 @@
 # missing plugin installer
 installPlugin.message = Adakah anda mahu memasang plugin tambahan yang diperlukan untuk memaparkan media di halaman ini?
 installPlugin.button.label=Pasang %S
-installPlugin.button.accesskey=l
+installPlugin.button.accesskey=P
 installPlugin.ignoreButton.label=Jangan tanya lagi
 installPlugin.ignoreButton.accesskey=N
 
@@ -152,11 +152,11 @@
 # plugin for a long while (90 days), auto-renewed if the site keeps using the
 # plugin.
 pluginActivateAlways.label=Izinkan dan Ingati
-pluginActivateAlways.accesskey=R
+pluginActivateAlways.accesskey=I
 pluginBlockNow.label=Sekat Plugin
-pluginBlockNow.accesskey=B
+pluginBlockNow.accesskey=k
 pluginContinue.label=Terus Membenarkan
-pluginContinue.accesskey=C
+pluginContinue.accesskey=b
 
 # in-page UI
 PluginClickToActivate=Aktifkan %S.
@@ -165,7 +165,7 @@
 
 # infobar UI
 pluginContinueBlocking.label=Terus Menghalang
-pluginContinueBlocking.accesskey=B
+pluginContinueBlocking.accesskey=h
 # LOCALIZATION NOTE (pluginActivateTrigger): Use the unicode ellipsis char, \u2026,
 # or use "..." if \u2026 doesn't suit traditions in your locale.
 pluginActivateTrigger.label=Benarkan…
@@ -194,7 +194,7 @@
 # LOCALIZATION NOTE (downloadAndInstallButton.label): %S is replaced by the
 # version of the update: "Update to 28.0".
 update.downloadAndInstallButton.label=Kemaskini kepada %S
-update.downloadAndInstallButton.accesskey=U
+update.downloadAndInstallButton.accesskey=k
 
 # RSS Pretty Print
 feedShowFeedNew=Langgani '%S'…
@@ -235,12 +235,12 @@
 # General bookmarks button
 # LOCALIZATION NOTE (bookmarksMenuButton.tooltip):
 # %S is the keyboard shortcut for "Show All Bookmarks"
-bookmarksMenuButton.tooltip=Tunjuk penandabuku anda (%S)
+bookmarksMenuButton.tooltip=Tunjuk penanda buku anda (%S)
 # Star button
-starButtonOn.tooltip=Ubah penandabuku ini
-starButtonOff.tooltip=Tandabuku laman Ini
-starButtonOverflowed.label=Tandabuku Laman Ini
-starButtonOverflowedStarred.label=Sunting Tandabuku Ini
+starButtonOn.tooltip=Ubah penanda buku ini
+starButtonOff.tooltip=Penanda buku Laman Ini
+starButtonOverflowed.label=Penanda buku Laman Ini
+starButtonOverflowedStarred.label=Sunting Penanda buku Ini
 
 # Print button tooltip on OS X
 # LOCALIZATION NOTE (printButton.tooltip):
@@ -288,17 +288,17 @@
 identity.chrome=Ini adalah laman %S yang selamat.
 
 # Edit Bookmark UI
-editBookmarkPanel.pageBookmarkedTitle=Laman telah ditanda buku
+editBookmarkPanel.pageBookmarkedTitle=Laman telah dipenanda buku
 editBookmarkPanel.pageBookmarkedDescription=%S akan sentiasa mengingati laman ini untuk anda.
-editBookmarkPanel.bookmarkedRemovedTitle=Tandabuku Dialihkan
-editBookmarkPanel.editBookmarkTitle=Edit Tandabuku Ini
+editBookmarkPanel.bookmarkedRemovedTitle=Penanda buku Dialihkan
+editBookmarkPanel.editBookmarkTitle=Ubah Penanda buku Ini
 
 # LOCALIZATION NOTE (editBookmark.removeBookmarks.label): Semicolon-separated list of plural forms.
 # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
 # Replacement for #1 is the number of bookmarks to be removed.
 # If this causes problems with localization you can also do "Remove Bookmarks (#1)"
 # instead of "Remove #1 Bookmarks".
-editBookmark.removeBookmarks.label=Alih Penandabuku;Alih #1 Penandabuku-Penandabuku
+editBookmark.removeBookmarks.label=Alih Penanda buku;Alih #1 Penanda buku - Penanda buku
 
 # Post Update Notifications
 pu.notifyButton.label=Butiran…
@@ -448,7 +448,7 @@
 
 # LOCALIZATION NOTE (social.turnOff.label): %S is the name of the social provider
 social.turnOff.label=Padam %S
-social.turnOff.accesskey=T
+social.turnOff.accesskey=d
 # LOCALIZATION NOTE (social.turnOn.label): %S is the name of the social provider
 social.turnOn.label=Mula %S
 social.turnOn.accesskey=M
@@ -463,9 +463,9 @@
 # LOCALIZATION NOTE (social.error.message): %1$S is brandShortName (e.g. Firefox), %2$S is the name of the social provider
 social.error.message=%1$S tidak dapat disambungkan dengan %2$S ketika ini.
 social.error.tryAgain.label=Cuba Semula
-social.error.tryAgain.accesskey=T
+social.error.tryAgain.accesskey=C
 social.error.closeSidebar.label=Tutup Bar Sisi Ini
-social.error.closeSidebar.accesskey=C
+social.error.closeSidebar.accesskey=t
 
 # LOCALIZATION NOTE: %1$S is the label for the toolbar button, %2$S is the associated badge numbering that the social provider may provide.
 social.aria.toolbarButtonBadgeText=%1$S (%2$S)
@@ -502,12 +502,12 @@
 getUserMedia.shareSelectedDevices.label = Kongsi Peranti Yang Dipilih;Kongsi Peranti Yang Dipilih
 getUserMedia.shareSelectedDevices.accesskey = S
 getUserMedia.denyRequest.label = Jangan Kongsi
-getUserMedia.denyRequest.accesskey = D
+getUserMedia.denyRequest.accesskey = J
 getUserMedia.sharingCamera.message2 = Anda kini sedang berkongsi kamera dengan halaman ini.
 getUserMedia.sharingMicrophone.message2 = Anda kini sedang berkongsi mikrofon dengan halaman ini.
 getUserMedia.sharingCameraAndMicrophone.message2 = Anda kini sedang berkongsi kamera dan mikrofon dengan halaman ini.
 getUserMedia.continueSharing.label = Teruskan Perkongsian
-getUserMedia.continueSharing.accesskey = C
+getUserMedia.continueSharing.accesskey = k
 getUserMedia.stopSharing.label = Hentikan Perkongsian
 getUserMedia.stopSharing.accesskey = S
 
@@ -515,7 +515,7 @@
 # LOCALIZATION NOTE - %S is brandShortName
 mixedContentBlocked.message = %S telah menghalang kandungan yang tidak selamat.
 mixedContentBlocked.keepBlockingButton.label = Teruskan Menghalang
-mixedContentBlocked.keepBlockingButton.accesskey = B
+mixedContentBlocked.keepBlockingButton.accesskey = h
 mixedContentBlocked.unblock.label = Lumpuhkan perlindungan pada laman ini
 mixedContentBlocked.unblock.accesskey = D
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/devtools/styleeditor.properties firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/devtools/styleeditor.properties
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/devtools/styleeditor.properties	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/devtools/styleeditor.properties	2014-04-10 20:50:52.000000000 +0000
@@ -70,7 +70,7 @@
 
 # LOCALIZATION NOTE  (showOriginalSources.accesskey): This is the access key for
 # the menu item to toggle showing original sources in the editor.
-showOriginalSources.accesskey=O
+showOriginalSources.accesskey=s
 
 # LOCALIZATION NOTE  (showCSSSources.label): This is the label on the context
 # menu item to toggle back to showing only CSS sources in the editor.
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/engineManager.properties firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/engineManager.properties
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/engineManager.properties	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/engineManager.properties	2014-04-10 20:50:52.000000000 +0000
@@ -6,4 +6,4 @@
 editMsg=Masukkan kata kunci baru untuk "%S":
 duplicateTitle=Kata kunci Pendua
 duplicateEngineMsg=Anda telah memilih kata kunci yang sedang dipakai oleh "%S". Sila pilih yang lain.
-duplicateBookmarkMsg=Anda telah memilih kata kunci yang sedang dipakai oleh tanda buku. Sila pilih yang lain.
+duplicateBookmarkMsg=Anda telah memilih kata kunci yang sedang dipakai oleh penanda buku. Sila pilih yang lain.
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/feeds/subscribe.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/feeds/subscribe.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/feeds/subscribe.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/feeds/subscribe.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -4,4 +4,4 @@
 
 
 
-
+
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/feeds/subscribe.properties firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/feeds/subscribe.properties
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/feeds/subscribe.properties	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/feeds/subscribe.properties	2014-04-10 20:50:52.000000000 +0000
@@ -7,7 +7,7 @@
 addHandlerAddButton=Tambah Suapan Bacaan
 addHandlerAddButtonAccesskey=a
 handlerRegistered="%S" sudah pun didaftarkan sebagai Suapan Bacaan
-liveBookmarks=Tanda buku Langsung
+liveBookmarks=Penanda buku Secara Langsung
 subscribeNow=Langgan Sekarang
 chooseApplicationMenuItem=Pilih Aplikasi…
 chooseApplicationDialogTitle=Pilih Aplikasi
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/migration/migration.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/migration/migration.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/migration/migration.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/migration/migration.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -5,9 +5,9 @@
 
 
 
-
-
-
+
+
+
 
 
 
@@ -20,7 +20,7 @@
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/migration/migration.properties firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/migration/migration.properties
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/migration/migration.properties	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/migration/migration.properties	2014-04-10 20:50:52.000000000 +0000
@@ -29,7 +29,7 @@
 4_ie=Sejarah Pelungsuran
 4_safari=Sejarah Pelungsuran
 4_chrome=Melungsur Sejarah
-4_firefox_history_and_bookmarks=Sejarah Pelayar dan Penanda
+4_firefox_history_and_bookmarks=Sejarah Pelayar dan Penanda buku
 
 8_ie=Sejarah Borang Disimpan
 8_safari=Sejarah Borang Disimpan
@@ -42,8 +42,8 @@
 16_firefox=Kata laluan Disimpan
 
 32_ie=Kegemaran
-32_safari=Penandabuku
-32_chrome=Penandabuku
+32_safari=Penanda buku
+32_chrome=Penanda buku
 
 64_ie=Maklumat lain-lain
 64_safari=Maklumat lain-lain
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/places/bookmarkProperties.properties firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/places/bookmarkProperties.properties
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/places/bookmarkProperties.properties	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/places/bookmarkProperties.properties	2014-04-10 20:50:52.000000000 +0000
@@ -5,15 +5,15 @@
 dialogAcceptLabelAddItem=Tambah
 dialogAcceptLabelSaveItem=Simpan
 dialogAcceptLabelAddLivemark=Langgan
-dialogAcceptLabelAddMulti=Tambah Tandabuku
+dialogAcceptLabelAddMulti=Tambah Penanda buku
 dialogAcceptLabelEdit=Simpan
-dialogTitleAddBookmark=Tandabuku Baru
-dialogTitleAddLivemark=Langgan dengan Tanda buku Langsung
+dialogTitleAddBookmark=Penanda buku Baru
+dialogTitleAddLivemark=Langgan dengan Penanda buku Langsung
 dialogTitleAddFolder=Folder Baru
-dialogTitleAddMulti=Penandabuku Baru
+dialogTitleAddMulti=Penanda buku Baru
 dialogTitleEdit=Sifat-sifat untuk "%S"
 
 bookmarkAllTabsDefault=[Nama Selongsong]
 newFolderDefault=Folder Baru
-newBookmarkDefault=Tandabuku Baru
-newLivemarkDefault=Tandabuku Langsung Baru
+newBookmarkDefault=Penanda buku Baru
+newLivemarkDefault=Penanda buku Langsung Baru
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/places/editBookmarkOverlay.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/places/editBookmarkOverlay.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/places/editBookmarkOverlay.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/places/editBookmarkOverlay.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -11,7 +11,7 @@
 
 
 
-
+
 
 
 
@@ -21,7 +21,7 @@
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/places/places.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/places/places.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/places/places.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/places/places.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -8,7 +8,7 @@
 
 
 
-
+
 
 
 
@@ -18,18 +18,18 @@
 
 
 
-
+
 
-
+
 
  Z Isihan Tertib Menaik">
 
 A Isihan Tertib Menurun">
 
 
-
+
 
-
+
 
 
 
@@ -41,7 +41,7 @@
 
 
 
-
+
 
 
 
@@ -64,7 +64,7 @@
 
 
 
-
+
 
 
 
@@ -72,7 +72,7 @@
 
 
 
-
+
 
 
 
@@ -95,7 +95,7 @@
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/places/places.properties firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/places/places.properties
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/places/places.properties	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/places/places.properties	2014-04-10 20:50:52.000000000 +0000
@@ -7,19 +7,19 @@
 
 bookmarksMenuEmptyFolder=(Kosong)
 
-bookmarksBackupTitle=Menandabukukan sandar nama fail
+bookmarksBackupTitle=Penanda buku bersandar nama fail
 
-bookmarksRestoreAlertTitle=Kembalikan Penandabuku
-bookmarksRestoreAlert=Ini akan menggantikan semua penandabuku semasa anda dengan sandar. Pastikan anda?
-bookmarksRestoreTitle=Pilihlah sandar penandabuku
+bookmarksRestoreAlertTitle=Kembalikan Penanda buku
+bookmarksRestoreAlert=Ini akan menggantikan semua penanda buku semasa anda dengan sandar. Pastikan anda?
+bookmarksRestoreTitle=Pilihlah sandar penanda buku
 bookmarksRestoreFilterName=JSON
 bookmarksRestoreFilterExtension=*.json
 
 bookmarksRestoreFormatError=Jenis fail tidak disokong.
 bookmarksRestoreParseError=Tidak dapat proses fail sandaran.
 
-bookmarksLivemarkLoading=Pemuatan Penandabuku Hidup...
-bookmarksLivemarkFailed=Suap Penandabuku Hidup gagal dimuat.
+bookmarksLivemarkLoading=Memuatkan Penanda buku Secara Langsung...
+bookmarksLivemarkFailed=Penanda buku Secara Langsung gagal dimuat.
 
 menuOpenLivemarkOrigin.label=Buka "%S"
 
@@ -34,9 +34,9 @@
 view.sortBy.1.url.label=Isih dengan Lokasi
 view.sortBy.1.url.accesskey=L
 view.sortBy.1.date.label=Isih daripada Antara Selalu Dilawati
-view.sortBy.1.date.accesskey=V
+view.sortBy.1.date.accesskey=I
 view.sortBy.1.visitCount.label=Isih dengan Bilangan Melayar
-view.sortBy.1.visitCount.accesskey=C
+view.sortBy.1.visitCount.accesskey=B
 view.sortBy.1.keyword.label=Isih dengan Kata Kekunci
 view.sortBy.1.keyword.accesskey=K
 view.sortBy.1.description.label=Isih dengan Perihal
@@ -44,12 +44,12 @@
 view.sortBy.1.dateAdded.label=Isih dengan Tambahan
 view.sortBy.1.dateAdded.accesskey=e
 view.sortBy.1.lastModified.label=Isih dengan Pengubahsuaian Akhir
-view.sortBy.1.lastModified.accesskey=M
+view.sortBy.1.lastModified.accesskey=u
 view.sortBy.1.tags.label=Isih dengan Penanda
-view.sortBy.1.tags.accesskey=T
+view.sortBy.1.tags.accesskey=g
 
-searchBookmarks=Gelintar Penandabuku
-searchHistory=Gelintar Sejarah
+searchBookmarks=Carian Penanda buku
+searchHistory=Carian Sejarah
 searchDownloads=Carian Muat turun
 
 tabs.openWarningTitle=Sah buka
@@ -57,8 +57,8 @@
 tabs.openButtonMultiple=Buka tab
 tabs.openWarningPromptMeBranded=Ingatkan saya semasa perlancaran tab berbilang mungkin memperlahankan %S
 
-SelectImport=Import Fail Penandabuku
-EnterExport=Eksport Fail Penandabuku
+SelectImport=Import Fail Penanda buku
+EnterExport=Eksport Fail Penanda buku
 
 detailsPane.noItems=Tidak ada perkara
 # LOCALIZATION NOTE (detailsPane.itemsCountLabel): Semicolon-separated list of plural forms.
@@ -68,7 +68,7 @@
 detailsPane.itemsCountLabel=Satu bahan;#1 bahan
 
 mostVisitedTitle=Paling Banyak Dilayari
-recentlyBookmarkedTitle=Baru-baru Ini Ditandabukukan
+recentlyBookmarkedTitle=Penanda buku yang terkini
 recentTagsTitle=Tag-tag Baru-baru Ini
 # LOCALIZATION NOTE (windows8TouchTitle): this is the name of the folder used
 # to store bookmarks created in Metro mode and share bookmarks between Metro
@@ -77,7 +77,7 @@
 
 OrganizerQueryHistory=Latar
 OrganizerQueryDownloads=Muat Turun
-OrganizerQueryAllBookmarks=Semua Penandabuku
+OrganizerQueryAllBookmarks=Semua Penanda buku
 OrganizerQueryTags=Tanda-tanda
 
 # LOCALIZATION NOTE (tagResultLabel) :
@@ -89,11 +89,11 @@
 # Noun used to describe the location bar autocomplete result type
 # to users with screen readers
 # See createResultLabel() in urlbarBindings.xml 
-bookmarkResultLabel=Penandabuku
+bookmarkResultLabel=Penanda buku
 
 # LOCALIZATION NOTE (lockPrompt.text)
 # %S will be replaced with the application name.
 lockPrompt.title=Ralat permulaan Pelayar
-lockPrompt.text=Penandabuku dan sistem sejarah tidak akan berfungsi kerana salah satu fail %S berada dalam keadaan digunakan aplikasi lain. Sesetengah sekuriti perisian boleh menyebabkan masalah ini.
+lockPrompt.text=Penanda buku dan sistem sejarah tidak akan berfungsi kerana salah satu fail %S berada dalam keadaan digunakan aplikasi lain. Sesetengah sekuriti perisian boleh menyebabkan masalah ini.
 lockPromptInfoButton.label=Ketahui Lanjut
 lockPromptInfoButton.accessKey=L
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/preferences/main.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/preferences/main.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/preferences/main.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/preferences/main.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -15,7 +15,7 @@
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/preferences/privacy.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/preferences/privacy.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/preferences/privacy.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/preferences/privacy.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -19,13 +19,13 @@
 
 
 
-
+
 
-
+
 
 
-
-
+
+
 
 
 
@@ -41,7 +41,7 @@
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/preferences/selectBookmark.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/preferences/selectBookmark.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/preferences/selectBookmark.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/preferences/selectBookmark.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -3,5 +3,5 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 
-
+
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/preferences/sync.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/preferences/sync.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/preferences/sync.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/preferences/sync.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -5,7 +5,7 @@
 
 
 
-
+
 
 
 
@@ -24,13 +24,13 @@
 
 
 
-
+
 
 
 
 
 
-
+
 
 
 
@@ -62,7 +62,7 @@
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/syncCustomize.dtd firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/syncCustomize.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/chrome/browser/syncCustomize.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/chrome/browser/syncCustomize.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -13,13 +13,13 @@
   for the last two that are marked as being specific to Desktop browsers.
 -->
 
-
+
 
 
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/metro/chrome/browser.dtd firefox-29.0~b6+build1/l10n/ms/browser/metro/chrome/browser.dtd
--- firefox-29.0~b4+build1/l10n/ms/browser/metro/chrome/browser.dtd	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/metro/chrome/browser.dtd	2014-04-10 20:50:52.000000000 +0000
@@ -21,8 +21,8 @@
 
 
 
-
-
+
+
 
 
 
 
-
-
+
+
 
 
 
@@ -50,7 +50,7 @@
 
 
 
-
+
 
 
 
@@ -76,7 +76,7 @@
 
 
 
-
+
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ms/browser/metro/chrome/browser.properties firefox-29.0~b6+build1/l10n/ms/browser/metro/chrome/browser.properties
--- firefox-29.0~b4+build1/l10n/ms/browser/metro/chrome/browser.properties	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/browser/metro/chrome/browser.properties	2014-04-10 20:50:52.000000000 +0000
@@ -17,9 +17,9 @@
 # Contextual Appbar - Button Labels
 
 contextAppbar2.pin.topSites=Pin untuk Laman Tertinggi
-contextAppbar2.pin.bookmarks=Pin ke Penandabuku
+contextAppbar2.pin.bookmarks=Pin ke Penanda buku
 contextAppbar2.pin.recentHistory=Pin ke Sejarah yang semasa
-contextAppbar2.pin.downloads=Pin ke Muaturun
+contextAppbar2.pin.downloads=Pin ke Muat turun
 
 contextAppbar2.unpin.topSites=Nyahpin daripada Laman Tertinggi
 contextAppbar2.hide.bookmarks=Simpan Penandabuku
@@ -65,7 +65,7 @@
 downloadShowInFiles=Tunjuk dalam Files
 
 # Alerts
-alertLinkBookmarked=Penandabuku ditambah
+alertLinkBookmarked=Penanda buku ditambah
 alertDownloads=Muat Turun
 alertDownloadsStart=Memuaturun: %S
 alertDownloadsDone=%S telah sudah dimuaturunkan
@@ -138,9 +138,9 @@
 # directly under the Firefox version in the about dialog (see bug 596813 for
 # screenshots).
 update.checkInsideButton.label=Semak untuk Kemas kini
-update.checkInsideButton.accesskey=C
+update.checkInsideButton.accesskey=S
 update.resumeButton.label=Sambung Muat Turun %S…
-update.resumeButton.accesskey=D
+update.resumeButton.accesskey=b
 update.openUpdateUI.applyButton.label=Guna Kemaskini…
 update.openUpdateUI.applyButton.accesskey=A
 update.restart.updateButton.label=Ulang hidup untuk Mengemaskinikan
diff -Nru firefox-29.0~b4+build1/l10n/ms/toolkit/chrome/places/places.properties firefox-29.0~b6+build1/l10n/ms/toolkit/chrome/places/places.properties
--- firefox-29.0~b4+build1/l10n/ms/toolkit/chrome/places/places.properties	2014-04-02 09:08:40.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ms/toolkit/chrome/places/places.properties	2014-04-10 20:50:52.000000000 +0000
@@ -2,9 +2,9 @@
 # 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/.
 
-BookmarksMenuFolderTitle=Menu Penandabuku
-BookmarksToolbarFolderTitle=Toolbar Penandabuku
-UnsortedBookmarksFolderTitle=Penandabuku yang tidak diisih
+BookmarksMenuFolderTitle=Menu Penanda buku
+BookmarksToolbarFolderTitle=Bar Alatan Penanda buku
+UnsortedBookmarksFolderTitle=Penanda buku yang tidak disusun
 TagsFolderTitle=Tanda-tanda
 
 # LOCALIZATION NOTE (dateName):
diff -Nru firefox-29.0~b4+build1/l10n/nb-NO/browser/chrome/browser/baseMenuOverlay.dtd firefox-29.0~b6+build1/l10n/nb-NO/browser/chrome/browser/baseMenuOverlay.dtd
--- firefox-29.0~b4+build1/l10n/nb-NO/browser/chrome/browser/baseMenuOverlay.dtd	2014-04-02 09:08:46.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/nb-NO/browser/chrome/browser/baseMenuOverlay.dtd	2014-04-10 20:50:59.000000000 +0000
@@ -36,7 +36,7 @@
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/nb-NO/browser/chrome/browser/pageInfo.dtd firefox-29.0~b6+build1/l10n/nb-NO/browser/chrome/browser/pageInfo.dtd
--- firefox-29.0~b4+build1/l10n/nb-NO/browser/chrome/browser/pageInfo.dtd	2014-04-02 09:08:46.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/nb-NO/browser/chrome/browser/pageInfo.dtd	2014-04-10 20:50:59.000000000 +0000
@@ -52,7 +52,7 @@
 
 
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/nb-NO/dom/chrome/dom/dom.properties firefox-29.0~b6+build1/l10n/nb-NO/dom/chrome/dom/dom.properties
--- firefox-29.0~b4+build1/l10n/nb-NO/dom/chrome/dom/dom.properties	2014-04-02 09:08:46.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/nb-NO/dom/chrome/dom/dom.properties	2014-04-10 20:50:59.000000000 +0000
@@ -50,6 +50,7 @@
 CreateAttributeWarning=Bruk av document.createAttribute() er frarådet. Bruk element.setAttribute() isteden.
 CreateAttributeNSWarning=Bruk av document.createAttributeNS() er frarådet. Bruk element.setAttributeNS() isteden.
 SpecifiedWarning=Bruk av attributters specified-attributt er frarådet. Den returnerer alltid true.
+OwnerElementWarning=Bruk av attributters ownerElement-attributt er frarådet.
 NodeValueWarning=Bruk av attributters nodeValue-attributt er frarådet.
 TextContentWarning=Bruk av attributters textContent-attributt er frarådet. Bruk value isteden.
 EnablePrivilegeWarning=Bruk av enablePrivilege er frarådet. Bruk kode som kjører med system principal (f.eks. en utvidelse) isteden.
diff -Nru firefox-29.0~b4+build1/l10n/nb-NO/webapprt/webapprt/overrides/dom.properties firefox-29.0~b6+build1/l10n/nb-NO/webapprt/webapprt/overrides/dom.properties
--- firefox-29.0~b4+build1/l10n/nb-NO/webapprt/webapprt/overrides/dom.properties	2014-04-02 09:08:46.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/nb-NO/webapprt/webapprt/overrides/dom.properties	2014-04-10 20:50:59.000000000 +0000
@@ -50,6 +50,7 @@
 CreateAttributeWarning=Use of document.createAttribute() is deprecated. Use element.setAttribute() instead.
 CreateAttributeNSWarning=Use of document.createAttributeNS() is deprecated. Use element.setAttributeNS() instead.
 SpecifiedWarning=Use of attributes' specified attribute is deprecated. It always returns true.
+OwnerElementWarning=Use of attributes' ownerElement attribute is deprecated.
 NodeValueWarning=Use of attributes' nodeValue attribute is deprecated. Use value instead.
 TextContentWarning=Use of attributes' textContent attribute is deprecated. Use value instead.
 EnablePrivilegeWarning=Use of enablePrivilege is deprecated. Please use code that runs with the system principal (e.g. an extension) instead.
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/branding/official/brand.properties firefox-29.0~b6+build1/l10n/ru/browser/branding/official/brand.properties
--- firefox-29.0~b4+build1/l10n/ru/browser/branding/official/brand.properties	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/branding/official/brand.properties	2014-04-10 20:51:57.000000000 +0000
@@ -9,4 +9,4 @@
 homePageImport = Импортировать домашнюю страницу из %S
 homePageMigrationPageTitle = Выбор домашней страницы
 homePageMigrationDescription = Пожалуйста, выберите домашнюю страницу, которую вы хотите использовать:
-syncBrandShortName = Синхронизацию
+syncBrandShortName = Sync
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/aboutAccounts.dtd firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/aboutAccounts.dtd
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/aboutAccounts.dtd	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/aboutAccounts.dtd	2014-04-10 20:51:57.000000000 +0000
@@ -2,7 +2,7 @@
    - 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/. -->
 
-
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/browser.dtd firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/browser.dtd
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/browser.dtd	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/browser.dtd	2014-04-10 20:51:57.000000000 +0000
@@ -68,12 +68,12 @@
 
 
 
-
-
+
+
 
-
-
-
+
+
+
 
 
 
@@ -497,9 +497,9 @@
 
 
 
-
-
-
+
+
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/devtools/webconsole.properties firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/devtools/webconsole.properties
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/devtools/webconsole.properties	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/devtools/webconsole.properties	2014-04-10 20:51:57.000000000 +0000
@@ -37,7 +37,7 @@
 webConsoleWindowTitleAndURL = Веб-консоль — %S
 webConsoleMixedContentWarning = Смешанное содержимое
 webConsoleMoreInfoLabel = Подробнее
-scratchpad.linkText = Shift+RETURN - Открыть в простом редакторе Javascript
+scratchpad.linkText = Shift+RETURN - Открыть в простом редакторе JavaScript
 gcliterm.instanceLabel = Экземляр %S
 reflow.messageWithNoLink = reflow: %Sмс
 reflow.messageWithLink = reflow: %Sмс\u0020
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/preferences/preferences.properties firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/preferences/preferences.properties
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/preferences/preferences.properties	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/preferences/preferences.properties	2014-04-10 20:51:57.000000000 +0000
@@ -58,7 +58,7 @@
 updateAutoDesktop.label = Автоматически устанавливать обновления через классический %S
 updateAutoDesktop.accessKey = м
 syncUnlink.title = Вы хотите отсоединить ваше устройство?
-syncUnlink.label = Это устройство больше не будет связано с вашей учётной записью Sync. Все ваши персональные данные, как на этом устройстве, так и в вашей учётной записи Sync, останутся в целости.
+syncUnlink.label = Это устройство больше не будет связано с вашей учётной записью Синхронизации. Все ваши персональные данные, как на этом устройстве, так и в вашей учётной записи Синхронизации останутся в целости.
 syncUnlinkConfirm.label = Отсоединить
 featureEnableRequiresRestart = Для включения этого режима необходимо перезапустить %S.
 featureDisableRequiresRestart = Для отключения этого режима необходимо перезапустить %S.
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/preferences/sync.dtd firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/preferences/sync.dtd
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/preferences/sync.dtd	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/preferences/sync.dtd	2014-04-10 20:51:57.000000000 +0000
@@ -12,7 +12,7 @@
 
 
 
-
+
 
 
 
@@ -47,4 +47,4 @@
 
 
 
-
+
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncBrand.dtd firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncBrand.dtd
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncBrand.dtd	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncBrand.dtd	2014-04-10 20:51:57.000000000 +0000
@@ -2,6 +2,6 @@
    - 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/. -->
 
-
+
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncGenericChange.properties firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncGenericChange.properties
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncGenericChange.properties	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncGenericChange.properties	2014-04-10 20:51:57.000000000 +0000
@@ -15,7 +15,7 @@
 change.recoverykey.error = При изменении вашего ключа восстановления произошла ошибка!
 change.recoverykey.success = Ваш ключ восстановления был успешно изменён!
 change.synckey.introText2 = Чтобы обеспечить абсолютную приватность, все ваши данные перед их выгрузкой шифруются. Ключ для расшифровки ваших данных не выгружается.
-change.recoverykey.warningText = Внимание! Изменение ключа сотрёт все данные, хранящиеся на сервере Sync, и выгрузит новые данные, защищённые новым ключом восстановления. Остальные ваши устройства не будут синхронизироваться, пока на этих устройствах не будет введён новый ключ восстановления.
+change.recoverykey.warningText = Внимание! Изменение ключа сотрёт все данные, хранящиеся на сервере Синхронизации, и выгрузит новые данные, защищённые новым ключом восстановления. Остальные ваши устройства не будут синхронизироваться, пока на этих устройствах не будет введён новый ключ восстановления.
 new.recoverykey.label = Ваш ключ восстановления
 new.password.title = Обновление пароля
 new.password.introText = Ваш пароль был отклонён сервером. Пожалуйста, обновите свой пароль.
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncProgress.dtd firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncProgress.dtd
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncProgress.dtd	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncProgress.dtd	2014-04-10 20:51:57.000000000 +0000
@@ -6,6 +6,7 @@
     SYSTEM "chrome://branding/locale/brand.dtd">
     %brandDTD;
 
+
 
 
 
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncSetup.dtd firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncSetup.dtd
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncSetup.dtd	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncSetup.dtd	2014-04-10 20:51:57.000000000 +0000
@@ -7,8 +7,8 @@
 
 
 
-
-
+
+
 
 
 
@@ -56,11 +56,11 @@
 
 
 
-
+
 
 
 
-
+
 
 
 
@@ -76,15 +76,15 @@
 
 
 
-
+
 
-
+
 
 
-
+
 
-
+
 
 
-
+
 
diff -Nru firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncSetup.properties firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncSetup.properties
--- firefox-29.0~b4+build1/l10n/ru/browser/chrome/browser/syncSetup.properties	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/browser/chrome/browser/syncSetup.properties	2014-04-10 20:51:57.000000000 +0000
@@ -2,7 +2,7 @@
 # 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/.
 
-button.syncOptions.label = Настройки Sync
+button.syncOptions.label = Настройки синхронизации
 button.syncOptionsDone.label = Готово
 button.syncOptionsCancel.label = Отмена
 invalidEmail.label = Некорректный адрес эл. почты
@@ -17,11 +17,11 @@
 save.recoverykey.title = Сохранение ключа восстановления
 save.recoverykey.defaultfilename = Ключ восстановления Firefox.html
 newAccount.action.label = Firefox Sync теперь настроен на автоматическую синхронизацию всех данных вашего браузера.
-newAccount.change.label = Вы можете выбрать, что нужно синхронизировать, перейдя в расположенные ниже настройки Sync.
-resetClient.change2.label = Firefox Sync теперь объединит все данные браузера на этом устройстве с данными вашей учётной записи Sync.
-wipeClient.change2.label = Firefox Sync теперь заменит все данные браузера на этом устройстве на данные вашей учётной записи Sync.
-wipeRemote.change2.label = Firefox Sync теперь заменит все данные вашей учётной записи Sync на данные браузера на этом устройстве.
-existingAccount.change.label = Вы можете изменить эту настройку, перейдя в расположенные ниже настройки Sync.
+newAccount.change.label = Вы можете выбрать, что нужно синхронизировать, перейдя в расположенные ниже настройки Синхронизации.
+resetClient.change2.label = Firefox Sync теперь объединит все данные браузера на этом устройстве с данными вашей учётной записи Синхронизации.
+wipeClient.change2.label = Firefox Sync теперь заменит все данные браузера на этом устройстве на данные вашей учётной записи Синхронизации.
+wipeRemote.change2.label = Firefox Sync теперь заменит все данные вашей учётной записи Синхронизации на данные браузера на этом устройстве.
+existingAccount.change.label = Вы можете изменить эту настройку, перейдя в расположенные ниже настройки Синхронизации.
 continue.label = Продолжить
 disconnect.verify.title = Отсоединение
 disconnect.verify.heading = Вы уверены?
diff -Nru firefox-29.0~b4+build1/l10n/ru/dom/chrome/dom/dom.properties firefox-29.0~b6+build1/l10n/ru/dom/chrome/dom/dom.properties
--- firefox-29.0~b4+build1/l10n/ru/dom/chrome/dom/dom.properties	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/dom/chrome/dom/dom.properties	2014-04-10 20:51:57.000000000 +0000
@@ -45,6 +45,7 @@
 CreateAttributeWarning = Метод document.createAttribute() является устаревшим. Для его замены используйте метод element.setAttribute().
 CreateAttributeNSWarning = Метод document.createAttributeNS() является устаревшим. Для его замены используйте метод element.setAttributeNS().
 SpecifiedWarning = Свойство specified в атрибутах является устаревшим. Оно всегда возращает true.
+OwnerElementWarning = Свойство ownerElement в атрибутах является устаревшим.
 NodeValueWarning = Свойство nodeValue в атрибутах является устаревшим. Вместо него используйте value.
 TextContentWarning = Свойство textContent в атрибутах является устаревшим. Вместо него используйте value.
 EnablePrivilegeWarning = Метод enablePrivilege является устаревшим. Для его замены используйте код, выполняющийся с системными правами (напр. расширение).
diff -Nru firefox-29.0~b4+build1/l10n/ru/services/sync/sync.properties firefox-29.0~b6+build1/l10n/ru/services/sync/sync.properties
--- firefox-29.0~b4+build1/l10n/ru/services/sync/sync.properties	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/services/sync/sync.properties	2014-04-10 20:51:57.000000000 +0000
@@ -10,15 +10,15 @@
 remote.opened.label = Все удалённые вкладки уже открыты
 remote.notification.label = Последние вкладки с десктопа будут доступны после их синхронизации
 error.login.title = Ошибка при входе
-error.login.description = При соединении в Sync произошла ошибка: %1$S.  Пожалуйста, попробуйте снова.
+error.login.description = При соединении в Синхронизации произошла ошибка: %1$S.  Пожалуйста, попробуйте снова.
 error.login.prefs.label = Настройки…
 error.login.prefs.accesskey = о
 error.logout.title = Ошибка при выходе
-error.logout.description = При соединении в Sync произошла ошибка. Наверное, это нормально, и вам не нужно об этом беспокоиться.
+error.logout.description = При соединении в Синхронизации произошла ошибка. Наверное, это нормально, и вам не нужно об этом беспокоиться.
 error.sync.title = Ошибка при синхронизации
-error.sync.description = При синхронизации в Sync произошла ошибка: %1$S.  Sync автоматически повторит это действие.
-error.sync.prolonged_failure = В течение последних %1$S дней Sync не удаётся завершить свою работу. Пожалуйста, проверьте свои сетевые настройки.
-error.sync.no_node_found = Сервер Sync сейчас немножко занят, но вам не нужно предпринимать по этому поводу каких-либо действий.  Мы начнём синхронизировать ваши данные при первой возможности!
+error.sync.description = При синхронизации в службе Синхронизации произошла ошибка: %1$S.  Синхронизация автоматически повторит это действие.
+error.sync.prolonged_failure = В течение последних %1$S дней Синхронизации не удаётся завершить свою работу. Пожалуйста, проверьте свои сетевые настройки.
+error.sync.no_node_found = Сервер Синхронизации сейчас немножко занят, но вам не нужно предпринимать по этому поводу каких-либо действий.  Мы начнём синхронизировать ваши данные при первой возможности!
 error.sync.no_node_found.title = Задержка в синхронизации
 error.sync.serverStatusButton.label = Статус сервера
 error.sync.serverStatusButton.accesskey = а
diff -Nru firefox-29.0~b4+build1/l10n/ru/webapprt/webapprt/overrides/dom.properties firefox-29.0~b6+build1/l10n/ru/webapprt/webapprt/overrides/dom.properties
--- firefox-29.0~b4+build1/l10n/ru/webapprt/webapprt/overrides/dom.properties	2014-04-02 09:09:43.000000000 +0000
+++ firefox-29.0~b6+build1/l10n/ru/webapprt/webapprt/overrides/dom.properties	2014-04-10 20:51:57.000000000 +0000
@@ -45,6 +45,7 @@
 CreateAttributeWarning = Метод document.createAttribute() является устаревшим. Для его замены используйте метод element.setAttribute().
 CreateAttributeNSWarning = Метод document.createAttributeNS() является устаревшим. Для его замены используйте метод element.setAttributeNS().
 SpecifiedWarning = Свойство specified в атрибутах является устаревшим. Оно всегда возращает true.
+OwnerElementWarning = Свойство ownerElement в атрибутах является устаревшим.
 NodeValueWarning = Свойство nodeValue в атрибутах является устаревшим. Вместо него используйте value.
 TextContentWarning = Свойство textContent в атрибутах является устаревшим. Вместо него используйте value.
 EnablePrivilegeWarning = Метод enablePrivilege является устаревшим. Для его замены используйте код, выполняющийся с системными правами (напр. расширение).
diff -Nru firefox-29.0~b4+build1/layout/base/nsCSSRendering.cpp firefox-29.0~b6+build1/layout/base/nsCSSRendering.cpp
--- firefox-29.0~b4+build1/layout/base/nsCSSRendering.cpp	2014-04-02 09:03:56.000000000 +0000
+++ firefox-29.0~b6+build1/layout/base/nsCSSRendering.cpp	2014-04-10 20:46:04.000000000 +0000
@@ -1715,12 +1715,6 @@
                                          bool& aDrawBackgroundImage,
                                          bool& aDrawBackgroundColor)
 {
-  if (aFrame->IsThemed()) {
-    aDrawBackgroundColor = false;
-    aDrawBackgroundImage = false;
-    return NS_RGBA(0,0,0,0);
-  }
-
   aDrawBackgroundImage = true;
   aDrawBackgroundColor = true;
 
diff -Nru firefox-29.0~b4+build1/layout/generic/nsLineLayout.cpp firefox-29.0~b6+build1/layout/generic/nsLineLayout.cpp
--- firefox-29.0~b4+build1/layout/generic/nsLineLayout.cpp	2014-04-02 09:03:56.000000000 +0000
+++ firefox-29.0~b6+build1/layout/generic/nsLineLayout.cpp	2014-04-10 20:46:04.000000000 +0000
@@ -1969,8 +1969,8 @@
     // Update minY/maxY for frames that we just placed. Do not factor
     // text into the equation.
     if (pfd->mVerticalAlign == VALIGN_OTHER) {
-      // Text frames and bullets do not contribute to the min/max Y values for
-      // the line (instead their parent frame's font-size contributes).
+      // Text frames do not contribute to the min/max Y values for the
+      // line (instead their parent frame's font-size contributes).
       // XXXrbs -- relax this restriction because it causes text frames
       //           to jam together when 'font-size-adjust' is enabled
       //           and layout is using dynamic font heights (bug 20394)
@@ -1981,15 +1981,17 @@
       //           For example in quirks mode, avoiding empty text frames prevents
       //           "tall" lines around elements like 
since the rules of
// in quirks.css have pseudo text contents with LF in them. +#if 0 + if (!pfd->GetFlag(PFD_ISTEXTFRAME)) { +#else + // Only consider non empty text frames when line-height=normal bool canUpdate = !pfd->GetFlag(PFD_ISTEXTFRAME); - if ((!canUpdate && pfd->GetFlag(PFD_ISNONWHITESPACETEXTFRAME)) || - (canUpdate && (pfd->GetFlag(PFD_ISBULLET) || - nsGkAtoms::bulletFrame == frame->GetType()))) { - // Only consider bullet / non-empty text frames when line-height:normal. + if (!canUpdate && pfd->GetFlag(PFD_ISNONWHITESPACETEXTFRAME)) { canUpdate = frame->StyleText()->mLineHeight.GetUnit() == eStyleUnit_Normal; } if (canUpdate) { +#endif nscoord yTop, yBottom; if (frameSpan) { // For spans that were are now placing, use their position diff -Nru firefox-29.0~b4+build1/layout/reftests/bugs/reftest.list firefox-29.0~b6+build1/layout/reftests/bugs/reftest.list --- firefox-29.0~b4+build1/layout/reftests/bugs/reftest.list 2014-04-02 09:03:58.000000000 +0000 +++ firefox-29.0~b6+build1/layout/reftests/bugs/reftest.list 2014-04-10 20:46:06.000000000 +0000 @@ -1789,7 +1789,7 @@ == 931853-quirks.html 931853-quirks-ref.html fuzzy-if(OSX==10.6,2,30) == 933264-1.html 933264-1-ref.html == 936670-1.svg 936670-1-ref.svg -== 942017.html 942017-ref.html +fails == 942017.html 942017-ref.html # bug 942017 == 942672-1.html 942672-1-ref.html == 953334-win32-clipping.html 953334-win32-clipping-ref.html == 956513-1.svg 956513-1-ref.svg diff -Nru firefox-29.0~b4+build1/layout/style/crashtests/989965-1.html firefox-29.0~b6+build1/layout/style/crashtests/989965-1.html --- firefox-29.0~b4+build1/layout/style/crashtests/989965-1.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-29.0~b6+build1/layout/style/crashtests/989965-1.html 2014-04-10 20:46:08.000000000 +0000 @@ -0,0 +1,9 @@ + + + + diff -Nru firefox-29.0~b4+build1/layout/style/crashtests/crashtests.list firefox-29.0~b6+build1/layout/style/crashtests/crashtests.list --- firefox-29.0~b4+build1/layout/style/crashtests/crashtests.list 2014-04-02 09:04:01.000000000 +0000 +++ firefox-29.0~b6+build1/layout/style/crashtests/crashtests.list 2014-04-10 20:46:08.000000000 +0000 @@ -101,3 +101,4 @@ load 930270-1.html load 930270-2.html load 945048-1.html +load 989965-1.html diff -Nru firefox-29.0~b4+build1/layout/style/nsCSSRuleProcessor.cpp firefox-29.0~b6+build1/layout/style/nsCSSRuleProcessor.cpp --- firefox-29.0~b4+build1/layout/style/nsCSSRuleProcessor.cpp 2014-04-02 09:04:01.000000000 +0000 +++ firefox-29.0~b6+build1/layout/style/nsCSSRuleProcessor.cpp 2014-04-10 20:46:08.000000000 +0000 @@ -2435,6 +2435,19 @@ if (selector->IsPseudoElement()) { PseudoElementRuleProcessorData* pdata = static_cast(data); + if (!pdata->mPseudoElement && selector->mPseudoClassList) { + // We can get here when calling getComputedStyle(aElt, aPseudo) if: + // + // * aPseudo is a pseudo-element that supports a user action + // pseudo-class, like "::-moz-placeholder"; + // * there is a style rule that uses a pseudo-class on this + // pseudo-element in the document, like ::-moz-placeholder:hover; and + // * aElt does not have such a pseudo-element. + // + // We know that the selector can't match, since there is no element for + // the user action pseudo-class to match against. + return; + } if (!StateSelectorMatches(pdata->mPseudoElement, aSelector, nodeContext, data->mTreeMatchContext)) { return; diff -Nru firefox-29.0~b4+build1/layout/style/nsRuleProcessorData.h firefox-29.0~b6+build1/layout/style/nsRuleProcessorData.h --- firefox-29.0~b4+build1/layout/style/nsRuleProcessorData.h 2014-04-02 09:04:01.000000000 +0000 +++ firefox-29.0~b6+build1/layout/style/nsRuleProcessorData.h 2014-04-10 20:46:08.000000000 +0000 @@ -491,11 +491,6 @@ "invalid aPseudoType value"); NS_PRECONDITION(aTreeMatchContext.mForStyling, "Styling here!"); NS_PRECONDITION(aRuleWalker, "Must have rule walker"); - NS_PRECONDITION(!(!aPseudoElement && - nsCSSPseudoElements::PseudoElementSupportsUserActionState - (aPseudoType)), - "aPseudoElement must be specified if the pseudo supports " - ":hover and :active"); } nsCSSPseudoElements::Type mPseudoType; diff -Nru firefox-29.0~b4+build1/memory/mozjemalloc/jemalloc.c firefox-29.0~b6+build1/memory/mozjemalloc/jemalloc.c --- firefox-29.0~b4+build1/memory/mozjemalloc/jemalloc.c 2014-04-02 09:03:56.000000000 +0000 +++ firefox-29.0~b6+build1/memory/mozjemalloc/jemalloc.c 2014-04-10 20:46:04.000000000 +0000 @@ -6995,15 +6995,15 @@ static void ozone_force_lock(malloc_zone_t *zone) { - /* jemalloc locking is taken care of by the normal jemalloc zone. */ + _malloc_prefork(); szone->introspect->force_lock(zone); } static void ozone_force_unlock(malloc_zone_t *zone) { - /* jemalloc locking is taken care of by the normal jemalloc zone. */ szone->introspect->force_unlock(zone); + _malloc_postfork(); } static size_t diff -Nru firefox-29.0~b4+build1/mobile/android/base/background/healthreport/HealthReportConstants.java.in firefox-29.0~b6+build1/mobile/android/base/background/healthreport/HealthReportConstants.java.in --- firefox-29.0~b4+build1/mobile/android/base/background/healthreport/HealthReportConstants.java.in 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/mobile/android/base/background/healthreport/HealthReportConstants.java.in 2014-04-10 20:46:04.000000000 +0000 @@ -11,7 +11,7 @@ public static final String HEALTH_AUTHORITY = "@ANDROID_PACKAGE_NAME@.health"; public static final String GLOBAL_LOG_TAG = "GeckoHealth"; - public static final String USER_AGENT = "Firefox-Android-HealthReport/ (" + GlobalConstants.MOZ_APP_DISPLAYNAME + " " + GlobalConstants.MOZ_APP_VERSION + ")"; + public static final String USER_AGENT = "Firefox-Android-HealthReport/" + GlobalConstants.MOZ_APP_VERSION + " (" + GlobalConstants.MOZ_APP_DISPLAYNAME + ")"; /** * The earliest allowable value for the last ping time, corresponding to May 2nd 2013. diff -Nru firefox-29.0~b4+build1/mobile/android/base/fxa/FxAccountConstants.java.in firefox-29.0~b6+build1/mobile/android/base/fxa/FxAccountConstants.java.in --- firefox-29.0~b4+build1/mobile/android/base/fxa/FxAccountConstants.java.in 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/mobile/android/base/fxa/FxAccountConstants.java.in 2014-04-10 20:46:04.000000000 +0000 @@ -33,7 +33,7 @@ // You must wait 15 minutes after failing an age check before trying to create a different account. public static final long MINIMUM_TIME_TO_WAIT_AFTER_AGE_CHECK_FAILED_IN_MILLISECONDS = 15 * 60 * 1000; - public static final String USER_AGENT = "Firefox-Android-FxAccounts/ (" + GlobalConstants.MOZ_APP_DISPLAYNAME + " " + GlobalConstants.MOZ_APP_VERSION + ")"; + public static final String USER_AGENT = "Firefox-Android-FxAccounts/" + GlobalConstants.MOZ_APP_VERSION + " (" + GlobalConstants.MOZ_APP_DISPLAYNAME + ")"; public static final String ACCOUNT_PICKLE_FILENAME = "fxa.account.json"; Binary files /tmp/M5zCaUcnE1/firefox-29.0~b4+build1/mobile/android/base/resources/drawable-hdpi/progress.9.png and /tmp/UXBA3JIrcd/firefox-29.0~b6+build1/mobile/android/base/resources/drawable-hdpi/progress.9.png differ Binary files /tmp/M5zCaUcnE1/firefox-29.0~b4+build1/mobile/android/base/resources/drawable-mdpi/progress.9.png and /tmp/UXBA3JIrcd/firefox-29.0~b6+build1/mobile/android/base/resources/drawable-mdpi/progress.9.png differ Binary files /tmp/M5zCaUcnE1/firefox-29.0~b4+build1/mobile/android/base/resources/drawable-xhdpi/progress.9.png and /tmp/UXBA3JIrcd/firefox-29.0~b6+build1/mobile/android/base/resources/drawable-xhdpi/progress.9.png differ diff -Nru firefox-29.0~b4+build1/mobile/android/base/resources/values-large-land-v11/styles.xml firefox-29.0~b6+build1/mobile/android/base/resources/values-large-land-v11/styles.xml --- firefox-29.0~b4+build1/mobile/android/base/resources/values-large-land-v11/styles.xml 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/mobile/android/base/resources/values-large-land-v11/styles.xml 2014-04-10 20:46:05.000000000 +0000 @@ -53,15 +53,4 @@ 30dp - - - diff -Nru firefox-29.0~b4+build1/mobile/android/base/webapp/WebappImpl.java firefox-29.0~b6+build1/mobile/android/base/webapp/WebappImpl.java --- firefox-29.0~b4+build1/mobile/android/base/webapp/WebappImpl.java 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/mobile/android/base/webapp/WebappImpl.java 2014-04-10 20:46:05.000000000 +0000 @@ -51,7 +51,10 @@ private View mSplashscreen; + private boolean mIsApk = true; private ApkResources mApkResources; + private String mManifestUrl; + private String mAppName; protected int getIndex() { return 0; } @@ -79,18 +82,36 @@ String packageName = extras.getString("packageName"); if (packageName == null) { - // TODO Migration path! - Log.w(LOGTAG, "Can't find package name for webapp"); - setResult(RESULT_CANCELED); - finish(); - } + Log.w(LOGTAG, "no package name; treating as legacy shortcut"); - try { - mApkResources = new ApkResources(this, packageName); - } catch (NameNotFoundException e) { - Log.e(LOGTAG, "Can't find package for webapp " + packageName, e); - setResult(RESULT_CANCELED); - finish(); + mIsApk = false; + + // Shortcut apps are already installed. + isInstalled = true; + + Uri data = getIntent().getData(); + if (data == null) { + Log.wtf(LOGTAG, "can't get manifest URL from shortcut data"); + setResult(RESULT_CANCELED); + finish(); + return; + } + mManifestUrl = data.toString(); + + String shortcutName = extras.getString(Intent.EXTRA_SHORTCUT_NAME); + mAppName = shortcutName != null ? shortcutName : "Web App"; + } else { + try { + mApkResources = new ApkResources(this, packageName); + } catch (NameNotFoundException e) { + Log.e(LOGTAG, "Can't find package for webapp " + packageName, e); + setResult(RESULT_CANCELED); + finish(); + return; + } + + mManifestUrl = mApkResources.getManifestUrl(); + mAppName = mApkResources.getAppName(); } // start Gecko. @@ -113,7 +134,7 @@ if (!GeckoThread.checkLaunchState(GeckoThread.LaunchState.GeckoRunning) || !isInstalled || isInstallCompleting) { // Show the splash screen if we need to start Gecko, or we need to install this. overridePendingTransition(R.anim.grow_fade_in_center, android.R.anim.fade_out); - showSplash(true); + showSplash(); } else { mSplashscreen.setVisibility(View.GONE); } @@ -134,10 +155,10 @@ } return; } else { - launchWebapp(origin, mApkResources.getManifestUrl(), mApkResources.getAppName()); + launchWebapp(origin); } - setTitle(mApkResources.getAppName()); + setTitle(mAppName); } @Override @@ -150,15 +171,25 @@ // the synthesized APK. // TODO Translate AndroidIntents into WebActivities here. - return mApkResources.getManifestUrl(); + if (mIsApk) { + return mApkResources.getManifestUrl(); + } + + // If this is a legacy shortcut, then we should have been able to get + // the URI from the intent data. Otherwise, we should have been able + // to get it from the APK resources. So we should never get here. + Log.wtf(LOGTAG, "Couldn't get URI from intent nor APK resources"); + return null; } @Override protected void loadStartupTab(String uri) { - // NOP + // Load a tab so it's available for any code that assumes a tab + // before the app tab itself is loaded in BrowserApp._loadWebapp. + super.loadStartupTab("about:blank"); } - private void showSplash(boolean isApk) { + private void showSplash() { // get the favicon dominant color, stored when the app was installed int dominantColor = Allocator.getInstance().getColor(getIndex()); @@ -168,7 +199,7 @@ ImageView image = (ImageView)findViewById(R.id.splashscreen_icon); Drawable d = null; - if (isApk) { + if (mIsApk) { Uri uri = mApkResources.getAppIconUri(); image.setImageURI(uri); d = image.getDrawable(); @@ -232,6 +263,15 @@ case LOCATION_CHANGE: if (Tabs.getInstance().isSelectedTab(tab)) { final String urlString = tab.getURL(); + + // Don't show the titlebar for about:blank, which we load + // into the initial tab we create while waiting for the app + // to load. + if (urlString != null && urlString.equals("about:blank")) { + mTitlebar.setVisibility(View.GONE); + return; + } + final URL url; try { @@ -299,7 +339,7 @@ if (event.equals("Webapps:Postinstall")) { String origin = message.optString("origin"); - launchWebapp(origin, mApkResources.getManifestUrl(), mApkResources.getAppName()); + launchWebapp(origin); } } @@ -308,30 +348,37 @@ Log.e(LOGTAG, "Install errored", exception); } - public void launchWebapp(String origin, String manifestUrl, String name) { + private void setOrigin(String origin) { try { mOrigin = new URL(origin); } catch (java.net.MalformedURLException ex) { - // If we can't parse the this is an app protocol, just settle for not having an origin + // If this isn't an app: URL, just settle for not having an origin. if (!origin.startsWith("app://")) { return; } - // If that failed fall back to the origin stored in the shortcut - Log.i(LOGTAG, "Webapp is not registered with allocator"); - Uri data = getIntent().getData(); - if (data != null) { - try { - mOrigin = new URL(data.toString()); - } catch (java.net.MalformedURLException ex2) { - Log.e(LOGTAG, "Unable to parse intent url: ", ex); + // If that failed fall back to the origin stored in the shortcut. + if (!mIsApk) { + Log.i(LOGTAG, "Origin is app: URL; falling back to intent URL"); + Uri data = getIntent().getData(); + if (data != null) { + try { + mOrigin = new URL(data.toString()); + } catch (java.net.MalformedURLException ex2) { + Log.e(LOGTAG, "Unable to parse intent URL: ", ex); + } } } } + } + + public void launchWebapp(String origin) { + setOrigin(origin); + try { JSONObject launchObject = new JSONObject(); - launchObject.putOpt("url", manifestUrl); - launchObject.putOpt("name", mApkResources.getAppName()); + launchObject.putOpt("url", mManifestUrl); + launchObject.putOpt("name", mAppName); Log.i(LOGTAG, "Trying to launch: " + launchObject); GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Webapps:Load", launchObject.toString())); } catch (JSONException e) { @@ -341,6 +388,12 @@ @Override protected boolean getIsDebuggable() { - return mApkResources.isDebuggable(); + if (mIsApk) { + return mApkResources.isDebuggable(); + } + + // This is a legacy shortcut, which didn't provide a way to determine + // that the app is debuggable, so we say the app is not debuggable. + return false; } } diff -Nru firefox-29.0~b4+build1/mobile/android/chrome/content/aboutApps.js firefox-29.0~b6+build1/mobile/android/chrome/content/aboutApps.js --- firefox-29.0~b4+build1/mobile/android/chrome/content/aboutApps.js 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/mobile/android/chrome/content/aboutApps.js 2014-04-10 20:46:05.000000000 +0000 @@ -12,7 +12,9 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/AppsUtils.jsm"); +#ifdef MOZ_ANDROID_SYNTHAPKS XPCOMUtils.defineLazyModuleGetter(this, "WebappManager", "resource://gre/modules/WebappManager.jsm"); +#endif const DEFAULT_ICON = "chrome://browser/skin/images/default-app-icon.png"; @@ -43,9 +45,11 @@ } catch (ex) {} } +#ifdef MOZ_ANDROID_SYNTHAPKS function checkForUpdates(aEvent) { WebappManager.checkForUpdates(true); } +#endif #ifndef MOZ_ANDROID_SYNTHAPKS var ContextMenus = { @@ -93,7 +97,9 @@ elmts[i].addEventListener("click", openLink, false); } +#ifdef MOZ_ANDROID_SYNTHAPKS document.getElementById("update-item").addEventListener("click", checkForUpdates, false); +#endif navigator.mozApps.mgmt.oninstall = onInstall; navigator.mozApps.mgmt.onuninstall = onUninstall; diff -Nru firefox-29.0~b4+build1/mobile/android/chrome/content/aboutApps.xhtml firefox-29.0~b6+build1/mobile/android/chrome/content/aboutApps.xhtml --- firefox-29.0~b4+build1/mobile/android/chrome/content/aboutApps.xhtml 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/mobile/android/chrome/content/aboutApps.xhtml 2014-04-10 20:46:05.000000000 +0000 @@ -57,12 +57,13 @@
&aboutApps.browseMarketplace;
- +#ifdef MOZ_ANDROID_SYNTHAPKS
&aboutPage.checkForUpdates.link;
+#endif diff -Nru firefox-29.0~b4+build1/mobile/android/chrome/content/aboutFeedback.js firefox-29.0~b6+build1/mobile/android/chrome/content/aboutFeedback.js --- firefox-29.0~b4+build1/mobile/android/chrome/content/aboutFeedback.js 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/mobile/android/chrome/content/aboutFeedback.js 2014-04-10 20:46:05.000000000 +0000 @@ -35,9 +35,9 @@ document.getElementById("open-play-store").addEventListener("click", openPlayStore, false); document.forms[0].addEventListener("submit", sendFeedback, false); - document.getElementById("no-thanks").addEventListener("click", function(evt) { - window.close(); - }, false); + for (let anchor of document.querySelectorAll(".no-thanks")) { + anchor.addEventListener("click", evt => window.close(), false); + } let sumoLink = Services.urlFormatter.formatURLPref("app.support.baseURL"); document.getElementById("sumo-link").href = sumoLink; diff -Nru firefox-29.0~b4+build1/mobile/android/chrome/content/aboutFeedback.xhtml firefox-29.0~b6+build1/mobile/android/chrome/content/aboutFeedback.xhtml --- firefox-29.0~b4+build1/mobile/android/chrome/content/aboutFeedback.xhtml 2014-04-02 09:03:57.000000000 +0000 +++ firefox-29.0~b6+build1/mobile/android/chrome/content/aboutFeedback.xhtml 2014-04-10 20:46:05.000000000 +0000 @@ -35,6 +35,7 @@ @@ -50,7 +51,7 @@ Binary files /tmp/M5zCaUcnE1/firefox-29.0~b4+build1/mobile/android/themes/core/images/update.png and /tmp/UXBA3JIrcd/firefox-29.0~b6+build1/mobile/android/themes/core/images/update.png differ diff -Nru firefox-29.0~b4+build1/modules/libpref/src/init/all.js firefox-29.0~b6+build1/modules/libpref/src/init/all.js --- firefox-29.0~b4+build1/modules/libpref/src/init/all.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/modules/libpref/src/init/all.js 2014-04-10 20:46:05.000000000 +0000 @@ -1910,7 +1910,11 @@ // Player ("Shockwave for Director"). To hide all plugins from enumeration, use // the empty string "" to match no plugin names. To allow all plugins to be // enumerated, use the string "*" to match all plugin names. +#ifdef EARLY_BETA_OR_EARLIER pref("plugins.enumerable_names", "Java,Nexus Personal,QuickTime,Shockwave"); +#else +pref("plugins.enumerable_names", "*"); +#endif // The default value for nsIPluginTag.enabledState (STATE_ENABLED = 2) pref("plugin.default.state", 2); @@ -4334,7 +4338,7 @@ pref("social.whitelist", "https://mozsocial.cliqz.com,https://now.msn.com,https://mixi.jp"); // comma separated list of domain origins (e.g. https://domain.com) for // directory websites (e.g. AMO) that can install providers for other sites -pref("social.directories", "https://activations.mozilla.org"); +pref("social.directories", "https://activations.cdn.mozilla.net"); // remote-install allows any website to activate a provider, with extended UI // notifying user of installation. we can later pref off remote install if // necessary. This does not affect whitelisted and directory installs. diff -Nru firefox-29.0~b4+build1/netwerk/sctp/datachannel/DataChannel.cpp firefox-29.0~b6+build1/netwerk/sctp/datachannel/DataChannel.cpp --- firefox-29.0~b4+build1/netwerk/sctp/datachannel/DataChannel.cpp 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/netwerk/sctp/datachannel/DataChannel.cpp 2014-04-10 20:46:06.000000000 +0000 @@ -43,6 +43,7 @@ #ifdef MOZ_PEERCONNECTION #include "mtransport/runnable_utils.h" #endif +#include "nsProxyRelease.h" #define DATACHANNEL_LOG(args) LOG(args) #include "DataChannel.h" @@ -2338,18 +2339,17 @@ // be deferred until buffer space is available. nsCString temp; uint64_t len; - aBlob->Available(&len); - nsresult rv = NS_ReadInputStreamToString(aBlob, temp, len); - if (NS_FAILED(rv)) { + nsCOMPtr mainThread; + NS_GetMainThread(getter_AddRefs(mainThread)); + + if (NS_FAILED(aBlob->Available(&len)) || + NS_FAILED(NS_ReadInputStreamToString(aBlob, temp, len))) { // Bug 966602: Doesn't return an error to the caller via onerror. - // Let aThis (aka this) be released when we exit out of paranoia - // instead of calling Release() - nsRefPtr self(aThis); + // We must release DataChannelConnection on MainThread to avoid issues (bug 876167) + NS_ProxyRelease(mainThread, aThis.get()); return; } aBlob->Close(); - nsCOMPtr mainThread; - NS_GetMainThread(getter_AddRefs(mainThread)); RUN_ON_THREAD(mainThread, WrapRunnable(nsRefPtr(aThis), &DataChannelConnection::SendBinaryMsg, aStream, temp), diff -Nru firefox-29.0~b4+build1/services/common/tests/unit/head_helpers.js firefox-29.0~b6+build1/services/common/tests/unit/head_helpers.js --- firefox-29.0~b4+build1/services/common/tests/unit/head_helpers.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/common/tests/unit/head_helpers.js 2014-04-10 20:46:09.000000000 +0000 @@ -173,16 +173,15 @@ Cm.nsIComponentRegistrar.unregisterFactory(CID, PACSystemSettings); } -// We want to ensure the legacy provider is used for most of these tests, -// including after a service.startOver. The tests that know how to deal with +// Many tests do service.startOver() and don't expect the provider type to +// change (whereas by default, a startOver will do exactly that so FxA is +// subsequently used). The tests that know how to deal with // the Firefox Accounts identity hack things to ensure that still works. -function setDefaultIdentityConfig() { +function ensureStartOverKeepsIdentity() { Cu.import("resource://gre/modules/Services.jsm"); - Services.prefs.setBoolPref("services.sync.fxaccounts.enabled", false); Services.prefs.setBoolPref("services.sync-testing.startOverKeepIdentity", true); do_register_cleanup(function() { - Services.prefs.clearUserPref("services.sync.fxaccounts.enabled"); Services.prefs.clearUserPref("services.sync-testing.startOverKeepIdentity"); }); } -setDefaultIdentityConfig(); +ensureStartOverKeepsIdentity(); diff -Nru firefox-29.0~b4+build1/services/sync/modules/engines/passwords.js firefox-29.0~b6+build1/services/sync/modules/engines/passwords.js --- firefox-29.0~b4+build1/services/sync/modules/engines/passwords.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/modules/engines/passwords.js 2014-04-10 20:46:09.000000000 +0000 @@ -36,6 +36,28 @@ _recordObj: LoginRec, applyIncomingBatchSize: PASSWORDS_STORE_BATCH_SIZE, + get isAllowed() { + return Cc["@mozilla.org/weave/service;1"] + .getService(Ci.nsISupports) + .wrappedJSObject + .allowPasswordsEngine; + }, + + get enabled() { + // If we are disabled due to !isAllowed(), we must take care to ensure the + // engine has actually had the enabled setter called which reflects this state. + let prefVal = SyncEngine.prototype.__lookupGetter__("enabled").call(this); + let newVal = this.isAllowed && prefVal; + if (newVal != prefVal) { + this.enabled = newVal; + } + return newVal; + }, + + set enabled(val) { + SyncEngine.prototype.__lookupSetter__("enabled").call(this, this.isAllowed && val); + }, + _syncFinish: function _syncFinish() { SyncEngine.prototype._syncFinish.call(this); diff -Nru firefox-29.0~b4+build1/services/sync/modules/service.js firefox-29.0~b6+build1/services/sync/modules/service.js --- firefox-29.0~b4+build1/services/sync/modules/service.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/modules/service.js 2014-04-10 20:46:09.000000000 +0000 @@ -910,7 +910,6 @@ this.identity.finalize().then( () => { this.identity.username = ""; - Services.prefs.clearUserPref("services.sync.fxaccounts.enabled"); this.status.__authManager = null; this.identity = Status._authManager; this._clusterManager = this.identity.createClusterManager(this); diff -Nru firefox-29.0~b4+build1/services/sync/modules/stages/enginesync.js firefox-29.0~b6+build1/services/sync/modules/stages/enginesync.js --- firefox-29.0~b4+build1/services/sync/modules/stages/enginesync.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/modules/stages/enginesync.js 2014-04-10 20:46:09.000000000 +0000 @@ -254,25 +254,37 @@ continue; } - if (Svc.Prefs.get("engineStatusChanged." + engine.prefName, false)) { - // The engine was disabled locally. Wipe server data and - // disable it everywhere. - this._log.trace("Wiping data for " + engineName + " engine."); - engine.wipeServer(); - delete meta.payload.engines[engineName]; - meta.changed = true; // TODO: Should we still do this? - - // We also here mark the engine as declined, because the pref - // was explicitly changed to false. - // This will be reflected in meta/global in the next stage. - this._log.trace("Engine " + engineName + " was disabled locally. Marking as declined."); - toDecline.add(engineName); - } else { - // The engine was enabled remotely. Enable it locally. + let attemptedEnable = false; + // If the engine was enabled remotely, enable it locally. + if (!Svc.Prefs.get("engineStatusChanged." + engine.prefName, false)) { this._log.trace("Engine " + engineName + " was enabled. Marking as non-declined."); toUndecline.add(engineName); this._log.trace(engineName + " engine was enabled remotely."); engine.enabled = true; + // Note that setting engine.enabled to true might not have worked for + // the password engine if a master-password is enabled. However, it's + // still OK that we added it to undeclined - the user *tried* to enable + // it remotely - so it still winds up as not being flagged as declined + // even though it's disabled remotely. + attemptedEnable = true; + } + + // If either the engine was disabled locally or enabling the engine + // failed (see above re master-password) then wipe server data and + // disable it everywhere. + if (!engine.enabled) { + this._log.trace("Wiping data for " + engineName + " engine."); + engine.wipeServer(); + delete meta.payload.engines[engineName]; + meta.changed = true; // the new enabled state must propagate + // We also here mark the engine as declined, because the pref + // was explicitly changed to false - unless we tried, and failed, + // to enable it - in which case we leave the declined state alone. + if (!attemptedEnable) { + // This will be reflected in meta/global in the next stage. + this._log.trace("Engine " + engineName + " was disabled locally. Marking as declined."); + toDecline.add(engineName); + } } } @@ -290,8 +302,8 @@ } } - this.service.engineManager.decline(toDecline); - this.service.engineManager.undecline(toUndecline); + engineManager.decline(toDecline); + engineManager.undecline(toUndecline); Svc.Prefs.resetBranch("engineStatusChanged."); this.service._ignorePrefObserver = false; diff -Nru firefox-29.0~b4+build1/services/sync/modules/util.js firefox-29.0~b6+build1/services/sync/modules/util.js --- firefox-29.0~b4+build1/services/sync/modules/util.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/modules/util.js 2014-04-10 20:46:09.000000000 +0000 @@ -555,6 +555,22 @@ return function innerBind() { return method.apply(object, arguments); }; }, + /** + * Is there a master password configured, regardless of current lock state? + */ + mpEnabled: function mpEnabled() { + let modules = Cc["@mozilla.org/security/pkcs11moduledb;1"] + .getService(Ci.nsIPKCS11ModuleDB); + let sdrSlot = modules.findSlotByName(""); + let status = sdrSlot.status; + let slots = Ci.nsIPKCS11Slot; + + return status != slots.SLOT_UNINITIALIZED && status != slots.SLOT_READY; + }, + + /** + * Is there a master password configured and currently locked? + */ mpLocked: function mpLocked() { let modules = Cc["@mozilla.org/security/pkcs11moduledb;1"] .getService(Ci.nsIPKCS11ModuleDB); diff -Nru firefox-29.0~b4+build1/services/sync/modules-testing/utils.js firefox-29.0~b6+build1/services/sync/modules-testing/utils.js --- firefox-29.0~b4+build1/services/sync/modules-testing/utils.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/modules-testing/utils.js 2014-04-10 20:46:09.000000000 +0000 @@ -7,6 +7,7 @@ this.EXPORTED_SYMBOLS = [ "btoa", // It comes from a module import. "encryptPayload", + "ensureLegacyIdentityManager", "setBasicCredentials", "makeIdentityConfig", "configureFxAccountIdentity", @@ -49,6 +50,17 @@ CommonUtils.namedTimer(wait, 150, {}, "timer"); } +/** + * Ensure Sync is configured with the "legacy" identity provider. + */ +this.ensureLegacyIdentityManager = function() { + let ns = {}; + Cu.import("resource://services-sync/service.js", ns); + + Status.__authManager = ns.Service.identity = new IdentityManager(); + ns.Service._clusterManager = ns.Service.identity.createClusterManager(ns.Service); +} + this.setBasicCredentials = function setBasicCredentials(username, password, syncKey) { let ns = {}; @@ -170,7 +182,7 @@ let ns = {}; Cu.import("resource://services-sync/service.js", ns); - let auth = ns.Service.identity; + ensureLegacyIdentityManager(); let config = makeIdentityConfig(); // XXX - hacks for the sync identity provider. if (username) @@ -233,7 +245,7 @@ test.add_task(function() { note("sync"); let oldIdentity = Status._authManager; - Status.__authManager = ns.Service.identity = new IdentityManager(); + ensureLegacyIdentityManager(); yield testFunction(); Status.__authManager = ns.Service.identity = oldIdentity; }); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_bookmark_record.js firefox-29.0~b6+build1/services/sync/tests/unit/test_bookmark_record.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_bookmark_record.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_bookmark_record.js 2014-04-10 20:46:09.000000000 +0000 @@ -7,6 +7,7 @@ Cu.import("resource://services-sync/record.js"); Cu.import("resource://services-sync/service.js"); Cu.import("resource://services-sync/util.js"); +Cu.import("resource://testing-common/services/sync/utils.js"); function prepareBookmarkItem(collection, id) { let b = new Bookmark(collection, id); @@ -15,6 +16,7 @@ } function run_test() { + ensureLegacyIdentityManager(); Service.identity.username = "john@example.com"; Service.identity.syncKey = "abcdeabcdeabcdeabcdeabcdea"; generateNewKeys(Service.collectionKeys); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_clients_engine.js firefox-29.0~b6+build1/services/sync/tests/unit/test_clients_engine.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_clients_engine.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_clients_engine.js 2014-04-10 20:46:09.000000000 +0000 @@ -81,6 +81,7 @@ } try { + ensureLegacyIdentityManager(); let passphrase = "abcdeabcdeabcdeabcdeabcdea"; Service.serverURL = server.baseURI; Service.login("foo", "ilovejane", passphrase); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_clients_escape.js firefox-29.0~b6+build1/services/sync/tests/unit/test_clients_escape.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_clients_escape.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_clients_escape.js 2014-04-10 20:46:09.000000000 +0000 @@ -5,10 +5,12 @@ Cu.import("resource://services-sync/record.js"); Cu.import("resource://services-sync/service.js"); Cu.import("resource://services-sync/util.js"); +Cu.import("resource://testing-common/services/sync/utils.js"); function run_test() { _("Set up test fixtures."); + ensureLegacyIdentityManager(); Service.identity.username = "john@example.com"; Service.clusterURL = "http://fakebase/"; let baseUri = "http://fakebase/1.1/foo/storage/"; diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_corrupt_keys.js firefox-29.0~b6+build1/services/sync/tests/unit/test_corrupt_keys.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_corrupt_keys.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_corrupt_keys.js 2014-04-10 20:46:09.000000000 +0000 @@ -206,6 +206,8 @@ let logger = Log.repository.rootLogger; Log.repository.rootLogger.addAppender(new Log.DumpAppender()); + ensureLegacyIdentityManager(); + run_next_test(); } diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_errorhandler.js firefox-29.0~b6+build1/services/sync/tests/unit/test_errorhandler.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_errorhandler.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_errorhandler.js 2014-04-10 20:46:09.000000000 +0000 @@ -55,6 +55,8 @@ Log.repository.getLogger("Sync.SyncScheduler").level = Log.Level.Trace; Log.repository.getLogger("Sync.ErrorHandler").level = Log.Level.Trace; + ensureLegacyIdentityManager(); + run_next_test(); } diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_fxa_startOver.js firefox-29.0~b6+build1/services/sync/tests/unit/test_fxa_startOver.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_fxa_startOver.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_fxa_startOver.js 2014-04-10 20:46:09.000000000 +0000 @@ -15,10 +15,10 @@ let oldValue = Services.prefs.getBoolPref("services.sync-testing.startOverKeepIdentity", true); Services.prefs.setBoolPref("services.sync-testing.startOverKeepIdentity", false); + ensureLegacyIdentityManager(); yield configureIdentity({username: "johndoe"}); - // The pref that forces FxA identities should not be set. - do_check_false(Services.prefs.getBoolPref("services.sync.fxaccounts.enabled")); - // And the boolean flag on the xpcom service should reflect this. + + // The boolean flag on the xpcom service should reflect a legacy provider. let xps = Cc["@mozilla.org/weave/service;1"] .getService(Components.interfaces.nsISupports) .wrappedJSObject; @@ -43,9 +43,7 @@ Service.startOver(); yield deferred.promise; // wait for the observer to fire. - // should have reset the pref that indicates if FxA is enabled. - do_check_true(Services.prefs.getBoolPref("services.sync.fxaccounts.enabled")); - // the xpcom service should agree FxA is enabled. + // the xpcom service should indicate FxA is enabled. do_check_true(xps.fxAccountsEnabled); // should have swapped identities. do_check_true(Service.identity instanceof BrowserIDManager); @@ -57,6 +55,5 @@ do_check_neq(oldClusterManager, Service._clusterManager); // reset the world. - Services.prefs.setBoolPref("services.sync.fxaccounts.enabled", false); Services.prefs.setBoolPref("services.sync-testing.startOverKeepIdentity", oldValue); }); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_healthreport.js firefox-29.0~b6+build1/services/sync/tests/unit/test_healthreport.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_healthreport.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_healthreport.js 2014-04-10 20:46:09.000000000 +0000 @@ -14,15 +14,6 @@ function run_test() { initTestLogging(); - // A head JS file always sets the - // services.sync.fxaccounts.enabled pref. This prevents us from testing - // pristine profile conditions and likely indicates there isn't test - // coverage of the Sync service's fxAccountsEnabled property. Check - // that pre-condition and hack around it. - let branch = new Preferences("services.sync."); - Assert.ok(branch.isSet("fxaccounts.enabled"), "Check precondition"); - branch.reset("fxaccounts.enabled"); - run_next_test(); } diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_hmac_error.js firefox-29.0~b6+build1/services/sync/tests/unit/test_hmac_error.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_hmac_error.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_hmac_error.js 2014-04-10 20:46:09.000000000 +0000 @@ -21,6 +21,7 @@ hmacErrorCount = 0; // Do not instantiate SyncTestingInfrastructure; we need real crypto. + ensureLegacyIdentityManager(); setBasicCredentials("foo", "foo", "aabcdeabcdeabcdeabcdeabcde"); // Make sure RotaryEngine is the only one we sync. diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_jpakeclient.js firefox-29.0~b6+build1/services/sync/tests/unit/test_jpakeclient.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_jpakeclient.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_jpakeclient.js 2014-04-10 20:46:09.000000000 +0000 @@ -186,6 +186,7 @@ // Simulate Sync setup with credentials in place. We want to make // sure the J-PAKE requests don't include those data. + ensureLegacyIdentityManager(); setBasicCredentials("johndoe", "ilovejane"); initTestLogging("Trace"); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_password_mpenabled.js firefox-29.0~b6+build1/services/sync/tests/unit/test_password_mpenabled.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_password_mpenabled.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_password_mpenabled.js 2014-04-10 20:46:09.000000000 +0000 @@ -0,0 +1,137 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +Cu.import("resource://gre/modules/Log.jsm"); +Cu.import("resource://services-sync/stages/enginesync.js"); +Cu.import("resource://services-sync/util.js"); +Cu.import("resource://services-sync/engines/passwords.js"); +Cu.import("resource://services-sync/service.js"); +Cu.import("resource://testing-common/services/sync/utils.js"); + +function run_test() { + initTestLogging("Trace"); + run_next_test(); +} + +add_test(function test_simple() { + ensureLegacyIdentityManager(); + // Stub fxAccountsEnabled + let xpcs = Cc["@mozilla.org/weave/service;1"] + .getService(Components.interfaces.nsISupports) + .wrappedJSObject; + let fxaEnabledGetter = xpcs.__lookupGetter__("fxAccountsEnabled"); + xpcs.__defineGetter__("fxAccountsEnabled", () => true); + + // Stub mpEnabled. + let mpEnabledF = Utils.mpEnabled; + let mpEnabled = false; + Utils.mpEnabled = function() mpEnabled; + + let manager = Service.engineManager; + + Service.engineManager.register(PasswordEngine); + let engine = Service.engineManager.get("passwords"); + let wipeCount = 0; + let engineWipeServerF = engine.wipeServer; + engine.wipeServer = function() { + ++wipeCount; + } + + // A server for the metadata. + let server = new SyncServer(); + let johndoe = server.registerUser("johndoe", "password"); + johndoe.createContents({ + meta: {global: {engines: {passwords: {version: engine.version, + syncID: engine.syncID}}}}, + crypto: {}, + clients: {} + }); + server.start(); + setBasicCredentials("johndoe", "password", "abcdeabcdeabcdeabcdeabcdea"); + Service.serverURL = server.baseURI; + Service.clusterURL = server.baseURI; + + let engineSync = new EngineSynchronizer(Service); + engineSync._log.level = Log.Level.Trace; + + function assertEnabled(expected, message) { + Assert.strictEqual(engine.enabled, expected, message); + // The preference *must* reflect the actual state. + Assert.strictEqual(Svc.Prefs.get("engine." + engine.prefName), expected, + message + " (pref should match enabled state)"); + } + + try { + assertEnabled(true, "password engine should be enabled by default") + let engineMeta = Service.recordManager.get(engine.metaURL); + // This engine should be in the meta/global + Assert.notStrictEqual(engineMeta.payload.engines[engine.name], undefined, + "The engine should appear in the metadata"); + Assert.ok(!engineMeta.changed, "the metadata for the password engine hasn't changed"); + + // (pretend to) enable a master-password + mpEnabled = true; + // The password engine should be locally disabled... + assertEnabled(false, "if mp is locked the engine should be disabled"); + // ...but not declined. + Assert.ok(!manager.isDeclined("passwords"), "password engine is not declined"); + // Next time a sync would happen, we call _updateEnabledEngines(), which + // would remove the engine from the metadata - call that now. + engineSync._updateEnabledEngines(); + // The global meta should no longer list the engine. + engineMeta = Service.recordManager.get(engine.metaURL); + Assert.strictEqual(engineMeta.payload.engines[engine.name], undefined, + "The engine should have vanished"); + // And we should have wiped the server data. + Assert.strictEqual(wipeCount, 1, "wipeServer should have been called"); + + // Now simulate an incoming meta/global indicating the engine should be + // enabled. We should fail to actually enable it - the pref should remain + // false and we wipe the server for anything another device might have + // stored. + let meta = { + payload: { + engines: { + "passwords": {"version":1,"syncID":"yfBi2v7PpFO2"}, + }, + }, + }; + engineSync._updateEnabledFromMeta(meta, 3, manager); + Assert.strictEqual(wipeCount, 2, "wipeServer should have been called"); + Assert.ok(!manager.isDeclined("passwords"), "password engine is not declined"); + assertEnabled(false, "engine still not enabled locally"); + + // Let's turn the MP off - but *not* re-enable it locally. + mpEnabled = false; + // Just disabling the MP isn't enough to force it back to enabled. + assertEnabled(false, "engine still not enabled locally"); + // Another incoming metadata record with the engine enabled should cause + // it to be enabled locally. + meta = { + payload: { + engines: { + "passwords": 1, + }, + }, + }; + engineSync._updateEnabledFromMeta(meta, 3, manager); + Assert.strictEqual(wipeCount, 2, "wipeServer should *not* have been called again"); + Assert.ok(!manager.isDeclined("passwords"), "password engine is not declined"); + // It should be enabled locally. + assertEnabled(true, "engine now enabled locally"); + // Next time a sync starts it should magically re-appear in our meta/global + engine._syncStartup(); + //engineSync._updateEnabledEngines(); + engineMeta = Service.recordManager.get(engine.metaURL); + Assert.equal(engineMeta.payload.engines[engine.name].version, engine.version, + "The engine should re-appear in the metadata"); + } finally { + // restore the damage we did above... + engine.wipeServer = engineWipeServerF; + engine._store.wipe(); + // Un-stub mpEnabled and fxAccountsEnabled + Utils.mpEnabled = mpEnabledF; + xpcs.__defineGetter__("fxAccountsEnabled", fxaEnabledGetter); + server.stop(run_next_test); + } +}); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_records_crypto.js firefox-29.0~b6+build1/services/sync/tests/unit/test_records_crypto.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_records_crypto.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_records_crypto.js 2014-04-10 20:46:09.000000000 +0000 @@ -8,6 +8,7 @@ Cu.import("resource://services-sync/resource.js"); Cu.import("resource://services-sync/service.js"); Cu.import("resource://services-sync/util.js"); +Cu.import("resource://testing-common/services/sync/utils.js"); let cryptoWrap; @@ -30,6 +31,7 @@ let server; do_test_pending(); + ensureLegacyIdentityManager(); Service.identity.username = "john@example.com"; Service.identity.syncKey = "a-abcde-abcde-abcde-abcde-abcde"; let keyBundle = Service.identity.syncKeyBundle; diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_records_wbo.js firefox-29.0~b6+build1/services/sync/tests/unit/test_records_wbo.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_records_wbo.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_records_wbo.js 2014-04-10 20:46:09.000000000 +0000 @@ -6,6 +6,7 @@ Cu.import("resource://services-sync/resource.js"); Cu.import("resource://services-sync/service.js"); Cu.import("resource://services-sync/util.js"); +Cu.import("resource://testing-common/services/sync/utils.js"); function test_toJSON() { @@ -78,6 +79,7 @@ function run_test() { initTestLogging("Trace"); + ensureLegacyIdentityManager(); test_toJSON(); test_fetch(); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_resource_ua.js firefox-29.0~b6+build1/services/sync/tests/unit/test_resource_ua.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_resource_ua.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_resource_ua.js 2014-04-10 20:46:09.000000000 +0000 @@ -31,6 +31,7 @@ "/1.1/johndoe/storage/meta/global": uaHandler(meta_global.handler()), }); + ensureLegacyIdentityManager(); setBasicCredentials("johndoe", "ilovejane"); Service.serverURL = server.baseURI + "/"; Service.clusterURL = server.baseURI + "/"; diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_sendcredentials_controller.js firefox-29.0~b6+build1/services/sync/tests/unit/test_sendcredentials_controller.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_sendcredentials_controller.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_sendcredentials_controller.js 2014-04-10 20:46:09.000000000 +0000 @@ -8,6 +8,7 @@ Cu.import("resource://testing-common/services/sync/utils.js"); function run_test() { + ensureLegacyIdentityManager(); setBasicCredentials("johndoe", "ilovejane", Utils.generatePassphrase()); Service.serverURL = "http://weave.server/"; diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_attributes.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_attributes.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_attributes.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_attributes.js 2014-04-10 20:46:09.000000000 +0000 @@ -5,10 +5,12 @@ Cu.import("resource://services-sync/service.js"); Cu.import("resource://services-sync/util.js"); Cu.import("resource://testing-common/services/sync/fakeservices.js"); +Cu.import("resource://testing-common/services/sync/utils.js"); function test_urls() { _("URL related Service properties correspond to preference settings."); try { + ensureLegacyIdentityManager(); do_check_true(!!Service.serverURL); // actual value may change do_check_eq(Service.clusterURL, ""); do_check_eq(Service.userBaseURL, undefined); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_changePassword.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_changePassword.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_changePassword.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_changePassword.js 2014-04-10 20:46:09.000000000 +0000 @@ -13,6 +13,8 @@ Log.repository.getLogger("Sync.Resource").level = Log.Level.Trace; Log.repository.getLogger("Sync.Service").level = Log.Level.Trace; + ensureLegacyIdentityManager(); + run_next_test(); } diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_checkAccount.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_checkAccount.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_checkAccount.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_checkAccount.js 2014-04-10 20:46:09.000000000 +0000 @@ -7,6 +7,7 @@ function run_test() { do_test_pending(); + ensureLegacyIdentityManager(); let server = httpd_setup({ "/user/1.0/johndoe": httpd_handler(200, "OK", "1"), "/user/1.0/janedoe": httpd_handler(200, "OK", "0"), diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_cluster.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_cluster.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_cluster.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_cluster.js 2014-04-10 20:46:09.000000000 +0000 @@ -18,11 +18,12 @@ add_test(function test_findCluster() { _("Test Service._findCluster()"); let server; + ensureLegacyIdentityManager(); try { _("_findCluster() throws on network errors (e.g. connection refused)."); do_check_throws(function() { Service.serverURL = "http://dummy:9000/"; - Service.identify.account = "johndoe"; + Service.identity.account = "johndoe"; Service._clusterManager._findCluster(); }); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_detect_upgrade.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_detect_upgrade.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_detect_upgrade.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_detect_upgrade.js 2014-04-10 20:46:09.000000000 +0000 @@ -43,6 +43,8 @@ "/1.1/johndoe/storage/prefs": new ServerCollection().handler() }); + ensureLegacyIdentityManager(); + try { _("Set up some tabs."); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_getStorageInfo.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_getStorageInfo.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_getStorageInfo.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_getStorageInfo.js 2014-04-10 20:46:09.000000000 +0000 @@ -16,6 +16,7 @@ Log.repository.getLogger("Sync.StorageRequest").level = Log.Level.Trace; initTestLogging(); + ensureLegacyIdentityManager(); setBasicCredentials("johndoe", "ilovejane"); run_next_test(); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_login.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_login.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_login.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_login.js 2014-04-10 20:46:09.000000000 +0000 @@ -72,6 +72,7 @@ try { _("Force the initial state."); + ensureLegacyIdentityManager(); Service.status.service = STATUS_OK; do_check_eq(Service.status.service, STATUS_OK); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_passwordUTF8.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_passwordUTF8.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_passwordUTF8.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_passwordUTF8.js 2014-04-10 20:46:09.000000000 +0000 @@ -58,6 +58,8 @@ let upd = collectionsHelper.with_updated_collection; let collections = collectionsHelper.collections; + ensureLegacyIdentityManager(); + do_test_pending(); let server = httpd_setup({ "/1.1/johndoe/info/collections": login_handling(collectionsHelper.handler), diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_persistLogin.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_persistLogin.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_persistLogin.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_persistLogin.js 2014-04-10 20:46:09.000000000 +0000 @@ -9,6 +9,7 @@ function run_test() { try { // Ensure we have a blank slate to start. + ensureLegacyIdentityManager(); Services.logins.removeAllLogins(); setBasicCredentials("johndoe", "ilovejane", "abbbbbcccccdddddeeeeefffff"); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_sync_remoteSetup.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_sync_remoteSetup.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_sync_remoteSetup.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_sync_remoteSetup.js 2014-04-10 20:46:09.000000000 +0000 @@ -65,6 +65,7 @@ try { _("Log in."); + ensureLegacyIdentityManager(); Service.serverURL = server.baseURI; _("Checking Status.sync with no credentials."); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_verifyLogin.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_verifyLogin.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_verifyLogin.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_verifyLogin.js 2014-04-10 20:46:09.000000000 +0000 @@ -30,6 +30,7 @@ let logger = Log.repository.rootLogger; Log.repository.rootLogger.addAppender(new Log.DumpAppender()); + ensureLegacyIdentityManager(); // This test expects a clean slate -- no saved passphrase. Services.logins.removeAllLogins(); let johnHelper = track_collections_helper(); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_service_wipeClient.js firefox-29.0~b6+build1/services/sync/tests/unit/test_service_wipeClient.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_service_wipeClient.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_service_wipeClient.js 2014-04-10 20:46:09.000000000 +0000 @@ -82,6 +82,7 @@ _("Ensure that credentials are preserved if client is wiped."); // Required for wipeClient(). + ensureLegacyIdentityManager(); Service.identity.account = "testaccount"; Service.identity.basicPassword = "testpassword"; Service.clusterURL = "http://dummy:9000/"; diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_status_checkSetup.js firefox-29.0~b6+build1/services/sync/tests/unit/test_status_checkSetup.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_status_checkSetup.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_status_checkSetup.js 2014-04-10 20:46:09.000000000 +0000 @@ -4,9 +4,11 @@ Cu.import("resource://services-sync/constants.js"); Cu.import("resource://services-sync/status.js"); Cu.import("resource://services-sync/util.js"); +Cu.import("resource://testing-common/services/sync/utils.js"); function run_test() { initTestLogging("Trace"); + ensureLegacyIdentityManager(); try { _("Ensure fresh config."); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_syncscheduler.js firefox-29.0~b6+build1/services/sync/tests/unit/test_syncscheduler.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_syncscheduler.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_syncscheduler.js 2014-04-10 20:46:09.000000000 +0000 @@ -85,6 +85,13 @@ Log.repository.getLogger("Sync.Service").level = Log.Level.Trace; Log.repository.getLogger("Sync.scheduler").level = Log.Level.Trace; + // The scheduler checks Weave.fxaEnabled to determine whether to use + // FxA defaults or legacy defaults. As .fxaEnabled checks the username, we + // set a username here then reset the default to ensure they are used. + ensureLegacyIdentityManager(); + setBasicCredentials("johndoe"); + scheduler.setDefaults(); + run_next_test(); } diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_syncstoragerequest.js firefox-29.0~b6+build1/services/sync/tests/unit/test_syncstoragerequest.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_syncstoragerequest.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_syncstoragerequest.js 2014-04-10 20:46:09.000000000 +0000 @@ -12,6 +12,8 @@ Log.repository.getLogger("Sync.RESTRequest").level = Log.Level.Trace; initTestLogging(); + ensureLegacyIdentityManager(); + run_next_test(); } diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/test_upgrade_old_sync_key.js firefox-29.0~b6+build1/services/sync/tests/unit/test_upgrade_old_sync_key.js --- firefox-29.0~b4+build1/services/sync/tests/unit/test_upgrade_old_sync_key.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/test_upgrade_old_sync_key.js 2014-04-10 20:46:09.000000000 +0000 @@ -4,11 +4,13 @@ Cu.import("resource://services-sync/constants.js"); Cu.import("resource://services-sync/service.js"); Cu.import("resource://services-sync/util.js"); +Cu.import("resource://testing-common/services/sync/utils.js"); // Test upgrade of a dashed old-style sync key. function run_test() { const PBKDF2_KEY_BYTES = 16; initTestLogging("Trace"); + ensureLegacyIdentityManager(); let passphrase = "abcde-abcde-abcde-abcde"; do_check_false(Utils.isPassphrase(passphrase)); diff -Nru firefox-29.0~b4+build1/services/sync/tests/unit/xpcshell.ini firefox-29.0~b6+build1/services/sync/tests/unit/xpcshell.ini --- firefox-29.0~b4+build1/services/sync/tests/unit/xpcshell.ini 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tests/unit/xpcshell.ini 2014-04-10 20:46:09.000000000 +0000 @@ -169,3 +169,5 @@ [test_healthreport.js] skip-if = ! healthreport + +[test_password_mpenabled.js] diff -Nru firefox-29.0~b4+build1/services/sync/tps/extensions/tps/resource/tps.jsm firefox-29.0~b6+build1/services/sync/tps/extensions/tps/resource/tps.jsm --- firefox-29.0~b4+build1/services/sync/tps/extensions/tps/resource/tps.jsm 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/tps/extensions/tps/resource/tps.jsm 2014-04-10 20:46:09.000000000 +0000 @@ -95,11 +95,10 @@ * Check if the Firefox Accounts feature is enabled */ get fxaccounts_enabled() { - try { - return Services.prefs.getBoolPref("services.sync.fxaccounts.enabled"); - } catch (e) { - return false; - } + let service = Cc["@mozilla.org/weave/service;1"] + .getService(Components.interfaces.nsISupports) + .wrappedJSObject; + return service.fxAccountsEnabled; }, DumpError: function (msg) { diff -Nru firefox-29.0~b4+build1/services/sync/Weave.js firefox-29.0~b6+build1/services/sync/Weave.js --- firefox-29.0~b4+build1/services/sync/Weave.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/services/sync/Weave.js 2014-04-10 20:46:09.000000000 +0000 @@ -98,23 +98,24 @@ * @return bool */ get fxAccountsEnabled() { - // work out what identity manager to use. This is stored in a preference; - // if the preference exists, we trust it. - let fxAccountsEnabled; try { - fxAccountsEnabled = Services.prefs.getBoolPref("services.sync.fxaccounts.enabled"); + // Old sync guarantees '@' will never appear in the username while FxA + // uses the FxA email address - so '@' is the flag we use. + let username = Services.prefs.getCharPref(SYNC_PREFS_BRANCH + "username"); + return !username || username.contains('@'); } catch (_) { - // That pref doesn't exist - so let's assume this is a first-run. - // If sync already appears configured, we assume it's for the legacy - // provider. - let prefs = Services.prefs.getBranch(SYNC_PREFS_BRANCH); - fxAccountsEnabled = !prefs.prefHasUserValue("username"); - Services.prefs.setBoolPref("services.sync.fxaccounts.enabled", fxAccountsEnabled); + return true; // No username == only allow FxA to be configured. } - // Currently we don't support toggling this pref after initialization - - // except when sync is reset - but this 1 exception is enough that we can't - // cache the value. - return fxAccountsEnabled; + }, + + /** + * Returns whether the password engine is allowed. We explicitly disallow + * the password engine when a master password is used to ensure those can't + * be accessed without the master key. + */ + get allowPasswordsEngine() { + // This doesn't apply to old-style sync, it's only an issue for FxA. + return !this.fxAccountsEnabled || !Utils.mpEnabled(); }, /** diff -Nru firefox-29.0~b4+build1/testing/mochitest/b2g-debug.json firefox-29.0~b6+build1/testing/mochitest/b2g-debug.json --- firefox-29.0~b4+build1/testing/mochitest/b2g-debug.json 2014-04-02 09:04:01.000000000 +0000 +++ firefox-29.0~b6+build1/testing/mochitest/b2g-debug.json 2014-04-10 20:46:09.000000000 +0000 @@ -262,6 +262,8 @@ "docshell/test/navigation/test_not-opener.html":"", "docshell/test/navigation/test_reserved.html":"", "docshell/test/test_bug413310.html":"", + "docshell/test/test_bug668513.html":"", + "docshell/test/test_framedhistoryframes.html":"", "dom/imptests/html/webgl":"", "dom/battery/test/test_battery_basics.html":"", diff -Nru firefox-29.0~b4+build1/testing/mochitest/b2g-desktop.json firefox-29.0~b6+build1/testing/mochitest/b2g-desktop.json --- firefox-29.0~b4+build1/testing/mochitest/b2g-desktop.json 2014-04-02 09:04:01.000000000 +0000 +++ firefox-29.0~b6+build1/testing/mochitest/b2g-desktop.json 2014-04-10 20:46:09.000000000 +0000 @@ -524,9 +524,11 @@ "docshell/test/test_bug637644.html": "Bug 931116, b2g desktop specific, initial triage", "docshell/test/test_bug640387_1.html": "Bug 931116, b2g desktop specific, initial triage", "docshell/test/test_bug660404.html": "Bug 931116, b2g desktop specific, initial triage", + "docshell/test/test_bug668513.html": "Bug 931116, b2g desktop specific, initial triage", "docshell/test/test_bug669671.html": "Bug 931116, b2g desktop specific, initial triage", "docshell/test/test_bug680257.html": "Bug 931116, b2g desktop specific, initial triage", "docshell/test/test_bug728939.html": "Bug 931116, b2g desktop specific, initial triage", + "docshell/test/test_framedhistoryframes.html": "Bug 931116, b2g desktop specific, initial triage", "docshell/test/test_windowedhistoryframes.html": "Bug 931116, b2g desktop specific, initial triage", "dom/alarm/test/test_alarm_add_data.html": "Bug 931116, b2g desktop specific, initial triage", "dom/alarm/test/test_alarm_add_date.html": "Bug 931116, b2g desktop specific, initial triage", diff -Nru firefox-29.0~b4+build1/testing/mochitest/b2g.json firefox-29.0~b6+build1/testing/mochitest/b2g.json --- firefox-29.0~b4+build1/testing/mochitest/b2g.json 2014-04-02 09:04:01.000000000 +0000 +++ firefox-29.0~b6+build1/testing/mochitest/b2g.json 2014-04-10 20:46:09.000000000 +0000 @@ -225,6 +225,8 @@ "docshell/test/navigation/test_bug270414.html":"", "docshell/test/navigation/test_not-opener.html":"", "docshell/test/test_bug413310.html":"", + "docshell/test/test_bug668513.html":"", + "docshell/test/test_framedhistoryframes.html":"", "dom/imptests/html/webgl":"", diff -Nru firefox-29.0~b4+build1/testing/tps/tps/testrunner.py firefox-29.0~b6+build1/testing/tps/tps/testrunner.py --- firefox-29.0~b4+build1/testing/tps/tps/testrunner.py 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/testing/tps/tps/testrunner.py 2014-04-10 20:46:09.000000000 +0000 @@ -313,9 +313,11 @@ if self.mobile: self.preferences.update({'services.sync.client.type' : 'mobile'}) - # If sync accounts have been chosen, disable Firefox Accounts - if self.config.get('auth_type', 'fx_account') != 'fx_account': - self.preferences.update({'services.sync.fxaccounts.enabled' : False}) + # Set a dummy username to force the correct authentication type. For the + # old sync, the username is not allowed to contain a '@'. + dummy = {'fx_account': 'dummy@somewhere', 'sync_account': 'dummy'} + auth_type = self.config.get('auth_type', 'fx_account') + self.preferences.update({'services.sync.username': dummy[auth_type]}) # Acquire a lock to make sure no other threads are running tests # at the same time. diff -Nru firefox-29.0~b4+build1/toolkit/components/satchel/test/test_bug_511615.html firefox-29.0~b6+build1/toolkit/components/satchel/test/test_bug_511615.html --- firefox-29.0~b4+build1/toolkit/components/satchel/test/test_bug_511615.html 2014-04-02 09:04:02.000000000 +0000 +++ firefox-29.0~b6+build1/toolkit/components/satchel/test/test_bug_511615.html 2014-04-10 20:46:11.000000000 +0000 @@ -381,7 +381,7 @@ setupFormHistory(runTest); } -window.onload = startTest; +SimpleTest.waitForFocus(startTest); SimpleTest.waitForExplicitFinish(); diff -Nru firefox-29.0~b4+build1/toolkit/devtools/server/actors/profiler.js firefox-29.0~b6+build1/toolkit/devtools/server/actors/profiler.js --- firefox-29.0~b4+build1/toolkit/devtools/server/actors/profiler.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/toolkit/devtools/server/actors/profiler.js 2014-04-10 20:46:11.000000000 +0000 @@ -165,11 +165,12 @@ } /* - * If these values are objects with a non-null 'wrappedJSObject' - * property, use its value. Otherwise, use the value unchanged. + * If these values are objects with a non-null 'wrappedJSObject' property + * and aren't Xrays, use their .wrappedJSObject. Otherwise, use the value + * unchanged. */ - aSubject = (aSubject && aSubject.wrappedJSObject) || aSubject; - aData = (aData && aData.wrappedJSObject) || aData; + aSubject = (aSubject && !Cu.isXrayWrapper(aSubject) && aSubject.wrappedJSObject) || aSubject; + aData = (aData && !Cu.isXrayWrapper(aData) && aData.wrappedJSObject) || aData; let subj = JSON.parse(JSON.stringify(aSubject, cycleBreaker)); let data = JSON.parse(JSON.stringify(aData, cycleBreaker)); diff -Nru firefox-29.0~b4+build1/toolkit/devtools/server/actors/tracer.js firefox-29.0~b6+build1/toolkit/devtools/server/actors/tracer.js --- firefox-29.0~b4+build1/toolkit/devtools/server/actors/tracer.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/toolkit/devtools/server/actors/tracer.js 2014-04-10 20:46:11.000000000 +0000 @@ -95,7 +95,13 @@ this._buffer = []; this.onExitFrame = this.onExitFrame.bind(this); - this.global = aParentActor.window.wrappedJSObject; + // aParentActor.window might be an Xray for a window, but it might also be a + // double-wrapper for a Sandbox. We want to unwrap the latter but not the + // former. + this.global = aParentActor.window; + if (!Cu.isXrayWrapper(this.global)) { + this.global = this.global.wrappedJSObject; + } } TraceActor.prototype = { diff -Nru firefox-29.0~b4+build1/toolkit/devtools/server/actors/webbrowser.js firefox-29.0~b6+build1/toolkit/devtools/server/actors/webbrowser.js --- firefox-29.0~b4+build1/toolkit/devtools/server/actors/webbrowser.js 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/toolkit/devtools/server/actors/webbrowser.js 2014-04-10 20:46:11.000000000 +0000 @@ -227,7 +227,7 @@ // For each tab in this XUL window, ensure that we have an actor for // it, reusing existing actors where possible. We actually iterate // over 'browser' XUL elements, and BrowserTabActor uses - // browser.contentWindow.wrappedJSObject as the debuggee global. + // browser.contentWindow as the debuggee global. for (let browser of this._getChildren(win)) { // Do we have an existing actor for this browser? If not, create one. let actor = this._actorByBrowser.get(browser); @@ -655,7 +655,7 @@ this._contextPool = new ActorPool(this.conn); this.conn.addActorPool(this._contextPool); - this.threadActor = new ThreadActor(this, this.window.wrappedJSObject); + this.threadActor = new ThreadActor(this, this.window); this._contextPool.addActor(this.threadActor); }, @@ -904,7 +904,7 @@ this.threadActor.clearDebuggees(); if (this.threadActor.dbg) { this.threadActor.dbg.enabled = true; - this.threadActor.global = evt.target.defaultView.wrappedJSObject; + this.threadActor.global = evt.target.defaultView; this.threadActor.maybePauseOnExceptions(); } } diff -Nru firefox-29.0~b4+build1/toolkit/themes/windows/global/inContentUI.css firefox-29.0~b6+build1/toolkit/themes/windows/global/inContentUI.css --- firefox-29.0~b4+build1/toolkit/themes/windows/global/inContentUI.css 2014-04-02 09:04:04.000000000 +0000 +++ firefox-29.0~b6+build1/toolkit/themes/windows/global/inContentUI.css 2014-04-10 20:46:12.000000000 +0000 @@ -68,10 +68,18 @@ background-image: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.75)); border: 1px solid #C3CEDF; - border-radius: 5px; } %ifdef WINDOWS_AERO +@media (-moz-os-version: windows-vista), + (-moz-os-version: windows-win7) { +%endif + *|*.main-content { + border-radius: 5px; + } +%ifdef WINDOWS_AERO +} + @media (-moz-windows-glass) { /* Buttons */ *|button, diff -Nru firefox-29.0~b4+build1/toolkit/themes/windows/mozapps/extensions/extensions.css firefox-29.0~b6+build1/toolkit/themes/windows/mozapps/extensions/extensions.css --- firefox-29.0~b4+build1/toolkit/themes/windows/mozapps/extensions/extensions.css 2014-04-02 09:04:04.000000000 +0000 +++ firefox-29.0~b6+build1/toolkit/themes/windows/mozapps/extensions/extensions.css 2014-04-10 20:46:12.000000000 +0000 @@ -181,15 +181,22 @@ overflow: hidden; } -.category:-moz-locale-dir(ltr) { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} +%ifdef WINDOWS_AERO +@media (-moz-os-version: windows-vista), + (-moz-os-version: windows-win7) { +%endif + .category:-moz-locale-dir(ltr) { + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + } -.category:-moz-locale-dir(rtl) { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; + .category:-moz-locale-dir(rtl) { + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + } +%ifdef WINDOWS_AERO } +%endif .category[disabled] { border-top: 0; diff -Nru firefox-29.0~b4+build1/toolkit/webapps/WebappOSUtils.jsm firefox-29.0~b6+build1/toolkit/webapps/WebappOSUtils.jsm --- firefox-29.0~b4+build1/toolkit/webapps/WebappOSUtils.jsm 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/toolkit/webapps/WebappOSUtils.jsm 2014-04-10 20:46:12.000000000 +0000 @@ -204,6 +204,19 @@ throw new Error("Unsupported apps platform"); }, + getPackagePath: function(aApp) { + let packagePath = this.getInstallPath(aApp); + + // Only for Firefox on Mac OS X +#ifndef MOZ_B2G +#ifdef XP_MACOSX + packagePath = OS.Path.join(packagePath, "Contents", "Resources"); +#endif +#endif + + return packagePath; + }, + launch: function(aApp) { let uniqueName = this.getUniqueName(aApp); diff -Nru firefox-29.0~b4+build1/toolkit/webapps/WebappsInstaller.jsm firefox-29.0~b6+build1/toolkit/webapps/WebappsInstaller.jsm --- firefox-29.0~b4+build1/toolkit/webapps/WebappsInstaller.jsm 2014-04-02 09:04:10.000000000 +0000 +++ firefox-29.0~b6+build1/toolkit/webapps/WebappsInstaller.jsm 2014-04-10 20:46:12.000000000 +0000 @@ -223,14 +223,14 @@ * This function retrieves the icon for an app. * If the retrieving fails, it uses the default chrome icon. */ - getIcon: function() { + getIcon: function(aZipPath) { try { // If the icon is in the zip package, we should modify the url // to point to the zip file (we can't use the app protocol yet // because the app isn't installed yet). if (this.iconURI.scheme == "app") { let zipUrl = OS.Path.toFileURI(OS.Path.join(this.tmpInstallDir, - "application.zip")); + aZipPath)); let filePath = this.iconURI.QueryInterface(Ci.nsIURL).filePath; @@ -352,7 +352,7 @@ "application.zip")); } - yield this.getIcon(); + yield this.getIcon("application.zip"); // Remove previously installed app this._removeInstallation(true); @@ -663,6 +663,7 @@ this.macOSDir = OS.Path.join(this.contentsDir, "MacOS"); this.resourcesDir = OS.Path.join(this.contentsDir, "Resources"); this.iconFile = OS.Path.join(this.resourcesDir, "appicon.icns"); + this.zipFile = OS.Path.join(this.resourcesDir, "application.zip"); } MacNativeApp.prototype = { @@ -679,10 +680,10 @@ if (aZipPath) { yield OS.File.move(aZipPath, OS.Path.join(this.tmpInstallDir, - "application.zip")); + this.zipFile)); } - yield this.getIcon(); + yield this.getIcon(this.zipFile); // Remove previously installed app this._removeInstallation(true); @@ -886,7 +887,7 @@ "application.zip")); } - yield this.getIcon(); + yield this.getIcon("application.zip"); // Remove previously installed app this._removeInstallation(true); diff -Nru firefox-29.0~b4+build1/widget/cocoa/nsNativeThemeCocoa.h firefox-29.0~b6+build1/widget/cocoa/nsNativeThemeCocoa.h --- firefox-29.0~b4+build1/widget/cocoa/nsNativeThemeCocoa.h 2014-04-02 09:04:04.000000000 +0000 +++ firefox-29.0~b6+build1/widget/cocoa/nsNativeThemeCocoa.h 2014-04-10 20:46:13.000000000 +0000 @@ -71,7 +71,6 @@ nsIFrame* SeparatorResponsibility(nsIFrame* aBefore, nsIFrame* aAfter); CGRect SeparatorAdjustedRect(CGRect aRect, nsIFrame* aLeft, nsIFrame* aCurrent, nsIFrame* aRight); - bool IsWindowSheet(nsIFrame* aFrame); // HITheme drawing routines void DrawFrame(CGContextRef context, HIThemeFrameKind inKind, diff -Nru firefox-29.0~b4+build1/widget/cocoa/nsNativeThemeCocoa.mm firefox-29.0~b6+build1/widget/cocoa/nsNativeThemeCocoa.mm --- firefox-29.0~b4+build1/widget/cocoa/nsNativeThemeCocoa.mm 2014-04-02 09:04:04.000000000 +0000 +++ firefox-29.0~b6+build1/widget/cocoa/nsNativeThemeCocoa.mm 2014-04-10 20:46:13.000000000 +0000 @@ -2100,14 +2100,7 @@ switch (aWidgetType) { case NS_THEME_DIALOG: { - CGContextClearRect(cgContext, macRect); - if (IsWindowSheet(aFrame)) { - HIThemeSetFill(kThemeBrushSheetBackgroundTransparent, NULL, cgContext, HITHEME_ORIENTATION); - } - else { - HIThemeSetFill(kThemeBrushDialogBackgroundActive, NULL, cgContext, HITHEME_ORIENTATION); - } - + HIThemeSetFill(kThemeBrushDialogBackgroundActive, NULL, cgContext, HITHEME_ORIENTATION); CGContextFillRect(cgContext, macRect); } break; @@ -3362,20 +3355,6 @@ } } -bool -nsNativeThemeCocoa::IsWindowSheet(nsIFrame* aFrame) -{ - NSWindow* win = NativeWindowForFrame(aFrame); - id winDelegate = [win delegate]; - nsIWidget* widget = [(WindowDelegate *)winDelegate geckoWidget]; - if (!widget) { - return false; - } - nsWindowType windowType; - widget->GetWindowType(windowType); - return (windowType == eWindowType_sheet); -} - nsITheme::Transparency nsNativeThemeCocoa::GetWidgetTransparency(nsIFrame* aFrame, uint8_t aWidgetType) { @@ -3384,9 +3363,6 @@ case NS_THEME_TOOLTIP: return eTransparent; - case NS_THEME_DIALOG: - return IsWindowSheet(aFrame) ? eTransparent : eOpaque; - case NS_THEME_SCROLLBAR_SMALL: case NS_THEME_SCROLLBAR: return nsLookAndFeel::UseOverlayScrollbars() ? eTransparent : eOpaque; diff -Nru firefox-29.0~b4+build1/widget/windows/nsLookAndFeel.cpp firefox-29.0~b6+build1/widget/windows/nsLookAndFeel.cpp --- firefox-29.0~b4+build1/widget/windows/nsLookAndFeel.cpp 2014-04-02 09:04:04.000000000 +0000 +++ firefox-29.0~b6+build1/widget/windows/nsLookAndFeel.cpp 2014-04-10 20:46:13.000000000 +0000 @@ -375,11 +375,7 @@ // High contrast is a misnomer under Win32 -- any theme can be used with it, // e.g. normal contrast with large fonts, low contrast, etc. // The high contrast flag really means -- use this theme and don't override it. - HIGHCONTRAST contrastThemeInfo; - contrastThemeInfo.cbSize = sizeof(contrastThemeInfo); - ::SystemParametersInfo(SPI_GETHIGHCONTRAST, 0, &contrastThemeInfo, 0); - - aResult = ((contrastThemeInfo.dwFlags & HCF_HIGHCONTRASTON) != 0); + aResult = nsUXThemeData::IsHighContrastOn(); break; case eIntID_ScrollArrowStyle: aResult = eScrollArrowStyle_Single; diff -Nru firefox-29.0~b4+build1/widget/windows/nsUXThemeData.cpp firefox-29.0~b6+build1/widget/windows/nsUXThemeData.cpp --- firefox-29.0~b4+build1/widget/windows/nsUXThemeData.cpp 2014-04-02 09:04:04.000000000 +0000 +++ firefox-29.0~b6+build1/widget/windows/nsUXThemeData.cpp 2014-04-10 20:46:13.000000000 +0000 @@ -253,6 +253,8 @@ bool nsUXThemeData::sIsDefaultWindowsTheme = false; +bool +nsUXThemeData::sIsHighContrastOn = false; // static LookAndFeel::WindowsTheme @@ -267,6 +269,11 @@ return sIsDefaultWindowsTheme; } +bool nsUXThemeData::IsHighContrastOn() +{ + return sIsHighContrastOn; +} + // static bool nsUXThemeData::CheckForCompositor(bool aUpdateCache) { @@ -292,6 +299,14 @@ return; } + HIGHCONTRAST highContrastInfo; + highContrastInfo.cbSize = sizeof(HIGHCONTRAST); + if (SystemParametersInfo(SPI_GETHIGHCONTRAST, 0, &highContrastInfo, 0)) { + sIsHighContrastOn = ((highContrastInfo.dwFlags & HCF_HIGHCONTRASTON) != 0); + } else { + sIsHighContrastOn = false; + } + WCHAR themeFileName[MAX_PATH + 1]; WCHAR themeColor[MAX_PATH + 1]; if (FAILED(GetCurrentThemeName(themeFileName, @@ -317,9 +332,16 @@ if (theme == WINTHEME_UNRECOGNIZED) return; - if (theme == WINTHEME_AERO || theme == WINTHEME_AERO_LITE || theme == WINTHEME_LUNA) + // We're using the default theme if we're using any of Aero, Aero Lite, or + // luna. However, on Win8, GetCurrentThemeName (see above) returns + // AeroLite.msstyles for the 4 builtin highcontrast themes as well. Those + // themes "don't count" as default themes, so we specifically check for high + // contrast mode in that situation. + if (!(IsWin8OrLater() && sIsHighContrastOn) && + (theme == WINTHEME_AERO || theme == WINTHEME_AERO_LITE || theme == WINTHEME_LUNA)) { sIsDefaultWindowsTheme = true; - + } + if (theme != WINTHEME_LUNA) { switch(theme) { case WINTHEME_AERO: diff -Nru firefox-29.0~b4+build1/widget/windows/nsUXThemeData.h firefox-29.0~b6+build1/widget/windows/nsUXThemeData.h --- firefox-29.0~b4+build1/widget/windows/nsUXThemeData.h 2014-04-02 09:04:04.000000000 +0000 +++ firefox-29.0~b6+build1/widget/windows/nsUXThemeData.h 2014-04-10 20:46:13.000000000 +0000 @@ -92,6 +92,7 @@ static SIZE sCommandButtons[4]; static mozilla::LookAndFeel::WindowsTheme sThemeId; static bool sIsDefaultWindowsTheme; + static bool sIsHighContrastOn; static void Initialize(); static void Teardown(); @@ -106,6 +107,7 @@ static void UpdateNativeThemeInfo(); static mozilla::LookAndFeel::WindowsTheme GetNativeThemeId(); static bool IsDefaultWindowTheme(); + static bool IsHighContrastOn(); // This method returns the cached compositor state. Most // callers should call without the argument. The cache