author | Carsten "Tomcat" Book <cbook@mozilla.com> |
Fri, 06 May 2016 14:18:17 +0200 | |
changeset 296397 | 19a1743ceb2e035e571012e88d25275ce627b925 |
parent 296396 | 25d777f7efb357fc5478251913548521986abaa0 (current diff) |
parent 296349 | 1a00d3da0e9eed5f8e527b1d60842d5f72b3c1c9 (diff) |
child 296398 | 84a3e571680149b8fafcfc338aa4e0f27cb16050 |
child 296482 | 9d202f109312b37f42224c55724ea845a4b86c23 |
push id | 76311 |
push user | cbook@mozilla.com |
push date | Fri, 06 May 2016 12:26:12 +0000 |
treeherder | mozilla-inbound@84a3e5716801 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge |
milestone | 49.0a1 |
first release with | nightly linux32
19a1743ceb2e
/
49.0a1
/
20160506052823
/
files
nightly linux64
19a1743ceb2e
/
49.0a1
/
20160506052037
/
files
nightly mac
19a1743ceb2e
/
49.0a1
/
20160506052037
/
files
nightly win32
19a1743ceb2e
/
49.0a1
/
20160506052823
/
files
nightly win64
19a1743ceb2e
/
49.0a1
/
20160506052823
/
files
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
releases | nightly linux32
49.0a1
/
20160506052823
/
pushlog to previous
nightly linux64
49.0a1
/
20160506052037
/
pushlog to previous
nightly mac
49.0a1
/
20160506052037
/
pushlog to previous
nightly win32
49.0a1
/
20160506052823
/
pushlog to previous
nightly win64
49.0a1
/
20160506052823
/
pushlog to previous
|
--- a/accessible/base/EventTree.cpp +++ b/accessible/base/EventTree.cpp @@ -147,17 +147,16 @@ TreeMutation::Done() #ifdef DEBUG for (uint32_t idx = 0; idx < mStartIdx && idx < length; idx++) { MOZ_ASSERT(mParent->mChildren[idx]->mIndexInParent == static_cast<int32_t>(idx), "Wrong index detected"); } #endif for (uint32_t idx = mStartIdx; idx < length; idx++) { - mParent->mChildren[idx]->mIndexInParent = idx; mParent->mChildren[idx]->mInt.mIndexOfEmbeddedChild = -1; mParent->mChildren[idx]->mStateFlags |= Accessible::eGroupInfoDirty; } if (mStartIdx < mParent->mChildren.Length() - 1) { mParent->mEmbeddedObjCollector = nullptr; }
--- a/accessible/generic/Accessible.cpp +++ b/accessible/generic/Accessible.cpp @@ -2076,16 +2076,20 @@ Accessible::InsertChildAt(uint32_t aInde if (!mChildren.AppendElement(aChild)) return false; } else { if (!mChildren.InsertElementAt(aIndex, aChild)) return false; MOZ_ASSERT(mStateFlags & eKidsMutating, "Illicit children change"); + + for (uint32_t idx = aIndex + 1; idx < mChildren.Length(); idx++) { + mChildren[idx]->mIndexInParent = idx; + } } if (aChild->IsText()) { mStateFlags |= eHasTextKids; } aChild->BindToParent(this, aIndex); return true; @@ -2099,27 +2103,26 @@ Accessible::RemoveChild(Accessible* aChi if (aChild->mParent != this || aChild->mIndexInParent == -1) return false; MOZ_ASSERT((mStateFlags & eKidsMutating) || aChild->IsDefunct() || aChild->IsDoc(), "Illicit children change"); int32_t index = static_cast<uint32_t>(aChild->mIndexInParent); - - // If we adopt a child during a tree construction, then indexes might be not - // rebuilt yet. - if (mChildren.SafeElementAt(index) != aChild) { - index = mChildren.IndexOf(aChild); - MOZ_ASSERT(index != -1, - "Child is bound to parent but parent hasn't this child at its index."); - } + MOZ_ASSERT(mChildren.SafeElementAt(index) == aChild, + "A wrong child index"); aChild->UnbindFromParent(); mChildren.RemoveElementAt(index); + + for (uint32_t idx = index; idx < mChildren.Length(); idx++) { + mChildren[idx]->mIndexInParent = idx; + } + return true; } void Accessible::MoveChild(uint32_t aNewIndex, Accessible* aChild) { MOZ_ASSERT(aChild, "No child was given"); MOZ_ASSERT(aChild->mParent == this, "A child from different subtree was given");
--- a/accessible/tests/mochitest/treeupdate/a11y.ini +++ b/accessible/tests/mochitest/treeupdate/a11y.ini @@ -16,16 +16,17 @@ support-files = [test_bug1189277.html] [test_canvas.html] [test_colorpicker.xul] [test_contextmenu.xul] [test_cssoverflow.html] [test_deck.xul] [test_doc.html] [test_gencontent.html] +[test_general.html] [test_hidden.html] [test_imagemap.html] skip-if = buildapp == "mulet" [test_list.html] [test_list_editabledoc.html] [test_listbox.xul] [test_menu.xul] [test_menubutton.xul]
new file mode 100644 --- /dev/null +++ b/accessible/tests/mochitest/treeupdate/test_general.html @@ -0,0 +1,117 @@ +<html> + +<head> + <title>Testing the tree updates</title> + + <link rel="stylesheet" type="text/css" + href="chrome://mochikit/content/tests/SimpleTest/test.css" /> + + <script type="application/javascript" + src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> + + <script type="application/javascript" + src="../common.js"></script> + <script type="application/javascript" + src="../role.js"></script> + <script type="application/javascript" + src="../events.js"></script> + + <script type="application/javascript"> + + //////////////////////////////////////////////////////////////////////////// + // Invokers + //////////////////////////////////////////////////////////////////////////// + + function prependAppend(aContainer) + { + this.eventSeq = [ + new invokerChecker(EVENT_REORDER, aContainer) + ]; + + this.invoke = function prependAppend_invoke() + { + var checkbox = document.createElement('input'); + checkbox.setAttribute('type', 'checkbox'); + getNode(aContainer).insertBefore(checkbox, getNode(aContainer).firstChild); + + var button = document.createElement('input'); + button.setAttribute('type', 'button'); + getNode(aContainer).appendChild(button); + } + + this.finalCheck = function prependAppend_finalCheck() + { + var accTree = + { SECTION: [ // container + { CHECKBUTTON: [ ] }, + { ENTRY: [ ] }, + { PUSHBUTTON: [ ] } + ] }; + testAccessibleTree(aContainer, accTree); + } + + this.getID = function prependAppend_getID() + { + return "prepends a child and appends a child"; + } + } + + function removeRemove(aContainer) + { + this.eventSeq = [ + new invokerChecker(EVENT_REORDER, aContainer) + ]; + + this.invoke = function removeRemove_invoke() + { + getNode(aContainer).removeChild(getNode(aContainer).firstChild); + } + + this.finalCheck = function removeRemove_finalCheck() + { + var accTree = + { SECTION: [ // container + { PUSHBUTTON: [ ] } + ] }; + testAccessibleTree(aContainer, accTree); + } + + this.getID = function removeRemove_getID() + { + return "remove first and second children"; + } + } + + //////////////////////////////////////////////////////////////////////////// + // Do tests + //////////////////////////////////////////////////////////////////////////// + + var gQueue = null; + //gA11yEventDumpID = "eventdump"; // debug stuff + //gA11yEventDumpToConsole = true; + + function doTests() + { + gQueue = new eventQueue(); + + gQueue.push(new prependAppend("c1")); + gQueue.push(new removeRemove("c2")); + + gQueue.invoke(); // Will call SimpleTest.finish(); + } + + SimpleTest.waitForExplicitFinish(); + addA11yLoadEvent(doTests); + </script> +</head> + +<body> + <p id="display"></p> + <div id="content" style="display: none"></div> + <pre id="test"> + </pre> + + <div id="c1"><input></div> + <div id="c2"><span><input type="checkbox"><input></span><input type="button"></div> +</body> +</html>
--- a/browser/base/content/abouthome/aboutHome.css +++ b/browser/base/content/abouthome/aboutHome.css @@ -82,25 +82,25 @@ a { border-radius: 2px 0 0 2px; border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2); box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset, 0 0 2px hsla(210,65%,9%,.1) inset, 0 1px 0 hsla(0,0%,100%,.2); color: inherit; } -#searchText:-moz-dir(rtl) { +#searchText:dir(rtl) { border-radius: 0 2px 2px 0; } #searchText[aria-expanded="true"] { border-radius: 2px 0 0 0; } -#searchText[aria-expanded="true"]:-moz-dir(rtl) { +#searchText[aria-expanded="true"]:dir(rtl) { border-radius: 0 2px 0 0; } #searchText[keepfocus], #searchText:focus, #searchText[autofocus] { border-color: hsla(206,100%,60%,.6) hsla(206,76%,52%,.6) hsla(204,100%,40%,.6); } @@ -117,17 +117,17 @@ a { 0 1px 0 hsla(0,0%,100%,.2); color: inherit; cursor: pointer; transition-property: background-color, border-color, box-shadow; transition-duration: 150ms; width: 50px; } -#searchSubmit:-moz-dir(rtl) { +#searchSubmit:dir(rtl) { border-radius: 2px 0 0 2px; } #searchText:focus + #searchSubmit, #searchText[keepfocus] + #searchSubmit, #searchText + #searchSubmit:hover, #searchText[autofocus] + #searchSubmit { border-color: #59b5fc #45a3e7 #3294d5; @@ -166,19 +166,19 @@ a { padding: 6px 0; -moz-padding-start: 49px; } #rightsSnippet[hidden] { display: none; } -#defaultSnippet1:-moz-dir(rtl), -#defaultSnippet2:-moz-dir(rtl), -#rightsSnippet:-moz-dir(rtl) { +#defaultSnippet1:dir(rtl), +#defaultSnippet2:dir(rtl), +#rightsSnippet:dir(rtl) { background-position: right 0 center; } #defaultSnippet1 { background-image: url("chrome://browser/content/abouthome/snippet1.png"); } #defaultSnippet2 { @@ -328,17 +328,17 @@ body[narrow] #restorePreviousSession { height: 48px; width: 48px; display: inline-block; /* display on same line as text label */ vertical-align: middle; margin-bottom: 0; -moz-margin-end: 8px; } -#restorePreviousSession:-moz-dir(rtl)::before { +#restorePreviousSession:dir(rtl)::before { transform: scaleX(-1); } body[narrow] #restorePreviousSession::before { content: url("chrome://browser/content/abouthome/restore.png"); height: 32px; width: 32px; } @@ -389,18 +389,18 @@ body[narrow] #restorePreviousSession::be } .launchButton::before, #aboutMozilla::before { transform: scale(.5); transform-origin: 0 0; } - .launchButton:-moz-dir(rtl)::before, - #aboutMozilla:-moz-dir(rtl)::before { + .launchButton:dir(rtl)::before, + #aboutMozilla:dir(rtl)::before { transform: scale(.5) translateX(32px); } #downloads::before { content: url("chrome://browser/content/abouthome/downloads@2x.png"); } #bookmarks::before { @@ -426,17 +426,17 @@ body[narrow] #restorePreviousSession::be #restorePreviousSession::before { content: url("chrome://browser/content/abouthome/restore-large@2x.png"); } body[narrow] #restorePreviousSession::before { content: url("chrome://browser/content/abouthome/restore@2x.png"); } - #restorePreviousSession:-moz-dir(rtl)::before { + #restorePreviousSession:dir(rtl)::before { transform: scale(-0.5, 0.5) translateX(24px); transform-origin: top center; } #aboutMozilla::before { content: url("chrome://browser/content/abouthome/mozilla@2x.png"); } }
--- a/browser/base/content/newtab/newTab.css +++ b/browser/base/content/newtab/newTab.css @@ -45,17 +45,17 @@ input[type=button] { /* CUSTOMIZE */ #newtab-customize-button { position: absolute; top: 10px; right: 20px; z-index: 101; } -#newtab-customize-button:-moz-dir(rtl) { +#newtab-customize-button:dir(rtl) { left: 20px; right: auto; } /* MARGINS */ #newtab-vertical-margin { display: -moz-box; position: relative; @@ -66,22 +66,22 @@ input[type=button] { #newtab-margin-undo-container { display: -moz-box; left: 6px; position: absolute; top: 6px; z-index: 1; } -#newtab-margin-undo-container:-moz-dir(rtl) { +#newtab-margin-undo-container:dir(rtl) { left: auto; right: 6px; } -#newtab-undo-close-button:-moz-dir(rtl) { +#newtab-undo-close-button:dir(rtl) { float:left; } #newtab-horizontal-margin { display: -moz-box; -moz-box-flex: 1; } @@ -239,17 +239,17 @@ input[type=button] { border: 0; color: white; } .newtab-site > .newtab-sponsored[active] { background-color: #000000; } -.newtab-sponsored:-moz-dir(rtl) { +.newtab-sponsored:dir(rtl) { right: 0; left: auto; } .newtab-site:-moz-any([type=enhanced], [type=sponsored], [suggested]) .newtab-sponsored { display: block; } @@ -302,23 +302,23 @@ input[type=button] { } @media (-moz-touch-enabled) { .newtab-control { opacity: 1; } } -.newtab-control-pin:-moz-dir(ltr), -.newtab-control-block:-moz-dir(rtl) { +.newtab-control-pin:dir(ltr), +.newtab-control-block:dir(rtl) { left: 4px; } -.newtab-control-block:-moz-dir(ltr), -.newtab-control-pin:-moz-dir(rtl) { +.newtab-control-block:dir(ltr), +.newtab-control-pin:dir(rtl) { right: 4px; } /* DRAG & DROP */ /* * This is just a temporary drag element used for dataTransfer.setDragImage() * so that we can use custom drag images and elements. It needs an opacity of @@ -374,25 +374,25 @@ input[type=button] { border-radius: 2px 0 0 2px; border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2); box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset, 0 0 2px hsla(210,65%,9%,.1) inset, 0 1px 0 hsla(0,0%,100%,.2); color: inherit; } -#newtab-search-text:-moz-dir(rtl) { +#newtab-search-text:dir(rtl) { border-radius: 0 2px 2px 0; } #newtab-search-text[aria-expanded="true"] { border-radius: 2px 0 0 0; } -#newtab-search-text[aria-expanded="true"]:-moz-dir(rtl) { +#newtab-search-text[aria-expanded="true"]:dir(rtl) { border-radius: 0 2px 0 0; } #newtab-search-text[keepfocus], #newtab-search-text:focus, #newtab-search-text[autofocus] { border-color: hsla(206,100%,60%,.6) hsla(206,76%,52%,.6) hsla(204,100%,40%,.6); } @@ -409,17 +409,17 @@ input[type=button] { 0 1px 0 hsla(0,0%,100%,.2); color: inherit; cursor: pointer; transition-property: background-color, border-color, box-shadow; transition-duration: 150ms; width: 50px; } -#newtab-search-submit:-moz-dir(rtl) { +#newtab-search-submit:dir(rtl) { border-radius: 2px 0 0 2px; } #newtab-search-text:focus + #newtab-search-submit, #newtab-search-text + #newtab-search-submit:hover, #newtab-search-text[autofocus] + #newtab-search-submit { border-color: #59b5fc #45a3e7 #3294d5; color: white; @@ -461,17 +461,17 @@ input[type=button] { } .newtab-customize-panel-container { position: absolute; margin-right: 40px; right: 0; } -.newtab-customize-panel-container:-moz-dir(rtl) { +.newtab-customize-panel-container:dir(rtl) { right: auto; left: 0; } #newtab-customize-panel { z-index: 999; margin-top: 55px; min-width: 270px; @@ -479,22 +479,22 @@ input[type=button] { top: 100%; right: -25px; filter: drop-shadow(0 0 1px rgba(0,0,0,0.4)) drop-shadow(0 3px 4px rgba(0,0,0,0.4)); transition: all 200ms ease-in-out; transform-origin: top right; transform: translate(-30px, -20px) scale(0) translate(30px, 20px); } -#newtab-customize-panel:-moz-dir(rtl) { +#newtab-customize-panel:dir(rtl) { transform-origin: 40px top 20px; } -#newtab-customize-panel:-moz-dir(rtl), -#newtab-customize-panel-anchor:-moz-dir(rtl) { +#newtab-customize-panel:dir(rtl), +#newtab-customize-panel-anchor:dir(rtl) { left: 15px; right: auto; } #newtab-customize-panel[open="true"] { transform: translate(-30px, -20px) scale(1) translate(30px, 20px); }
--- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -2495,16 +2495,26 @@ // Removing the panel requires fixing up selectedPanel immediately // (see below), which would be hindered by the potentially expensive // browser removal. So we remove the browser and the panel in two // steps. var panel = this.getNotificationBox(browser); + // In the multi-process case, it's possible an asynchronous tab switch + // is still underway. If so, then it's possible that the last visible + // browser is the one we're in the process of removing. There's the + // risk of displaying preloaded browsers that are at the end of the + // deck if we remove the browser before the switch is complete, so + // we alert the switcher in order to show a spinner instead. + if (this._switcher) { + this._switcher.onTabRemoved(aTab); + } + // This will unload the document. An unload handler could remove // dependant tabs, so it's important that the tabbrowser is now in // a consistent state (tab removed, tab positions updated, etc.). browser.parentNode.removeChild(browser); // Release the browser in case something is erroneously holding a // reference to the tab after its removal. this._tabForBrowser.delete(aTab.linkedBrowser); @@ -3643,16 +3653,29 @@ if (this.getTabState(tab) == this.STATE_LOADING) { this.onLayersReady(tab.linkedBrowser); } else if (this.getTabState(tab) == this.STATE_UNLOADING) { this.onLayersCleared(tab.linkedBrowser); } } }, + // Called when a tab has been removed, and the browser node is + // about to be removed from the DOM. + onTabRemoved: function(tab) { + if (this.lastVisibleTab == tab) { + // The browser that was being presented to the user is + // going to be removed during this tick of the event loop. + // This will cause us to show a tab spinner instead. + this.preActions(); + this.lastVisibleTab = null; + this.postActions(); + } + }, + // Called when the user asks to switch to a given tab. requestTab: function(tab) { if (tab === this.requestedTab) { return; } // Instrumentation to figure out bug 1166351 - if the binding // on the browser we're switching to has gone away, try to find out
index 7e6ef77ec407eccb3e07bc21d85d8418ab84e011..4e8b4d3a3d8e27dc6592427e7560a9be23645c3c GIT binary patch literal 20316 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
--- a/browser/base/content/test/general/browser.ini +++ b/browser/base/content/test/general/browser.ini @@ -142,16 +142,17 @@ support-files = [browser_aboutSupport_newtab_security_state.js] [browser_aboutHealthReport.js] skip-if = os == "linux" # Bug 924307 [browser_aboutHome.js] [browser_aboutHome_wrapsCorrectly.js] [browser_addKeywordSearch.js] [browser_alltabslistener.js] [browser_audioTabIcon.js] +tags = audiochannel [browser_backButtonFitts.js] skip-if = os == "mac" # The Fitt's Law back button is not supported on OS X [browser_beforeunload_duplicate_dialogs.js] [browser_blob-channelname.js] [browser_bookmark_popup.js] skip-if = (os == "linux" && debug) # mouseover not reliable on linux debug builds [browser_bookmark_titles.js] skip-if = buildapp == 'mulet' || toolkit == "windows" # Disabled on Windows due to frequent failures (bugs 825739, 841341)
--- a/browser/components/contextualidentity/test/browser/browser.ini +++ b/browser/components/contextualidentity/test/browser/browser.ini @@ -1,14 +1,15 @@ [DEFAULT] skip-if = buildapp == "mulet" support-files = empty_file.html file_reflect_cookie_into_title.html serviceworker.html worker.js +[browser_aboutURLs.js] [browser_usercontext.js] [browser_usercontextid_tabdrop.js] [browser_windowName.js] [browser_windowOpen.js] [browser_serviceworkers.js] [browser_broadcastchannel.js]
new file mode 100644 --- /dev/null +++ b/browser/components/contextualidentity/test/browser/browser_aboutURLs.js @@ -0,0 +1,42 @@ +add_task(function* () { + let aboutURLs = []; + + // List of about: URLs that will initiate network requests. + let networkURLs = [ + "credits", + "telemetry" // about:telemetry will fetch Telemetry asynchrounously and takes + // longer, we skip this for now. + ]; + + let ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); + for (let cid in Cc) { + let result = cid.match(/@mozilla.org\/network\/protocol\/about;1\?what\=(.*)$/); + if (!result) { + continue; + } + + let aboutType = result[1]; + let contract = "@mozilla.org/network/protocol/about;1?what=" + aboutType; + try { + let am = Cc[contract].getService(Ci.nsIAboutModule); + let uri = ios.newURI("about:"+aboutType, null, null); + let flags = am.getURIFlags(uri); + if (!(flags & Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT) && + networkURLs.indexOf(aboutType) == -1) { + aboutURLs.push(aboutType); + } + } catch (e) { + // getService might have thrown if the component doesn't actually + // implement nsIAboutModule + } + } + + for (let url of aboutURLs) { + let tab = gBrowser.addTab("about:"+url, {userContextId: 1}); + yield BrowserTestUtils.browserLoaded(tab.linkedBrowser); + + ok(true); + + yield BrowserTestUtils.removeTab(tab); + } +});
--- a/browser/components/extensions/ext-browserAction.js +++ b/browser/components/extensions/ext-browserAction.js @@ -33,16 +33,22 @@ function BrowserAction(options, extensio enabled: true, title: options.default_title || extension.name, badgeText: "", badgeBackgroundColor: null, icon: IconDetails.normalize({path: options.default_icon}, extension), popup: options.default_popup || "", }; + this.browserStyle = options.browser_style || false; + if (options.browser_style === null) { + this.extension.logger.warn("Please specify whether you want browser_style " + + "or not in your browser_action options."); + } + this.tabContext = new TabContext(tab => Object.create(this.defaults), extension); EventEmitter.decorate(this); } BrowserAction.prototype = { build() { @@ -86,17 +92,17 @@ BrowserAction.prototype = { this.tabManager.addActiveTabPermission(tab); // If the widget has a popup URL defined, we open a popup, but do not // dispatch a click event to the extension. // If it has no popup URL defined, we dispatch a click event, but do not // open a popup. if (popupURL) { try { - new ViewPopup(this.extension, event.target, popupURL); + new ViewPopup(this.extension, event.target, popupURL, this.browserStyle); } catch (e) { Cu.reportError(e); event.preventDefault(); } } else { // This isn't not a hack, but it seems to provide the correct behavior // with the fewest complications. event.preventDefault();
--- a/browser/components/extensions/ext-pageAction.js +++ b/browser/components/extensions/ext-pageAction.js @@ -21,16 +21,22 @@ function PageAction(options, extension) this.defaults = { show: false, title: options.default_title || extension.name, icon: IconDetails.normalize({path: options.default_icon}, extension), popup: options.default_popup || "", }; + this.browserStyle = options.browser_style || false; + if (options.browser_style === null) { + this.extension.logger.warn("Please specify whether you want browser_style " + + "or not in your page_action options."); + } + this.tabContext = new TabContext(tab => Object.create(this.defaults), extension); this.tabContext.on("location-change", this.handleLocationChange.bind(this)); // eslint-disable-line mozilla/balanced-listeners // WeakMap[ChromeWindow -> <xul:image>] this.buttons = new WeakMap(); @@ -147,17 +153,18 @@ PageAction.prototype = { this.tabManager.addActiveTabPermission(tab); // If the widget has a popup URL defined, we open a popup, but do not // dispatch a click event to the extension. // If it has no popup URL defined, we dispatch a click event, but do not // open a popup. if (popupURL) { - new PanelPopup(this.extension, this.getButton(window), popupURL); + new PanelPopup(this.extension, this.getButton(window), popupURL, + this.browserStyle); } else { this.emit("click", tab); } }, handleLocationChange(eventType, tab, fromBrowse) { if (fromBrowse) { this.tabContext.clear(tab);
--- a/browser/components/extensions/ext-utils.js +++ b/browser/components/extensions/ext-utils.js @@ -154,26 +154,27 @@ XPCOMUtils.defineLazyGetter(global, "sty let macStyleSheet = styleSheetService.preloadSheet(styleSheetURI, styleSheetService.AGENT_SHEET); stylesheets.push(macStyleSheet); } return stylesheets; }); class BasePopup { - constructor(extension, viewNode, popupURL) { + constructor(extension, viewNode, popupURL, browserStyle) { let popupURI = Services.io.newURI(popupURL, null, extension.baseURI); Services.scriptSecurityManager.checkLoadURIWithPrincipal( extension.principal, popupURI, Services.scriptSecurityManager.DISALLOW_SCRIPT); this.extension = extension; this.popupURI = popupURI; this.viewNode = viewNode; + this.browserStyle = browserStyle; this.window = viewNode.ownerDocument.defaultView; this.contentReady = new Promise(resolve => { this._resolveContentReady = resolve; }); this.viewNode.addEventListener(this.DESTROY_EVENT, this); @@ -207,17 +208,17 @@ class BasePopup { handleEvent(event) { switch (event.type) { case this.DESTROY_EVENT: this.destroy(); break; case "DOMWindowCreated": - if (event.target === this.browser.contentDocument) { + if (this.browserStyle && event.target === this.browser.contentDocument) { let winUtils = this.browser.contentWindow .QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); for (let stylesheet of global.stylesheets) { winUtils.addSheet(stylesheet, winUtils.AGENT_SHEET); } } break; @@ -325,28 +326,28 @@ class BasePopup { this.browser.style.width = `${width}px`; this.browser.style.height = `${height}px`; this._resolveContentReady(); } } global.PanelPopup = class PanelPopup extends BasePopup { - constructor(extension, imageNode, popupURL) { + constructor(extension, imageNode, popupURL, browserStyle) { let document = imageNode.ownerDocument; let panel = document.createElement("panel"); panel.setAttribute("id", makeWidgetId(extension.id) + "-panel"); panel.setAttribute("class", "browser-extension-panel"); panel.setAttribute("type", "arrow"); panel.setAttribute("role", "group"); document.getElementById("mainPopupSet").appendChild(panel); - super(extension, panel, popupURL); + super(extension, panel, popupURL, browserStyle); this.contentReady.then(() => { panel.openPopup(imageNode, "bottomcenter topright", 0, 0, false, false); }); } get DESTROY_EVENT() { return "popuphidden";
--- a/browser/components/extensions/extension.css +++ b/browser/components/extensions/extension.css @@ -133,47 +133,158 @@ button.default.pressed { button.default.focused { border-color: #fff; } /* Radio Buttons */ .radioItem { margin-bottom: 6px; + text-align: left; +} + +input[type="radio"] { + display: none; } input[type="radio"] + label { -moz-user-select: none; - text-align: left; +} + +input[type="radio"] + label::before { + background-color: #fff; + background-position: center; + border: 1px solid #b1b1b1; + border-radius: 50%; + content: ""; + display: inline-block; + height: 16px; + margin-right: 6px; + vertical-align: text-top; + width: 16px; +} + +input[type="radio"]:hover + label::before, +.radioItem.hover input[type="radio"]:not(active) + label::before { + background-color: #fbfbfb; + border-color: #b1b1b1; +} + +input[type="radio"]:hover:active + label::before, +.radioItem.pressed input[type="radio"]:not(active) + label::before { + background-color: #ebebeb; + border-color: #858585; +} + +input[type="radio"]:checked + label::before { + background-color: #0996f8; + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij4KICA8Y2lyY2xlIGN4PSI4IiBjeT0iOCIgcj0iNCIgZmlsbD0iI2ZmZiIgLz4KPC9zdmc+Cg==); + border-color: #0670cc; +} + +input[type="radio"]:checked:hover + label::before, +.radioItem.hover input[type="radio"]:checked:not(active) + label::before { + background-color: #0670cc; + border-color: #005bab; +} + +input[type="radio"]:checked:hover:active + label::before, +.radioItem.pressed input[type="radio"]:checked:not(active) + label::before { + background-color: #005bab; + border-color: #004480; } .radioItem.disabled input[type="radio"] + label, .radioItem.disabled input[type="radio"]:hover + label, .radioItem.disabled input[type="radio"]:hover:active + label { color: #999; opacity: .5; } +.radioItem.focused input[type="radio"] + label::before { + border-color: #0996f8; + box-shadow: 0 0 0 2px rgba(97, 181, 255, 0.75); +} + +.radioItem.focused input[type="radio"]:checked + label::before { + border-color: #fff; +} + /* Checkboxes */ .checkboxItem { margin-bottom: 6px; + text-align: left; +} + +input[type="checkbox"] { + display: none; } input[type="checkbox"] + label { -moz-user-select: none; - text-align: left; +} + +input[type="checkbox"] + label::before { + background-color: #fff; + background-position: center; + border: 1px solid #b1b1b1; + content: ""; + display: inline-block; + height: 16px; + margin-right: 6px; + vertical-align: text-top; + width: 16px; +} + +input[type="checkbox"]:hover + label::before, +.checkboxItem.hover input[type="checkbox"]:not(active) + label::before { + background-color: #fbfbfb; + border-color: #b1b1b1; +} + +input[type="checkbox"]:hover:active + label::before, +.checkboxItem.pressed input[type="checkbox"]:not(active) + label::before { + background-color: #ebebeb; + border-color: #858585; +} + +input[type="checkbox"]:checked + label::before { + background-color: #0996f8; + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij4KICA8cGF0aCBkPSJNNy43LDEyLjkgQzcuNCwxMy4zIDYuOCwxMy40IDYuNCwxMyBMMy4yLDkuOCBDMi44LDkuNCAyLjgsOC42IDMuMiw4LjIgQzMuNiw3LjggNC40LDcuOCA0LjgsOC4yIEw2LjksMTAuMyBMMTEuMSw0LjQgQzExLjUsMy45IDEyLjIsMy44IDEyLjcsNC4xIEMxMy4yLDQuNSAxMy4zLDUuMiAxMyw1LjcgTDcuNywxMi45IEw3LjcsMTIuOSBaIiBmaWxsPSIjZmZmIiAvPgo8L3N2Zz4K); + border-color: #0670cc; +} + +input[type="checkbox"]:checked:hover + label::before, +.checkboxItem.hover input[type="checkbox"]:checked:not(active) + label::before { + background-color: #0670cc; + border-color: #005bab; +} + +input[type="checkbox"]:checked:hover:active + label::before, +.checkboxItem.pressed input[type="checkbox"]:checked:not(active) + label::before { + background-color: #005bab; + border-color: #004480; } .checkboxItem.disabled input[type="checkbox"] + label, .checkboxItem.disabled input[type="checkbox"]:hover + label, .checkboxItem.disabled input[type="checkbox"]:hover:active + label { color: #999; opacity: .5; } +.checkboxItem.focused input[type="checkbox"] + label::before { + border-color: #0996f8; + box-shadow: 0 0 0 2px rgba(97, 181, 255, 0.75); +} + +.checkboxItem.focused input[type="checkbox"]:checked + label::before { + border-color: #fff; +} + /* Expander Button */ button.expander { background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij4KICA8cGF0aCBkPSJNOCwxMkwzLDcsNCw2bDQsNCw0LTQsMSwxWiIgZmlsbD0iIzZBNkE2QSIgLz4KPC9zdmc+Cg==); background-position: center; background-repeat: no-repeat; height: 24px; padding: 0; width: 24px; @@ -349,17 +460,17 @@ textarea:focus:hover { } .panel-formElements-item:last-child { margin-bottom: 0; } .panel-formElements-item label { flex-shrink: 0; - margin: 0 6px; + margin-right: 6px; text-align: right; } .panel-formElements-item input[type="text"], .panel-formElements-item select { flex-grow: 1; }
--- a/browser/components/extensions/schemas/browser_action.json +++ b/browser/components/extensions/schemas/browser_action.json @@ -22,16 +22,20 @@ "$ref": "IconPath", "optional": true }, "default_popup": { "type": "string", "format": "relativeUrl", "optional": true, "preprocess": "localize" + }, + "browser_style": { + "type": "boolean", + "optional": true } }, "optional": true } } } ] },
--- a/browser/components/extensions/schemas/page_action.json +++ b/browser/components/extensions/schemas/page_action.json @@ -22,16 +22,20 @@ "$ref": "IconPath", "optional": true }, "default_popup": { "type": "string", "format": "relativeUrl", "optional": true, "preprocess": "localize" + }, + "browser_style": { + "type": "boolean", + "optional": true } }, "optional": true } } } ] },
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js +++ b/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js @@ -7,28 +7,27 @@ function* testInArea(area) { let extension = ExtensionTestUtils.loadExtension({ manifest: { "background": { "page": "data/background.html", }, "browser_action": { "default_popup": "popup-a.html", + "browser_style": true, }, }, files: { "popup-a.html": scriptPage("popup-a.js"), "popup-a.js": function() { window.onload = () => { - if (window.getComputedStyle(document.body).backgroundColor == "rgb(252, 252, 252)") { - browser.runtime.sendMessage("from-popup-a"); - } else { - browser.runtime.sendMessage("popup-a-failed-style-check"); - } + let background = window.getComputedStyle(document.body).backgroundColor; + browser.test.assertEq("rgb(252, 252, 252)", background); + browser.runtime.sendMessage("from-popup-a"); }; browser.runtime.onMessage.addListener(msg => { if (msg == "close-popup") { window.close(); } }); }, @@ -75,18 +74,16 @@ function* testInArea(area) { sendClick = ({expectEvent, expectPopup, runNextTest}) => { expect = {event: expectEvent, popup: expectPopup, runNextTest}; browser.test.sendMessage("send-click"); }; browser.runtime.onMessage.addListener(msg => { if (msg == "close-popup") { return; - } else if (msg == "popup-a-failed-style-check") { - browser.test.fail("popup failed style check"); } else if (expect.popup) { browser.test.assertEq(msg, `from-popup-${expect.popup}`, "expected popup opened"); } else { browser.test.fail(`unexpected popup: ${msg}`); } expect.popup = null;
--- a/browser/components/extensions/test/browser/browser_ext_pageAction_popup.js +++ b/browser/components/extensions/test/browser/browser_ext_pageAction_popup.js @@ -13,17 +13,21 @@ add_task(function* testPageActionPopup() "page_action": { "default_popup": "popup-a.html", }, }, files: { "popup-a.html": scriptPage("popup-a.js"), "popup-a.js": function() { - browser.runtime.sendMessage("from-popup-a"); + window.onload = () => { + let background = window.getComputedStyle(document.body).backgroundColor; + browser.test.assertEq("transparent", background); + browser.runtime.sendMessage("from-popup-a"); + }; browser.runtime.onMessage.addListener(msg => { if (msg == "close-popup") { window.close(); } }); }, "data/popup-b.html": scriptPage("popup-b.js"),
--- a/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js +++ b/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js @@ -51,24 +51,23 @@ document.addEventListener("DOMContentLoa .setAttribute("href", FAVICON_QUESTION); document.getElementById("startPrivateBrowsing") .addEventListener("command", openPrivateWindow); return; } let tpToggle = document.getElementById("tpToggle"); document.getElementById("tpButton").addEventListener('click', () => { - tpToggle.checked = !tpToggle.checked; + tpToggle.click(); }); document.title = stringBundle.GetStringFromName("title.head"); document.getElementById("favicon") .setAttribute("href", FAVICON_PRIVACY); - document.getElementById("tpButton") - .addEventListener("click", toggleTrackingProtection); + tpToggle.addEventListener("change", toggleTrackingProtection); document.getElementById("startTour") .addEventListener("click", dontShowIntroPanelAgain); let formatURLPref = Cc["@mozilla.org/toolkit/URLFormatterService;1"] .getService(Ci.nsIURLFormatter).formatURLPref; document.getElementById("startTour").setAttribute("href", formatURLPref("privacy.trackingprotection.introURL")); document.getElementById("learnMore").setAttribute("href",
--- a/browser/themes/shared/newtab/newTab.inc.css +++ b/browser/themes/shared/newtab/newTab.inc.css @@ -190,17 +190,17 @@ height: 17px; left: 0; position: absolute; width: 10px; margin-left: 8px; margin-top: 6px; } -.newtab-site[pinned] .newtab-title:-moz-dir(rtl)::before { +.newtab-site[pinned] .newtab-title:dir(rtl)::before { left: auto; right: 0; } /* CONTROLS */ .newtab-control { background-color: transparent; background-size: 24px;
--- a/browser/themes/windows/syncedtabs/sidebar.css +++ b/browser/themes/windows/syncedtabs/sidebar.css @@ -110,23 +110,23 @@ html { .item.client .item-twisty-container:hover { background-image: url("chrome://global/skin/tree/twisty.svg#open-hover"); } .item.client.closed .item-twisty-container:hover { background-image: url("chrome://global/skin/tree/twisty.svg#clsd-hover"); } -.item.client .item-twisty-container:-moz-dir(rtl) { +.item.client .item-twisty-container:dir(rtl) { background-image: url("chrome://global/skin/tree/twisty.svg#open-rtl"); } -.item.client.closed .item-twisty-container:-moz-dir(rtl) { +.item.client.closed .item-twisty-container:dir(rtl) { background-image: url("chrome://global/skin/tree/twisty.svg#clsd-rtl"); } -.item.client .item-twisty-container:hover:-moz-dir(rtl) { +.item.client .item-twisty-container:hover:dir(rtl) { background-image: url("chrome://global/skin/tree/twisty.svg#open-hover-rtl"); } -.item.client.closed .item-twisty-container:hover:-moz-dir(rtl) { +.item.client.closed .item-twisty-container:hover:dir(rtl) { background-image: url("chrome://global/skin/tree/twisty.svg#clsd-hover-rtl"); }
--- a/build/Makefile.in +++ b/build/Makefile.in @@ -1,37 +1,20 @@ # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -ifdef MOZ_APP_BASENAME -APP_INI_DEPS = $(topsrcdir)/config/milestone.txt - -APP_INI_DEPS += $(DEPTH)/config/autoconf.mk -endif - ifdef MOZTTDIR # Install the Firefox OS fonts. include $(MOZTTDIR)/fonts.mk MOZTT_DEST = $(FINAL_TARGET)/fonts MOZTT_FILES = $(patsubst external/moztt/%,$(MOZTTDIR)/%,$(filter external/moztt/%,$(subst :, ,$(PRODUCT_COPY_FILES)))) INSTALL_TARGETS += MOZTT endif include $(topsrcdir)/config/rules.mk TARGET_DEPTH = .. include $(srcdir)/automation-build.mk -ifdef MOZ_APP_BASENAME -$(FINAL_TARGET)/application.ini: $(APP_INI_DEPS) - -ifdef MOZ_APP_STATIC_INI -application.ini.h: appini_header.py $(FINAL_TARGET)/application.ini - $(PYTHON) $^ > $@ -export:: application.ini.h -GARBAGE += application.ini.h -endif -endif - libs:: automation.py
--- a/build/appini_header.py +++ b/build/appini_header.py @@ -3,17 +3,17 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. '''Parses a given application.ini file and outputs the corresponding XULAppData structure as a C++ header file''' import ConfigParser import sys -def main(file): +def main(output, file): config = ConfigParser.RawConfigParser() config.read(file) flags = set() try: if config.getint('XRE', 'EnableProfileMigrator') == 1: flags.add('NS_XRE_ENABLE_PROFILE_MIGRATOR') except: pass try: @@ -29,32 +29,32 @@ def main(file): if missing: print >>sys.stderr, \ "Missing values in %s: %s" % (file, ', '.join(missing)) sys.exit(1) if not 'Crash Reporter:serverurl' in appdata: appdata['Crash Reporter:serverurl'] = '' - print '''#include "nsXREAppData.h" + output.write('''#include "nsXREAppData.h" static const nsXREAppData sAppData = { sizeof(nsXREAppData), NULL, // directory "%(App:vendor)s", "%(App:name)s", "%(App:remotingname)s", "%(App:version)s", "%(App:buildid)s", "%(App:id)s", NULL, // copyright %(flags)s, NULL, // xreDirectory "%(Gecko:minversion)s", "%(Gecko:maxversion)s", "%(Crash Reporter:serverurl)s", %(App:profile)s - };''' % appdata + };''' % appdata) if __name__ == '__main__': if len(sys.argv) != 1: - main(sys.argv[1]) + main(sys.stdout, sys.argv[1]) else: print >>sys.stderr, "Usage: %s /path/to/application.ini" % sys.argv[0]
--- a/build/mach_bootstrap.py +++ b/build/mach_bootstrap.py @@ -52,16 +52,17 @@ environment. MERCURIAL_SETUP_FATAL_INTERVAL = 31 * 24 * 60 * 60 # TODO Bug 794506 Integrate with the in-tree virtualenv configuration. SEARCH_PATHS = [ 'python/mach', 'python/mozboot', 'python/mozbuild', + 'python/mozlint', 'python/mozversioncontrol', 'python/blessings', 'python/compare-locales', 'python/configobj', 'python/futures', 'python/jsmin', 'python/psutil', 'python/which', @@ -134,16 +135,17 @@ MACH_MODULES = [ 'testing/marionette/mach_commands.py', 'testing/mochitest/mach_commands.py', 'testing/mozharness/mach_commands.py', 'testing/talos/mach_commands.py', 'testing/taskcluster/mach_commands.py', 'testing/web-platform/mach_commands.py', 'testing/xpcshell/mach_commands.py', 'tools/docs/mach_commands.py', + 'tools/lint/mach_commands.py', 'tools/mercurial/mach_commands.py', 'tools/mach_commands.py', 'tools/power/mach_commands.py', 'mobile/android/mach_commands.py', ] CATEGORIES = {
--- a/build/moz.build +++ b/build/moz.build @@ -65,16 +65,22 @@ FINAL_TARGET_FILES += ['/.gdbinit'] if CONFIG['MOZ_ASAN'] and CONFIG['CLANG_CL']: FINAL_TARGET_FILES += ['%' + CONFIG['MOZ_CLANG_RT_ASAN_LIB_PATH']] if CONFIG['MOZ_APP_BASENAME']: FINAL_TARGET_PP_FILES += ['application.ini'] if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'android' and CONFIG['MOZ_UPDATER']: FINAL_TARGET_PP_FILES += ['update-settings.ini'] + if CONFIG['MOZ_APP_STATIC_INI']: + GENERATED_FILES += ['application.ini.h'] + appini = GENERATED_FILES['application.ini.h'] + appini.script = 'appini_header.py' + appini.inputs = ['!/dist/bin/application.ini'] + DEFINES['TOPOBJDIR'] = TOPOBJDIR # NOTE: Keep .gdbinit in the topsrcdir for people who run gdb from the topsrcdir. OBJDIR_FILES += ['/.gdbinit'] # Put a .lldbinit in the bin directory and the objdir, to be picked up # automatically by LLDB when we debug executables using either of those two # directories as the current working directory. The .lldbinit file will
--- a/build/virtualenv_packages.txt +++ b/build/virtualenv_packages.txt @@ -2,16 +2,17 @@ marionette_driver.pth:testing/marionette browsermobproxy.pth:testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py wptserve.pth:testing/web-platform/tests/tools/wptserve marionette.pth:testing/marionette/harness blessings.pth:python/blessings configobj.pth:python/configobj jsmin.pth:python/jsmin mach.pth:python/mach mozbuild.pth:python/mozbuild +mozlint.pth:python/mozlint pymake.pth:build/pymake optional:setup.py:python/psutil:build_ext:--inplace optional:psutil.pth:python/psutil which.pth:python/which ply.pth:other-licenses/ply/ mock.pth:python/mock-1.0.0 mozilla.pth:build mozilla.pth:config
--- a/devtools/client/themes/layout.css +++ b/devtools/client/themes/layout.css @@ -21,29 +21,29 @@ #layout-header { box-sizing: border-box; width: 100%; padding: 4px 14px; display: -moz-box; vertical-align: top; } -#layout-header:-moz-dir(rtl) { +#layout-header:dir(rtl) { -moz-box-direction: reverse; } #layout-header > span { display: -moz-box; } #layout-element-size { -moz-box-flex: 1; } -#layout-element-size:-moz-dir(rtl) { +#layout-element-size:dir(rtl) { -moz-box-pack: end; } @media (max-height: 250px) { #layout-header { padding-top: 0; padding-bottom: 0; margin-top: 10px;
--- a/devtools/client/themes/toolbars.css +++ b/devtools/client/themes/toolbars.css @@ -405,17 +405,17 @@ background-image: var(--magnifying-glass-image); background-position: 8px center; background-size: 11px 11px; background-repeat: no-repeat; font-size: inherit; } .devtools-searchinput:-moz-locale-dir(rtl), -.devtools-searchinput:-moz-dir(rtl) { +.devtools-searchinput:dir(rtl) { background-position: calc(100% - 8px) center; } .devtools-searchinput > .textbox-input-box > .textbox-search-icons > .textbox-search-icon { visibility: hidden; } /* Searchbox is a div container element for a search input element */ @@ -487,17 +487,17 @@ border: 0; width: 16px; height: 16px; background-position: 0 0; background-repeat: no-repeat; background-color: transparent; } -.devtools-searchinput-clear:-moz-dir(rtl) { +.devtools-searchinput-clear:dir(rtl) { right: unset; left: 7px; } .theme-dark .devtools-searchinput-clear { background-image: url("chrome://devtools/skin/images/search-clear-dark.svg"); }
--- a/devtools/shared/gcli/source/docs/running-tests.md +++ b/devtools/shared/gcli/source/docs/running-tests.md @@ -43,27 +43,16 @@ Or, using the `test` command: testCompletion: Pass (funcs=1, checks=139) testExec: Pass (funcs=1, checks=133) testHistory: Pass (funcs=3, checks=13) .... Summary: Pass (951 checks) -# Phantom - -The GCLI test suite can also be run under PhantomJS as follows: - - $ phantomjs ./phantom-test.js - - Summary: Pass (4289 checks) - - Finished running unit tests. (total 3.843s, ave response time 3.36ms, ...) - - # Travis CI GCLI check-ins are automatically tested by [Travis CI](https://travis-ci.org/joewalker/gcli). # Test Case Generation GCLI can generate test cases automagically. Load ```localtest.html```, type a
--- a/devtools/shared/gcli/source/docs/writing-tests.md +++ b/devtools/shared/gcli/source/docs/writing-tests.md @@ -2,17 +2,17 @@ # Writing Tests There are several sources of GCLI tests and several environments in which they are run. The majority of GCLI tests are stored in [this repository](https://github.com/joewalker/gcli/) in files named like ```./lib/gclitest/test*.js```. These tests run in Firefox, Chrome, Opera, -PhantomJS, and NodeJS/JsDom +and NodeJS/JsDom See [Running Tests](running-tests.md) for further details. GCLI comes with a generic unit test harness (in ```./lib/test/```) and a set of helpers for creating GCLI tests (in ```./lib/gclitest/helpers.js```). # GCLI tests in Firefox
--- a/devtools/shared/gcli/source/lib/gcli/cli.js +++ b/devtools/shared/gcli/source/lib/gcli/cli.js @@ -1163,17 +1163,19 @@ Requisition.prototype.getInputStatusMark cursor = cursor === 0 ? 0 : cursor - 1; var cTrace = argTraces[cursor]; var markup = []; for (var i = 0; i < argTraces.length; i++) { var argTrace = argTraces[i]; var arg = argTrace.arg; var status = Status.VALID; - if (argTrace.part === 'text') { + // When things get very async we can get here while something else is + // doing an update, in which case arg.assignment == null, so we check first + if (argTrace.part === 'text' && arg.assignment != null) { status = arg.assignment.getStatus(arg); // Promote INCOMPLETE to ERROR ... if (status === Status.INCOMPLETE) { // If the cursor is in the prefix or suffix of an argument then we // don't consider it in the argument for the purposes of preventing // the escalation to ERROR. However if this is a NamedArgument, then we // allow the suffix (as space between 2 parts of the argument) to be in. // We use arg.assignment.arg not arg because we're looking at the arg
deleted file mode 100644 --- a/devtools/shared/gcli/source/lib/gcli/commands/connect.js +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2012, Mozilla Foundation and contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -var l10n = require('../util/l10n'); -var cli = require('../cli'); -var GcliFront = require('../connectors/remoted').GcliFront; - -/** - * A lookup of the current connection - */ -var fronts = {}; - -/** - * 'connection' type - */ -var connection = { - item: 'type', - name: 'connection', - parent: 'selection', - lookup: function() { - return Object.keys(fronts).map(function(prefix) { - return { name: prefix, value: fronts[prefix] }; - }); - } -}; - -/** - * 'connector' type - */ -var connector = { - item: 'type', - name: 'connector', - parent: 'selection', - lookup: function(context) { - var connectors = context.system.connectors; - return connectors.getAll().map(function(connector) { - return { name: connector.name, value: connector }; - }); - } -}; - -/** - * 'connect' command - */ -var connect = { - item: 'command', - name: 'connect', - description: l10n.lookup('connectDesc'), - manual: l10n.lookup('connectManual'), - params: [ - { - name: 'prefix', - type: 'string', - description: l10n.lookup('connectPrefixDesc') - }, - { - name: 'method', - short: 'm', - type: 'connector', - description: l10n.lookup('connectMethodDesc'), - defaultValue: null, - option: true - }, - { - name: 'url', - short: 'u', - type: 'string', - description: l10n.lookup('connectUrlDesc'), - defaultValue: null, - option: true - } - ], - returnType: 'string', - - exec: function(args, context) { - if (fronts[args.prefix] != null) { - throw new Error(l10n.lookupFormat('connectDupReply', [ args.prefix ])); - } - - args.method = args.method || context.system.connectors.get('xhr'); - - return GcliFront.create(args.method, args.url).then(function(front) { - // Nasty: stash the prefix on the front to help us tidy up - front.prefix = args.prefix; - fronts[args.prefix] = front; - - return front.specs().then(function(specs) { - var remoter = this.createRemoter(args.prefix, front); - var commands = cli.getMapping(context).requisition.system.commands; - commands.addProxyCommands(specs, remoter, args.prefix, args.url); - - // TODO: We should add type proxies here too - - // commandSpecs doesn't include the parent command that we added - return l10n.lookupFormat('connectReply', - [ Object.keys(specs).length + 1 ]); - }.bind(this)); - }.bind(this)); - }, - - /** - * When we register a set of remote commands, we need to provide a proxy - * executor. This is that executor. - */ - createRemoter: function(prefix, front) { - return function(cmdArgs, context) { - var typed = context.typed; - - // If we've been called using a 'context' then there will be no prefix - // otherwise we need to remove it - if (typed.indexOf(prefix) === 0) { - typed = typed.substring(prefix.length).replace(/^ */, ''); - } - - return front.execute(typed).then(function(reply) { - var typedData = context.typedData(reply.type, reply.data); - if (!reply.error) { - return typedData; - } - else { - throw typedData; - } - }); - }.bind(this); - } -}; - -/** - * 'disconnect' command - */ -var disconnect = { - item: 'command', - name: 'disconnect', - description: l10n.lookup('disconnectDesc2'), - manual: l10n.lookup('disconnectManual2'), - params: [ - { - name: 'prefix', - type: 'connection', - description: l10n.lookup('disconnectPrefixDesc') - } - ], - returnType: 'string', - - exec: function(args, context) { - var front = args.prefix; - return front.connection.disconnect().then(function() { - var commands = cli.getMapping(context).requisition.system.commands; - var removed = commands.removeProxyCommands(front.prefix); - delete fronts[front.prefix]; - return l10n.lookupFormat('disconnectReply', [ removed.length ]); - }); - } -}; - -exports.items = [ connection, connector, connect, disconnect ];
deleted file mode 100644 --- a/devtools/shared/gcli/source/lib/gcli/commands/exec.js +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2012, Mozilla Foundation and contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -var host = require('../util/host'); -var l10n = require('../util/l10n'); -var cli = require('../cli'); - -exports.items = [ - { - // 'cd' command - item: 'command', - name: 'cd', - description: l10n.lookup('cdDesc'), - manual: l10n.lookup('cdManual'), - params: [ - { - name: 'directory', - type: { - name: 'file', - filetype: 'directory', - existing: 'yes' - }, - description: l10n.lookup('cdDirectoryDesc') - } - ], - returnType: 'string', - exec: function(args, context) { - context.shell.cwd = args.directory; - return l10n.lookupFormat('cdOutput', [ context.shell.cwd ]); - } - }, - { - // 'exec' command - item: 'command', - name: 'exec', - description: l10n.lookup('execDesc'), - manual: l10n.lookup('execManual'), - params: [ - { - name: 'command', - type: 'string', - description: l10n.lookup('execCommandDesc') - } - ], - returnType: 'output', - exec: function(args, context) { - var cmdArgs = cli.tokenize(args.command).map(function(arg) { - return arg.text; - }); - var cmd = cmdArgs.shift(); - - var spawnSpec = { - cmd: cmd, - args: cmdArgs, - env: context.shell.env, - cwd: context.shell.cwd - }; - - return host.spawn(context, spawnSpec).then(function(output) { - if (output.code === 0) { - return output; - } - - throw output.data; - }, function(output) { - throw output.data; - }); - } - }, - { - // How we display the output of a generic exec command: we have to assume - // that it is a string to be displayed in a monospaced font - item: 'converter', - from: 'output', - to: 'view', - exec: function(output, context) { - return { - html: '<pre>${output.data}</pre>', - data: { output: output } - }; - } - }, - { - item: 'converter', - from: 'output', - to: 'string', - exec: function(output, context) { - return output.data; - } - } -];
deleted file mode 100644 --- a/devtools/shared/gcli/source/lib/gcli/commands/global.js +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2012, Mozilla Foundation and contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -var l10n = require('../util/l10n'); - -exports.items = [ - { - // A type for selecting a known setting - item: 'type', - name: 'global', - parent: 'selection', - remote: true, - lookup: function(context) { - var knownWindows = context.environment.window == null ? - [ ] : [ context.environment.window ]; - - this.last = findWindows(knownWindows).map(function(window) { - return { name: windowToString(window), value: window }; - }); - - return this.last; - } - }, - { - // A command to switch JS globals - item: 'command', - runAt: 'client', - name: 'global', - description: l10n.lookup('globalDesc'), - params: [ - { - name: 'window', - type: 'global', - description: l10n.lookup('globalWindowDesc'), - } - ], - returnType: 'string', - exec: function(args, context) { - context.shell.global = args.window; - return l10n.lookupFormat('globalOutput', [ windowToString(args.window) ]); - } - } -]; - -function windowToString(win) { - return win.location ? win.location.href : 'NodeJS-Global'; -} - -function findWindows(knownWindows) { - knownWindows.forEach(function(window) { - addChildWindows(window, knownWindows); - }); - return knownWindows; -} - -function addChildWindows(win, knownWindows) { - var iframes = win.document.querySelectorAll('iframe'); - [].forEach.call(iframes, function(iframe) { - var iframeWin = iframe.contentWindow; - if (knownWindows.indexOf(iframeWin) === -1) { - knownWindows.push(iframeWin); - addChildWindows(iframeWin, knownWindows); - } - }); -}
deleted file mode 100644 --- a/devtools/shared/gcli/source/lib/gcli/commands/intro.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2012, Mozilla Foundation and contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -var l10n = require('../util/l10n'); -var intro = require('../ui/intro'); - -exports.items = [ - { - item: 'converter', - from: 'intro', - to: 'view', - exec: intro.createView - }, - { - item: 'command', - name: 'intro', - description: l10n.lookup('introDesc'), - manual: l10n.lookup('introManual'), - returnType: 'intro', - exec: function(args, context) { - // The intro command is pure formatting - no data - } - } -];
deleted file mode 100644 --- a/devtools/shared/gcli/source/lib/gcli/commands/lang.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2012, Mozilla Foundation and contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -var l10n = require('../util/l10n'); -var cli = require('../cli'); - -exports.items = [ - { - // A type that lists available languages - item: 'type', - name: 'language', - parent: 'selection', - lookup: function(context) { - return context.system.languages.getAll().map(function(language) { - return { name: language.name, value: language }; - }); - } - }, - { - // A command to switch languages - item: 'command', - name: 'lang', - description: l10n.lookup('langDesc'), - params: [ - { - name: 'language', - type: 'language' - } - ], - returnType: 'view', - exec: function(args, context) { - var terminal = cli.getMapping(context).terminal; - - context.environment.window.setTimeout(function() { - terminal.switchLanguage(args.language); - }, 10); - - return { - html: - '<div class="gcli-section ${style}">' + - ' ${langOutput}' + - '</div>', - data: { - langOutput: l10n.lookupFormat('langOutput', [ args.language.name ]), - style: args.language.proportionalFonts ? '' : 'gcli-row-script' - } - }; - } - } -];
--- a/devtools/shared/gcli/source/lib/gcli/commands/mocks.js +++ b/devtools/shared/gcli/source/lib/gcli/commands/mocks.js @@ -13,18 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; var cli = require('../cli'); var mockCommands = require('../test/mockCommands'); +var mockFileCommands = require('../test/mockFileCommands'); var mockSettings = require('../test/mockSettings'); -var mockDocument = require('../test/mockDocument'); + +var isNode = (typeof(process) !== 'undefined' && + process.title.indexOf('node') != -1); exports.items = [ { item: 'command', name: 'mocks', description: 'Add/remove mock commands', params: [ { @@ -42,18 +45,24 @@ exports.items = [ var requisition = cli.getMapping(context).requisition; this[args.included](requisition); return 'Mock commands are now ' + args.included; }, on: function(requisition) { mockCommands.setup(requisition); mockSettings.setup(requisition.system); - mockDocument.setup(requisition); + + if (isNode) { + mockFileCommands.setup(requisition); + } }, off: function(requisition) { mockCommands.shutdown(requisition); mockSettings.shutdown(requisition.system); - mockDocument.shutdown(requisition); + + if (isNode) { + mockFileCommands.shutdown(requisition); + } } } ];
--- a/devtools/shared/gcli/source/lib/gcli/commands/moz.build +++ b/devtools/shared/gcli/source/lib/gcli/commands/moz.build @@ -2,20 +2,15 @@ # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. DevToolsModules( 'clear.js', 'commands.js', - 'connect.js', 'context.js', - 'exec.js', - 'global.js', 'help.js', - 'intro.js', - 'lang.js', 'mocks.js', 'pref.js', 'preflist.js', 'test.js', )
--- a/devtools/shared/gcli/source/lib/gcli/commands/test.js +++ b/devtools/shared/gcli/source/lib/gcli/commands/test.js @@ -11,25 +11,29 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; -require('../test/suite'); - var examiner = require('../testharness/examiner'); var stati = require('../testharness/status').stati; var helpers = require('../test/helpers'); +var suite = require('../test/suite'); var cli = require('../cli'); var Requisition = require('../cli').Requisition; var createRequisitionAutomator = require('../test/automators/requisition').createRequisitionAutomator; +var isNode = (typeof(process) !== 'undefined' && + process.title.indexOf('node') != -1); + +suite.init(isNode); + exports.optionsContainer = []; exports.items = [ { item: 'type', name: 'suite', parent: 'selection', cacheable: true, @@ -64,22 +68,25 @@ exports.items = [ throw new Error('Can\'t use --usehost without injected options'); } var options; if (args.usehost) { options = exports.optionsContainer[0]; } else { + var env = { + document: document, + window: window + }; options = { - isNode: (typeof(process) !== 'undefined' && - process.title.indexOf('node') != -1), + isNode: isNode, isFirefox: false, isPhantomjs: false, - requisition: new Requisition(context.system) + requisition: new Requisition(context.system, { environment: env }) }; options.automator = createRequisitionAutomator(options.requisition); } var requisition = options.requisition; requisition.system.commands.get('mocks').on(requisition); helpers.resetResponseTimes(); examiner.reset();
--- a/devtools/shared/gcli/source/lib/gcli/languages/command.js +++ b/devtools/shared/gcli/source/lib/gcli/languages/command.js @@ -481,26 +481,31 @@ var commandLanguage = exports.commandLan } if (ev.output.error) { data.promptEle.classList.add('gcli-row-error'); } util.clearElement(data.rowoutEle); return ev.output.convert('dom', context).then(function(node) { + this.terminal.scrollToBottom(); + data.throbEle.style.display = ev.output.completed ? 'none' : 'block'; + + if (node == null) { + data.promptEle.classList.add('gcli-row-error'); + // TODO: show some error to the user + } + this._linksToNewTab(node); data.rowoutEle.appendChild(node); var event = document.createEvent('Event'); event.initEvent('load', true, true); event.addedElement = node; node.dispatchEvent(event); - - this.terminal.scrollToBottom(); - data.throbEle.style.display = ev.output.completed ? 'none' : 'block'; }.bind(this)); }.bind(this)).catch(console.error); this.terminal.addElement(data.rowinEle); this.terminal.addElement(data.rowoutEle); this.terminal.scrollToBottom(); this.focusManager.outputted();
--- a/devtools/shared/gcli/source/lib/gcli/types/delegate.js +++ b/devtools/shared/gcli/source/lib/gcli/types/delegate.js @@ -82,16 +82,17 @@ exports.items = [ // change the function definition to accommodate this right now isImportant: false }, { item: 'type', name: 'remote', paramName: undefined, blankIsValid: false, + hasPredictions: true, getSpec: function(commandName, paramName) { return { name: 'remote', commandName: commandName, paramName: paramName, blankIsValid: this.blankIsValid };
--- a/devtools/shared/gcli/source/lib/gcli/types/file.js +++ b/devtools/shared/gcli/source/lib/gcli/types/file.js @@ -58,25 +58,21 @@ exports.items = [ } if (this.existing !== 'yes' && this.existing !== 'no' && this.existing !== 'maybe') { throw new Error('existing must be one of [yes|no|maybe]'); } }, - getSpec: function() { - var matches = (typeof this.matches === 'string' || this.matches == null) ? - this.matches : - this.matches.source; // Assume RegExp + getSpec: function(commandName, paramName) { return { - name: 'file', - filetype: this.filetype, - existing: this.existing, - matches: matches + name: 'remote', + commandName: commandName, + paramName: paramName }; }, stringify: function(file) { if (file == null) { return ''; }
--- a/devtools/shared/gcli/source/lib/gcli/util/host.js +++ b/devtools/shared/gcli/source/lib/gcli/util/host.js @@ -55,23 +55,16 @@ Highlighter.prototype._unhighlightNode = // Enable when the highlighter rewrite is done }; exports.Highlighter = Highlighter; /** * See docs in lib/gcli/util/host.js */ -exports.spawn = function(context, spawnSpec) { - throw new Error('Not supported'); -}; - -/** - * See docs in lib/gcli/util/host.js - */ exports.exec = function(task) { return Task.spawn(task); }; /** * The URL API is new enough that we need specific platform help */ exports.createUrl = function(uristr, base) {
--- a/devtools/shared/gcli/source/lib/gcli/util/util.js +++ b/devtools/shared/gcli/source/lib/gcli/util/util.js @@ -171,17 +171,17 @@ exports.createEvent = function(name) { return new Promise(function(resolve, reject) { var handler = function(arg) { event.remove(handler); resolve(arg); }; event.add(handler); }); - }, + }; /** * Temporarily prevent this event from firing. * @see resumeFire(ev) */ event.holdFire = function() { if (eventDebug) { console.group('Holding fire: ' + name);
--- a/dom/audiochannel/AudioChannelAgent.cpp +++ b/dom/audiochannel/AudioChannelAgent.cpp @@ -197,30 +197,33 @@ AudioChannelAgent::InitInternal(nsPIDOMW ("AudioChannelAgent, InitInternal, this = %p, type = %d, " "owner = %p, hasCallback = %d\n", this, mAudioChannelType, mWindow.get(), (!!mCallback || !!mWeakCallback))); return NS_OK; } NS_IMETHODIMP -AudioChannelAgent::NotifyStartedPlaying(AudioPlaybackConfig* aConfig) +AudioChannelAgent::NotifyStartedPlaying(AudioPlaybackConfig* aConfig, + bool aAudible) { if (NS_WARN_IF(!aConfig)) { return NS_ERROR_FAILURE; } RefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate(); if (mAudioChannelType == AUDIO_AGENT_CHANNEL_ERROR || service == nullptr || mIsRegToService) { return NS_ERROR_FAILURE; } + MOZ_ASSERT(AudioChannelService::AudibleState::eAudible == true && + AudioChannelService::AudibleState::eNotAudible == false); service->RegisterAudioChannelAgent(this, - static_cast<AudioChannel>(mAudioChannelType)); + static_cast<AudioChannelService::AudibleState>(aAudible)); AudioPlaybackConfig config = service->GetMediaConfig(mWindow, mAudioChannelType); MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug, ("AudioChannelAgent, NotifyStartedPlaying, this = %p, " "mute = %d, volume = %f, suspend = %d\n", this, config.mMuted, config.mVolume, config.mSuspend)); @@ -245,16 +248,33 @@ AudioChannelAgent::NotifyStoppedPlaying( if (service) { service->UnregisterAudioChannelAgent(this); } mIsRegToService = false; return NS_OK; } +NS_IMETHODIMP +AudioChannelAgent::NotifyStartedAudible(bool aAudible) +{ + MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug, + ("AudioChannelAgent, NotifyStartedAudible, this = %p, " + "audible = %d\n", this, aAudible)); + + RefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate(); + if (NS_WARN_IF(!service)) { + return NS_ERROR_FAILURE; + } + + service->AudioAudibleChanged( + this, static_cast<AudioChannelService::AudibleState>(aAudible)); + return NS_OK; +} + already_AddRefed<nsIAudioChannelAgentCallback> AudioChannelAgent::GetCallback() { nsCOMPtr<nsIAudioChannelAgentCallback> callback = mCallback; if (!callback) { callback = do_QueryReferent(mWeakCallback); } return callback.forget();
--- a/dom/audiochannel/AudioChannelService.cpp +++ b/dom/audiochannel/AudioChannelService.cpp @@ -89,51 +89,45 @@ public: } private: const uint64_t mWindowID; const AudioChannel mAudioChannel; const bool mActive; }; -void -NotifyChannelActive(uint64_t aWindowID, AudioChannel aAudioChannel, - bool aActive) -{ - RefPtr<Runnable> runnable = - new NotifyChannelActiveRunnable(aWindowID, aAudioChannel, aActive); - NS_DispatchToCurrentThread(runnable); -} - bool IsParentProcess() { return XRE_GetProcessType() == GeckoProcessType_Default; } -class MediaPlaybackRunnable : public Runnable +class AudioPlaybackRunnable final : public Runnable { public: - MediaPlaybackRunnable(nsPIDOMWindowOuter* aWindow, bool aActive) + AudioPlaybackRunnable(nsPIDOMWindowOuter* aWindow, bool aActive) : mWindow(aWindow) , mActive(aActive) {} NS_IMETHOD Run() { nsCOMPtr<nsIObserverService> observerService = services::GetObserverService(); - if (observerService) { - observerService->NotifyObservers( - ToSupports(mWindow), - "audio-playback", - mActive ? MOZ_UTF16("active") - : MOZ_UTF16("inactive")); + if (NS_WARN_IF(!observerService)) { + return NS_ERROR_FAILURE; } + observerService->NotifyObservers(ToSupports(mWindow), + "audio-playback", + mActive ? MOZ_UTF16("active") + : MOZ_UTF16("inactive")); + + MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug, + ("AudioPlaybackRunnable, active = %d\n", mActive)); return NS_OK; } private: nsCOMPtr<nsPIDOMWindowOuter> mWindow; bool mActive; }; @@ -250,96 +244,59 @@ AudioChannelService::AudioChannelService } AudioChannelService::~AudioChannelService() { } void AudioChannelService::RegisterAudioChannelAgent(AudioChannelAgent* aAgent, - AudioChannel aChannel) + AudibleState aAudible) { + MOZ_ASSERT(aAgent); + uint64_t windowID = aAgent->WindowID(); AudioChannelWindow* winData = GetWindowData(windowID); if (!winData) { winData = new AudioChannelWindow(windowID); mWindows.AppendElement(winData); } - MOZ_ASSERT(!winData->mAgents.Contains(aAgent)); - winData->mAgents.AppendElement(aAgent); - - ++winData->mChannels[(uint32_t)aChannel].mNumberOfAgents; - - // The first one, we must inform the BrowserElementAudioChannel. - if (winData->mChannels[(uint32_t)aChannel].mNumberOfAgents == 1) { - NotifyChannelActive(aAgent->WindowID(), aChannel, true); - } - - // If this is the first agent for this window, we must notify the observers. - if (winData->mAgents.Length() == 1) { - RefPtr<MediaPlaybackRunnable> runnable = - new MediaPlaybackRunnable(aAgent->Window(), true /* active */); - NS_DispatchToCurrentThread(runnable); - } - - // If the window has already been captured, the agent of that window should - // also be captured. - if (winData->mIsAudioCaptured) { - aAgent->WindowAudioCaptureChanged(aAgent->InnerWindowID(), - winData->mIsAudioCaptured); - } + // To make sure agent would be alive because AppendAgent() would trigger the + // callback function of AudioChannelAgentOwner that means the agent might be + // released in their callback. + RefPtr<AudioChannelAgent> kungFuDeathGrip(aAgent); + winData->AppendAgent(aAgent, aAudible); MaybeSendStatusUpdate(); } void AudioChannelService::UnregisterAudioChannelAgent(AudioChannelAgent* aAgent) { + MOZ_ASSERT(aAgent); + AudioChannelWindow* winData = GetWindowData(aAgent->WindowID()); if (!winData) { return; } - if (winData->mAgents.Contains(aAgent)) { - int32_t channel = aAgent->AudioChannelType(); - uint64_t windowID = aAgent->WindowID(); - - // aAgent can be freed after this call. - winData->mAgents.RemoveElement(aAgent); - - MOZ_ASSERT(winData->mChannels[channel].mNumberOfAgents > 0); - - --winData->mChannels[channel].mNumberOfAgents; - - // The last one, we must inform the BrowserElementAudioChannel. - if (winData->mChannels[channel].mNumberOfAgents == 0) { - NotifyChannelActive(windowID, static_cast<AudioChannel>(channel), false); - } - } + // To make sure agent would be alive because AppendAgent() would trigger the + // callback function of AudioChannelAgentOwner that means the agent might be + // released in their callback. + RefPtr<AudioChannelAgent> kungFuDeathGrip(aAgent); + winData->RemoveAgent(aAgent); #ifdef MOZ_WIDGET_GONK bool active = AnyAudioChannelIsActive(); for (uint32_t i = 0; i < mSpeakerManager.Length(); i++) { mSpeakerManager[i]->SetAudioChannelActive(active); } #endif - // If this is the last agent for this window, we must notify the observers. - if (winData->mAgents.IsEmpty()) { - RefPtr<MediaPlaybackRunnable> runnable = - new MediaPlaybackRunnable(aAgent->Window(), false /* active */); - NS_DispatchToCurrentThread(runnable); - } - - // No need to capture non-audible object. - if (winData->mIsAudioCaptured) { - aAgent->WindowAudioCaptureChanged(aAgent->InnerWindowID(), false); - } - MaybeSendStatusUpdate(); } void AudioChannelService::RegisterTabParent(TabParent* aTabParent) { MOZ_ASSERT(aTabParent); MOZ_ASSERT(!mTabParents.Contains(aTabParent)); @@ -396,16 +353,29 @@ AudioChannelService::GetMediaConfig(nsPI window = do_QueryInterface(win); // If there is no parent, or we are the toplevel we don't continue. } while (window && window != aWindow); return config; } +void +AudioChannelService::AudioAudibleChanged(AudioChannelAgent* aAgent, + AudibleState aAudible) +{ + MOZ_ASSERT(aAgent); + + uint64_t windowID = aAgent->WindowID(); + AudioChannelWindow* winData = GetWindowData(windowID); + if (winData) { + winData->AudioAudibleChanged(aAgent, aAudible); + } +} + bool AudioChannelService::TelephonyChannelIsActive() { nsTObserverArray<nsAutoPtr<AudioChannelWindow>>::ForwardIterator windowsIter(mWindows); while (windowsIter.HasMore()) { AudioChannelWindow* next = windowsIter.GetNext(); if (next->mChannels[(uint32_t)AudioChannel::Telephony].mNumberOfAgents != 0 && !next->mChannels[(uint32_t)AudioChannel::Telephony].mMuted) { @@ -1025,8 +995,151 @@ AudioChannelService::ChildStatusReceived } /* static */ bool AudioChannelService::IsAudioChannelMutedByDefault() { CreateServiceIfNeeded(); return sAudioChannelMutedByDefault; } + +void +AudioChannelService::AudioChannelWindow::AppendAgent(AudioChannelAgent* aAgent, + AudibleState aAudible) +{ + MOZ_ASSERT(aAgent); + + AppendAgentAndIncreaseAgentsNum(aAgent); + AudioCapturedChanged(aAgent, AudioCaptureState::eCapturing); + AudioAudibleChanged(aAgent, aAudible); +} + +void +AudioChannelService::AudioChannelWindow::RemoveAgent(AudioChannelAgent* aAgent) +{ + MOZ_ASSERT(aAgent); + + RemoveAgentAndReduceAgentsNum(aAgent); + AudioCapturedChanged(aAgent, AudioCaptureState::eNotCapturing); + AudioAudibleChanged(aAgent, AudibleState::eNotAudible); +} + +void +AudioChannelService::AudioChannelWindow::AppendAgentAndIncreaseAgentsNum(AudioChannelAgent* aAgent) +{ + MOZ_ASSERT(aAgent); + MOZ_ASSERT(!mAgents.Contains(aAgent)); + + int32_t channel = aAgent->AudioChannelType(); + mAgents.AppendElement(aAgent); + + ++mChannels[channel].mNumberOfAgents; + + // The first one, we must inform the BrowserElementAudioChannel. + if (mChannels[channel].mNumberOfAgents == 1) { + NotifyChannelActive(aAgent->WindowID(), + static_cast<AudioChannel>(channel), + true); + } +} + +void +AudioChannelService::AudioChannelWindow::RemoveAgentAndReduceAgentsNum(AudioChannelAgent* aAgent) +{ + MOZ_ASSERT(aAgent); + MOZ_ASSERT(mAgents.Contains(aAgent)); + + int32_t channel = aAgent->AudioChannelType(); + mAgents.RemoveElement(aAgent); + + MOZ_ASSERT(mChannels[channel].mNumberOfAgents > 0); + --mChannels[channel].mNumberOfAgents; + + if (mChannels[channel].mNumberOfAgents == 0) { + NotifyChannelActive(aAgent->WindowID(), + static_cast<AudioChannel>(channel), + false); + } +} + +void +AudioChannelService::AudioChannelWindow::AudioCapturedChanged(AudioChannelAgent* aAgent, + AudioCaptureState aCapture) +{ + MOZ_ASSERT(aAgent); + + if (mIsAudioCaptured) { + aAgent->WindowAudioCaptureChanged(aAgent->InnerWindowID(), aCapture); + } +} + +void +AudioChannelService::AudioChannelWindow::AudioAudibleChanged(AudioChannelAgent* aAgent, + AudibleState aAudible) +{ + MOZ_ASSERT(aAgent); + + if (aAudible) { + AppendAudibleAgentIfNotContained(aAgent); + } else { + RemoveAudibleAgentIfContained(aAgent); + } +} + +void +AudioChannelService::AudioChannelWindow::AppendAudibleAgentIfNotContained(AudioChannelAgent* aAgent) +{ + MOZ_ASSERT(aAgent); + MOZ_ASSERT(mAgents.Contains(aAgent)); + + if (!mAudibleAgents.Contains(aAgent)) { + mAudibleAgents.AppendElement(aAgent); + if (IsFirstAudibleAgent()) { + NotifyAudioAudibleChanged(aAgent->Window(), AudibleState::eAudible); + } + } +} + +void +AudioChannelService::AudioChannelWindow::RemoveAudibleAgentIfContained(AudioChannelAgent* aAgent) +{ + MOZ_ASSERT(aAgent); + + if (mAudibleAgents.Contains(aAgent)) { + mAudibleAgents.RemoveElement(aAgent); + if (IsLastAudibleAgent()) { + NotifyAudioAudibleChanged(aAgent->Window(), AudibleState::eNotAudible); + } + } +} + +bool +AudioChannelService::AudioChannelWindow::IsFirstAudibleAgent() const +{ + return (mAudibleAgents.Length() == 1); +} + +bool +AudioChannelService::AudioChannelWindow::IsLastAudibleAgent() const +{ + return mAudibleAgents.IsEmpty(); +} + +void +AudioChannelService::AudioChannelWindow::NotifyAudioAudibleChanged(nsPIDOMWindowOuter* aWindow, + AudibleState aAudible) +{ + RefPtr<AudioPlaybackRunnable> runnable = + new AudioPlaybackRunnable(aWindow, aAudible); + nsresult rv = NS_DispatchToCurrentThread(runnable); + NS_WARN_IF(NS_FAILED(rv)); +} + +void +AudioChannelService::AudioChannelWindow::NotifyChannelActive(uint64_t aWindowID, + AudioChannel aChannel, + bool aActive) +{ + RefPtr<NotifyChannelActiveRunnable> runnable = + new NotifyChannelActiveRunnable(aWindowID, aChannel, aActive); + nsresult rv = NS_DispatchToCurrentThread(runnable); + NS_WARN_IF(NS_FAILED(rv)); +}
--- a/dom/audiochannel/AudioChannelService.h +++ b/dom/audiochannel/AudioChannelService.h @@ -63,33 +63,43 @@ public: class AudioChannelService final : public nsIAudioChannelService , public nsIObserver { public: NS_DECL_ISUPPORTS NS_DECL_NSIOBSERVER NS_DECL_NSIAUDIOCHANNELSERVICE + enum AudibleState : bool { + eAudible = true, + eNotAudible = false + }; + + enum AudioCaptureState : bool { + eCapturing = true, + eNotCapturing = false + }; + /** * Returns the AudioChannelServce singleton. * If AudioChannelServce is not exist, create and return new one. * Only to be called from main thread. */ static already_AddRefed<AudioChannelService> GetOrCreate(); static bool IsAudioChannelMutedByDefault(); static PRLogModuleInfo* GetAudioChannelLog(); /** * Any audio channel agent that starts playing should register itself to * this service, sharing the AudioChannel. */ void RegisterAudioChannelAgent(AudioChannelAgent* aAgent, - AudioChannel aChannel); + AudibleState aAudible); /** * Any audio channel agent that stops playing should unregister itself to * this service. */ void UnregisterAudioChannelAgent(AudioChannelAgent* aAgent); /** @@ -100,16 +110,23 @@ public: /** * Return the state to indicate this audioChannel for his window should keep * playing/muted/suspended. */ AudioPlaybackConfig GetMediaConfig(nsPIDOMWindowOuter* aWindow, uint32_t aAudioChannel) const; + /** + * Called this method when the audible state of the audio playback changed, + * it would dispatch the playback event to observers which want to know the + * actual audible state of the window. + */ + void AudioAudibleChanged(AudioChannelAgent* aAgent, AudibleState aAudible); + /* Methods for the BrowserElementAudioChannel */ float GetAudioChannelVolume(nsPIDOMWindowOuter* aWindow, AudioChannel aChannel); void SetAudioChannelVolume(nsPIDOMWindowOuter* aWindow, AudioChannel aChannel, float aVolume); bool GetAudioChannelMuted(nsPIDOMWindowOuter* aWindow, AudioChannel aChannel); @@ -210,32 +227,57 @@ private: : AudioPlaybackConfig(1.0, IsAudioChannelMutedByDefault(), nsISuspendedTypes::NONE_SUSPENDED) , mNumberOfAgents(0) {} uint32_t mNumberOfAgents; }; - struct AudioChannelWindow final + class AudioChannelWindow final { + public: explicit AudioChannelWindow(uint64_t aWindowID) : mWindowID(aWindowID), mIsAudioCaptured(false) { // Workaround for bug1183033, system channel type can always playback. mChannels[(int16_t)AudioChannel::System].mMuted = false; } + void AudioAudibleChanged(AudioChannelAgent* aAgent, AudibleState aAudible); + + void AppendAgent(AudioChannelAgent* aAgent, AudibleState aAudible); + void RemoveAgent(AudioChannelAgent* aAgent); + uint64_t mWindowID; bool mIsAudioCaptured; AudioChannelConfig mChannels[NUMBER_OF_AUDIO_CHANNELS]; // Raw pointer because the AudioChannelAgent must unregister itself. nsTObserverArray<AudioChannelAgent*> mAgents; + nsTObserverArray<AudioChannelAgent*> mAudibleAgents; + + private: + void AudioCapturedChanged(AudioChannelAgent* aAgent, + AudioCaptureState aCapture); + + void AppendAudibleAgentIfNotContained(AudioChannelAgent* aAgent); + void RemoveAudibleAgentIfContained(AudioChannelAgent* aAgent); + + void AppendAgentAndIncreaseAgentsNum(AudioChannelAgent* aAgent); + void RemoveAgentAndReduceAgentsNum(AudioChannelAgent* aAgent); + + bool IsFirstAudibleAgent() const; + bool IsLastAudibleAgent() const; + + void NotifyAudioAudibleChanged(nsPIDOMWindowOuter* aWindow, + AudibleState aAudible); + void NotifyChannelActive(uint64_t aWindowID, AudioChannel aChannel, + bool aActive); }; AudioChannelWindow* GetOrCreateWindowData(nsPIDOMWindowOuter* aWindow); AudioChannelWindow* GetWindowData(uint64_t aWindowID) const;
--- a/dom/audiochannel/nsIAudioChannelAgent.idl +++ b/dom/audiochannel/nsIAudioChannelAgent.idl @@ -84,20 +84,18 @@ interface nsIAudioChannelAgentCallback : void windowAudioCaptureChanged(in bool aCapture); }; /** * This interface provides an agent for gecko components to participate * in the audio channel service. Gecko components are responsible for * 1. Indicating what channel type they are using (via the init() member * function). - * 2. Before playing, checking the playable status of the channel. - * 3. Notifying the agent when they start/stop using this channel. - * 4. Notifying the agent of changes to the visibility of the component using - * this channel. + * 2. Notifying the agent when they start/stop using this channel. + * 3. Notifying the agent when they are audible. * * The agent will invoke a callback to notify Gecko components of * 1. Changes to the playable status of this channel. */ [uuid(ab7e21c0-970c-11e5-a837-0800200c9a66)] interface nsIAudioChannelAgent : nsISupports { @@ -160,20 +158,30 @@ interface nsIAudioChannelAgent : nsISupp /** * Notify the agent that we want to start playing. * Note: Gecko component SHOULD call this function first then start to * play audio stream only when return value is true. * * @param config * It contains the playback related states (volume/mute/suspend) */ - void notifyStartedPlaying(in AudioPlaybackConfig config); + void notifyStartedPlaying(in AudioPlaybackConfig config, in bool audible); /** * Notify the agent we no longer want to play. * * Note : even if notifyStartedPlaying() returned false, the agent would * still be registered with the audio channel service and receive callbacks * for status changes. So notifyStoppedPlaying must still eventually be * called to unregister the agent with the channel service. */ void notifyStoppedPlaying(); + + + /** + * Notify agent that we already start producing audible data. + * + * Note : sometime audio might become silent during playing, this method is used to + * notify the actually audible state to other services which want to know + * about that, ex. tab sound indicator. + */ + void notifyStartedAudible(in bool audible); };
--- a/dom/base/nsDOMTokenList.cpp +++ b/dom/base/nsDOMTokenList.cpp @@ -114,23 +114,18 @@ nsDOMTokenList::CheckTokens(const nsTArr return rv; } } return NS_OK; } bool -nsDOMTokenList::Contains(const nsAString& aToken, ErrorResult& aError) +nsDOMTokenList::Contains(const nsAString& aToken) { - aError = CheckToken(aToken); - if (aError.Failed()) { - return false; - } - const nsAttrValue* attr = GetParsedAttr(); return attr && attr->Contains(aToken); } void nsDOMTokenList::AddInternal(const nsAttrValue* aAttr, const nsTArray<nsString>& aTokens) {
--- a/dom/base/nsDOMTokenList.h +++ b/dom/base/nsDOMTokenList.h @@ -53,17 +53,17 @@ public: { bool found; IndexedGetter(aIndex, found, aResult); if (!found) { SetDOMStringToNull(aResult); } } void IndexedGetter(uint32_t aIndex, bool& aFound, nsAString& aResult); - bool Contains(const nsAString& aToken, mozilla::ErrorResult& aError); + bool Contains(const nsAString& aToken); void Add(const nsAString& aToken, mozilla::ErrorResult& aError); void Add(const nsTArray<nsString>& aTokens, mozilla::ErrorResult& aError); void Remove(const nsAString& aToken, mozilla::ErrorResult& aError); void Remove(const nsTArray<nsString>& aTokens, mozilla::ErrorResult& aError); void Replace(const nsAString& aToken, const nsAString& aNewToken,
--- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -5158,22 +5158,24 @@ nsDocument::DispatchContentLoadedEvents( mPreloadedPreconnects.Clear(); if (mTiming) { mTiming->NotifyDOMContentLoadedStart(nsIDocument::GetDocumentURI()); } // Dispatch observer notification to notify observers document is interactive. nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService(); - nsIPrincipal *principal = GetPrincipal(); - os->NotifyObservers(static_cast<nsIDocument*>(this), - nsContentUtils::IsSystemPrincipal(principal) ? - "chrome-document-interactive" : - "content-document-interactive", - nullptr); + if (os) { + nsIPrincipal *principal = GetPrincipal(); + os->NotifyObservers(static_cast<nsIDocument*>(this), + nsContentUtils::IsSystemPrincipal(principal) ? + "chrome-document-interactive" : + "content-document-interactive", + nullptr); + } // Fire a DOM event notifying listeners that this document has been // loaded (excluding images and other loads initiated by this // document). nsContentUtils::DispatchTrustedEvent(this, static_cast<nsIDocument*>(this), NS_LITERAL_STRING("DOMContentLoaded"), true, false); @@ -9293,25 +9295,27 @@ nsDocument::OnPageShow(bool aPersisted, nsCOMPtr<EventTarget> target = aDispatchStartTarget; if (!target) { target = do_QueryInterface(GetWindow()); } // Dispatch observer notification to notify observers page is shown. nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService(); - nsIPrincipal *principal = GetPrincipal(); - os->NotifyObservers(static_cast<nsIDocument*>(this), - nsContentUtils::IsSystemPrincipal(principal) ? - "chrome-page-shown" : - "content-page-shown", - nullptr); - if (!mObservingAppThemeChanged) { - os->AddObserver(this, "app-theme-changed", /* ownsWeak */ false); - mObservingAppThemeChanged = true; + if (os) { + nsIPrincipal *principal = GetPrincipal(); + os->NotifyObservers(static_cast<nsIDocument*>(this), + nsContentUtils::IsSystemPrincipal(principal) ? + "chrome-page-shown" : + "content-page-shown", + nullptr); + if (!mObservingAppThemeChanged) { + os->AddObserver(this, "app-theme-changed", /* ownsWeak */ false); + mObservingAppThemeChanged = true; + } } DispatchPageTransition(target, NS_LITERAL_STRING("pageshow"), aPersisted); } static bool NotifyPageHide(nsIDocument* aDocument, void* aData) {
index d7f6a0ccf47fbc30e936b47e3f4d2cf8f4a90a16..4e8b4d3a3d8e27dc6592427e7560a9be23645c3c GIT binary patch literal 20316 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
new file mode 100644 index 0000000000000000000000000000000000000000..dc136f1494024145ffa05952140216a878c9c5cb GIT binary patch literal 188376 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
--- a/dom/base/test/mochitest.ini +++ b/dom/base/test/mochitest.ini @@ -1,11 +1,12 @@ [DEFAULT] support-files = audio.ogg + audioEndedDuringPlaying.webm iframe_bug962251.html iframe_bug976673.html iframe_main_bug1022229.html iframe_sandbox_bug1022229.html file_empty.html iframe_postMessage_solidus.html file_setname.html 345339_iframe.html @@ -280,16 +281,20 @@ skip-if = buildapp == 'b2g' # Requires w [test_applet_alternate_content.html] [test_appname_override.html] [test_async_setTimeout_stack.html] [test_async_setTimeout_stack_across_globals.html] [test_audioWindowUtils.html] [test_audioNotification.html] tags = audiochannel skip-if = buildapp == 'mulet' +[test_audioNotificationSilent_audioFile.html] +tags = audiochannel +[test_audioNotificationSilent_webAudio.html] +tags = audiochannel [test_audioNotificationStream.html] tags = audiochannel skip-if = buildapp == 'mulet' [test_audioNotificationStopOnNavigation.html] tags = audiochannel skip-if = buildapp == 'mulet' [test_audioNotificationWithEarlyPlay.html] tags = audiochannel
new file mode 100644 --- /dev/null +++ b/dom/base/test/test_audioNotificationSilent_audioFile.html @@ -0,0 +1,82 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Audio-playback should be inactive when input file is silent</title> + <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> +</head> +<body> +<script type="application/javascript;version=1.7"> + +SimpleTest.waitForExplicitFinish(); + +var generator = runTest(); +var expectedPlaybackActive = null; +var expectedPlaying = null; + +var audio = new Audio(); +audio.src = "audioEndedDuringPlaying.webm"; + +var observerService = SpecialPowers.Cc["@mozilla.org/observer-service;1"] + .getService(SpecialPowers.Ci.nsIObserverService); + +var observer = { + observe: function(subject, topic, data) { + is(topic, "audio-playback", "audio-playback received"); + is(data, expectedPlaybackActive, "Corrrect audible state"); + is(!audio.ended, expectedPlaying, "Corrrect playing state"); + continueTest(); + } +}; + +function continueTest() { + try { + generator.next(); + } catch (e if e instanceof StopIteration) { + error("Stop test because of exception!"); + } +} + +function audioPlayingStart() { + observerService.addObserver(observer, "audio-playback", false); + ok(true, "Observer set"); + + expectedPlaybackActive = 'active'; + expectedPlaying = true; + + info("Audio playing start"); + audio.play(); +} + +function audioBecomeSilentDuringPlaying() { + info("Audio would become silent during playing"); + + expectedPlaybackActive = 'inactive'; + expectedPlaying = true; +} + +function audioPlayingEnd() { + audio.onended = function() { + info("Audio playback ended"); + audio.onended = null; + + observerService.removeObserver(observer, "audio-playback"); + ok(true, "Observer removed"); + + SimpleTest.finish(); + }; +} + +function runTest() { + yield audioPlayingStart(); + + yield audioBecomeSilentDuringPlaying(); + + yield audioPlayingEnd(); +} + +continueTest(); + +</script> +</body> +</html> \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/dom/base/test/test_audioNotificationSilent_webAudio.html @@ -0,0 +1,103 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Audio-playback should be inactive when web-audio is silent</title> + <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> +</head> +<body> +<script type="application/javascript;version=1.7"> + +SimpleTest.waitForExplicitFinish(); + +var generator = runTest(); +var expectedPlaybackActive = null; +var expectedPlaying = null; + +var ac = new AudioContext(); +var audibleDuration = 3; + +var observerService = SpecialPowers.Cc["@mozilla.org/observer-service;1"] + .getService(SpecialPowers.Ci.nsIObserverService); + +var observer = { + observe: function(subject, topic, data) { + is(topic, "audio-playback", "audio-playback received"); + is(data, expectedPlaybackActive, "Corrrect audible state"); + is(ac.state, expectedPlaying, "Corrrect playing state"); + continueTest(); + } +}; + +function continueTest() { + try { + generator.next(); + } catch (e if e instanceof StopIteration) { + error("Stop test because of exception!"); + } +} + +function playOscillatorNode() { + var dest = ac.destination; + var osc = ac.createOscillator(); + osc.connect(dest); + osc.start(0); + osc.stop(ac.currentTime + audibleDuration); +} + +function audioPlayingStart() { + observerService.addObserver(observer, "audio-playback", false); + ok(true, "Observer set"); + + expectedPlaybackActive = 'active'; + expectedPlaying = "running"; + + info("Audio playing start"); + playOscillatorNode(); +} + +function audioBecomeSilentDuringPlaying() { + info("Audio would become silent during playing"); + + expectedPlaybackActive = 'inactive'; + expectedPlaying = "running"; +} + +function finish() { + observerService.removeObserver(observer, "audio-playback"); + ok(true, "Observer removed"); + + SimpleTest.finish(); +} + +function startAudioContext() { + if (ac.state != "running") { + ac.resume(); + ac.onstatechange = function() { + if (ac.state == "running") { + ok(true, "AudioContext starts running!"); + ac.onstatechange = null; + continueTest(); + } + } + } else { + ok(true, "AudioContext is running!"); + continueTest(); + } +} + +function runTest() { + yield startAudioContext(); + + yield audioPlayingStart(); + + yield audioBecomeSilentDuringPlaying(); + + yield finish(); +} + +continueTest(); + +</script> +</body> +</html> \ No newline at end of file
--- a/dom/base/test/test_bug562169-1.html +++ b/dom/base/test/test_bug562169-1.html @@ -20,17 +20,17 @@ https://bugzilla.mozilla.org/show_bug.cg /** Test for Bug 562169 **/ /** Test that adding an child to an element with dir="rtl" makes the child have rtl directionality, and removing the child makes it go back to ltr directionality **/ function checkSelector(element, expectedDir, expectedChild) { - ok(element.querySelector(":-moz-dir("+expectedDir+")") == expectedChild, + ok(element.querySelector(":dir("+expectedDir+")") == expectedChild, "direction should be " + expectedDir); } var x = document.createElement("div"); var y = document.createElement("div"); x.appendChild(y); checkSelector(x, "ltr", y); $(z).appendChild(x);
--- a/dom/base/test/test_bug562169-2.html +++ b/dom/base/test/test_bug562169-2.html @@ -15,15 +15,15 @@ https://bugzilla.mozilla.org/show_bug.cg <div id="content" style="display: none"> </div> <pre id="test"> <script type="application/javascript"> /** Test for Bug 562169 **/ /** Test that a newly created element has ltr directionality **/ -ok(document.createElement("div").matches(":-moz-dir(ltr)"), +ok(document.createElement("div").matches(":dir(ltr)"), "Element should be ltr on creation"); </script> </pre> </body> </html>
--- a/dom/base/test/test_classList.html +++ b/dom/base/test/test_classList.html @@ -95,17 +95,17 @@ function checkModification(e, funcName, } function assignToClassListStrict(e) { "use strict"; try { e.classList = "foo"; ok(true, "assigning to classList didn't throw"); e.removeAttribute("class"); - } catch (e) { + } catch (e) { ok(false, "assigning to classList threw"); } } function assignToClassList(e) { try { var expect = e.classList; e.classList = "foo"; @@ -211,34 +211,31 @@ function testClassList(e) { is(e.classList[2], undefined, "wrong classList[] result"); // contains() method e.removeAttribute("class"); is(e.classList.contains("a"), false, "wrong classList.contains() result"); try { e.classList.contains(""); - ok(false, "classList.contains() didn't throw"); + ok(true, "classList.contains(empty_string) didn't throw"); } catch (e) { - is(e.name, "SyntaxError", "wrong exception thrown"); - is(e.code, DOMException.SYNTAX_ERR, "wrong exception thrown"); + ok(false, "classList.contains(empty_string) threw"); } try { e.classList.contains(" "); - ok(false, "classList.contains() didn't throw"); + ok(true, "classList.contains(string_with_spaces) didn't throw"); } catch (e) { - is(e.name, "InvalidCharacterError", "wrong exception thrown"); - is(e.code, DOMException.INVALID_CHARACTER_ERR, "wrong exception thrown"); + ok(false, "classList.contains(string_with_spaces) threw"); } try { e.classList.contains("aa "); - ok(false, "classList.contains() didn't throw"); + ok(true, "classList.contains(string_with_spaces) didn't throw"); } catch (e) { - is(e.name, "InvalidCharacterError", "wrong exception thrown"); - is(e.code, DOMException.INVALID_CHARACTER_ERR, "wrong exception thrown"); + ok(false, "classList.contains(string_with_spaces) threw"); } e.setAttribute("class", ""); is(e.classList.contains("a"), false, "wrong classList.contains() result"); e.setAttribute("class", "a"); is(e.classList.contains("a"), true, "wrong classList.contains() result"); is(e.classList.contains("aa"), false, "wrong classList.contains() result"); @@ -377,17 +374,17 @@ function testClassList(e) { // Test for bug 530171 checkToggle("null", null, false, ""); checkToggle("", null, true, "null"); checkToggle("undefined", undefined, false, ""); checkToggle("", undefined, true, "undefined"); // tests for the force argument handling - + function checkForceToggle(before, argument, force, expectedRes, after, expectedException) { checkModification(e, "toggle", [argument, force], expectedRes, before, after, expectedException); } checkForceToggle("", "a", true, true, "a"); checkForceToggle("a", "a", true, true, "a"); checkForceToggle("a", "b", true, true, "a b"); checkForceToggle("a b", "b", true, true, "a b");
index d7f6a0ccf47fbc30e936b47e3f4d2cf8f4a90a16..4e8b4d3a3d8e27dc6592427e7560a9be23645c3c GIT binary patch literal 20316 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
--- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -4502,24 +4502,16 @@ EventStateManager::FireDragEnterOrExit(n aMessage == eDragEnter) { UpdateDragDataTransfer(&event); } } // Finally dispatch the event to the frame if (aTargetFrame) aTargetFrame->HandleEvent(aPresContext, &event, &status); - - if (aMessage == eDragExit && IsRemoteTarget(aTargetContent)) { - nsEventStatus status = nsEventStatus_eIgnore; - WidgetDragEvent remoteEvent(aDragEvent->IsTrusted(), aMessage, - aDragEvent->mWidget); - remoteEvent.AssignDragEventData(*aDragEvent, true); - HandleCrossProcessEvent(&remoteEvent, &status); - } } void EventStateManager::UpdateDragDataTransfer(WidgetDragEvent* dragEvent) { NS_ASSERTION(dragEvent, "drag event is null in UpdateDragDataTransfer!"); if (!dragEvent->mDataTransfer) { return;
--- a/dom/events/test/mochitest.ini +++ b/dom/events/test/mochitest.ini @@ -193,9 +193,9 @@ skip-if = buildapp == 'b2g' || e10s support-files = bug1096146_embedded.html [test_offsetxy.html] [test_eventhandler_scoping.html] [test_bug1013412.html] skip-if = buildapp == 'b2g' # no wheel events on b2g [test_dom_activate_event.html] [test_bug1264380.html] -run-if = e10s # bug1264380 comment 20, nsDragService::InvokeDragSessionImpl behaves differently among platform implementations in non-e10s mode which prevents us to check the validity of nsIDragService::getCurrentSession() consistently via synthesize mouse clicks in non-e10s mode. +run-if = (e10s && os != "win") # Bug 1270043, crash at windows platforms; Bug1264380 comment 20, nsDragService::InvokeDragSessionImpl behaves differently among platform implementations in non-e10s mode which prevents us to check the validity of nsIDragService::getCurrentSession() consistently via synthesize mouse clicks in non-e10s mode.
--- a/dom/fetch/Fetch.cpp +++ b/dom/fetch/Fetch.cpp @@ -293,36 +293,82 @@ public: ErrorResult result; result.ThrowTypeError<MSG_FETCH_FAILED>(); promise->MaybeReject(result); } return true; } }; -class WorkerFetchResponseEndRunnable final : public WorkerRunnable +class WorkerFetchResponseEndBase { - RefPtr<WorkerFetchResolver> mResolver; + RefPtr<PromiseWorkerProxy> mPromiseProxy; public: - WorkerFetchResponseEndRunnable(WorkerPrivate* aWorkerPrivate, - WorkerFetchResolver* aResolver) - : WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount) - , mResolver(aResolver) + explicit WorkerFetchResponseEndBase(PromiseWorkerProxy* aPromiseProxy) + : mPromiseProxy(aPromiseProxy) + { + MOZ_ASSERT(mPromiseProxy); + } + + void + WorkerRunInternal(WorkerPrivate* aWorkerPrivate) + { + MOZ_ASSERT(aWorkerPrivate); + aWorkerPrivate->AssertIsOnWorkerThread(); + mPromiseProxy->CleanUp(); + } +}; + +class WorkerFetchResponseEndRunnable final : public WorkerRunnable + , public WorkerFetchResponseEndBase +{ +public: + explicit WorkerFetchResponseEndRunnable(PromiseWorkerProxy* aPromiseProxy) + : WorkerRunnable(aPromiseProxy->GetWorkerPrivate(), + WorkerThreadModifyBusyCount) + , WorkerFetchResponseEndBase(aPromiseProxy) { } bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override { - MOZ_ASSERT(aWorkerPrivate); - aWorkerPrivate->AssertIsOnWorkerThread(); - - mResolver->mPromiseProxy->CleanUp(); + WorkerRunInternal(aWorkerPrivate); return true; } + + nsresult + Cancel() override + { + // Execute Run anyway to make sure we cleanup our promise proxy to avoid + // leaking the worker thread + Run(); + return WorkerRunnable::Cancel(); + } +}; + +class WorkerFetchResponseEndControlRunnable final : public WorkerControlRunnable + , public WorkerFetchResponseEndBase +{ +public: + explicit WorkerFetchResponseEndControlRunnable(PromiseWorkerProxy* aPromiseProxy) + : WorkerControlRunnable(aPromiseProxy->GetWorkerPrivate(), + WorkerThreadUnchangedBusyCount) + , WorkerFetchResponseEndBase(aPromiseProxy) + { + } + + bool + WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override + { + WorkerRunInternal(aWorkerPrivate); + return true; + } + + // Control runnable cancel already calls Run(). }; void WorkerFetchResolver::OnResponseAvailableInternal(InternalResponse* aResponse) { AssertIsOnMainThread(); MutexAutoLock lock(mPromiseProxy->Lock()); @@ -344,20 +390,26 @@ WorkerFetchResolver::OnResponseEnd() { AssertIsOnMainThread(); MutexAutoLock lock(mPromiseProxy->Lock()); if (mPromiseProxy->CleanedUp()) { return; } RefPtr<WorkerFetchResponseEndRunnable> r = - new WorkerFetchResponseEndRunnable(mPromiseProxy->GetWorkerPrivate(), this); + new WorkerFetchResponseEndRunnable(mPromiseProxy); if (!r->Dispatch()) { - NS_WARNING("Could not dispatch fetch response end"); + RefPtr<WorkerFetchResponseEndControlRunnable> cr = + new WorkerFetchResponseEndControlRunnable(mPromiseProxy); + // This can fail if the worker thread is canceled or killed causing + // the PromiseWorkerProxy to give up its WorkerFeature immediately, + // allowing the worker thread to become Dead. + NS_WARN_IF_FALSE(cr->Dispatch(), + "Failed to dispatch WorkerFetchResponseEndControlRunnable"); } } namespace { nsresult ExtractFromArrayBuffer(const ArrayBuffer& aBuffer, nsIInputStream** aStream) {
--- a/dom/fmradio/FMRadio.cpp +++ b/dom/fmradio/FMRadio.cpp @@ -9,16 +9,17 @@ #include "mozilla/Hal.h" #include "mozilla/HalTypes.h" #include "mozilla/Preferences.h" #include "mozilla/dom/FMRadioBinding.h" #include "mozilla/dom/ContentChild.h" #include "mozilla/dom/PFMRadioChild.h" #include "mozilla/dom/FMRadioService.h" #include "mozilla/dom/TypedArray.h" +#include "AudioChannelService.h" #include "DOMRequest.h" #include "nsDOMClassInfo.h" #include "nsIDocShell.h" #include "nsIInterfaceRequestorUtils.h" #include "nsIAudioManager.h" #undef LOG #define LOG(args...) FM_LOG("FMRadio", args) @@ -448,17 +449,18 @@ FMRadio::DisableRDS() } void FMRadio::EnableAudioChannelAgent() { NS_ENSURE_TRUE_VOID(mAudioChannelAgent); AudioPlaybackConfig config; - nsresult rv = mAudioChannelAgent->NotifyStartedPlaying(&config); + nsresult rv = mAudioChannelAgent->NotifyStartedPlaying(&config, + AudioChannelService::AudibleState::eAudible); if (NS_WARN_IF(NS_FAILED(rv))) { return; } WindowVolumeChanged(config.mVolume, config.mMuted); WindowSuspendChanged(config.mSuspend); mAudioChannelAgentEnabled = true;
--- a/dom/html/HTMLCanvasElement.cpp +++ b/dom/html/HTMLCanvasElement.cpp @@ -1353,22 +1353,24 @@ HTMLCanvasElement::SetAttrFromAsyncCanva if (element->GetWidthHeight() == aRenderer->GetSize()) { return; } gfx::IntSize asyncCanvasSize = aRenderer->GetSize(); ErrorResult rv; - element->SetUnsignedIntAttr(nsGkAtoms::width, asyncCanvasSize.width, rv); + element->SetUnsignedIntAttr(nsGkAtoms::width, asyncCanvasSize.width, + DEFAULT_CANVAS_WIDTH, rv); if (rv.Failed()) { NS_WARNING("Failed to set width attribute to a canvas element asynchronously."); } - element->SetUnsignedIntAttr(nsGkAtoms::height, asyncCanvasSize.height, rv); + element->SetUnsignedIntAttr(nsGkAtoms::height, asyncCanvasSize.height, + DEFAULT_CANVAS_HEIGHT, rv); if (rv.Failed()) { NS_WARNING("Failed to set height attribute to a canvas element asynchronously."); } element->mResetLayer = true; } /* static */ void
--- a/dom/html/HTMLCanvasElement.h +++ b/dom/html/HTMLCanvasElement.h @@ -146,30 +146,30 @@ public: } void SetHeight(uint32_t aHeight, ErrorResult& aRv) { if (mOffscreenCanvas) { aRv.Throw(NS_ERROR_FAILURE); return; } - SetUnsignedIntAttr(nsGkAtoms::height, aHeight, aRv); + SetUnsignedIntAttr(nsGkAtoms::height, aHeight, DEFAULT_CANVAS_HEIGHT, aRv); } uint32_t Width() { return GetUnsignedIntAttr(nsGkAtoms::width, DEFAULT_CANVAS_WIDTH); } void SetWidth(uint32_t aWidth, ErrorResult& aRv) { if (mOffscreenCanvas) { aRv.Throw(NS_ERROR_FAILURE); return; } - SetUnsignedIntAttr(nsGkAtoms::width, aWidth, aRv); + SetUnsignedIntAttr(nsGkAtoms::width, aWidth, DEFAULT_CANVAS_WIDTH, aRv); } virtual already_AddRefed<nsISupports> GetContext(JSContext* aCx, const nsAString& aContextId, JS::Handle<JS::Value> aContextOptions, ErrorResult& aRv) override; void ToDataURL(JSContext* aCx, const nsAString& aType,
--- a/dom/html/HTMLImageElement.cpp +++ b/dom/html/HTMLImageElement.cpp @@ -147,17 +147,17 @@ NS_IMPL_ELEMENT_CLONE(HTMLImageElement) NS_IMPL_STRING_ATTR(HTMLImageElement, Name, name) NS_IMPL_STRING_ATTR(HTMLImageElement, Align, align) NS_IMPL_STRING_ATTR(HTMLImageElement, Alt, alt) NS_IMPL_STRING_ATTR(HTMLImageElement, Border, border) NS_IMPL_INT_ATTR(HTMLImageElement, Hspace, hspace) NS_IMPL_BOOL_ATTR(HTMLImageElement, IsMap, ismap) NS_IMPL_URI_ATTR(HTMLImageElement, LongDesc, longdesc) NS_IMPL_STRING_ATTR(HTMLImageElement, Sizes, sizes) -NS_IMPL_STRING_ATTR(HTMLImageElement, Lowsrc, lowsrc) +NS_IMPL_URI_ATTR(HTMLImageElement, Lowsrc, lowsrc) NS_IMPL_URI_ATTR(HTMLImageElement, Src, src) NS_IMPL_STRING_ATTR(HTMLImageElement, Srcset, srcset) NS_IMPL_STRING_ATTR(HTMLImageElement, UseMap, usemap) NS_IMPL_INT_ATTR(HTMLImageElement, Vspace, vspace) bool HTMLImageElement::IsInteractiveHTMLContent(bool aIgnoreTabindex) const { @@ -413,19 +413,19 @@ HTMLImageElement::AfterSetAttr(int32_t a aValue && !aValue->IsEmptyString()) { // add the image to the hashtable as needed MOZ_ASSERT(aValue->Type() == nsAttrValue::eAtom, "Expected atom value for name/id"); mForm->AddImageElementToTable(this, nsDependentAtomString(aValue->GetAtomValue())); } - // Handle src/srcset/crossorigin updates. If aNotify is false, we are coming - // from the parser or some such place; we'll get bound after all the - // attributes have been set, so we'll do the image load from BindToTree. + // Handle src/srcset updates. If aNotify is false, we are coming from the + // parser or some such place; we'll get bound after all the attributes have + // been set, so we'll do the image load from BindToTree. nsAttrValueOrString attrVal(aValue); if (aName == nsGkAtoms::src && aNameSpaceID == kNameSpaceID_None && !aValue) { // SetAttr handles setting src since it needs to catch img.src = // img.src, so we only need to handle the unset case @@ -442,30 +442,16 @@ HTMLImageElement::AfterSetAttr(int32_t a } else if (aName == nsGkAtoms::srcset && aNameSpaceID == kNameSpaceID_None && IsSrcsetEnabled()) { PictureSourceSrcsetChanged(this, attrVal.String(), aNotify); } else if (aName == nsGkAtoms::sizes && aNameSpaceID == kNameSpaceID_None && HTMLPictureElement::IsPictureEnabled()) { PictureSourceSizesChanged(this, attrVal.String(), aNotify); - } else if (aName == nsGkAtoms::crossorigin && - aNameSpaceID == kNameSpaceID_None && - aNotify) { - // Force a new load of the image with the new cross origin policy. - if (InResponsiveMode()) { - // per spec, full selection runs when this changes, even though - // it doesn't directly affect the source selection - QueueImageLoadTask(true); - } else { - // Bug 1076583 - We still use the older synchronous algorithm in - // non-responsive mode. Force a new load of the image with the - // new cross origin policy. - ForceReload(aNotify); - } } return nsGenericHTMLElement::AfterSetAttr(aNameSpaceID, aName, aValue, aNotify); } nsresult @@ -521,16 +507,17 @@ HTMLImageElement::IsHTMLFocusable(bool a return false; } nsresult HTMLImageElement::SetAttr(int32_t aNameSpaceID, nsIAtom* aName, nsIAtom* aPrefix, const nsAString& aValue, bool aNotify) { + bool forceReloadWithNewCORSMode = false; // We need to force our image to reload. This must be done here, not in // AfterSetAttr or BeforeSetAttr, because we want to do it even if the attr is // being set to its existing value, which is normally optimized away as a // no-op. // // If we are in responsive mode, we drop the forced reload behavior, // but still trigger a image load task for img.src = img.src per // spec. @@ -559,20 +546,47 @@ HTMLImageElement::SetAttr(int32_t aNameS // network if it's set to be not cacheable... If we change things so that // the state gets in Element's attr-setting happen around this // LoadImage call, we could start passing false instead of aNotify // here. LoadImage(aValue, true, aNotify, eImageLoadType_Normal); mNewRequestsWillNeedAnimationReset = false; } + } else if (aNameSpaceID == kNameSpaceID_None && + aName == nsGkAtoms::crossorigin && + aNotify) { + nsAttrValue attrValue; + ParseCORSValue(aValue, attrValue); + if (GetCORSMode() != AttrValueToCORSMode(&attrValue)) { + // Force a new load of the image with the new cross origin policy. + forceReloadWithNewCORSMode = true; + } } - return nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix, aValue, - aNotify); + nsresult rv = nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix, + aValue, aNotify); + + // Because we load image synchronously in non-responsive-mode, we need to do + // reload after the attribute has been set if the reload is triggerred by + // cross origin changing. + if (forceReloadWithNewCORSMode) { + if (InResponsiveMode()) { + // per spec, full selection runs when this changes, even though + // it doesn't directly affect the source selection + QueueImageLoadTask(true); + } else { + // Bug 1076583 - We still use the older synchronous algorithm in + // non-responsive mode. Force a new load of the image with the + // new cross origin policy + ForceReload(aNotify); + } + } + + return rv; } nsresult HTMLImageElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent, nsIContent* aBindingParent, bool aCompileEventHandlers) { nsresult rv = nsGenericHTMLElement::BindToTree(aDocument, aParent,
--- a/dom/html/HTMLImageElement.h +++ b/dom/html/HTMLImageElement.h @@ -108,44 +108,44 @@ public: SetHTMLBoolAttr(nsGkAtoms::ismap, aIsMap, aError); } uint32_t Width() { return GetWidthHeightForImage(mCurrentRequest).width; } void SetWidth(uint32_t aWidth, ErrorResult& aError) { - SetUnsignedIntAttr(nsGkAtoms::width, aWidth, aError); + SetUnsignedIntAttr(nsGkAtoms::width, aWidth, 0, aError); } uint32_t Height() { return GetWidthHeightForImage(mCurrentRequest).height; } void SetHeight(uint32_t aHeight, ErrorResult& aError) { - SetUnsignedIntAttr(nsGkAtoms::height, aHeight, aError); + SetUnsignedIntAttr(nsGkAtoms::height, aHeight, 0, aError); } uint32_t NaturalWidth(); uint32_t NaturalHeight(); bool Complete(); uint32_t Hspace() { return GetUnsignedIntAttr(nsGkAtoms::hspace, 0); } void SetHspace(uint32_t aHspace, ErrorResult& aError) { - SetUnsignedIntAttr(nsGkAtoms::hspace, aHspace, aError); + SetUnsignedIntAttr(nsGkAtoms::hspace, aHspace, 0, aError); } uint32_t Vspace() { return GetUnsignedIntAttr(nsGkAtoms::vspace, 0); } void SetVspace(uint32_t aVspace, ErrorResult& aError) { - SetUnsignedIntAttr(nsGkAtoms::vspace, aVspace, aError); + SetUnsignedIntAttr(nsGkAtoms::vspace, aVspace, 0, aError); } // The XPCOM versions of the following getters work for Web IDL bindings as well void SetAlt(const nsAString& aAlt, ErrorResult& aError) { SetHTMLAttr(nsGkAtoms::alt, aAlt, aError); } void SetSrc(const nsAString& aSrc, ErrorResult& aError)
--- a/dom/html/HTMLInputElement.h +++ b/dom/html/HTMLInputElement.h @@ -479,17 +479,17 @@ public: { SetHTMLAttr(nsGkAtoms::formtarget, aValue, aRv); } uint32_t Height(); void SetHeight(uint32_t aValue, ErrorResult& aRv) { - SetUnsignedIntAttr(nsGkAtoms::height, aValue, aRv); + SetUnsignedIntAttr(nsGkAtoms::height, aValue, 0, aRv); } bool Indeterminate() const { return mIndeterminate; } // XPCOM SetIndeterminate() is OK @@ -583,17 +583,17 @@ public: void SetSize(uint32_t aValue, ErrorResult& aRv) { if (aValue == 0) { aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return; } - SetUnsignedIntAttr(nsGkAtoms::size, aValue, aRv); + SetUnsignedIntAttr(nsGkAtoms::size, aValue, DEFAULT_COLS, aRv); } // XPCOM GetSrc() is OK void SetSrc(const nsAString& aValue, ErrorResult& aRv) { SetHTMLAttr(nsGkAtoms::src, aValue, aRv); } @@ -636,17 +636,17 @@ public: } void SetValueAsNumber(double aValue, ErrorResult& aRv); uint32_t Width(); void SetWidth(uint32_t aValue, ErrorResult& aRv) { - SetUnsignedIntAttr(nsGkAtoms::width, aValue, aRv); + SetUnsignedIntAttr(nsGkAtoms::width, aValue, 0, aRv); } void StepUp(int32_t aN, ErrorResult& aRv) { aRv = ApplyStep(aN); } void StepDown(int32_t aN, ErrorResult& aRv)
--- a/dom/html/HTMLMediaElement.cpp +++ b/dom/html/HTMLMediaElement.cpp @@ -1292,19 +1292,16 @@ nsresult HTMLMediaElement::LoadResource( // TODO: Handle failure: run "If the media data cannot be fetched at // all, due to network errors, causing the user agent to give up // trying to fetch the resource" section of resource fetch algorithm. decoder->Shutdown(); return NS_ERROR_FAILURE; } RefPtr<MediaResource> resource = MediaSourceDecoder::CreateResource(mMediaSource->GetPrincipal()); - if (IsAutoplayEnabled()) { - mJoinLatency.Start(); - } return FinishDecoderSetup(decoder, resource, nullptr); } // determine what security checks need to be performed in AsyncOpen2(). nsSecurityFlags securityFlags = ShouldCheckAllowOrigin() ? nsILoadInfo::SEC_REQUIRE_CORS_DATA_INHERITS : nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS; @@ -2834,39 +2831,34 @@ HTMLMediaElement::ReportMSETelemetry() (ranges->End(index, ignore) - t) < errorMargin; stalled |= mDecoder && NextFrameStatus() == MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_BUFFERING && mReadyState == HTMLMediaElement::HAVE_CURRENT_DATA; if (stalled) { state = STALLED; } } + Telemetry::Accumulate(Telemetry::VIDEO_UNLOAD_STATE, state); + LOG(LogLevel::Debug, ("%p VIDEO_UNLOAD_STATE = %d", this, state)); + if (HTMLVideoElement* vid = HTMLVideoElement::FromContentOrNull(this)) { RefPtr<VideoPlaybackQuality> quality = vid->GetVideoPlaybackQuality(); uint64_t totalFrames = quality->TotalVideoFrames(); uint64_t droppedFrames = quality->DroppedVideoFrames(); if (totalFrames) { uint32_t percentage = 100 * droppedFrames / totalFrames; LOG(LogLevel::Debug, ("Reporting telemetry DROPPED_FRAMES_IN_VIDEO_PLAYBACK")); Telemetry::Accumulate(Telemetry::VIDEO_DROPPED_FRAMES_PROPORTION, percentage); } } - Telemetry::Accumulate(Telemetry::VIDEO_MSE_UNLOAD_STATE, state); - LOG(LogLevel::Debug, ("%p VIDEO_MSE_UNLOAD_STATE = %d", this, state)); - - Telemetry::Accumulate(Telemetry::VIDEO_MSE_PLAY_TIME_MS, SECONDS_TO_MS(mPlayTime.Total())); - LOG(LogLevel::Debug, ("%p VIDEO_MSE_PLAY_TIME_MS = %f", this, mPlayTime.Total())); - - double latency = mJoinLatency.Count() ? mJoinLatency.Total() / mJoinLatency.Count() : 0.0; - Telemetry::Accumulate(Telemetry::VIDEO_MSE_JOIN_LATENCY_MS, SECONDS_TO_MS(latency)); - LOG(LogLevel::Debug, ("%p VIDEO_MSE_JOIN_LATENCY = %f (%d ms) count=%d\n", - this, latency, SECONDS_TO_MS(latency), mJoinLatency.Count())); + Telemetry::Accumulate(Telemetry::VIDEO_PLAY_TIME_MS, SECONDS_TO_MS(mPlayTime.Total())); + LOG(LogLevel::Debug, ("%p VIDEO_PLAY_TIME_MS = %f", this, mPlayTime.Total())); } void HTMLMediaElement::UnbindFromTree(bool aDeep, bool aNullParent) { if (!mPaused && mNetworkState != nsIDOMHTMLMediaElement::NETWORK_EMPTY) { Pause(); } @@ -3362,16 +3354,20 @@ void HTMLMediaElement::UpdateSrcMediaStr // called and that will remove all listeners/outputs. mWatchManager.Unwatch(*mMediaStreamListener, &HTMLMediaElement::UpdateReadyStateInternal); mMediaStreamListener->Forget(); mMediaStreamListener = nullptr; } + + // If the input is a media stream, we don't check its data and always regard + // it as audible when it's playing. + SetAudibleState(shouldPlay); } void HTMLMediaElement::SetupSrcMediaStreamPlayback(DOMMediaStream* aStream) { NS_ASSERTION(!mSrcStream && !mMediaStreamListener && !mMediaStreamSizeListener, "Should have been ended already"); mSrcStream = aStream; @@ -4323,27 +4319,20 @@ nsresult HTMLMediaElement::DispatchAsync if (mEventDeliveryPaused) { mPendingEvents.AppendElement(aName); return NS_OK; } nsCOMPtr<nsIRunnable> event = new nsAsyncEventRunner(aName, this); NS_DispatchToMainThread(event); - // Only collect rebuffer and stall rate stats for MSE video. - if (!mMediaSource) { - return NS_OK; - } - if ((aName.EqualsLiteral("play") || aName.EqualsLiteral("playing"))) { mPlayTime.Start(); - mJoinLatency.Pause(); } else if (aName.EqualsLiteral("waiting")) { mPlayTime.Pause(); - Telemetry::Accumulate(Telemetry::VIDEO_MSE_BUFFERING_COUNT, 1); } else if (aName.EqualsLiteral("pause")) { mPlayTime.Pause(); } return NS_OK; } nsresult HTMLMediaElement::DispatchPendingMediaEvents() @@ -5056,18 +5045,25 @@ void HTMLMediaElement::NotifyAudioChannelAgent(bool aPlaying) { // This is needed to pass nsContentUtils::IsCallerChrome(). // AudioChannel API should not called from content but it can happen that // this method has some content JS in its stack. AutoNoJSAPI nojsapi; if (aPlaying) { + // The reason we don't call NotifyStartedPlaying after the media element + // really becomes audible is because there is another case needs to block + // element as early as we can, we would hear sound leaking if we block it + // too late. In that case (block autoplay in non-visited-tab), we need to + // create a connection before decoding, because we don't want user hearing + // any sound. AudioPlaybackConfig config; - nsresult rv = mAudioChannelAgent->NotifyStartedPlaying(&config); + nsresult rv = mAudioChannelAgent->NotifyStartedPlaying(&config, + mIsAudioTrackAudible); if (NS_WARN_IF(NS_FAILED(rv))) { return; } WindowVolumeChanged(config.mVolume, config.mMuted); WindowSuspendChanged(config.mSuspend); } else { mAudioChannelAgent->NotifyStoppedPlaying(); @@ -5609,18 +5605,26 @@ HTMLMediaElement::IsCurrentlyPlaying() c return false; } return true; } return false; } void -HTMLMediaElement::NotifyAudibleStateChanged(bool aAudible) +HTMLMediaElement::SetAudibleState(bool aAudible) { if (mIsAudioTrackAudible != aAudible) { mIsAudioTrackAudible = aAudible; - // To do ... + NotifyAudioPlaybackChanged(); + } +} + +void +HTMLMediaElement::NotifyAudioPlaybackChanged() +{ + if (mAudioChannelAgent) { + mAudioChannelAgent->NotifyStartedAudible(mIsAudioTrackAudible); } } } // namespace dom } // namespace mozilla
--- a/dom/html/HTMLMediaElement.h +++ b/dom/html/HTMLMediaElement.h @@ -443,18 +443,22 @@ public: { return mNetworkState; } // Called by the media decoder object, on the main thread, // when the connection between Rtsp server and client gets lost. virtual void ResetConnectionState() final override; - // Called by media decoder when the audible state changed. - virtual void NotifyAudibleStateChanged(bool aAudible) final override; + // Called by media decoder when the audible state changed or when input is + // a media stream. + virtual void SetAudibleState(bool aAudible) final override; + + // Notify agent when the MediaElement changes its audible state. + void NotifyAudioPlaybackChanged(); // XPCOM GetPreload() is OK void SetPreload(const nsAString& aValue, ErrorResult& aRv) { SetHTMLAttr(nsGkAtoms::preload, aValue, aRv); } already_AddRefed<TimeRanges> Buffered() const; @@ -1593,22 +1597,19 @@ public: return mCount; } private: TimeStamp mStartTime; TimeDuration mSum; uint32_t mCount; }; private: - // Total time an MSE video has spent playing + // Total time a video has spent playing. TimeDurationAccumulator mPlayTime; - // Time spent between video load and video playback. - TimeDurationAccumulator mJoinLatency; - // Indicates if user has interacted with the element. // Used to block autoplay when disabled. bool mHasUserInteraction; // True if the first frame has been successfully loaded. bool mFirstFrameLoaded; // Media elements also have a default playback start position, which must
--- a/dom/html/HTMLObjectElement.cpp +++ b/dom/html/HTMLObjectElement.cpp @@ -448,17 +448,17 @@ HTMLObjectElement::SubmitNamesValues(nsF NS_ENSURE_SUCCESS(rv, rv); return aFormSubmission->AddNameValuePair(name, value); } NS_IMPL_STRING_ATTR(HTMLObjectElement, Align, align) NS_IMPL_STRING_ATTR(HTMLObjectElement, Archive, archive) NS_IMPL_STRING_ATTR(HTMLObjectElement, Border, border) -NS_IMPL_URI_ATTR_WITH_BASE(HTMLObjectElement, Code, code, codebase) +NS_IMPL_STRING_ATTR(HTMLObjectElement, Code, code) NS_IMPL_URI_ATTR(HTMLObjectElement, CodeBase, codebase) NS_IMPL_STRING_ATTR(HTMLObjectElement, CodeType, codetype) NS_IMPL_URI_ATTR_WITH_BASE(HTMLObjectElement, Data, data, codebase) NS_IMPL_BOOL_ATTR(HTMLObjectElement, Declare, declare) NS_IMPL_STRING_ATTR(HTMLObjectElement, Height, height) NS_IMPL_INT_ATTR(HTMLObjectElement, Hspace, hspace) NS_IMPL_STRING_ATTR(HTMLObjectElement, Name, name) NS_IMPL_STRING_ATTR(HTMLObjectElement, Standby, standby)
--- a/dom/html/HTMLObjectElement.h +++ b/dom/html/HTMLObjectElement.h @@ -168,17 +168,17 @@ public: void GetArchive(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::archive, aValue); } void SetArchive(const nsAString& aValue, ErrorResult& aRv) { SetHTMLAttr(nsGkAtoms::archive, aValue, aRv); } - // XPCOM GetCode is ok; note that it's a URI attribute with a weird base URI + // XPCOM GetCode is ok void SetCode(const nsAString& aValue, ErrorResult& aRv) { SetHTMLAttr(nsGkAtoms::code, aValue, aRv); } bool Declare() { return GetBoolAttr(nsGkAtoms::declare); } @@ -187,33 +187,33 @@ public: SetHTMLBoolAttr(nsGkAtoms::declare, aValue, aRv); } uint32_t Hspace() { return GetUnsignedIntAttr(nsGkAtoms::hspace, 0); } void SetHspace(uint32_t aValue, ErrorResult& aRv) { - SetUnsignedIntAttr(nsGkAtoms::hspace, aValue, aRv); + SetUnsignedIntAttr(nsGkAtoms::hspace, aValue, 0, aRv); } void GetStandby(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::standby, aValue); } void SetStandby(const nsAString& aValue, ErrorResult& aRv) { SetHTMLAttr(nsGkAtoms::standby, aValue, aRv); } uint32_t Vspace() { return GetUnsignedIntAttr(nsGkAtoms::vspace, 0); } void SetVspace(uint32_t aValue, ErrorResult& aRv) { - SetUnsignedIntAttr(nsGkAtoms::vspace, aValue, aRv); + SetUnsignedIntAttr(nsGkAtoms::vspace, aValue, 0, aRv); } // XPCOM GetCodebase is ok; note that it's a URI attribute void SetCodeBase(const nsAString& aValue, ErrorResult& aRv) { SetHTMLAttr(nsGkAtoms::codebase, aValue, aRv); } void GetCodeType(DOMString& aValue) {
--- a/dom/html/HTMLPreElement.cpp +++ b/dom/html/HTMLPreElement.cpp @@ -32,17 +32,17 @@ NS_IMPL_INT_ATTR(HTMLPreElement, Width, bool HTMLPreElement::ParseAttribute(int32_t aNamespaceID, nsIAtom* aAttribute, const nsAString& aValue, nsAttrValue& aResult) { if (aNamespaceID == kNameSpaceID_None) { if (aAttribute == nsGkAtoms::width) { - return aResult.ParseIntWithBounds(aValue, 0); + return aResult.ParseIntValue(aValue); } } return nsGenericHTMLElement::ParseAttribute(aNamespaceID, aAttribute, aValue, aResult); } void
--- a/dom/html/HTMLSelectElement.h +++ b/dom/html/HTMLSelectElement.h @@ -205,17 +205,17 @@ public: SetHTMLBoolAttr(nsGkAtoms::required, aVal, aRv); } uint32_t Size() const { return GetUnsignedIntAttr(nsGkAtoms::size, 0); } void SetSize(uint32_t aSize, ErrorResult& aRv) { - SetUnsignedIntAttr(nsGkAtoms::size, aSize, aRv); + SetUnsignedIntAttr(nsGkAtoms::size, aSize, 0, aRv); } // Uses XPCOM GetType. HTMLOptionsCollection* Options() const { return mOptions; }
--- a/dom/html/HTMLSharedObjectElement.h +++ b/dom/html/HTMLSharedObjectElement.h @@ -132,17 +132,17 @@ public: SetHTMLAttr(nsGkAtoms::height, aValue, aRv); } uint32_t Hspace() { return GetUnsignedIntAttr(nsGkAtoms::hspace, 0); } void SetHspace(uint32_t aValue, ErrorResult& aRv) { - SetUnsignedIntAttr(nsGkAtoms::hspace, aValue, aRv); + SetUnsignedIntAttr(nsGkAtoms::hspace, aValue, 0, aRv); } void GetName(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::name, aValue); } void SetName(const nsAString& aValue, ErrorResult& aRv) { SetHTMLAttr(nsGkAtoms::name, aValue, aRv); @@ -153,17 +153,17 @@ public: SetHTMLAttr(nsGkAtoms::object, aValue, aRv); } uint32_t Vspace() { return GetUnsignedIntAttr(nsGkAtoms::vspace, 0); } void SetVspace(uint32_t aValue, ErrorResult& aRv) { - SetUnsignedIntAttr(nsGkAtoms::vspace, aValue, aRv); + SetUnsignedIntAttr(nsGkAtoms::vspace, aValue, 0, aRv); } void GetWidth(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::width, aValue); } void SetWidth(const nsAString& aValue, ErrorResult& aRv) { SetHTMLAttr(nsGkAtoms::width, aValue, aRv);
--- a/dom/html/HTMLTableCellElement.cpp +++ b/dom/html/HTMLTableCellElement.cpp @@ -364,16 +364,22 @@ HTMLTableCellElement::GetAlign(DOMString static const nsAttrValue::EnumTable kCellScopeTable[] = { { "row", NS_STYLE_CELL_SCOPE_ROW }, { "col", NS_STYLE_CELL_SCOPE_COL }, { "rowgroup", NS_STYLE_CELL_SCOPE_ROWGROUP }, { "colgroup", NS_STYLE_CELL_SCOPE_COLGROUP }, { 0 } }; +void +HTMLTableCellElement::GetScope(DOMString& aScope) +{ + GetEnumAttr(nsGkAtoms::scope, nullptr, aScope); +} + bool HTMLTableCellElement::ParseAttribute(int32_t aNamespaceID, nsIAtom* aAttribute, const nsAString& aValue, nsAttrValue& aResult) { if (aNamespaceID == kNameSpaceID_None) { /* ignore these attributes, stored simply as strings
--- a/dom/html/HTMLTableCellElement.h +++ b/dom/html/HTMLTableCellElement.h @@ -61,20 +61,17 @@ public: void GetAbbr(DOMString& aAbbr) { GetHTMLAttr(nsGkAtoms::abbr, aAbbr); } void SetAbbr(const nsAString& aAbbr, ErrorResult& aError) { SetHTMLAttr(nsGkAtoms::abbr, aAbbr, aError); } - void GetScope(DOMString& aScope) - { - GetHTMLAttr(nsGkAtoms::scope, aScope); - } + void GetScope(DOMString& aScope); void SetScope(const nsAString& aScope, ErrorResult& aError) { SetHTMLAttr(nsGkAtoms::scope, aScope, aError); } void GetAlign(DOMString& aAlign); void SetAlign(const nsAString& aAlign, ErrorResult& aError) { SetHTMLAttr(nsGkAtoms::align, aAlign, aError);
--- a/dom/html/HTMLTextAreaElement.h +++ b/dom/html/HTMLTextAreaElement.h @@ -174,17 +174,17 @@ public: { return GetIntAttr(nsGkAtoms::cols, DEFAULT_COLS); } void SetCols(uint32_t aCols, ErrorResult& aError) { if (aCols == 0) { aError.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); } else { - SetUnsignedIntAttr(nsGkAtoms::cols, aCols, aError); + SetUnsignedIntAttr(nsGkAtoms::cols, aCols, DEFAULT_COLS, aError); } } bool Disabled() { return GetBoolAttr(nsGkAtoms::disabled); } void SetDisabled(bool aDisabled, ErrorResult& aError) { @@ -242,17 +242,17 @@ public: { return GetIntAttr(nsGkAtoms::rows, DEFAULT_ROWS_TEXTAREA); } void SetRows(uint32_t aRows, ErrorResult& aError) { if (aRows == 0) { aError.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); } else { - SetUnsignedIntAttr(nsGkAtoms::rows, aRows, aError); + SetUnsignedIntAttr(nsGkAtoms::rows, aRows, DEFAULT_ROWS_TEXTAREA, aError); } } // XPCOM GetWrap is fine void SetWrap(const nsAString& aWrap, ErrorResult& aError) { SetHTMLAttr(nsGkAtoms::wrap, aWrap, aError); } // XPCOM GetType is fine
--- a/dom/html/HTMLVideoElement.h +++ b/dom/html/HTMLVideoElement.h @@ -56,27 +56,27 @@ public: uint32_t Width() const { return GetIntAttr(nsGkAtoms::width, 0); } void SetWidth(uint32_t aValue, ErrorResult& aRv) { - SetHTMLIntAttr(nsGkAtoms::width, aValue, aRv); + SetUnsignedIntAttr(nsGkAtoms::width, aValue, 0, aRv); } uint32_t Height() const { return GetIntAttr(nsGkAtoms::height, 0); } void SetHeight(uint32_t aValue, ErrorResult& aRv) { - SetHTMLIntAttr(nsGkAtoms::height, aValue, aRv); + SetUnsignedIntAttr(nsGkAtoms::height, aValue, 0, aRv); } uint32_t VideoWidth() const { return mMediaInfo.HasVideo() ? mMediaInfo.mVideo.mDisplay.width : 0; } uint32_t VideoHeight() const
--- a/dom/html/nsGenericHTMLElement.h +++ b/dom/html/nsGenericHTMLElement.h @@ -1131,22 +1131,29 @@ protected: /** * Helper method for NS_IMPL_UINT_ATTR macro. * Sets value of attribute to specified unsigned integer. Only works for * attributes in null namespace. * * @param aAttr name of attribute. * @param aValue Integer value of attribute. + * @param aDefault Default value (in case value is out of range). If the spec + * doesn't provide one, should be 1 if the value is limited to + * nonzero values, and 0 otherwise. */ - void SetUnsignedIntAttr(nsIAtom* aName, uint32_t aValue, + void SetUnsignedIntAttr(nsIAtom* aName, uint32_t aValue, uint32_t aDefault, mozilla::ErrorResult& aError) { nsAutoString value; - value.AppendInt(aValue); + if (aValue > INT32_MAX) { + value.AppendInt(aDefault); + } else { + value.AppendInt(aValue); + } SetHTMLAttr(aName, value, aError); } /** * Sets value of attribute to specified double. Only works for attributes * in null namespace. * @@ -1550,17 +1557,17 @@ protected: { \ *aValue = GetUnsignedIntAttr(nsGkAtoms::_atom, _default); \ return NS_OK; \ } \ NS_IMETHODIMP \ _class::Set##_method(uint32_t aValue) \ { \ mozilla::ErrorResult rv; \ - SetUnsignedIntAttr(nsGkAtoms::_atom, aValue, rv); \ + SetUnsignedIntAttr(nsGkAtoms::_atom, aValue, _default, rv); \ return rv.StealNSResult(); \ } /** * A macro to implement the getter and setter for a given unsigned integer * valued content property. The method uses GetUnsignedIntAttr and * SetUnsignedIntAttr methods. This macro is similar to NS_IMPL_UINT_ATTR except * that it throws an exception if the set value is null. @@ -1577,17 +1584,17 @@ protected: } \ NS_IMETHODIMP \ _class::Set##_method(uint32_t aValue) \ { \ if (aValue == 0) { \ return NS_ERROR_DOM_INDEX_SIZE_ERR; \ } \ mozilla::ErrorResult rv; \ - SetUnsignedIntAttr(nsGkAtoms::_atom, aValue, rv); \ + SetUnsignedIntAttr(nsGkAtoms::_atom, aValue, _default, rv); \ return rv.StealNSResult(); \ } /** * A macro to implement the getter and setter for a given content * property that needs to return a URI in string form. The method * uses the generic GetAttr and SetAttr methods. This macro is much * like the NS_IMPL_STRING_ATTR macro, except we make sure the URI is
--- a/dom/html/test/reflect.js +++ b/dom/html/test/reflect.js @@ -171,34 +171,31 @@ function reflectUnsignedInt(aParameters) } // -3000000000 is equivalent to 1294967296 when using the IDL attribute. element[attr] = -3000000000; is(element[attr], 1294967296, "." + attr + " should be equals to 1294967296"); is(element.getAttribute(attr), "1294967296", "@" + attr + " should be equals to 1294967296"); - // When setting the content atribute, it's a string so it will be unvalid. + // When setting the content attribute, it's a string so it will be invalid. element.setAttribute(attr, -3000000000); is(element.getAttribute(attr), "-3000000000", "@" + attr + " should be equals to " + -3000000000); is(element[attr], defaultValue, "." + attr + " should be equals to " + defaultValue); - var nonValidValues = [ - /* invalid value, value in the unsigned int range */ - [ -2147483648, 2147483648 ], - [ -1, 4294967295 ], - [ 3147483647, 3147483647 ], - ]; + // When interpreted as unsigned 32-bit integers, all of these fall between + // 2^31 and 2^32 - 1, so per spec they return the default value. + var nonValidValues = [ -2147483648, -1, 3147483647]; - for (var values of nonValidValues) { - element[attr] = values[0]; - is(element.getAttribute(attr), String(values[1]), - "@" + attr + " should be equals to " + values[1]); + for (var value of nonValidValues) { + element[attr] = value; + is(element.getAttribute(attr), String(defaultValue), + "@" + attr + " should be equals to " + defaultValue); is(element[attr], defaultValue, "." + attr + " should be equals to " + defaultValue); } for (var values of nonValidValues) { element.setAttribute(attr, values[0]); is(element.getAttribute(attr), String(values[0]), "@" + attr + " should be equals to " + values[0]);
--- a/dom/html/test/test_img_attributes_reflection.html +++ b/dom/html/test/test_img_attributes_reflection.html @@ -84,18 +84,17 @@ reflectURL({ }) reflectString({ element: document.createElement("img"), attribute: "border", extendedAttributes: { TreatNullAs: "EmptyString" }, }) -// TODO: Bug 881000 - Consider reflecting lowsrc as a URL. -reflectString({ +reflectURL({ element: document.createElement("img"), attribute: "lowsrc", }) ok("x" in document.createElement("img"), "img.x is present") ok("y" in document.createElement("img"), "img.y is present") </script>
--- a/dom/html/test/test_object_attributes_reflection.html +++ b/dom/html/test/test_object_attributes_reflection.html @@ -58,18 +58,18 @@ reflectString({ }); // .archive (String) reflectString({ element: document.createElement("object"), attribute: "archive", }); -// .code (URL) -reflectURL({ +// .code (String) +reflectString({ element: document.createElement("object"), attribute: "code", }); // .declare (String) reflectBoolean({ element: document.createElement("object"), attribute: "declare",
--- a/dom/indexedDB/ActorsParent.cpp +++ b/dom/indexedDB/ActorsParent.cpp @@ -3982,17 +3982,17 @@ UpgradeIndexDataValuesFunction::OnFuncti return rv; } UniqueFreePtr<uint8_t> newIdv; uint32_t newIdvLength; rv = MakeCompressedIndexDataValues(oldIdv, newIdv, &newIdvLength); std::pair<uint8_t*, int> data(newIdv.release(), newIdvLength); - + nsCOMPtr<nsIVariant> result = new storage::AdoptedBlobVariant(data); result.forget(aResult); return NS_OK; } nsresult UpgradeSchemaFrom20_0To21_0(mozIStorageConnection* aConnection) @@ -6986,23 +6986,32 @@ private: virtual bool RecvCreateObjectStore(const ObjectStoreMetadata& aMetadata) override; virtual bool RecvDeleteObjectStore(const int64_t& aObjectStoreId) override; virtual bool + RecvRenameObjectStore(const int64_t& aObjectStoreId, + const nsString& aName) override; + + virtual bool RecvCreateIndex(const int64_t& aObjectStoreId, const IndexMetadata& aMetadata) override; virtual bool RecvDeleteIndex(const int64_t& aObjectStoreId, const int64_t& aIndexId) override; + virtual bool + RecvRenameIndex(const int64_t& aObjectStoreId, + const int64_t& aIndexId, + const nsString& aName) override; + virtual PBackgroundIDBRequestParent* AllocPBackgroundIDBRequestParent(const RequestParams& aParams) override; virtual bool RecvPBackgroundIDBRequestConstructor(PBackgroundIDBRequestParent* aActor, const RequestParams& aParams) override; @@ -7742,16 +7751,40 @@ private: ~DeleteObjectStoreOp() { } virtual nsresult DoDatabaseWork(DatabaseConnection* aConnection) override; }; +class RenameObjectStoreOp final + : public VersionChangeTransactionOp +{ + friend class VersionChangeTransaction; + + const RefPtr<FullObjectStoreMetadata> mMetadata; + +private: + // Only created by VersionChangeTransaction. + RenameObjectStoreOp(VersionChangeTransaction* aTransaction, + FullObjectStoreMetadata* const aMetadata) + : VersionChangeTransactionOp(aTransaction) + , mMetadata(aMetadata) + { + MOZ_ASSERT(aMetadata->mCommonMetadata.id()); + } + + ~RenameObjectStoreOp() + { } + + virtual nsresult + DoDatabaseWork(DatabaseConnection* aConnection) override; +}; + class CreateIndexOp final : public VersionChangeTransactionOp { friend class VersionChangeTransaction; class ThreadLocalJSRuntime; class UpdateIndexDataValuesFunction; @@ -7918,16 +7951,43 @@ private: RemoveReferencesToIndex(DatabaseConnection* aConnection, const Key& aObjectDataKey, nsTArray<IndexDataValue>& aIndexValues); virtual nsresult DoDatabaseWork(DatabaseConnection* aConnection) override; }; +class RenameIndexOp final + : public VersionChangeTransactionOp +{ + friend class VersionChangeTransaction; + + const RefPtr<FullIndexMetadata> mMetadata; + const int64_t mObjectStoreId; + +private: + // Only created by VersionChangeTransaction. + RenameIndexOp(VersionChangeTransaction* aTransaction, + FullIndexMetadata* const aMetadata, + int64_t aObjectStoreId) + : VersionChangeTransactionOp(aTransaction) + , mMetadata(aMetadata) + , mObjectStoreId(aObjectStoreId) + { + MOZ_ASSERT(aMetadata->mCommonMetadata.id()); + } + + ~RenameIndexOp() + { } + + virtual nsresult + DoDatabaseWork(DatabaseConnection* aConnection) override; +}; + class NormalTransactionOp : public TransactionDatabaseOperationBase , public PBackgroundIDBRequestParent { #ifdef DEBUG bool mResponseSent; #endif @@ -15558,16 +15618,64 @@ VersionChangeTransaction::RecvDeleteObje } op->DispatchToConnectionPool(); return true; } bool +VersionChangeTransaction::RecvRenameObjectStore(const int64_t& aObjectStoreId, + const nsString& aName) +{ + AssertIsOnBackgroundThread(); + + if (NS_WARN_IF(!aObjectStoreId)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + const RefPtr<FullDatabaseMetadata> dbMetadata = GetDatabase()->Metadata(); + MOZ_ASSERT(dbMetadata); + MOZ_ASSERT(dbMetadata->mNextObjectStoreId > 0); + + if (NS_WARN_IF(aObjectStoreId >= dbMetadata->mNextObjectStoreId)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + RefPtr<FullObjectStoreMetadata> foundMetadata = + GetMetadataForObjectStoreId(aObjectStoreId); + + if (NS_WARN_IF(!foundMetadata)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + if (NS_WARN_IF(mCommitOrAbortReceived)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + foundMetadata->mCommonMetadata.name() = aName; + + RefPtr<RenameObjectStoreOp> renameOp = + new RenameObjectStoreOp(this, foundMetadata); + + if (NS_WARN_IF(!renameOp->Init(this))) { + renameOp->Cleanup(); + return false; + } + + renameOp->DispatchToConnectionPool(); + + return true; +} + +bool VersionChangeTransaction::RecvCreateIndex(const int64_t& aObjectStoreId, const IndexMetadata& aMetadata) { AssertIsOnBackgroundThread(); if (NS_WARN_IF(!aObjectStoreId)) { ASSERT_UNLESS_FUZZING(); return false; @@ -15712,16 +15820,84 @@ VersionChangeTransaction::RecvDeleteInde return false; } op->DispatchToConnectionPool(); return true; } +bool +VersionChangeTransaction::RecvRenameIndex(const int64_t& aObjectStoreId, + const int64_t& aIndexId, + const nsString& aName) +{ + AssertIsOnBackgroundThread(); + + if (NS_WARN_IF(!aObjectStoreId)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + if (NS_WARN_IF(!aIndexId)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + const RefPtr<FullDatabaseMetadata> dbMetadata = GetDatabase()->Metadata(); + MOZ_ASSERT(dbMetadata); + MOZ_ASSERT(dbMetadata->mNextObjectStoreId > 0); + MOZ_ASSERT(dbMetadata->mNextIndexId > 0); + + if (NS_WARN_IF(aObjectStoreId >= dbMetadata->mNextObjectStoreId)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + if (NS_WARN_IF(aIndexId >= dbMetadata->mNextIndexId)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + RefPtr<FullObjectStoreMetadata> foundObjectStoreMetadata = + GetMetadataForObjectStoreId(aObjectStoreId); + + if (NS_WARN_IF(!foundObjectStoreMetadata)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + RefPtr<FullIndexMetadata> foundIndexMetadata = + GetMetadataForIndexId(foundObjectStoreMetadata, aIndexId); + + if (NS_WARN_IF(!foundIndexMetadata)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + if (NS_WARN_IF(mCommitOrAbortReceived)) { + ASSERT_UNLESS_FUZZING(); + return false; + } + + foundIndexMetadata->mCommonMetadata.name() = aName; + + RefPtr<RenameIndexOp> renameOp = + new RenameIndexOp(this, foundIndexMetadata, aObjectStoreId); + + if (NS_WARN_IF(!renameOp->Init(this))) { + renameOp->Cleanup(); + return false; + } + + renameOp->DispatchToConnectionPool(); + + return true; +} + PBackgroundIDBRequestParent* VersionChangeTransaction::AllocPBackgroundIDBRequestParent( const RequestParams& aParams) { AssertIsOnBackgroundThread(); MOZ_ASSERT(aParams.type() != RequestParams::T__None); return AllocRequest(aParams, IsSameProcessActor()); @@ -23479,16 +23655,101 @@ DeleteObjectStoreOp::DoDatabaseWork(Data if (mMetadata->mCommonMetadata.autoIncrement()) { Transaction()->ForgetModifiedAutoIncrementObjectStore(mMetadata); } return NS_OK; } +nsresult +RenameObjectStoreOp::DoDatabaseWork(DatabaseConnection* aConnection) +{ + MOZ_ASSERT(aConnection); + aConnection->AssertIsOnConnectionThread(); + + PROFILER_LABEL("IndexedDB", + "RenameObjectStoreOp::DoDatabaseWork", + js::ProfileEntry::Category::STORAGE); + + if (NS_WARN_IF(IndexedDatabaseManager::InLowDiskSpaceMode())) { + return NS_ERROR_DOM_INDEXEDDB_QUOTA_ERR; + } + +#ifdef DEBUG + { + // Make sure that we're not renaming an object store with the same name as + // another that already exists. This should be impossible because we should + // have thrown an error long before now... + DatabaseConnection::CachedStatement stmt; + MOZ_ALWAYS_SUCCEEDS( + aConnection->GetCachedStatement(NS_LITERAL_CSTRING( + "SELECT name " + "FROM object_store " + "WHERE name = :name " + "AND id != :id;"), + &stmt)); + + MOZ_ALWAYS_SUCCEEDS( + stmt->BindStringByName(NS_LITERAL_CSTRING("name"), + mMetadata->mCommonMetadata.name())); + + MOZ_ALWAYS_SUCCEEDS( + stmt->BindInt64ByName(NS_LITERAL_CSTRING("id"), + mMetadata->mCommonMetadata.id())); + + bool hasResult; + MOZ_ALWAYS_SUCCEEDS(stmt->ExecuteStep(&hasResult)); + MOZ_ASSERT(!hasResult); + } +#endif + + DatabaseConnection::AutoSavepoint autoSave; + nsresult rv = autoSave.Start(Transaction()); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + DatabaseConnection::CachedStatement stmt; + rv = aConnection->GetCachedStatement(NS_LITERAL_CSTRING( + "UPDATE object_store " + "SET name = :name " + "WHERE id = :id;"), + &stmt); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = stmt->BindStringByName(NS_LITERAL_CSTRING("name"), + mMetadata->mCommonMetadata.name()); + + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = stmt->BindInt64ByName(NS_LITERAL_CSTRING("id"), + mMetadata->mCommonMetadata.id()); + + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = stmt->Execute(); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = autoSave.Commit(); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + return NS_OK; +} + CreateIndexOp::CreateIndexOp(VersionChangeTransaction* aTransaction, const int64_t aObjectStoreId, const IndexMetadata& aMetadata) : VersionChangeTransactionOp(aTransaction) , mMetadata(aMetadata) , mFileManager(aTransaction->GetDatabase()->GetFileManager()) , mDatabaseId(aTransaction->DatabaseId()) , mObjectStoreId(aObjectStoreId) @@ -23787,17 +24048,17 @@ NormalJSRuntime::Init() MOZ_ASSERT(!IsOnBackgroundThread()); mRuntime = JS_NewRuntime(kRuntimeHeapSize); if (NS_WARN_IF(!mRuntime)) { return false; } // Not setting this will cause JS_CHECK_RECURSION to report false positives. - JS_SetNativeStackQuota(mRuntime, 128 * sizeof(size_t) * 1024); + JS_SetNativeStackQuota(mRuntime, 128 * sizeof(size_t) * 1024); mContext = JS_NewContext(mRuntime, 0); if (NS_WARN_IF(!mContext)) { return false; } JSAutoRequest ar(mContext); @@ -24496,16 +24757,109 @@ DeleteIndexOp::DoDatabaseWork(DatabaseCo rv = autoSave.Commit(); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } return NS_OK; } +nsresult +RenameIndexOp::DoDatabaseWork(DatabaseConnection* aConnection) +{ + MOZ_ASSERT(aConnection); + aConnection->AssertIsOnConnectionThread(); + + PROFILER_LABEL("IndexedDB", + "RenameIndexOp::DoDatabaseWork", + js::ProfileEntry::Category::STORAGE); + + if (NS_WARN_IF(IndexedDatabaseManager::InLowDiskSpaceMode())) { + return NS_ERROR_DOM_INDEXEDDB_QUOTA_ERR; + } + +#ifdef DEBUG + { + // Make sure that we're not renaming an index with the same name as another + // that already exists. This should be impossible because we should have + // thrown an error long before now... + DatabaseConnection::CachedStatement stmt; + MOZ_ALWAYS_SUCCEEDS( + aConnection->GetCachedStatement(NS_LITERAL_CSTRING( + "SELECT name " + "FROM object_store_index " + "WHERE object_store_id = :object_store_id " + "AND name = :name " + "AND id != :id;"), + &stmt)); + + MOZ_ALWAYS_SUCCEEDS( + stmt->BindInt64ByName(NS_LITERAL_CSTRING("object_store_id"), + mObjectStoreId)); + + MOZ_ALWAYS_SUCCEEDS( + stmt->BindStringByName(NS_LITERAL_CSTRING("name"), + mMetadata->mCommonMetadata.name())); + + MOZ_ALWAYS_SUCCEEDS( + stmt->BindInt64ByName(NS_LITERAL_CSTRING("id"), + mMetadata->mCommonMetadata.id())); + + bool hasResult; + MOZ_ALWAYS_SUCCEEDS(stmt->ExecuteStep(&hasResult)); + MOZ_ASSERT(!hasResult); + } +#else + Unused << mObjectStoreId; +#endif + + DatabaseConnection::AutoSavepoint autoSave; + nsresult rv = autoSave.Start(Transaction()); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + DatabaseConnection::CachedStatement stmt; + rv = aConnection->GetCachedStatement(NS_LITERAL_CSTRING( + "UPDATE object_store_index " + "SET name = :name " + "WHERE id = :id;"), + &stmt); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = stmt->BindStringByName(NS_LITERAL_CSTRING("name"), + mMetadata->mCommonMetadata.name()); + + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = stmt->BindInt64ByName(NS_LITERAL_CSTRING("id"), + mMetadata->mCommonMetadata.id()); + + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = stmt->Execute(); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = autoSave.Commit(); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + + return NS_OK; +} + // static nsresult NormalTransactionOp::ObjectStoreHasIndexes(NormalTransactionOp* aOp, DatabaseConnection* aConnection, const int64_t aObjectStoreId, const bool aMayHaveIndexes, bool* aHasIndexes) {
--- a/dom/indexedDB/IDBDatabase.cpp +++ b/dom/indexedDB/IDBDatabase.cpp @@ -1344,10 +1344,90 @@ Observer::Observe(nsISupports* aSubject, return NS_OK; } NS_WARNING("Unknown observer topic!"); return NS_OK; } +nsresult +IDBDatabase::RenameObjectStore(int64_t aObjectStoreId, const nsAString& aName) +{ + MOZ_ASSERT(mSpec); + + nsTArray<ObjectStoreSpec>& objectStores = mSpec->objectStores(); + + ObjectStoreSpec* foundObjectStoreSpec = nullptr; + // Find the matched object store spec and check if 'aName' is already used by + // another object store. + for (uint32_t objCount = objectStores.Length(), objIndex = 0; + objIndex < objCount; + objIndex++) { + const ObjectStoreSpec& objSpec = objectStores[objIndex]; + if (objSpec.metadata().id() == aObjectStoreId) { + MOZ_ASSERT(!foundObjectStoreSpec); + foundObjectStoreSpec = &objectStores[objIndex]; + continue; + } + if (aName == objSpec.metadata().name()) { + return NS_ERROR_DOM_INDEXEDDB_CONSTRAINT_ERR; + } + } + + MOZ_ASSERT(foundObjectStoreSpec); + + // Update the name of the matched object store. + foundObjectStoreSpec->metadata().name() = nsString(aName); + + return NS_OK; +} + +nsresult +IDBDatabase::RenameIndex(int64_t aObjectStoreId, + int64_t aIndexId, + const nsAString& aName) +{ + MOZ_ASSERT(mSpec); + + nsTArray<ObjectStoreSpec>& objectStores = mSpec->objectStores(); + + ObjectStoreSpec* foundObjectStoreSpec = nullptr; + // Find the matched index metadata and check if 'aName' is already used by + // another index. + for (uint32_t objCount = objectStores.Length(), objIndex = 0; + objIndex < objCount; + objIndex++) { + const ObjectStoreSpec& objSpec = objectStores[objIndex]; + if (objSpec.metadata().id() == aObjectStoreId) { + foundObjectStoreSpec = &objectStores[objIndex]; + break; + } + } + + MOZ_ASSERT(foundObjectStoreSpec); + + nsTArray<IndexMetadata>& indexes = foundObjectStoreSpec->indexes(); + IndexMetadata* foundIndexMetadata = nullptr; + for (uint32_t idxCount = indexes.Length(), idxIndex = 0; + idxIndex < idxCount; + idxIndex++) { + const IndexMetadata& metadata = indexes[idxIndex]; + if (metadata.id() == aIndexId) { + MOZ_ASSERT(!foundIndexMetadata); + foundIndexMetadata = &indexes[idxIndex]; + continue; + } + if (aName == metadata.name()) { + return NS_ERROR_DOM_INDEXEDDB_CONSTRAINT_ERR; + } + } + + MOZ_ASSERT(foundIndexMetadata); + + // Update the name of the matched object store. + foundIndexMetadata->name() = nsString(aName); + + return NS_OK; +} + } // namespace dom } // namespace mozilla
--- a/dom/indexedDB/IDBDatabase.h +++ b/dom/indexedDB/IDBDatabase.h @@ -51,16 +51,19 @@ class IDBDatabase final { typedef mozilla::dom::indexedDB::DatabaseSpec DatabaseSpec; typedef mozilla::dom::StorageType StorageType; typedef mozilla::dom::quota::PersistenceType PersistenceType; class Observer; friend class Observer; + friend class IDBObjectStore; + friend class IDBIndex; + // The factory must be kept alive when IndexedDB is used in multiple // processes. If it dies then the entire actor tree will be destroyed with it // and the world will explode. RefPtr<IDBFactory> mFactory; nsAutoPtr<DatabaseSpec> mSpec; // Normally null except during a versionchange transaction. @@ -322,14 +325,22 @@ private: void InvalidateMutableFiles(); void LogWarning(const char* aMessageName, const nsAString& aFilename, uint32_t aLineNumber, uint32_t aColumnNumber); + + // Only accessed by IDBObjectStore. + nsresult + RenameObjectStore(int64_t aObjectStoreId, const nsAString& aName); + + // Only accessed by IDBIndex. + nsresult + RenameIndex(int64_t aObjectStoreId, int64_t aIndexId, const nsAString& aName); }; } // namespace dom } // namespace mozilla #endif // mozilla_dom_idbdatabase_h__
--- a/dom/indexedDB/IDBIndex.cpp +++ b/dom/indexedDB/IDBIndex.cpp @@ -144,16 +144,73 @@ const nsString& IDBIndex::Name() const { AssertIsOnOwningThread(); MOZ_ASSERT(mMetadata); return mMetadata->name(); } +void +IDBIndex::SetName(const nsAString& aName, ErrorResult& aRv) +{ + AssertIsOnOwningThread(); + + IDBTransaction* transaction = mObjectStore->Transaction(); + + if (transaction->GetMode() != IDBTransaction::VERSION_CHANGE || + mDeletedMetadata) { + aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); + return; + } + + if (!transaction->IsOpen()) { + aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR); + return; + } + + if (aName == mMetadata->name()) { + return; + } + + // Cache logging string of this index before renaming. + const LoggingString loggingOldIndex(this); + + const int64_t indexId = Id(); + + nsresult rv = + transaction->Database()->RenameIndex(mObjectStore->Id(), + indexId, + aName); + + if (NS_FAILED(rv)) { + aRv.Throw(rv); + return; + } + + // Don't do this in the macro because we always need to increment the serial + // number to keep in sync with the parent. + const uint64_t requestSerialNumber = IDBRequest::NextSerialNumber(); + + IDB_LOG_MARK("IndexedDB %s: Child Transaction[%lld] Request[%llu]: " + "database(%s).transaction(%s).objectStore(%s).index(%s)." + "rename(%s)", + "IndexedDB %s: C T[%lld] R[%llu]: IDBIndex.rename()", + IDB_LOG_ID_STRING(), + transaction->LoggingSerialNumber(), + requestSerialNumber, + IDB_LOG_STRINGIFY(transaction->Database()), + IDB_LOG_STRINGIFY(transaction), + IDB_LOG_STRINGIFY(mObjectStore), + loggingOldIndex.get(), + IDB_LOG_STRINGIFY(this)); + + transaction->RenameIndex(mObjectStore, indexId, aName); +} + bool IDBIndex::Unique() const { AssertIsOnOwningThread(); MOZ_ASSERT(mMetadata); return mMetadata->unique(); }
--- a/dom/indexedDB/IDBIndex.h +++ b/dom/indexedDB/IDBIndex.h @@ -102,16 +102,19 @@ public: void GetName(nsString& aName) const { aName = Name(); } void + SetName(const nsAString& aName, ErrorResult& aRv); + + void GetKeyPath(JSContext* aCx, JS::MutableHandle<JS::Value> aResult, ErrorResult& aRv); already_AddRefed<IDBRequest> OpenCursor(JSContext* aCx, JS::Handle<JS::Value> aRange, IDBCursorDirection aDirection,
--- a/dom/indexedDB/IDBObjectStore.cpp +++ b/dom/indexedDB/IDBObjectStore.cpp @@ -2260,16 +2260,69 @@ const nsString& IDBObjectStore::Name() const { AssertIsOnOwningThread(); MOZ_ASSERT(mSpec); return mSpec->metadata().name(); } +void +IDBObjectStore::SetName(const nsAString& aName, ErrorResult& aRv) +{ + AssertIsOnOwningThread(); + + if (mTransaction->GetMode() != IDBTransaction::VERSION_CHANGE || + mDeletedSpec) { + aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); + return; + } + + IDBTransaction* transaction = IDBTransaction::GetCurrent(); + if (!transaction || transaction != mTransaction) { + aRv.Throw(NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR); + return; + } + + MOZ_ASSERT(transaction->IsOpen()); + + if (aName == mSpec->metadata().name()) { + return; + } + + // Cache logging string of this object store before renaming. + const LoggingString loggingOldObjectStore(this); + + nsresult rv = + transaction->Database()->RenameObjectStore(mSpec->metadata().id(), + aName); + + if (NS_FAILED(rv)) { + aRv.Throw(rv); + return; + } + + // Don't do this in the macro because we always need to increment the serial + // number to keep in sync with the parent. + const uint64_t requestSerialNumber = IDBRequest::NextSerialNumber(); + + IDB_LOG_MARK("IndexedDB %s: Child Transaction[%lld] Request[%llu]: " + "database(%s).transaction(%s).objectStore(%s).rename(%s)", + "IndexedDB %s: C T[%lld] R[%llu]: IDBObjectStore.rename()", + IDB_LOG_ID_STRING(), + mTransaction->LoggingSerialNumber(), + requestSerialNumber, + IDB_LOG_STRINGIFY(mTransaction->Database()), + IDB_LOG_STRINGIFY(mTransaction), + loggingOldObjectStore.get(), + IDB_LOG_STRINGIFY(this)); + + transaction->RenameObjectStore(mSpec->metadata().id(), aName); +} + bool IDBObjectStore::AutoIncrement() const { AssertIsOnOwningThread(); MOZ_ASSERT(mSpec); return mSpec->metadata().autoIncrement(); }
--- a/dom/indexedDB/IDBObjectStore.h +++ b/dom/indexedDB/IDBObjectStore.h @@ -147,16 +147,19 @@ public: GetName(nsString& aName) const { AssertIsOnOwningThread(); aName = Name(); } void + SetName(const nsAString& aName, ErrorResult& aRv); + + void GetKeyPath(JSContext* aCx, JS::MutableHandle<JS::Value> aResult, ErrorResult& aRv); already_AddRefed<DOMStringList> IndexNames(); IDBTransaction* Transaction() const
--- a/dom/indexedDB/IDBTransaction.cpp +++ b/dom/indexedDB/IDBTransaction.cpp @@ -562,16 +562,30 @@ IDBTransaction::DeleteObjectStore(int64_ mObjectStores.RemoveElementAt(index); break; } } } void +IDBTransaction::RenameObjectStore(int64_t aObjectStoreId, + const nsAString& aName) +{ + AssertIsOnOwningThread(); + MOZ_ASSERT(aObjectStoreId); + MOZ_ASSERT(VERSION_CHANGE == mMode); + MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor); + MOZ_ASSERT(IsOpen()); + + MOZ_ALWAYS_TRUE(mBackgroundActor.mVersionChangeBackgroundActor-> + SendRenameObjectStore(aObjectStoreId, nsString(aName))); +} + +void IDBTransaction::CreateIndex(IDBObjectStore* aObjectStore, const indexedDB::IndexMetadata& aMetadata) { AssertIsOnOwningThread(); MOZ_ASSERT(aObjectStore); MOZ_ASSERT(aMetadata.id()); MOZ_ASSERT(VERSION_CHANGE == mMode); MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor); @@ -592,16 +606,34 @@ IDBTransaction::DeleteIndex(IDBObjectSto MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor); MOZ_ASSERT(IsOpen()); MOZ_ALWAYS_TRUE(mBackgroundActor.mVersionChangeBackgroundActor-> SendDeleteIndex(aObjectStore->Id(), aIndexId)); } void +IDBTransaction::RenameIndex(IDBObjectStore* aObjectStore, + int64_t aIndexId, + const nsAString& aName) +{ + AssertIsOnOwningThread(); + MOZ_ASSERT(aObjectStore); + MOZ_ASSERT(aIndexId); + MOZ_ASSERT(VERSION_CHANGE == mMode); + MOZ_ASSERT(mBackgroundActor.mVersionChangeBackgroundActor); + MOZ_ASSERT(IsOpen()); + + MOZ_ALWAYS_TRUE(mBackgroundActor.mVersionChangeBackgroundActor-> + SendRenameIndex(aObjectStore->Id(), + aIndexId, + nsString(aName))); +} + +void IDBTransaction::AbortInternal(nsresult aAbortCode, already_AddRefed<DOMError> aError) { AssertIsOnOwningThread(); MOZ_ASSERT(NS_FAILED(aAbortCode)); MOZ_ASSERT(!IsCommittingOrDone()); RefPtr<DOMError> error = aError;
--- a/dom/indexedDB/IDBTransaction.h +++ b/dom/indexedDB/IDBTransaction.h @@ -241,22 +241,28 @@ public: already_AddRefed<IDBObjectStore> CreateObjectStore(const indexedDB::ObjectStoreSpec& aSpec); void DeleteObjectStore(int64_t aObjectStoreId); void + RenameObjectStore(int64_t aObjectStoreId, const nsAString& aName); + + void CreateIndex(IDBObjectStore* aObjectStore, const indexedDB::IndexMetadata& aMetadata); void DeleteIndex(IDBObjectStore* aObjectStore, int64_t aIndexId); void + RenameIndex(IDBObjectStore* aObjectStore, int64_t aIndexId, const nsAString& aName); + + void Abort(IDBRequest* aRequest); void Abort(nsresult aAbortCode); int64_t LoggingSerialNumber() const {
--- a/dom/indexedDB/PBackgroundIDBVersionChangeTransaction.ipdl +++ b/dom/indexedDB/PBackgroundIDBVersionChangeTransaction.ipdl @@ -25,21 +25,26 @@ protocol PBackgroundIDBVersionChangeTran parent: async DeleteMe(); async Commit(); async Abort(nsresult resultCode); async CreateObjectStore(ObjectStoreMetadata metadata); async DeleteObjectStore(int64_t objectStoreId); + async RenameObjectStore(int64_t objectStoreId, + nsString name); async CreateIndex(int64_t objectStoreId, IndexMetadata metadata); async DeleteIndex(int64_t objectStoreId, int64_t indexId); + async RenameIndex(int64_t objectStoreId, + int64_t indexId, + nsString name); async PBackgroundIDBCursor(OpenCursorParams params); async PBackgroundIDBRequest(RequestParams params); child: async __delete__();
--- a/dom/indexedDB/test/mochitest.ini +++ b/dom/indexedDB/test/mochitest.ini @@ -77,17 +77,21 @@ support-files = unit/test_optionalArguments.js unit/test_overlapping_transactions.js unit/test_persistenceType.js unit/test_put_get_values.js unit/test_put_get_values_autoIncrement.js unit/test_readonly_transactions.js unit/test_readwriteflush_disabled.js unit/test_remove_index.js + unit/test_rename_index.js + unit/test_rename_index_errors.js unit/test_remove_objectStore.js + unit/test_rename_objectStore.js + unit/test_rename_objectStore_errors.js unit/test_request_readyState.js unit/test_setVersion.js unit/test_setVersion_abort.js unit/test_setVersion_events.js unit/test_setVersion_exclusion.js unit/test_success_events_after_abort.js unit/test_table_locks.js unit/test_table_rollback.js @@ -312,18 +316,26 @@ skip-if = (buildapp == 'b2g' && toolkit [test_put_get_values_autoIncrement.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 [test_readonly_transactions.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 [test_readwriteflush_disabled.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 [test_remove_index.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 +[test_rename_index.html] +skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 +[test_rename_index_errors.html] +skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 [test_remove_objectStore.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') || (buildapp == 'mulet') # Bug 931116 # TC: Bug 1144079 - Re-enable Mulet mochitests and reftests taskcluster-specific disables. +[test_rename_objectStore.html] +skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 +[test_rename_objectStore_errors.html] +skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 [test_request_readyState.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 [test_sandbox.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 [test_setVersion.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116 [test_setVersion_abort.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') # Bug 931116
new file mode 100644 --- /dev/null +++ b/dom/indexedDB/test/test_rename_index.html @@ -0,0 +1,19 @@ +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <title>Indexed Database Property Test</title> + + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> + + <script type="text/javascript;version=1.7" src="unit/test_rename_index.js"></script> + <script type="text/javascript;version=1.7" src="helpers.js"></script> + +</head> + +<body onload="runTest();"></body> + +</html>
new file mode 100644 --- /dev/null +++ b/dom/indexedDB/test/test_rename_index_errors.html @@ -0,0 +1,19 @@ +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <title>Indexed Database Property Test</title> + + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> + + <script type="text/javascript;version=1.7" src="unit/test_rename_index_errors.js"></script> + <script type="text/javascript;version=1.7" src="helpers.js"></script> + +</head> + +<body onload="runTest();"></body> + +</html>
new file mode 100644 --- /dev/null +++ b/dom/indexedDB/test/test_rename_objectStore.html @@ -0,0 +1,19 @@ +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <title>Indexed Database Property Test</title> + + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> + + <script type="text/javascript;version=1.7" src="unit/test_rename_objectStore.js"></script> + <script type="text/javascript;version=1.7" src="helpers.js"></script> + +</head> + +<body onload="runTest();"></body> + +</html>
new file mode 100644 --- /dev/null +++ b/dom/indexedDB/test/test_rename_objectStore_errors.html @@ -0,0 +1,19 @@ +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <title>Indexed Database Property Test</title> + + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> + + <script type="text/javascript;version=1.7" src="unit/test_rename_objectStore_errors.js"></script> + <script type="text/javascript;version=1.7" src="helpers.js"></script> + +</head> + +<body onload="runTest();"></body> + +</html>
new file mode 100644 --- /dev/null +++ b/dom/indexedDB/test/unit/test_rename_index.js @@ -0,0 +1,193 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var testGenerator = testSteps(); + +function testSteps() +{ + const name = this.window ? window.location.pathname : "Splendid Test"; + const storeName = "test store"; + const indexName_ToBeDeleted = "test index to be deleted"; + const indexName_v0 = "test index v0"; + const indexName_v1 = "test index v1"; + const indexName_v2 = "test index v2"; + const indexName_v3 = indexName_ToBeDeleted; + const indexName_v4 = "test index v4"; + + info("Rename in v1."); + let request = indexedDB.open(name, 1); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + let event = yield undefined; + + let db = event.target.result; + let txn = event.target.transaction; + + is(db.objectStoreNames.length, 0, "Correct objectStoreNames list"); + + let objectStore = db.createObjectStore(storeName, { keyPath: "foo" }); + is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); + is(db.objectStoreNames.item(0), objectStore.name, "Correct object store name"); + + // create index to be deleted later in v3. + objectStore.createIndex(indexName_ToBeDeleted, "foo"); + ok(objectStore.index(indexName_ToBeDeleted), "Index created."); + + // create target index to be renamed. + let index = objectStore.createIndex(indexName_v0, "bar"); + ok(objectStore.index(indexName_v0), "Index created."); + is(index.name, indexName_v0, "Correct index name"); + index.name = indexName_v1; + is(index.name, indexName_v1, "Renamed index successfully"); + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + info("Verify renaming done in v1 and run renaming in v2."); + request = indexedDB.open(name, 2); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + event = yield undefined; + + db = event.target.result; + txn = event.target.transaction; + + objectStore = txn.objectStore(storeName); + + // indexName_v0 created in v1 shall not be available. + try { + index = objectStore.index(indexName_v0); + ok(false, "NotFoundError shall be thrown."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "NotFoundError", "correct error"); + } + + // rename to "v2". + index = objectStore.index(indexName_v1); + is(index.name, indexName_v1, "Correct index name") + index.name = indexName_v2; + is(index.name, indexName_v2, "Renamed index successfully"); + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + info("Verify renaming done in v2."); + request = indexedDB.open(name, 2); + request.onerror = errorHandler; + request.onupgradeneeded = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + db = event.target.result; + txn = db.transaction(storeName); + + objectStore = txn.objectStore(storeName); + index = objectStore.index(indexName_v2); + is(index.name, indexName_v2, "Correct index name"); + + db.close(); + + info("Rename in v3."); + request = indexedDB.open(name, 3); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + event = yield undefined; + + db = event.target.result; + txn = event.target.transaction; + + objectStore = txn.objectStore(storeName); + ok(objectStore.index(indexName_ToBeDeleted), "index is valid."); + objectStore.deleteIndex(indexName_ToBeDeleted); + try { + objectStore.index(indexName_ToBeDeleted); + ok(false, "NotFoundError shall be thrown if the index name is deleted."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "NotFoundError", "correct error"); + } + + info("Rename with the name of the deleted index."); + index = objectStore.index(indexName_v2); + index.name = indexName_v3; + is(index.name, indexName_v3, "Renamed index successfully"); + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + info("Verify renaming done in v3."); + request = indexedDB.open(name, 3); + request.onerror = errorHandler; + request.onupgradeneeded = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + db = event.target.result; + txn = db.transaction(storeName); + + objectStore = txn.objectStore(storeName); + index = objectStore.index(indexName_v3); + is(index.name, indexName_v3, "Correct index name"); + + db.close(); + + info("Abort the version change transaction while renaming index."); + request = indexedDB.open(name, 4); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + event = yield undefined; + + db = event.target.result; + txn = event.target.transaction; + + objectStore = txn.objectStore(storeName); + index = objectStore.index(indexName_v3); + index.name = indexName_v4; + is(index.name, indexName_v4, "Renamed successfully"); + let putRequest = objectStore.put({ foo: "fooValue", bar: "barValue" }); + putRequest.onsuccess = continueToNextStepSync; + yield undefined; + + // Aborting the transaction. + request.onerror = expectedErrorHandler("AbortError"); + txn.abort(); + yield undefined; + + // Verify if the name of the index handle is reverted. + is(index.name, indexName_v3, "The name is reverted after aborted."); + + info("Verify if the objectstore name is unchanged."); + request = indexedDB.open(name, 3); + request.onerror = errorHandler; + request.onupgradeneeded = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + db = event.target.result; + txn = db.transaction(storeName); + + objectStore = txn.objectStore(storeName); + index = objectStore.index(indexName_v3); + is(index.name, indexName_v3, "Correct index name"); + + db.close(); + + finishTest(); + yield undefined; +}
new file mode 100644 --- /dev/null +++ b/dom/indexedDB/test/unit/test_rename_index_errors.js @@ -0,0 +1,129 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var testGenerator = testSteps(); + +function testSteps() +{ + const name = this.window ? window.location.pathname : "Splendid Test"; + const storeName = "test store"; + const indexName1 = "test index 1"; + const indexName2 = "test index 2"; + + info("Setup test indexes."); + let request = indexedDB.open(name, 1); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + let event = yield undefined; + + let db = event.target.result; + let txn = event.target.transaction; + + is(db.objectStoreNames.length, 0, "Correct objectStoreNames list"); + + let objectStore = db.createObjectStore(storeName, { keyPath: "foo" }); + is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); + is(db.objectStoreNames.item(0), objectStore.name, "Correct name"); + + let index1 = objectStore.createIndex(indexName1, "bar"); + is(objectStore.index(indexName1).name, index1.name, "Correct index name"); + is(index1.name, indexName1, "Correct index name"); + let index2 = objectStore.createIndex(indexName2, "baz"); + is(objectStore.index(indexName2).name, index2.name, "Correct index name"); + is(index2.name, indexName2, "Correct index name"); + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + info("Verify IDB Errors in version 2."); + request = indexedDB.open(name, 2); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + event = yield undefined; + + db = event.target.result; + txn = event.target.transaction; + + objectStore = txn.objectStore(storeName); + index1 = objectStore.index(indexName1); + index2 = objectStore.index(indexName2); + is(index1.name, indexName1, "Correct index name"); + is(index2.name, indexName2, "Correct index name"); + + // Rename with the name already adopted by the other index. + try { + index1.name = indexName2; + ok(false, "ConstraintError shall be thrown if the index name already exists."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "ConstraintError", "correct error"); + } + + // Rename with identical name. + try { + index1.name = indexName1; + ok(true, "It shall be fine to set the same name."); + } catch (e) { + ok(false, "Got a database exception: " + e.name); + } + + objectStore.deleteIndex(indexName2); + + // Rename after deleted. + try { + index2.name = indexName2; + ok(false, "InvalidStateError shall be thrown if deleted."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "InvalidStateError", "correct error"); + } + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + // Rename when the transaction is inactive. + try { + index1.name = indexName1; + ok(false, "TransactionInactiveError shall be thrown if the transaction is inactive."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "TransactionInactiveError", "correct error"); + } + + info("Rename when the transaction is not an upgrade one."); + request = indexedDB.open(name, 2); + request.onerror = errorHandler; + request.onupgradeneeded = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + db = event.target.result; + txn = db.transaction(storeName); + objectStore = txn.objectStore(storeName); + index1 = objectStore.index(indexName1); + + try { + index1.name = indexName1; + ok(false, "InvalidStateError shall be thrown if it's not an upgrade transaction."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "InvalidStateError", "correct error"); + } + + txn.oncomplete = continueToNextStepSync; + yield undefined; + db.close(); + + finishTest(); + yield undefined; +}
new file mode 100644 --- /dev/null +++ b/dom/indexedDB/test/unit/test_rename_objectStore.js @@ -0,0 +1,171 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var testGenerator = testSteps(); + +function testSteps() +{ + const name = this.window ? window.location.pathname : "Splendid Test"; + const storeName_ToBeDeleted = "test store to be deleted"; + const storeName_v0 = "test store v0"; + const storeName_v1 = "test store v1"; + const storeName_v2 = "test store v2"; + const storeName_v3 = storeName_ToBeDeleted; + const storeName_v4 = "test store v4"; + + info("Rename in v1."); + let request = indexedDB.open(name, 1); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + let event = yield undefined; + + let db = event.target.result; + let txn = event.target.transaction; + + is(db.objectStoreNames.length, 0, "Correct objectStoreNames list"); + + // create objectstore to be deleted later in v3. + db.createObjectStore(storeName_ToBeDeleted, { keyPath: "foo" }); + is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); + ok(db.objectStoreNames.contains(storeName_ToBeDeleted), "Correct name"); + + // create target objectstore to be renamed. + let objectStore = db.createObjectStore(storeName_v0, { keyPath: "bar" }); + is(db.objectStoreNames.length, 2, "Correct objectStoreNames list"); + ok(db.objectStoreNames.contains(objectStore.name), "Correct name"); + + objectStore.name = storeName_v1; + is(objectStore.name, storeName_v1, "Renamed successfully"); + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + info("Verify renaming done in v1 and run renaming in v2."); + request = indexedDB.open(name, 2); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + event = yield undefined; + + db = event.target.result; + txn = event.target.transaction; + + is(db.objectStoreNames.length, 2, "Correct objectStoreNames list"); + ok(db.objectStoreNames.contains(storeName_v1), "Correct name"); + ok(db.objectStoreNames.contains(storeName_ToBeDeleted), "Correct name"); + + objectStore = txn.objectStore(storeName_v1); + objectStore.name = storeName_v2; + is(objectStore.name, storeName_v2, "Renamed successfully"); + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + info("Verify renaming done in v2."); + request = indexedDB.open(name, 2); + request.onerror = errorHandler; + request.onupgradeneeded = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + db = event.target.result; + + is(db.objectStoreNames.length, 2, "Correct objectStoreNames list"); + ok(db.objectStoreNames.contains(storeName_v2), "Correct name"); + ok(db.objectStoreNames.contains(storeName_ToBeDeleted), "Correct name"); + + db.close(); + + info("Rename in v3."); + request = indexedDB.open(name, 3); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + event = yield undefined; + + db = event.target.result; + txn = event.target.transaction; + + is(db.objectStoreNames.length, 2, "Correct objectStoreNames list"); + ok(db.objectStoreNames.contains(storeName_v2), "Correct name"); + ok(db.objectStoreNames.contains(storeName_ToBeDeleted), "Correct name"); + db.deleteObjectStore(storeName_ToBeDeleted); + is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); + ok(db.objectStoreNames.contains(storeName_v2) && + !db.objectStoreNames.contains(storeName_ToBeDeleted), "Deleted correctly"); + + objectStore = txn.objectStore(storeName_v2); + objectStore.name = storeName_v3; + is(objectStore.name, storeName_v3, "Renamed successfully"); + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + info("Verify renaming done in v3."); + request = indexedDB.open(name, 3); + request.onerror = errorHandler; + request.onupgradeneeded = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + db = event.target.result; + + is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); + ok(db.objectStoreNames.contains(storeName_v3), "Correct name"); + + db.close(); + + info("Abort the version change transaction while renaming objectstore."); + request = indexedDB.open(name, 4); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + event = yield undefined; + + db = event.target.result; + txn = event.target.transaction; + + objectStore = txn.objectStore(storeName_v3); + objectStore.name = storeName_v4; + is(objectStore.name, storeName_v4, "Renamed successfully"); + let putRequest = objectStore.put({ bar: "barValue" }); + putRequest.onsuccess = continueToNextStepSync; + yield undefined; + + // Aborting the transaction. + request.onerror = expectedErrorHandler("AbortError"); + txn.abort(); + yield undefined; + + // Verify if the name of the objectStore handle is reverted. + is(objectStore.name, storeName_v3, "The name is reverted after aborted."); + + info("Verify if the objectstore name is unchanged."); + request = indexedDB.open(name, 3); + request.onerror = errorHandler; + request.onupgradeneeded = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + db = event.target.result; + + is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); + ok(db.objectStoreNames.contains(storeName_v3), "Correct name"); + + db.close(); + + finishTest(); + yield undefined; +}
new file mode 100644 --- /dev/null +++ b/dom/indexedDB/test/unit/test_rename_objectStore_errors.js @@ -0,0 +1,127 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var testGenerator = testSteps(); + +function testSteps() +{ + const name = this.window ? window.location.pathname : "Splendid Test"; + const storeName1 = "test store 1"; + const storeName2 = "test store 2"; + + info("Setup test object stores."); + let request = indexedDB.open(name, 1); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = unexpectedSuccessHandler; + let event = yield undefined; + + let db = event.target.result; + let txn = event.target.transaction; + + is(db.objectStoreNames.length, 0, "Correct objectStoreNames list"); + + let objectStore1 = db.createObjectStore(storeName1, { keyPath: "foo" }); + is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); + is(db.objectStoreNames.item(0), objectStore1.name, "Correct name"); + is(objectStore1.name, storeName1, "Correct name"); + + let objectStore2 = db.createObjectStore(storeName2, { keyPath: "bar" }); + is(db.objectStoreNames.length, 2, "Correct objectStoreNames list"); + is(db.objectStoreNames.item(1), objectStore2.name, "Correct name"); + is(objectStore2.name, storeName2, "Correct name"); + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + info("Verify IDB Errors in version 2."); + request = indexedDB.open(name, 2); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = continueToNextStep; + event = yield undefined; + + db = event.target.result; + txn = event.target.transaction; + + is(db.objectStoreNames.length, 2, "Correct objectStoreNames list"); + + objectStore1 = txn.objectStore(storeName1); + objectStore2 = txn.objectStore(storeName2); + is(objectStore1.name, storeName1, "Correct name"); + is(objectStore2.name, storeName2, "Correct name"); + + // Rename with the name already adopted by the other object store. + try { + objectStore1.name = storeName2; + ok(false, "ConstraintError shall be thrown if the store name already exists."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "ConstraintError", "correct error"); + } + + // Rename with the identical name. + try { + objectStore1.name = storeName1; + ok(true, "It shall be fine to set the same name."); + } catch (e) { + ok(false, "Got a database exception: " + e.name); + } + + db.deleteObjectStore(storeName2); + + // Rename after deleted. + try { + objectStore2.name = storeName2; + ok(false, "InvalidStateError shall be thrown if deleted."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "InvalidStateError", "correct error"); + } + + txn.oncomplete = continueToNextStepSync; + yield undefined; + request.onsuccess = continueToNextStep; + yield undefined; + db.close(); + + info("Rename when the transaction is inactive."); + try { + objectStore1.name = storeName1; + ok(false, "TransactionInactiveError shall be thrown if the transaction is inactive."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "TransactionInactiveError", "correct error"); + } + + info("Rename when the transaction is not an upgrade one."); + request = indexedDB.open(name, 2); + request.onerror = errorHandler; + request.onupgradeneeded = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + db = event.target.result; + txn = db.transaction(storeName1); + objectStore1 = txn.objectStore(storeName1); + + try { + objectStore1.name = storeName1; + ok(false, "InvalidStateError shall be thrown if it's not an upgrade transaction."); + } catch (e) { + ok(e instanceof DOMException, "got a database exception"); + is(e.name, "InvalidStateError", "correct error"); + } + + txn.oncomplete = continueToNextStepSync; + yield undefined; + db.close(); + + finishTest(); + yield undefined; +}
--- a/dom/indexedDB/test/unit/xpcshell-shared.ini +++ b/dom/indexedDB/test/unit/xpcshell-shared.ini @@ -60,17 +60,21 @@ skip-if = toolkit == 'android' # bug 864 [test_open_objectStore.js] [test_optionalArguments.js] [test_overlapping_transactions.js] [test_persistenceType.js] [test_put_get_values.js] [test_put_get_values_autoIncrement.js] [test_readonly_transactions.js] [test_remove_index.js] +[test_rename_index.js] +[test_rename_index_errors.js] [test_remove_objectStore.js] +[test_rename_objectStore.js] +[test_rename_objectStore_errors.js] [test_request_readyState.js] [test_sandbox.js] [test_setVersion.js] [test_setVersion_abort.js] [test_setVersion_events.js] [test_setVersion_exclusion.js] [test_success_events_after_abort.js] [test_table_locks.js]
--- a/dom/media/AudioChannelFormat.h +++ b/dom/media/AudioChannelFormat.h @@ -60,17 +60,17 @@ GetAudioChannelsSuperset(uint32_t aChann /** * DownMixMatrix represents a conversion matrix efficiently by exploiting the * fact that each input channel contributes to at most one output channel, * except possibly for the C input channel in layouts that have one. Also, * every input channel is multiplied by the same coefficient for every output * channel it contributes to. */ -const float SQRT_ONE_HALF = sqrt(0.5); +const float SQRT_ONE_HALF = 0.7071067811865476f; struct DownMixMatrix { // Every input channel c is copied to output channel mInputDestination[c] // after multiplying by mInputCoefficient[c]. uint8_t mInputDestination[CUSTOM_CHANNEL_LAYOUTS]; // If not IGNORE, then the C channel is copied to this output channel after // multiplying by its coefficient. uint8_t mCExtraDestination;
--- a/dom/media/MediaDecoder.cpp +++ b/dom/media/MediaDecoder.cpp @@ -1896,17 +1896,17 @@ MediaDecoder::DumpDebugInfo() GetStateMachine()->DumpDebugInfo(); } } void MediaDecoder::NotifyAudibleStateChanged() { MOZ_ASSERT(!mShuttingDown); - mOwner->NotifyAudibleStateChanged(mIsAudioDataAudible); + mOwner->SetAudibleState(mIsAudioDataAudible); } MediaMemoryTracker::MediaMemoryTracker() { } void MediaMemoryTracker::InitMemoryReporter()
--- a/dom/media/MediaDecoderOwner.h +++ b/dom/media/MediaDecoderOwner.h @@ -129,17 +129,17 @@ public: // ImageContainer containing the video data. virtual VideoFrameContainer* GetVideoFrameContainer() = 0; // Called by the media decoder object, on the main thread, // when the connection between Rtsp server and client gets lost. virtual void ResetConnectionState() = 0; // Called by media decoder when the audible state changed - virtual void NotifyAudibleStateChanged(bool aAudible) = 0; + virtual void SetAudibleState(bool aAudible) = 0; #ifdef MOZ_EME // Dispatches a "encrypted" event to the HTMLMediaElement, with the // provided init data. Actual dispatch may be delayed until HAVE_METADATA. // Main thread only. virtual void DispatchEncrypted(const nsTArray<uint8_t>& aInitData, const nsAString& aInitDataType) = 0; #endif // MOZ_EME
--- a/dom/media/MediaDecoderStateMachine.cpp +++ b/dom/media/MediaDecoderStateMachine.cpp @@ -117,21 +117,16 @@ static const int32_t LOW_VIDEO_THRESHOLD static const int AUDIO_DURATION_USECS = 40000; // If we increase our "low audio threshold" (see LOW_AUDIO_USECS above), we // use this as a factor in all our calculations. Increasing this will cause // us to be more likely to increase our low audio threshold, and to // increase it by more. static const int THRESHOLD_FACTOR = 2; -// When the continuous silent data is over this threshold, means the a/v does -// not produce any sound. This time is decided by UX suggestion, see -// https://bugzilla.mozilla.org/show_bug.cgi?id=1235612#c18 -static const uint32_t SILENT_DATA_THRESHOLD_USECS = 10000000; - namespace detail { // If we have less than this much undecoded data available, we'll consider // ourselves to be running low on undecoded data. We determine how much // undecoded data we have remaining using the reader's GetBuffered() // implementation. static const int64_t LOW_DATA_THRESHOLD_USECS = 5000000; @@ -242,17 +237,16 @@ MediaDecoderStateMachine::MediaDecoderSt mDecodeThreadWaiting(false), mDecodingFirstFrame(true), mSentLoadedMetadataEvent(false), mSentFirstFrameLoadedEvent(false), mSentPlaybackEndedEvent(false), mOutputStreamManager(new OutputStreamManager()), mResource(aDecoder->GetResource()), mAudioOffloading(false), - mSilentDataDuration(0), mBuffered(mTaskQueue, TimeIntervals(), "MediaDecoderStateMachine::mBuffered (Mirror)"), mEstimatedDuration(mTaskQueue, NullableTimeUnit(), "MediaDecoderStateMachine::mEstimatedDuration (Mirror)"), mExplicitDuration(mTaskQueue, Maybe<double>(), "MediaDecoderStateMachine::mExplicitDuration (Mirror)"), mPlayState(mTaskQueue, MediaDecoder::PLAY_STATE_LOADING, "MediaDecoderStateMachine::mPlayState (Mirror)"), @@ -628,46 +622,39 @@ MediaDecoderStateMachine::CheckIsAudible { MOZ_ASSERT(OnTaskQueue()); MOZ_ASSERT(aSample->mType == MediaData::AUDIO_DATA); const AudioData* data = aSample->As<AudioData>(); bool isAudible = data->IsAudible(); if (isAudible && !mIsAudioDataAudible) { mIsAudioDataAudible = true; - mSilentDataDuration = 0; - } else if (isAudible && mIsAudioDataAudible) { - mSilentDataDuration += data->mDuration; - if (mSilentDataDuration > SILENT_DATA_THRESHOLD_USECS) { - mIsAudioDataAudible = false; - mSilentDataDuration = 0; - } + } else if (!isAudible && mIsAudioDataAudible) { + mIsAudioDataAudible = false; } } void MediaDecoderStateMachine::OnAudioPopped(const RefPtr<MediaData>& aSample) { MOZ_ASSERT(OnTaskQueue()); mPlaybackOffset = std::max(mPlaybackOffset.Ref(), aSample->mOffset); UpdateNextFrameStatus(); DispatchAudioDecodeTaskIfNeeded(); - MaybeStartBuffering(); CheckIsAudible(aSample); } void MediaDecoderStateMachine::OnVideoPopped(const RefPtr<MediaData>& aSample) { MOZ_ASSERT(OnTaskQueue()); mPlaybackOffset = std::max(mPlaybackOffset.Ref(), aSample->mOffset); UpdateNextFrameStatus(); DispatchVideoDecodeTaskIfNeeded(); - MaybeStartBuffering(); } void MediaDecoderStateMachine::OnNotDecoded(MediaData::Type aType, MediaDecoderReader::NotDecodedReason aReason) { MOZ_ASSERT(OnTaskQueue()); MOZ_ASSERT(mState != DECODER_STATE_SEEKING); @@ -2148,16 +2135,17 @@ nsresult MediaDecoderStateMachine::RunSt // Start playback if necessary so that the clock can be properly queried. MaybeStartPlayback(); UpdatePlaybackPositionPeriodically(); NS_ASSERTION(!IsPlaying() || IsStateMachineScheduled(), "Must have timer scheduled"); + MaybeStartBuffering(); return NS_OK; } case DECODER_STATE_BUFFERING: { TimeStamp now = TimeStamp::Now(); NS_ASSERTION(!mBufferingStart.IsNull(), "Must know buffering start time."); // With buffering heuristics we will remain in the buffering state if @@ -2404,20 +2392,16 @@ void MediaDecoderStateMachine::StartBuff // We only move into BUFFERING state if we're actually decoding. // If we're currently doing something else, we don't need to buffer, // and more importantly, we shouldn't overwrite mState to interrupt // the current operation, as that could leave us in an inconsistent // state! return; } - // Update playback position again before entering BUFFERING so the currentTime - // of the media element is more accurate during buffering. - UpdatePlaybackPositionPeriodically(); - if (IsPlaying()) { StopPlayback(); } TimeDuration decodeDuration = TimeStamp::Now() - mDecodeStartTime; // Go into quick buffering mode provided we've not just left buffering using // a "quick exit". This stops us flip-flopping between playing and buffering // when the download speed is similar to the decode speed.
--- a/dom/media/MediaDecoderStateMachine.h +++ b/dom/media/MediaDecoderStateMachine.h @@ -937,19 +937,16 @@ private: MediaEventProducer<MediaEventType> mOnPlaybackEvent; MediaEventProducer<MediaDecoderEventVisibility> mOnSeekingStart; // True if audio is offloading. // Playback will not start when audio is offloading. bool mAudioOffloading; - // Duration of the continuous silent data. - uint32_t mSilentDataDuration; - #ifdef MOZ_EME void OnCDMProxyReady(RefPtr<CDMProxy> aProxy); void OnCDMProxyNotReady(); RefPtr<CDMProxy> mCDMProxy; MozPromiseRequestHolder<MediaDecoder::CDMProxyPromise> mCDMProxyPromise; #endif private:
--- a/dom/media/MediaFormatReader.cpp +++ b/dom/media/MediaFormatReader.cpp @@ -65,16 +65,17 @@ MediaFormatReader::MediaFormatReader(Abs , mDemuxer(aDemuxer) , mDemuxerInitDone(false) , mLastReportedNumDecodedFrames(0) , mLayersBackendType(aLayersBackend) , mInitDone(false) , mIsEncrypted(false) , mTrackDemuxersMayBlock(false) , mDemuxOnly(false) + , mSeekScheduled(false) , mVideoFrameContainer(aVideoFrameContainer) { MOZ_ASSERT(aDemuxer); MOZ_COUNT_CTOR(MediaFormatReader); } MediaFormatReader::~MediaFormatReader() { @@ -91,54 +92,54 @@ MediaFormatReader::Shutdown() } mDemuxerInitRequest.DisconnectIfExists(); mMetadataPromise.RejectIfExists(ReadMetadataFailureReason::METADATA_ERROR, __func__); mSeekPromise.RejectIfExists(NS_ERROR_FAILURE, __func__); mSkipRequest.DisconnectIfExists(); if (mAudio.mDecoder) { - Flush(TrackInfo::kAudioTrack); + Reset(TrackInfo::kAudioTrack); if (mAudio.HasPromise()) { mAudio.RejectPromise(CANCELED, __func__); } mAudio.mInitPromise.DisconnectIfExists(); mAudio.ShutdownDecoder(); } if (mAudio.mTrackDemuxer) { mAudio.ResetDemuxer(); mAudio.mTrackDemuxer->BreakCycles(); mAudio.mTrackDemuxer = nullptr; } if (mAudio.mTaskQueue) { mAudio.mTaskQueue->BeginShutdown(); mAudio.mTaskQueue->AwaitShutdownAndIdle(); mAudio.mTaskQueue = nullptr; } - MOZ_ASSERT(mAudio.mPromise.IsEmpty()); + MOZ_ASSERT(!mAudio.HasPromise()); if (mVideo.mDecoder) { - Flush(TrackInfo::kVideoTrack); + Reset(TrackInfo::kVideoTrack); if (mVideo.HasPromise()) { mVideo.RejectPromise(CANCELED, __func__); } mVideo.mInitPromise.DisconnectIfExists(); mVideo.ShutdownDecoder(); } if (mVideo.mTrackDemuxer) { mVideo.ResetDemuxer(); mVideo.mTrackDemuxer->BreakCycles(); mVideo.mTrackDemuxer = nullptr; } if (mVideo.mTaskQueue) { mVideo.mTaskQueue->BeginShutdown(); mVideo.mTaskQueue->AwaitShutdownAndIdle(); mVideo.mTaskQueue = nullptr; } - MOZ_ASSERT(mVideo.mPromise.IsEmpty()); + MOZ_ASSERT(!mVideo.HasPromise()); mDemuxer = nullptr; mPlatform = nullptr; return MediaDecoderReader::Shutdown(); } @@ -483,17 +484,20 @@ bool MediaFormatReader::ShouldSkip(bool aSkipToNextKeyframe, media::TimeUnit aTimeThreshold) { MOZ_ASSERT(HasVideo()); media::TimeUnit nextKeyframe; nsresult rv = mVideo.mTrackDemuxer->GetNextRandomAccessPoint(&nextKeyframe); if (NS_FAILED(rv)) { return aSkipToNextKeyframe; } - return nextKeyframe < aTimeThreshold && nextKeyframe.ToMicroseconds() >= 0; + return (nextKeyframe < aTimeThreshold || + (mVideo.mTimeThreshold && + mVideo.mTimeThreshold.ref().mTime < aTimeThreshold)) && + nextKeyframe.ToMicroseconds() >= 0; } RefPtr<MediaDecoderReader::MediaDataPromise> MediaFormatReader::RequestVideoData(bool aSkipToNextKeyframe, int64_t aTimeThreshold) { MOZ_ASSERT(OnTaskQueue()); MOZ_DIAGNOSTIC_ASSERT(mSeekPromise.IsEmpty(), "No sample requests allowed while seeking"); @@ -519,33 +523,22 @@ MediaFormatReader::RequestVideoData(bool return MediaDataPromise::CreateAndReject(CANCELED, __func__); } media::TimeUnit timeThreshold{media::TimeUnit::FromMicroseconds(aTimeThreshold)}; // Ensure we have no pending seek going as ShouldSkip could return out of date // information. if (!mVideo.HasInternalSeekPending() && ShouldSkip(aSkipToNextKeyframe, timeThreshold)) { - // Cancel any pending demux request. - mVideo.mDemuxRequest.DisconnectIfExists(); - - // I think it's still possible for an output to have been sent from the decoder - // and is currently sitting in our event queue waiting to be processed. The following - // flush won't clear it, and when we return to the event loop it'll be added to our - // output queue and be used. - // This code will count that as dropped, which was the intent, but not quite true. - mDecoder->NotifyDecodedFrames(0, 0, SizeOfVideoQueueInFrames()); - - Flush(TrackInfo::kVideoTrack); - RefPtr<MediaDataPromise> p = mVideo.mPromise.Ensure(__func__); + RefPtr<MediaDataPromise> p = mVideo.EnsurePromise(__func__); SkipVideoDemuxToNextKeyFrame(timeThreshold); return p; } - RefPtr<MediaDataPromise> p = mVideo.mPromise.Ensure(__func__); + RefPtr<MediaDataPromise> p = mVideo.EnsurePromise(__func__); NotifyDecodingRequested(TrackInfo::kVideoTrack); return p; } void MediaFormatReader::OnDemuxFailed(TrackType aTrack, DemuxerFailureReason aFailure) { @@ -621,17 +614,17 @@ MediaFormatReader::RequestAudioData() return MediaDataPromise::CreateAndReject(CANCELED, __func__); } if (mShutdown) { NS_WARNING("RequestAudioData on shutdown MediaFormatReader!"); return MediaDataPromise::CreateAndReject(CANCELED, __func__); } - RefPtr<MediaDataPromise> p = mAudio.mPromise.Ensure(__func__); + RefPtr<MediaDataPromise> p = mAudio.EnsurePromise(__func__); NotifyDecodingRequested(TrackInfo::kAudioTrack); return p; } void MediaFormatReader::DoDemuxAudio() { @@ -734,28 +727,27 @@ MediaFormatReader::NotifyDecodingRequest auto& decoder = GetDecoderData(aTrack); decoder.mDecodingRequested = true; ScheduleUpdate(aTrack); } bool MediaFormatReader::NeedInput(DecoderData& aDecoder) { - MOZ_ASSERT(OnTaskQueue()); // We try to keep a few more compressed samples input than decoded samples // have been output, provided the state machine has requested we send it a // decoded sample. To account for H.264 streams which may require a longer // run of input than we input, decoders fire an "input exhausted" callback, // which overrides our "few more samples" threshold. return !aDecoder.mDraining && !aDecoder.mError && aDecoder.mDecodingRequested && !aDecoder.mDemuxRequest.Exists() && - !aDecoder.mSeekRequest.Exists() && + !aDecoder.HasInternalSeekPending() && aDecoder.mOutput.Length() <= aDecoder.mDecodeAhead && (aDecoder.mInputExhausted || !aDecoder.mQueuedSamples.IsEmpty() || aDecoder.mTimeThreshold.isSome() || aDecoder.mNumSamplesInput - aDecoder.mNumSamplesOutput <= aDecoder.mDecodeAhead); } void MediaFormatReader::ScheduleUpdate(TrackType aTrack) @@ -824,40 +816,42 @@ MediaFormatReader::UpdateReceivedNewData decoder.mTimeThreshold.ref().mWaiting = false; } decoder.mWaitingForData = false; if (decoder.mError) { return false; } - bool hasPendingSeek = - decoder.mTimeThreshold && !decoder.mTimeThreshold.ref().mHasSeeked; - if (hasPendingSeek || decoder.HasWaitingPromise()) { - if (hasPendingSeek) { + if (!mSeekPromise.IsEmpty()) { + MOZ_ASSERT(!decoder.HasPromise()); + MOZ_DIAGNOSTIC_ASSERT(!mAudio.mTimeThreshold && !mVideo.mTimeThreshold, + "InternalSeek must have been aborted when Seek was first called"); + MOZ_DIAGNOSTIC_ASSERT(!mAudio.HasWaitingPromise() && !mVideo.HasWaitingPromise(), + "Waiting promises must have been rejected when Seek was first called"); + if (mVideo.mSeekRequest.Exists() || mAudio.mSeekRequest.Exists()) { + // Already waiting for a seek to complete. Nothing more to do. + return true; + } + LOG("Attempting Seek"); + ScheduleSeek(); + return true; + } + if (decoder.HasInternalSeekPending() || decoder.HasWaitingPromise()) { + if (decoder.HasInternalSeekPending()) { LOG("Attempting Internal Seek"); InternalSeek(aTrack, decoder.mTimeThreshold.ref()); } if (decoder.HasWaitingPromise()) { MOZ_ASSERT(!decoder.HasPromise()); LOG("We have new data. Resolving WaitingPromise"); decoder.mWaitingPromise.Resolve(decoder.mType, __func__); } return true; } - if (!mSeekPromise.IsEmpty()) { - MOZ_ASSERT(!decoder.HasPromise()); - if (mVideo.mSeekRequest.Exists() || mAudio.mSeekRequest.Exists()) { - // Already waiting for a seek to complete. Nothing more to do. - return true; - } - LOG("Attempting Seek"); - AttemptSeek(); - return true; - } return false; } void MediaFormatReader::RequestDemuxSamples(TrackType aTrack) { MOZ_ASSERT(OnTaskQueue()); auto& decoder = GetDecoderData(aTrack); @@ -946,19 +940,19 @@ MediaFormatReader::HandleDemuxedSamples( } LOG("%s stream id has changed from:%d to:%d, recreating decoder.", TrackTypeToStr(aTrack), decoder.mLastStreamSourceID, info->GetID()); decoder.mInfo = info; decoder.mLastStreamSourceID = info->GetID(); decoder.mNextStreamSourceID.reset(); - // Flush will clear our array of queued samples. So make a copy now. + // Reset will clear our array of queued samples. So make a copy now. nsTArray<RefPtr<MediaRawData>> samples{decoder.mQueuedSamples}; - Flush(aTrack); + Reset(aTrack); decoder.ShutdownDecoder(); if (sample->mKeyframe) { decoder.mQueuedSamples.AppendElements(Move(samples)); NotifyDecodingRequested(aTrack); } else { InternalSeekTarget seekTarget = decoder.mTimeThreshold.refOr(InternalSeekTarget(TimeUnit::FromMicroseconds(sample->mTime), false)); LOG("Stream change occurred on a non-keyframe. Seeking to:%lld", @@ -1000,25 +994,27 @@ MediaFormatReader::HandleDemuxedSamples( void MediaFormatReader::InternalSeek(TrackType aTrack, const InternalSeekTarget& aTarget) { MOZ_ASSERT(OnTaskQueue()); LOG("%s internal seek to %f", TrackTypeToStr(aTrack), aTarget.mTime.ToSeconds()); auto& decoder = GetDecoderData(aTrack); + decoder.Flush(); + decoder.ResetDemuxer(); decoder.mTimeThreshold = Some(aTarget); RefPtr<MediaFormatReader> self = this; - decoder.ResetDemuxer(); decoder.mSeekRequest.Begin(decoder.mTrackDemuxer->Seek(decoder.mTimeThreshold.ref().mTime) ->Then(OwnerThread(), __func__, [self, aTrack] (media::TimeUnit aTime) { auto& decoder = self->GetDecoderData(aTrack); decoder.mSeekRequest.Complete(); - MOZ_ASSERT(decoder.mTimeThreshold); + MOZ_ASSERT(decoder.mTimeThreshold, + "Seek promise must be disconnected when timethreshold is reset"); decoder.mTimeThreshold.ref().mHasSeeked = true; self->NotifyDecodingRequested(aTrack); }, [self, aTrack] (DemuxerFailureReason aResult) { auto& decoder = self->GetDecoderData(aTrack); decoder.mSeekRequest.Complete(); switch (aResult) { case DemuxerFailureReason::WAITING_FOR_DATA: @@ -1083,30 +1079,40 @@ MediaFormatReader::Update(TrackType aTra return; } if (UpdateReceivedNewData(aTrack)) { LOGV("Nothing more to do"); return; } + if (decoder.mSeekRequest.Exists()) { + LOGV("Seeking hasn't completed, nothing more to do"); + return; + } + + MOZ_DIAGNOSTIC_ASSERT(!decoder.HasInternalSeekPending() || + (!decoder.mOutput.Length() &&