зеркало из https://github.com/mozilla/gecko-dev.git
Merge mozilla-central to inbound. a=merge CLOSED TREE
This commit is contained in:
Коммит
a8ce7fac91
|
@ -187,7 +187,7 @@ profiledbuild::
|
|||
rm -f jarlog/en-US.log
|
||||
$(call BUILDSTATUS,TIER_FINISH pgo_package)
|
||||
$(call BUILDSTATUS,TIER_START pgo_profile)
|
||||
JARLOG_FILE=jarlog/en-US.log $(PYTHON) $(topsrcdir)/build/pgo/profileserver.py 10
|
||||
JARLOG_FILE=jarlog/en-US.log $(PYTHON) $(topsrcdir)/build/pgo/profileserver.py
|
||||
$(call BUILDSTATUS,TIER_FINISH pgo_profile)
|
||||
$(call BUILDSTATUS,TIER_START pgo_clobber)
|
||||
$(MAKE) maybe_clobber_profiledbuild
|
||||
|
|
|
@ -59,7 +59,7 @@ void AccGroupInfo::Update() {
|
|||
|
||||
// If the previous item in the group has calculated group information then
|
||||
// build group information for this item based on found one.
|
||||
if (sibling->mBits.groupInfo) {
|
||||
if (sibling->mBits.groupInfo && !sibling->HasDirtyGroupInfo()) {
|
||||
mPosInSet += sibling->mBits.groupInfo->mPosInSet;
|
||||
mParent = sibling->mBits.groupInfo->mParent;
|
||||
mSetSize = sibling->mBits.groupInfo->mSetSize;
|
||||
|
@ -93,7 +93,7 @@ void AccGroupInfo::Update() {
|
|||
|
||||
// If the next item in the group has calculated group information then
|
||||
// build group information for this item based on found one.
|
||||
if (sibling->mBits.groupInfo) {
|
||||
if (sibling->mBits.groupInfo && !sibling->HasDirtyGroupInfo()) {
|
||||
mParent = sibling->mBits.groupInfo->mParent;
|
||||
mSetSize = sibling->mBits.groupInfo->mSetSize;
|
||||
return;
|
||||
|
|
|
@ -103,6 +103,9 @@ void TreeMutation::Done() {
|
|||
|
||||
for (uint32_t idx = mStartIdx; idx < length; idx++) {
|
||||
mParent->mChildren[idx]->mInt.mIndexOfEmbeddedChild = -1;
|
||||
}
|
||||
|
||||
for (uint32_t idx = 0; idx < length; idx++) {
|
||||
mParent->mChildren[idx]->mStateFlags |= Accessible::eGroupInfoDirty;
|
||||
}
|
||||
|
||||
|
|
|
@ -2150,10 +2150,13 @@ void Accessible::MoveChild(uint32_t aNewIndex, Accessible* aChild) {
|
|||
|
||||
for (uint32_t idx = startIdx; idx <= endIdx; idx++) {
|
||||
mChildren[idx]->mIndexInParent = idx;
|
||||
mChildren[idx]->mStateFlags |= eGroupInfoDirty;
|
||||
mChildren[idx]->mInt.mIndexOfEmbeddedChild = -1;
|
||||
}
|
||||
|
||||
for (uint32_t idx = 0; idx < mChildren.Length(); idx++) {
|
||||
mChildren[idx]->mStateFlags |= eGroupInfoDirty;
|
||||
}
|
||||
|
||||
RefPtr<AccShowEvent> showEvent = new AccShowEvent(aChild);
|
||||
DebugOnly<bool> added = mDoc->Controller()->QueueMutationEvent(showEvent);
|
||||
MOZ_ASSERT(added);
|
||||
|
|
|
@ -4,6 +4,7 @@ support-files =
|
|||
|
||||
[test_dpub_aria_xml-roles.html]
|
||||
[test_graphics_aria_xml-roles.html]
|
||||
[test_listbox.html]
|
||||
[test_obj.html]
|
||||
[test_obj_css.html]
|
||||
[test_obj_css.xul]
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<title>Listbox group attribute tests</title>
|
||||
<meta charset="utf-8" />
|
||||
<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="../attributes.js"></script>
|
||||
<script type="application/javascript"
|
||||
src="../events.js"></script>
|
||||
|
||||
<script type="application/javascript">
|
||||
async function doTest() {
|
||||
// First test the whole lot.
|
||||
testGroupAttrs("a", 1, 6);
|
||||
testGroupAttrs("b", 2, 6);
|
||||
testGroupAttrs("c", 3, 6);
|
||||
testGroupAttrs("d", 4, 6);
|
||||
testGroupAttrs("e", 5, 6);
|
||||
testGroupAttrs("f", 6, 6);
|
||||
// Remove c, reducing the set to 5.
|
||||
let listbox = getAccessible("listbox");
|
||||
let updated = waitForEventPromise(EVENT_REORDER, listbox);
|
||||
c.remove();
|
||||
await updated;
|
||||
testGroupAttrs("a", 1, 5);
|
||||
testGroupAttrs("b", 2, 5);
|
||||
testGroupAttrs("d", 3, 5);
|
||||
testGroupAttrs("e", 4, 5);
|
||||
testGroupAttrs("f", 5, 5);
|
||||
// Now, remove the first element.
|
||||
updated = waitForEventPromise(EVENT_REORDER, listbox);
|
||||
a.remove();
|
||||
await updated;
|
||||
testGroupAttrs("b", 1, 4);
|
||||
testGroupAttrs("d", 2, 4);
|
||||
testGroupAttrs("e", 3, 4);
|
||||
testGroupAttrs("f", 4, 4);
|
||||
// Remove the last item.
|
||||
updated = waitForEventPromise(EVENT_REORDER, listbox);
|
||||
f.remove();
|
||||
await updated;
|
||||
testGroupAttrs("b", 1, 3);
|
||||
testGroupAttrs("d", 2, 3);
|
||||
testGroupAttrs("e", 3, 3);
|
||||
// Finally, remove the middle item.
|
||||
updated = waitForEventPromise(EVENT_REORDER, listbox);
|
||||
d.remove();
|
||||
await updated;
|
||||
testGroupAttrs("b", 1, 2);
|
||||
testGroupAttrs("e", 2, 2);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addA11yLoadEvent(doTest);
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none"></div>
|
||||
<pre id="test">
|
||||
</pre>
|
||||
|
||||
<!-- Group information updated after removal of list items, bug 1515186 -->
|
||||
<div id="listbox" role="listbox">
|
||||
<div id="a" role="option">Option a</div>
|
||||
<div id="b" role="option">Option b</div>
|
||||
<div id="c" role="option">Option c</div>
|
||||
<div id="d" role="option">Option d</div>
|
||||
<div id="e" role="option">Option e</div>
|
||||
<div id="f" role="option">Option f</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -346,7 +346,7 @@ var FullZoom = {
|
|||
// The browser is sometimes half-destroyed because this method is called
|
||||
// by content pref service callbacks, which themselves can be called at any
|
||||
// time, even after browsers are closed.
|
||||
if (!aBrowser.parentNode || aBrowser.isSyntheticDocument) {
|
||||
if (!aBrowser.mInitialized || aBrowser.isSyntheticDocument) {
|
||||
this._executeSoon(aCallback);
|
||||
return;
|
||||
}
|
||||
|
@ -434,7 +434,7 @@ var FullZoom = {
|
|||
// hasn't been received yet. In that case, the browser is unusable, it
|
||||
// has no properties, so return false. Check for this case by getting a
|
||||
// property, say, docShell.
|
||||
return map.get(browser) === this.token && browser.parentNode;
|
||||
return map.get(browser) === this.token && browser.mInitialized;
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
|
@ -113,7 +113,7 @@ window._gBrowser = {
|
|||
|
||||
/**
|
||||
* `_createLazyBrowser` will define properties on the unbound lazy browser
|
||||
* which correspond to properties defined in XBL which will be bound to
|
||||
* which correspond to properties defined in MozBrowser which will be bound to
|
||||
* the browser when it is inserted into the document. If any of these
|
||||
* properties are accessed by consumers, `_insertBrowser` is called and
|
||||
* the browser is inserted to ensure that things don't break. This list
|
||||
|
@ -3093,14 +3093,14 @@ window._gBrowser = {
|
|||
if (aTab.linkedPanel) {
|
||||
this._outerWindowIDBrowserMap.delete(browser.outerWindowID);
|
||||
|
||||
// Because of the way XBL works (fields just set JS
|
||||
// properties on the element) and the code we have in place
|
||||
// Because of the fact that we are setting JS properties on
|
||||
// the browser elements, and we have code in place
|
||||
// to preserve the JS objects for any elements that have
|
||||
// JS properties set on them, the browser element won't be
|
||||
// destroyed until the document goes away. So we force a
|
||||
// cleanup ourselves.
|
||||
// This has to happen before we remove the child so that the
|
||||
// XBL implementation of nsIObserver still works.
|
||||
// This has to happen before we remove the child since functions
|
||||
// like `getBrowserContainer` expect the browser to be parented.
|
||||
browser.destroy();
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
. $topsrcdir/browser/config/mozconfigs/linux64/nightly
|
||||
|
||||
mk_add_options "export MOZ_AUTOMATION_BUILD_SYMBOLS=0"
|
||||
mk_add_options "export MOZ_AUTOMATION_PACKAGE_TESTS=0"
|
||||
mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0"
|
||||
mk_add_options "export MOZ_AUTOMATION_L10N_CHECK=0"
|
||||
|
||||
ac_add_options --enable-profile-generate
|
|
@ -0,0 +1,6 @@
|
|||
. $topsrcdir/browser/config/mozconfigs/linux64/nightly
|
||||
|
||||
ac_add_options --enable-profile-use
|
||||
ac_add_options --enable-lto
|
||||
ac_add_options --with-pgo-jarlog=/builds/worker/fetches/en-US.log
|
||||
ac_add_options --with-pgo-profile-path=/builds/worker/fetches/default.profraw
|
|
@ -14,7 +14,7 @@
|
|||
}
|
||||
|
||||
/* Add some space at the top because there are no headers: */
|
||||
#BMB_bookmarksPopup menupopup > hbox > .popup-internal-box > .arrowscrollbox-scrollbox > .scrollbox-innerbox {
|
||||
#BMB_bookmarksPopup menupopup > hbox > .popup-internal-box > .arrowscrollbox-scrollbox {
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
|
|
|
@ -1122,11 +1122,11 @@ menuitem.panel-subview-footer@menuStateActive@,
|
|||
}
|
||||
|
||||
/* Popups with only one item don't have a footer */
|
||||
#BMB_bookmarksPopup menupopup[placespopup=true][singleitempopup=true] > hbox > .popup-internal-box > .arrowscrollbox-scrollbox > .scrollbox-innerbox,
|
||||
#BMB_bookmarksPopup menupopup[placespopup=true][singleitempopup=true] > hbox > .popup-internal-box > .arrowscrollbox-scrollbox,
|
||||
/* These popups never have a footer */
|
||||
#BMB_bookmarksToolbarPopup > hbox > .popup-internal-box > .arrowscrollbox-scrollbox > .scrollbox-innerbox,
|
||||
#BMB_unsortedBookmarksPopup > hbox > .popup-internal-box > .arrowscrollbox-scrollbox > .scrollbox-innerbox,
|
||||
#BMB_mobileBookmarksPopup > hbox > .popup-internal-box > .arrowscrollbox-scrollbox > .scrollbox-innerbox {
|
||||
#BMB_bookmarksToolbarPopup > hbox > .popup-internal-box > .arrowscrollbox-scrollbox,
|
||||
#BMB_unsortedBookmarksPopup > hbox > .popup-internal-box > .arrowscrollbox-scrollbox,
|
||||
#BMB_mobileBookmarksPopup > hbox > .popup-internal-box > .arrowscrollbox-scrollbox {
|
||||
/* And so they need some bottom padding: */
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
min-width: 0;
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .arrowscrollbox-scrollbox > .scrollbox-innerbox {
|
||||
.tabbrowser-arrowscrollbox > .arrowscrollbox-scrollbox {
|
||||
/* Needed to prevent tabstrip from growing as wide as the sum of the tabs'
|
||||
page-title widths (when we'd rather have it be as wide as the window and
|
||||
compress the tabs to their minimum size): */
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
}
|
||||
|
||||
/* Add some space at the top because there are no headers: */
|
||||
#BMB_bookmarksPopup menupopup[placespopup=true] > hbox > .popup-internal-box > .arrowscrollbox-scrollbox > .scrollbox-innerbox {
|
||||
#BMB_bookmarksPopup menupopup[placespopup=true] > hbox > .popup-internal-box > .arrowscrollbox-scrollbox {
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
"patches": [
|
||||
"static-llvm-symbolizer.patch",
|
||||
"find_symbolizer_linux.patch",
|
||||
"rename_gcov_flush_.patch"
|
||||
"rename_gcov_flush_.patch",
|
||||
"r350774.patch"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
"patches": [
|
||||
"static-llvm-symbolizer.patch",
|
||||
"find_symbolizer_linux.patch",
|
||||
"rename_gcov_flush_.patch"
|
||||
"rename_gcov_flush_.patch",
|
||||
"r350774.patch"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
"patches": [
|
||||
"static-llvm-symbolizer.patch",
|
||||
"compiler-rt-cross-compile.patch",
|
||||
"compiler-rt-no-codesign.patch"
|
||||
"compiler-rt-no-codesign.patch",
|
||||
"r350774.patch"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -14,5 +14,8 @@
|
|||
"gcc_dir": "/builds/worker/workspace/build/src/gcc",
|
||||
"cc": "/builds/worker/workspace/build/src/gcc/bin/gcc",
|
||||
"cxx": "/builds/worker/workspace/build/src/gcc/bin/g++",
|
||||
"as": "/builds/worker/workspace/build/src/gcc/bin/gcc"
|
||||
"as": "/builds/worker/workspace/build/src/gcc/bin/gcc",
|
||||
"patches": [
|
||||
"r350774.patch"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
"aarch64-vastart-checking.patch",
|
||||
"downgrade-mangling-error.patch",
|
||||
"r346300-compiler-rt-windows-mmap.patch",
|
||||
"loosen-msvc-detection.patch"
|
||||
"loosen-msvc-detection.patch",
|
||||
"r350774.patch"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
diff --git a/llvm/lib/Object/Binary.cpp b/llvm/lib/Object/Binary.cpp
|
||||
index d7c25921ec3..fe41987f5c2 100644
|
||||
--- a/llvm/lib/Object/Binary.cpp
|
||||
+++ b/llvm/lib/Object/Binary.cpp
|
||||
@@ -88,7 +88,8 @@ Expected<std::unique_ptr<Binary>> object::createBinary(MemoryBufferRef Buffer,
|
||||
|
||||
Expected<OwningBinary<Binary>> object::createBinary(StringRef Path) {
|
||||
ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
|
||||
- MemoryBuffer::getFileOrSTDIN(Path);
|
||||
+ MemoryBuffer::getFileOrSTDIN(Path, /*FileSize=*/-1,
|
||||
+ /*RequiresNullTerminator=*/false);
|
||||
if (std::error_code EC = FileOrErr.getError())
|
||||
return errorCodeToError(EC);
|
||||
std::unique_ptr<MemoryBuffer> &Buffer = FileOrErr.get();
|
|
@ -75,7 +75,7 @@ interface nsIPrincipal : nsISerializable
|
|||
* The codebase URI to which this principal pertains. This is
|
||||
* generally the document URI.
|
||||
*/
|
||||
readonly attribute nsIURI URI;
|
||||
[infallible] readonly attribute nsIURI URI;
|
||||
|
||||
/**
|
||||
* The domain URI to which this principal pertains.
|
||||
|
|
|
@ -40,7 +40,7 @@ function swapToInnerBrowser({ tab, containerURL, getInnerBrowser }) {
|
|||
|
||||
// Dispatch a custom event each time the _viewport content_ is swapped from one browser
|
||||
// to another. DevTools server code uses this to follow the content if there is an
|
||||
// active DevTools connection. While browser.xml does dispatch it's own SwapDocShells
|
||||
// active DevTools connection. While browser.js does dispatch it's own SwapDocShells
|
||||
// event, this one is easier for DevTools to follow because it's only emitted once per
|
||||
// transition, instead of twice like SwapDocShells.
|
||||
const dispatchDevToolsBrowserSwap = (from, to) => {
|
||||
|
@ -421,7 +421,7 @@ function addXULBrowserDecorations(browser) {
|
|||
}
|
||||
|
||||
// It's not necessary for these to actually do anything. These properties are
|
||||
// swapped between browsers in browser.xml's `swapDocShells`, and then their
|
||||
// swapped between browsers in browser.js's `swapDocShells`, and then their
|
||||
// `swapBrowser` methods are called, so we define them here for that to work
|
||||
// without errors. During the swap process above, these will move from the
|
||||
// the new inner browser to the original tab's browser (step 4) and then to
|
||||
|
|
|
@ -19,7 +19,7 @@ function debug(msg) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Properties swapped between browsers by browser.xml's `swapDocShells`.
|
||||
* Properties swapped between browsers by browser.js's `swapDocShells`.
|
||||
*/
|
||||
const SWAPPED_BROWSER_STATE = [
|
||||
"_remoteFinder",
|
||||
|
@ -64,8 +64,8 @@ const PROPERTIES_FROM_BROWSER_WINDOW = [
|
|||
*
|
||||
* The inner <iframe mozbrowser> element is _just_ the page content. It is not
|
||||
* enough to to replace <xul:browser> on its own. <xul:browser> comes along
|
||||
* with lots of associated functionality via XBL binding defined for such
|
||||
* elements in browser.xml, and the Firefox UI depends on these various things
|
||||
* with lots of associated functionality via a Custom Element defined for such
|
||||
* elements in browser.js, and the Firefox UI depends on these various things
|
||||
* to make the UI function.
|
||||
*
|
||||
* By mapping various methods, properties, and messages from the outer browser
|
||||
|
@ -103,9 +103,9 @@ function tunnelToInnerBrowser(outer, inner) {
|
|||
|
||||
// Various browser methods access the `frameLoader` property, including:
|
||||
// * `saveBrowser` from contentAreaUtils.js
|
||||
// * `docShellIsActive` from browser.xml
|
||||
// * `hasContentOpener` from browser.xml
|
||||
// * `preserveLayers` from browser.xml
|
||||
// * `docShellIsActive` from browser.js
|
||||
// * `hasContentOpener` from browser.js
|
||||
// * `preserveLayers` from browser.js
|
||||
// * `receiveMessage` from SessionStore.jsm
|
||||
// In general, these methods are interested in the `frameLoader` for the content,
|
||||
// so we redirect them to the inner browser's `frameLoader`.
|
||||
|
@ -153,12 +153,12 @@ function tunnelToInnerBrowser(outer, inner) {
|
|||
// which we can use to route messages of interest to the inner browser instead.
|
||||
// Note: The _actual_ messageManager accessible from
|
||||
// `browser.frameLoader.messageManager` is not overridable and is left unchanged.
|
||||
// Only the XBL getter `browser.messageManager` is overridden. Browser UI code
|
||||
// always uses this getter instead of `browser.frameLoader.messageManager` directly,
|
||||
// Only the Custom Element getter `browser.messageManager` is overridden. This
|
||||
// getter is always used instead of `browser.frameLoader.messageManager` directly,
|
||||
// so this has the effect of overriding the message manager for browser UI code.
|
||||
mmTunnel = new MessageManagerTunnel(outer, inner);
|
||||
|
||||
// Clear out any cached state that references the XBL binding's non-remote state,
|
||||
// Clear out any cached state that references the Custom Element's non-remote state,
|
||||
// such as form fill controllers. Otherwise they will remain in place and leak the
|
||||
// outer docshell.
|
||||
outer.destroy();
|
||||
|
@ -193,9 +193,9 @@ function tunnelToInnerBrowser(outer, inner) {
|
|||
outer._remoteWebNavigation = webNavigation;
|
||||
outer._remoteWebNavigationImpl = webNavigation;
|
||||
|
||||
// Now that we've flipped to the remote browser XBL binding, add `progressListener`
|
||||
// Now that we've flipped to the remote browser mode, add `progressListener`
|
||||
// onto the remote version of `webProgress`. Normally tabbrowser.xml does this step
|
||||
// when it creates a new browser, etc. Since we manually changed the XBL binding
|
||||
// when it creates a new browser, etc. Since we manually changed the mode
|
||||
// above, it caused a fresh webProgress object to be created which does not have any
|
||||
// listeners added. So, we get the listener that gBrowser is using for the tab and
|
||||
// reattach it here.
|
||||
|
@ -305,7 +305,7 @@ function tunnelToInnerBrowser(outer, inner) {
|
|||
// Remove the progress listener we added manually.
|
||||
outer.webProgress.removeProgressListener(filteredProgressListener);
|
||||
|
||||
// Reset the XBL binding back to the original state.
|
||||
// Reset the Custom Element back to the original state.
|
||||
outer.destroy();
|
||||
|
||||
// Reset @remote since this is now back to a regular, non-remote browser
|
||||
|
@ -388,7 +388,7 @@ MessageManagerTunnel.prototype = {
|
|||
],
|
||||
|
||||
OUTER_TO_INNER_MESSAGES: [
|
||||
// Messages sent from remote-browser.xml
|
||||
// Messages sent from browser.js
|
||||
"Browser:PurgeSessionHistory",
|
||||
"InPermitUnload",
|
||||
"PermitUnload",
|
||||
|
@ -422,7 +422,7 @@ MessageManagerTunnel.prototype = {
|
|||
"Content:SecurityChange",
|
||||
"Content:StateChange",
|
||||
"Content:StatusChange",
|
||||
// Messages sent to remote-browser.xml
|
||||
// Messages sent to browser.js
|
||||
"DOMTitleChanged",
|
||||
"ImageDocumentLoaded",
|
||||
"Forms:ShowDropDown",
|
||||
|
@ -440,7 +440,7 @@ MessageManagerTunnel.prototype = {
|
|||
],
|
||||
|
||||
OUTER_TO_INNER_MESSAGE_PREFIXES: [
|
||||
// Messages sent from browser.xml
|
||||
// Messages sent from browser.js
|
||||
"Autoscroll:",
|
||||
// Messages sent from nsContextMenu.js
|
||||
"ContextMenu:",
|
||||
|
@ -463,7 +463,7 @@ MessageManagerTunnel.prototype = {
|
|||
],
|
||||
|
||||
INNER_TO_OUTER_MESSAGE_PREFIXES: [
|
||||
// Messages sent to browser.xml
|
||||
// Messages sent to browser.js
|
||||
"Autoscroll:",
|
||||
// Messages sent to nsContextMenu.js
|
||||
"ContextMenu:",
|
||||
|
|
|
@ -86,7 +86,7 @@ function matchRequest(channel, filters) {
|
|||
return true;
|
||||
}
|
||||
} catch (e) {
|
||||
// outerWindowID getter from browser.xml (non-remote <xul:browser>) may
|
||||
// outerWindowID getter from browser.js (non-remote <xul:browser>) may
|
||||
// throw when closing a tab while resources are still loading.
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,8 +47,14 @@ bool AnimationEffect::IsCurrent() const {
|
|||
}
|
||||
|
||||
ComputedTiming computedTiming = GetComputedTiming();
|
||||
return computedTiming.mPhase == ComputedTiming::AnimationPhase::Before ||
|
||||
computedTiming.mPhase == ComputedTiming::AnimationPhase::Active;
|
||||
if (computedTiming.mPhase == ComputedTiming::AnimationPhase::Active) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return (mAnimation->PlaybackRate() > 0 &&
|
||||
computedTiming.mPhase == ComputedTiming::AnimationPhase::Before) ||
|
||||
(mAnimation->PlaybackRate() < 0 &&
|
||||
computedTiming.mPhase == ComputedTiming::AnimationPhase::After);
|
||||
}
|
||||
|
||||
// https://drafts.csswg.org/web-animations/#in-effect
|
||||
|
|
|
@ -482,7 +482,20 @@ promise_test(async t => {
|
|||
'Animation with fill:backwards in delay phase reports ' +
|
||||
'that it is running on the compositor after delay phase');
|
||||
}, 'animation with fill:backwards in delay phase is running on the ' +
|
||||
' main-thread while it is in delay phase');
|
||||
' compositor while it is in delay phase');
|
||||
|
||||
promise_test(async t => {
|
||||
const animation = addDiv(t).animate({ opacity: [ 0, 1 ] }, 100 * MS_PER_SEC);
|
||||
animation.playbackRate = -1;
|
||||
animation.currentTime = 200 * MS_PER_SEC;
|
||||
|
||||
await waitForPaints();
|
||||
|
||||
assert_animation_is_running_on_compositor(animation,
|
||||
'Animation with negative playback rate is runnning on the'
|
||||
+ ' compositor even before it reaches the active interval');
|
||||
}, 'animation with negative playback rate is sent to the compositor even in'
|
||||
+ ' after phase');
|
||||
|
||||
promise_test(async t => {
|
||||
var div = addDiv(t);
|
||||
|
@ -1006,7 +1019,7 @@ promise_test(async t => {
|
|||
'background-color animation is not yet able to run on the compositor ' +
|
||||
'on WebRender');
|
||||
}
|
||||
}, 'backgound-color animation runs on the compositor');
|
||||
}, 'background-color animation runs on the compositor');
|
||||
|
||||
promise_test(async t => {
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
|
@ -1023,7 +1036,7 @@ promise_test(async t => {
|
|||
assert_animation_is_not_running_on_compositor(animation,
|
||||
'background-color animation should NOT be running on the compositor ' +
|
||||
'if the pref is disabled');
|
||||
}, 'backgound-color animation does not run on the compositor if the pref ' +
|
||||
}, 'background-color animation does not run on the compositor if the pref ' +
|
||||
'is disabled');
|
||||
|
||||
</script>
|
||||
|
|
|
@ -4627,9 +4627,12 @@ void HTMLMediaElement::UpdateSrcMediaStreamPlaying(uint32_t aFlags) {
|
|||
|
||||
void HTMLMediaElement::UpdateSrcStreamTime() {
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
MOZ_ASSERT(mSrcStreamPausedGraphTime == GRAPH_TIME_MAX);
|
||||
MOZ_ASSERT(!mPaused);
|
||||
MOZ_ASSERT(!mSrcStreamPlaybackEnded);
|
||||
|
||||
if (mSrcStreamPlaybackEnded) {
|
||||
// We do a separate FireTimeUpdate() when this is set.
|
||||
return;
|
||||
}
|
||||
|
||||
FireTimeUpdate(true);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,11 @@
|
|||
|
||||
Services.obs.addObserver(crashObserver, 'ipc:content-shutdown');
|
||||
|
||||
BrowserTestUtils.crashBrowser(document.getElementById('thebrowser'), true, false);
|
||||
// Allow the browser to get connected before using the messageManager to cause
|
||||
// a crash:
|
||||
addEventListener("DOMContentLoaded", () => {
|
||||
BrowserTestUtils.crashBrowser(document.getElementById('thebrowser'), true, false);
|
||||
});
|
||||
]]></script>
|
||||
|
||||
</window>
|
||||
|
|
|
@ -36,22 +36,16 @@ void XULScrollElement::ScrollByIndex(int32_t aIndex, ErrorResult& aRv) {
|
|||
return;
|
||||
}
|
||||
|
||||
nsIFrame* scrolledBox = nsBox::GetChildXULBox(scrolledFrame);
|
||||
if (!scrolledBox) {
|
||||
aRv.Throw(NS_ERROR_FAILURE);
|
||||
return;
|
||||
}
|
||||
|
||||
nsRect rect;
|
||||
|
||||
// now get the element's first child
|
||||
nsIFrame* child = nsBox::GetChildXULBox(scrolledBox);
|
||||
nsIFrame* child = nsBox::GetChildXULBox(scrolledFrame);
|
||||
|
||||
bool horiz = scrolledBox->IsXULHorizontal();
|
||||
bool horiz = scrolledFrame->IsXULHorizontal();
|
||||
nsPoint cp = sf->GetScrollPosition();
|
||||
nscoord diff = 0;
|
||||
int32_t curIndex = 0;
|
||||
bool isLTR = scrolledBox->IsXULNormalDirection();
|
||||
bool isLTR = scrolledFrame->IsXULNormalDirection();
|
||||
|
||||
nscoord frameWidth = 0;
|
||||
if (!isLTR && horiz) {
|
||||
|
@ -110,7 +104,7 @@ void XULScrollElement::ScrollByIndex(int32_t aIndex, ErrorResult& aRv) {
|
|||
}
|
||||
|
||||
} else if (aIndex < 0) {
|
||||
child = nsBox::GetChildXULBox(scrolledBox);
|
||||
child = nsBox::GetChildXULBox(scrolledFrame);
|
||||
while (child) {
|
||||
rect = child->GetRect();
|
||||
if (count >= curIndex + aIndex) {
|
||||
|
|
|
@ -76,7 +76,7 @@ bool AutoscrollAnimation::DoSample(FrameMetrics& aFrameMetrics,
|
|||
}
|
||||
|
||||
void AutoscrollAnimation::Cancel(CancelAnimationFlags aFlags) {
|
||||
// The cancellation was initiated by browser.xml, so there's no need to
|
||||
// The cancellation was initiated by browser.js, so there's no need to
|
||||
// notify it.
|
||||
if (aFlags & TriggeredExternally) {
|
||||
return;
|
||||
|
|
|
@ -18,8 +18,8 @@ parser:
|
|||
# Rules for generating BinASTParser.cpp
|
||||
cpp:
|
||||
header: |
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
* vim: set ts=8 sts=2 et sw=2 tw=80:
|
||||
* 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/. */
|
||||
|
@ -73,8 +73,8 @@ hpp:
|
|||
# Rules for generating BinASTParser.h
|
||||
class:
|
||||
header: |
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
* vim: set ts=8 sts=2 et sw=2 tw=80:
|
||||
* 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/. */
|
||||
|
@ -203,8 +203,8 @@ hpp:
|
|||
|
||||
enums:
|
||||
header: |
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
* vim: set ts=8 sts=2 et sw=2 tw=80:
|
||||
* 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/. */
|
||||
|
@ -280,8 +280,8 @@ hpp:
|
|||
*/
|
||||
|
||||
header: |
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
* vim: set ts=8 sts=2 et sw=2 tw=80:
|
||||
* 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/. */
|
||||
|
|
|
@ -7,3 +7,11 @@ cargo run -- \
|
|||
--out-impl ../BinASTParser.cpp \
|
||||
--out-enum ../BinASTEnum.h \
|
||||
--out-token ../BinToken.h
|
||||
|
||||
MACH=../../../../mach
|
||||
|
||||
${MACH} clang-format --path \
|
||||
../BinASTParser.h \
|
||||
../BinASTParser.cpp \
|
||||
../BinASTEnum.h \
|
||||
../BinToken.h
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
// |jit-test| allow-oom; skip-if: !('oomTest' in this)
|
||||
|
||||
oomTest(async function() {}, { keepFailing: true });
|
|
@ -1107,6 +1107,8 @@ static bool TrackUnhandledRejections(JSContext* cx, JS::HandleObject promise,
|
|||
static void ForwardingPromiseRejectionTrackerCallback(
|
||||
JSContext* cx, JS::HandleObject promise,
|
||||
JS::PromiseRejectionHandlingState state, void* data) {
|
||||
AutoReportException are(cx);
|
||||
|
||||
if (!TrackUnhandledRejections(cx, promise, state)) {
|
||||
return;
|
||||
}
|
||||
|
@ -1128,9 +1130,7 @@ static void ForwardingPromiseRejectionTrackerCallback(
|
|||
}
|
||||
|
||||
RootedValue rval(cx);
|
||||
if (!Call(cx, callback, UndefinedHandleValue, args, &rval)) {
|
||||
JS_ClearPendingException(cx);
|
||||
}
|
||||
(void) Call(cx, callback, UndefinedHandleValue, args, &rval);
|
||||
}
|
||||
|
||||
static bool SetPromiseRejectionTrackerCallback(JSContext* cx, unsigned argc,
|
||||
|
|
|
@ -176,11 +176,6 @@ nsPresContext::nsPresContext(dom::Document* aDocument, nsPresContextType aType)
|
|||
mCurAppUnitsPerDevPixel(0),
|
||||
mAutoQualityMinFontSizePixelsPref(0),
|
||||
mLangService(nsLanguageAtomService::GetService()),
|
||||
// origin nscoord_MIN is impossible, so the first ResizeReflow always
|
||||
// fires
|
||||
mLastResizeEventVisibleArea(nsRect(nscoord_MIN, nscoord_MIN,
|
||||
NS_UNCONSTRAINEDSIZE,
|
||||
NS_UNCONSTRAINEDSIZE)),
|
||||
mPageSize(-1, -1),
|
||||
mPageScale(0.0),
|
||||
mPPScale(1.0f),
|
||||
|
|
|
@ -476,12 +476,6 @@ class nsPresContext : public nsISupports,
|
|||
}
|
||||
}
|
||||
|
||||
bool ShouldFireResizeEvent() const {
|
||||
return !mLastResizeEventVisibleArea.IsEqualEdges(mVisibleArea);
|
||||
}
|
||||
|
||||
void WillFireResizeEvent() { mLastResizeEventVisibleArea = mVisibleArea; }
|
||||
|
||||
/**
|
||||
* Return true if this presentation context is a paginated
|
||||
* context.
|
||||
|
@ -1312,7 +1306,6 @@ class nsPresContext : public nsISupports,
|
|||
mozilla::UniquePtr<gfxMissingFontRecorder> mMissingFonts;
|
||||
|
||||
nsRect mVisibleArea;
|
||||
nsRect mLastResizeEventVisibleArea;
|
||||
nsSize mPageSize;
|
||||
float mPageScale;
|
||||
float mPPScale;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#filter substitution
|
||||
|
||||
// For browser.xml binding
|
||||
// For browser.js element
|
||||
//
|
||||
// cacheRatio* is a ratio that determines the amount of pixels to cache. The
|
||||
// ratio is multiplied by the viewport width or height to get the displayport's
|
||||
|
|
|
@ -5378,7 +5378,7 @@ var XPInstallObserver = {
|
|||
};
|
||||
|
||||
/**
|
||||
* Handler for blocked popups, triggered by DOMUpdateBlockedPopups events in browser.xml
|
||||
* Handler for blocked popups, triggered by DOMUpdateBlockedPopups events in browser.js
|
||||
*/
|
||||
var PopupBlockerObserver = {
|
||||
onUpdateBlockedPopups: function onUpdateBlockedPopups(aEvent) {
|
||||
|
|
|
@ -124,7 +124,7 @@ if CONFIG['PGO_PROFILE_PATH']:
|
|||
]
|
||||
GENERATED_FILES[profdata_gen].script = 'build/merge_profdata.py'
|
||||
GENERATED_FILES[profdata_gen].inputs = [
|
||||
CONFIG['PGO_PROFILE_PATH'],
|
||||
'/' + CONFIG['PGO_PROFILE_PATH'],
|
||||
]
|
||||
|
||||
DIRS += [
|
||||
|
|
|
@ -994,7 +994,8 @@ SpdyConnectTransaction::SpdyConnectTransaction(
|
|||
mOutputDataOffset(0),
|
||||
mForcePlainText(false),
|
||||
mIsWebsocket(isWebsocket),
|
||||
mConnRefTaken(false) {
|
||||
mConnRefTaken(false),
|
||||
mCreateShimErrorCalled(false) {
|
||||
LOG(("SpdyConnectTransaction ctor %p\n", this));
|
||||
|
||||
mTimestampSyn = TimeStamp::Now();
|
||||
|
@ -1202,6 +1203,12 @@ void SpdyConnectTransaction::CreateShimError(nsresult code) {
|
|||
MOZ_ASSERT(OnSocketThread(), "not on socket thread");
|
||||
MOZ_ASSERT(NS_FAILED(code));
|
||||
|
||||
MOZ_ASSERT(!mCreateShimErrorCalled);
|
||||
if (mCreateShimErrorCalled) {
|
||||
return;
|
||||
}
|
||||
mCreateShimErrorCalled = true;
|
||||
|
||||
if (mTunnelStreamOut && NS_SUCCEEDED(mTunnelStreamOut->mStatus)) {
|
||||
mTunnelStreamOut->mStatus = code;
|
||||
}
|
||||
|
@ -1223,6 +1230,7 @@ void SpdyConnectTransaction::CreateShimError(nsresult code) {
|
|||
cb->OnOutputStreamReady(mTunnelStreamOut);
|
||||
}
|
||||
}
|
||||
mCreateShimErrorCalled = false;
|
||||
}
|
||||
|
||||
nsresult SpdyConnectTransaction::WriteDataToBuffer(nsAHttpSegmentWriter *writer,
|
||||
|
|
|
@ -272,6 +272,8 @@ class SpdyConnectTransaction final : public NullHttpTransaction {
|
|||
MOZ_MUST_USE nsresult WebsocketWriteSegments(nsAHttpSegmentWriter *writer,
|
||||
uint32_t count,
|
||||
uint32_t *countWritten);
|
||||
|
||||
bool mCreateShimErrorCalled;
|
||||
};
|
||||
|
||||
} // namespace net
|
||||
|
|
|
@ -7,6 +7,7 @@ loader: taskgraph.loader.transform:loader
|
|||
kind-dependencies:
|
||||
- toolchain
|
||||
- fetch
|
||||
- generate-profile
|
||||
|
||||
transforms:
|
||||
- taskgraph.transforms.build:transforms
|
||||
|
|
|
@ -65,6 +65,8 @@ linux64-plain/opt:
|
|||
|
||||
linux64/pgo:
|
||||
description: "Linux64 PGO"
|
||||
# Disabled because bug 1516114 shows up much more often
|
||||
# use-pgo: true
|
||||
index:
|
||||
product: firefox
|
||||
job-name: linux64-pgo
|
||||
|
@ -72,7 +74,9 @@ linux64/pgo:
|
|||
enable-full-crashsymbols: true
|
||||
treeherder:
|
||||
platform: linux64/pgo
|
||||
# Bug 1516114
|
||||
symbol: B
|
||||
# symbol: Bpgo(B)
|
||||
worker-type: aws-provisioner-v1/gecko-{level}-b-linux
|
||||
worker:
|
||||
max-run-time: 9000
|
||||
|
@ -87,6 +91,8 @@ linux64/pgo:
|
|||
secrets: true
|
||||
tooltool-downloads: public
|
||||
need-xvfb: true
|
||||
# Bug 1516114
|
||||
# mozconfig-variant: profile-use
|
||||
toolchains:
|
||||
- linux64-binutils
|
||||
- linux64-clang
|
||||
|
|
|
@ -10,6 +10,7 @@ treeherder:
|
|||
'py2': 'Python 2 unit tests'
|
||||
'py3': 'Python 3 unit tests'
|
||||
'A': 'Android Gradle tests'
|
||||
'Bpgo': 'Profile-guided optimization builds'
|
||||
'Fetch-URL': 'Fetch and store content'
|
||||
'Fxfn-l': 'Firefox functional tests (local)'
|
||||
'Fxfn-l-e10s': 'Firefox functional tests (local) with e10s'
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
# 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/.
|
||||
|
||||
loader: taskgraph.loader.transform:loader
|
||||
|
||||
kind-dependencies:
|
||||
- instrumented-build
|
||||
|
||||
transforms:
|
||||
- taskgraph.transforms.build_attrs:transforms
|
||||
- taskgraph.transforms.release_deps:transforms
|
||||
- taskgraph.transforms.run_pgo_profile:transforms
|
||||
- taskgraph.transforms.job:transforms
|
||||
- taskgraph.transforms.task:transforms
|
||||
|
||||
|
||||
job-defaults:
|
||||
treeherder:
|
||||
symbol: Bpgo(run)
|
||||
kind: test
|
||||
tier: 1
|
||||
|
||||
jobs:
|
||||
linux64/pgo:
|
||||
description: "Linux64 Profile Generation"
|
||||
shipping-phase: build
|
||||
shipping-product: firefox
|
||||
index:
|
||||
product: firefox
|
||||
job-name: linux64-profile
|
||||
treeherder:
|
||||
platform: linux64/pgo
|
||||
worker-type: aws-provisioner-v1/gecko-{level}-b-linux
|
||||
worker:
|
||||
max-run-time: 1200
|
||||
docker-image: {in-tree: debian7-amd64-build}
|
||||
artifacts:
|
||||
- type: file
|
||||
name: public/build/profdata.tar.xz
|
||||
path: /builds/worker/artifacts/profdata.tar.xz
|
||||
- type: file
|
||||
name: public/build/xvfb.log
|
||||
path: /builds/worker/artifacts/xvfb/xvfb.log
|
||||
- type: file
|
||||
name: public/build/profile-run-1.log
|
||||
path: /builds/worker/artifacts/profile-run-1.log
|
||||
- type: file
|
||||
name: public/build/profile-run-2.log
|
||||
path: /builds/worker/artifacts/profile-run-2.log
|
||||
run:
|
||||
using: run-task
|
||||
command: >
|
||||
cd /builds/worker/checkouts/gecko &&
|
||||
./taskcluster/scripts/misc/run-profileserver.sh
|
|
@ -0,0 +1,54 @@
|
|||
# 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/.
|
||||
|
||||
loader: taskgraph.loader.transform:loader
|
||||
|
||||
kind-dependencies:
|
||||
- toolchain
|
||||
- fetch
|
||||
|
||||
transforms:
|
||||
- taskgraph.transforms.build:transforms
|
||||
- taskgraph.transforms.build_attrs:transforms
|
||||
- taskgraph.transforms.build_lints:transforms
|
||||
- taskgraph.transforms.use_toolchains:transforms
|
||||
- taskgraph.transforms.job:transforms
|
||||
- taskgraph.transforms.task:transforms
|
||||
|
||||
job-defaults:
|
||||
treeherder:
|
||||
symbol: Bpgo(instr)
|
||||
tier: 1
|
||||
|
||||
jobs:
|
||||
linux64/pgo:
|
||||
description: "Linux64 Instrumented"
|
||||
shipping-phase: build
|
||||
shipping-product: firefox
|
||||
treeherder:
|
||||
platform: linux64/pgo
|
||||
worker-type: aws-provisioner-v1/gecko-{level}-b-linux
|
||||
worker:
|
||||
max-run-time: 7200
|
||||
env:
|
||||
PERFHERDER_EXTRA_OPTIONS: instrumented
|
||||
run:
|
||||
using: mozharness
|
||||
actions: [get-secrets, build]
|
||||
config:
|
||||
- builds/releng_base_firefox.py
|
||||
- builds/releng_base_linux_64_builds.py
|
||||
script: "mozharness/scripts/fx_desktop_build.py"
|
||||
secrets: true
|
||||
mozconfig-variant: profile-generate
|
||||
tooltool-downloads: public
|
||||
need-xvfb: true
|
||||
toolchains:
|
||||
- linux64-binutils
|
||||
- linux64-clang
|
||||
- linux64-rust
|
||||
- linux64-rust-size
|
||||
- linux64-cbindgen
|
||||
- linux64-sccache
|
||||
- linux64-node
|
|
@ -531,3 +531,15 @@ webrender
|
|||
---------
|
||||
Tasks used to do testing of WebRender standalone (without gecko). The
|
||||
WebRender code lives in gfx/wr and has its own testing infrastructure.
|
||||
|
||||
instrumented-build
|
||||
------------------
|
||||
Tasks that generate builds with PGO instrumentation enabled. This is an
|
||||
intermediate build that can be used to generate profiling information for a
|
||||
final PGO build. This is the 1st stage of the full 3-step PGO process.
|
||||
|
||||
generate-profile
|
||||
----------------
|
||||
Tasks that take a build configured for PGO and run the binary against a sample
|
||||
set to generate profile data. This is the 2nd stage of the full 3-step PGO
|
||||
process.
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
#! /bin/bash -vex
|
||||
|
||||
set -x -e
|
||||
|
||||
echo "running as" $(id)
|
||||
|
||||
####
|
||||
# Taskcluster friendly wrapper for running the profileserver
|
||||
####
|
||||
|
||||
PGO_RUNDIR=/builds/worker/workspace/build/src/obj-firefox/dist
|
||||
export UPLOAD_PATH=$HOME/artifacts
|
||||
export JARLOG_FILE="en-US.log"
|
||||
|
||||
set -v
|
||||
|
||||
# run XVfb in the background
|
||||
. /builds/worker/scripts/xvfb.sh
|
||||
|
||||
cleanup() {
|
||||
local rv=$?
|
||||
cleanup_xvfb
|
||||
exit $rv
|
||||
}
|
||||
trap cleanup EXIT INT
|
||||
|
||||
start_xvfb '1024x768x24' 2
|
||||
|
||||
cd /builds/worker/checkouts/gecko
|
||||
|
||||
# Move our fetched firefox into objdir/dist so the jarlog entries will match
|
||||
# the paths when the final PGO stage packages the build.
|
||||
mkdir -p $PGO_RUNDIR
|
||||
mv $MOZ_FETCHES_DIR/firefox $PGO_RUNDIR
|
||||
./mach python build/pgo/profileserver.py --binary $PGO_RUNDIR/firefox/firefox
|
||||
tar -acvf $UPLOAD_PATH/profdata.tar.xz default.profraw en-US.log
|
|
@ -82,6 +82,19 @@ def mozconfig(config, jobs):
|
|||
yield job
|
||||
|
||||
|
||||
@transforms.add
|
||||
def use_profile_data(config, jobs):
|
||||
for job in jobs:
|
||||
if not job.pop('use-pgo', False):
|
||||
yield job
|
||||
continue
|
||||
|
||||
dependencies = 'generate-profile-{}'.format(job['name'])
|
||||
job.setdefault('dependencies', {})['generate-profile'] = dependencies
|
||||
job.setdefault('fetches', {})['generate-profile'] = ['profdata.tar.xz']
|
||||
yield job
|
||||
|
||||
|
||||
@transforms.add
|
||||
def set_env(config, jobs):
|
||||
"""Set extra environment variables from try command line."""
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
# 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/.
|
||||
"""
|
||||
Apply some defaults and minor modifications to the pgo jobs.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
|
||||
from taskgraph.transforms.base import TransformSequence
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
transforms = TransformSequence()
|
||||
|
||||
|
||||
@transforms.add
|
||||
def run_profile_data(config, jobs):
|
||||
for job in jobs:
|
||||
instr = 'instrumented-build-{}'.format(job['name'])
|
||||
job.setdefault('fetches', {})[instr] = ['target.tar.bz2']
|
||||
yield job
|
|
@ -65,7 +65,50 @@ test(t => {
|
|||
delay: 100 * MS_PER_SEC,
|
||||
});
|
||||
assert_array_equals(div.getAnimations(), [animation]);
|
||||
}, 'Returns animations in their delay phase');
|
||||
}, 'Returns animations yet to reach their active phase');
|
||||
|
||||
test(t => {
|
||||
const div = createDiv(t);
|
||||
const animation = div.animate(null, 100 * MS_PER_SEC);
|
||||
animation.playbackRate = -1;
|
||||
assert_array_equals(div.getAnimations(), []);
|
||||
}, 'Does not return reversed finished animations that do not fill backwards');
|
||||
|
||||
test(t => {
|
||||
const div = createDiv(t);
|
||||
const animation = div.animate(null, {
|
||||
duration: 100 * MS_PER_SEC,
|
||||
fill: 'backwards',
|
||||
});
|
||||
animation.playbackRate = -1;
|
||||
assert_array_equals(div.getAnimations(), [animation]);
|
||||
}, 'Returns reversed finished animations that fill backwards');
|
||||
|
||||
test(t => {
|
||||
const div = createDiv(t);
|
||||
const animation = div.animate(null, 100 * MS_PER_SEC);
|
||||
animation.playbackRate = -1;
|
||||
animation.currentTime = 200 * MS_PER_SEC;
|
||||
assert_array_equals(div.getAnimations(), [animation]);
|
||||
}, 'Returns reversed animations yet to reach their active phase');
|
||||
|
||||
test(t => {
|
||||
const div = createDiv(t);
|
||||
const animation = div.animate(null, {
|
||||
duration: 100 * MS_PER_SEC,
|
||||
delay: 100 * MS_PER_SEC,
|
||||
});
|
||||
animation.playbackRate = 0;
|
||||
assert_array_equals(div.getAnimations(), []);
|
||||
}, 'Does not return animations with zero playback rate in before phase');
|
||||
|
||||
test(t => {
|
||||
const div = createDiv(t);
|
||||
const animation = div.animate(null, 100 * MS_PER_SEC);
|
||||
animation.finish();
|
||||
animation.playbackRate = 0;
|
||||
animation.currentTime = 200 * MS_PER_SEC;
|
||||
}, 'Does not return animations with zero playback rate in after phase');
|
||||
|
||||
test(t => {
|
||||
const div = createDiv(t);
|
||||
|
|
|
@ -1904,8 +1904,33 @@ class IntegerType extends Type {
|
|||
}
|
||||
|
||||
class BooleanType extends Type {
|
||||
static get EXTRA_PROPERTIES() {
|
||||
return ["enum", ...super.EXTRA_PROPERTIES];
|
||||
}
|
||||
|
||||
static parseSchema(root, schema, path, extraProperties = []) {
|
||||
this.checkSchemaProperties(schema, path, extraProperties);
|
||||
let enumeration = schema.enum || null;
|
||||
return new this(schema, enumeration);
|
||||
}
|
||||
|
||||
constructor(schema, enumeration) {
|
||||
super(schema);
|
||||
this.enumeration = enumeration;
|
||||
}
|
||||
|
||||
normalize(value, context) {
|
||||
return this.normalizeBase("boolean", value, context);
|
||||
if (!this.checkBaseType(getValueBaseType(value))) {
|
||||
return context.error(() => `Expected boolean instead of ${JSON.stringify(value)}`,
|
||||
`be a boolean`);
|
||||
}
|
||||
value = this.preprocess(value, context);
|
||||
if (this.enumeration && !this.enumeration.includes(value)) {
|
||||
return context.error(() => `Invalid value ${JSON.stringify(value)}`,
|
||||
`be ${this.enumeration}`);
|
||||
}
|
||||
this.checkDeprecated(context, value);
|
||||
return {value};
|
||||
}
|
||||
|
||||
checkBaseType(baseType) {
|
||||
|
|
|
@ -578,8 +578,17 @@
|
|||
},
|
||||
{
|
||||
"id": "PersistentBackgroundProperty",
|
||||
"type": "boolean",
|
||||
"deprecated": "Event pages are not currently supported. This will run as a persistent background page."
|
||||
"choices": [
|
||||
{
|
||||
"type": "boolean",
|
||||
"enum": [true]
|
||||
},
|
||||
{
|
||||
"type": "boolean",
|
||||
"enum": [false],
|
||||
"deprecated": "Event pages are not currently supported. This will run as a persistent background page."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -44,6 +44,20 @@ add_task(async function test_eventpages() {
|
|||
"nonExistentProp": true,
|
||||
},
|
||||
},
|
||||
{
|
||||
message: "testing persistent background page",
|
||||
eventPage: {
|
||||
"page": "event-page.html",
|
||||
"persistent": true,
|
||||
},
|
||||
},
|
||||
{
|
||||
message: "testing scripts with persistent background running as a background page",
|
||||
eventPage: {
|
||||
"scripts": ["event_page_script.js"],
|
||||
"persistent": true,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
let {messages} = await promiseConsoleOutput(async () => {
|
||||
|
@ -61,5 +75,5 @@ add_task(async function test_eventpages() {
|
|||
{message: /Event pages are not currently supported./},
|
||||
{message: /Event pages are not currently supported./},
|
||||
{message: /Reading manifest: Error processing background.nonExistentProp: An unexpected property was found/},
|
||||
]});
|
||||
]}, true);
|
||||
});
|
||||
|
|
|
@ -1739,3 +1739,42 @@ add_task(async function testReturns() {
|
|||
"Doesn't throw for invalid result value in release builds");
|
||||
}
|
||||
});
|
||||
|
||||
let booleanEnumJson = [{
|
||||
namespace: "booleanEnum",
|
||||
|
||||
types: [
|
||||
{
|
||||
"id": "enumTrue",
|
||||
"type": "boolean",
|
||||
"enum": [true],
|
||||
},
|
||||
],
|
||||
functions: [
|
||||
{
|
||||
name: "paramMustBeTrue",
|
||||
type: "function",
|
||||
parameters: [
|
||||
{name: "arg", "$ref": "enumTrue"},
|
||||
],
|
||||
},
|
||||
],
|
||||
}];
|
||||
|
||||
add_task(async function testBooleanEnum() {
|
||||
let url = "data:," + JSON.stringify(booleanEnumJson);
|
||||
Schemas._rootSchema = null;
|
||||
await Schemas.load(url);
|
||||
|
||||
let root = {};
|
||||
tallied = null;
|
||||
Schemas.inject(root, wrapper);
|
||||
Assert.equal(tallied, null);
|
||||
|
||||
ok(root.booleanEnum, "namespace exists");
|
||||
root.booleanEnum.paramMustBeTrue(true);
|
||||
verify("call", "booleanEnum", "paramMustBeTrue", [true]);
|
||||
Assert.throws(() => root.booleanEnum.paramMustBeTrue(false),
|
||||
/Type error for parameter arg \(Invalid value false\) for booleanEnum\.paramMustBeTrue\./,
|
||||
"should throw because enum of the type restricts parameter to true");
|
||||
});
|
||||
|
|
|
@ -13,7 +13,8 @@ Services.obs.addObserver({
|
|||
observe(doc) {
|
||||
if (doc.nodePrincipal.isSystemPrincipal && (
|
||||
doc.contentType == "application/vnd.mozilla.xul+xml" ||
|
||||
doc.contentType == "application/xhtml+xml"
|
||||
doc.contentType == "application/xhtml+xml" ||
|
||||
doc.contentType == "text/html"
|
||||
)) {
|
||||
Services.scriptloader.loadSubScript(
|
||||
"chrome://global/content/customElements.js", doc.ownerGlobal);
|
||||
|
|
|
@ -290,6 +290,10 @@ window.MozElementMixin = MozElementMixin;
|
|||
window.MozXULElement = MozXULElement;
|
||||
window.MozElements = MozElements;
|
||||
|
||||
customElements.setElementCreationCallback("browser", () => {
|
||||
Services.scriptloader.loadSubScript("chrome://global/content/elements/browser-custom-element.js", window);
|
||||
});
|
||||
|
||||
// For now, don't load any elements in the extension dummy document.
|
||||
// We will want to load <browser> when that's migrated (bug 1441935).
|
||||
const isDummyDocument = document.documentURI == "chrome://extensions/content/dummy.xul";
|
||||
|
|
|
@ -62,7 +62,6 @@ toolkit.jar:
|
|||
#endif
|
||||
content/global/widgets.css
|
||||
content/global/bindings/autocomplete.xml (widgets/autocomplete.xml)
|
||||
content/global/bindings/browser.xml (widgets/browser.xml)
|
||||
content/global/bindings/button.xml (widgets/button.xml)
|
||||
content/global/bindings/calendar.js (widgets/calendar.js)
|
||||
content/global/bindings/checkbox.xml (widgets/checkbox.xml)
|
||||
|
@ -90,6 +89,7 @@ toolkit.jar:
|
|||
content/global/bindings/tree.xml (widgets/tree.xml)
|
||||
content/global/bindings/videocontrols.xml (widgets/videocontrols.xml)
|
||||
* content/global/bindings/wizard.xml (widgets/wizard.xml)
|
||||
content/global/elements/browser-custom-element.js (widgets/browser-custom-element.js)
|
||||
content/global/elements/datetimebox.js (widgets/datetimebox.js)
|
||||
content/global/elements/findbar.js (widgets/findbar.js)
|
||||
content/global/elements/editor.js (widgets/editor.js)
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -9,14 +9,6 @@
|
|||
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
xmlns:xbl="http://www.mozilla.org/xbl">
|
||||
|
||||
<binding id="scrollbox" extends="chrome://global/content/bindings/general.xml#basecontrol">
|
||||
<content>
|
||||
<xul:box class="box-inherit scrollbox-innerbox" xbl:inherits="orient,align,pack,dir" flex="1">
|
||||
<children/>
|
||||
</xul:box>
|
||||
</content>
|
||||
</binding>
|
||||
|
||||
<binding id="arrowscrollbox" extends="chrome://global/content/bindings/general.xml#basecontrol">
|
||||
<content>
|
||||
<xul:toolbarbutton class="scrollbutton-up"
|
||||
|
|
|
@ -172,10 +172,6 @@ iframe {
|
|||
}
|
||||
}
|
||||
|
||||
browser {
|
||||
-moz-binding: url("chrome://global/content/bindings/browser.xml#browser");
|
||||
}
|
||||
|
||||
/*********** popup notification ************/
|
||||
popupnotification {
|
||||
-moz-binding: url("chrome://global/content/bindings/notification.xml#popup-notification");
|
||||
|
@ -668,7 +664,6 @@ slider {
|
|||
/******** scrollbox ********/
|
||||
|
||||
scrollbox {
|
||||
-moz-binding: url("chrome://global/content/bindings/scrollbox.xml#scrollbox");
|
||||
/* This makes it scrollable! */
|
||||
overflow: hidden;
|
||||
}
|
||||
|
|
|
@ -107,7 +107,7 @@ var E10SUtils = {
|
|||
return NOT_REMOTE;
|
||||
}
|
||||
|
||||
// loadURI in browser.xml treats null as about:blank
|
||||
// loadURI in browser.js treats null as about:blank
|
||||
if (!aURL) {
|
||||
aURL = "about:blank";
|
||||
}
|
||||
|
|
|
@ -578,8 +578,8 @@ button.warning {
|
|||
|
||||
/*** detail view ***/
|
||||
|
||||
#detail-view > .scrollbox-innerbox {
|
||||
margin: 8px 28px;
|
||||
#detail-view {
|
||||
padding: 8px 28px;
|
||||
}
|
||||
|
||||
#detail-view .loading {
|
||||
|
|
|
@ -113,12 +113,16 @@ nsSound::~nsSound() {}
|
|||
|
||||
void nsSound::PurgeLastSound() {
|
||||
// Halt any currently playing sound.
|
||||
if (mPlayerThread) {
|
||||
mPlayerThread->Dispatch(
|
||||
NS_NewRunnableFunction(
|
||||
"nsSound::PurgeLastSound",
|
||||
[]() { ::PlaySound(nullptr, nullptr, SND_PURGE); }),
|
||||
NS_DISPATCH_NORMAL);
|
||||
if (mSoundPlayer) {
|
||||
if (mPlayerThread) {
|
||||
mPlayerThread->Dispatch(NS_NewRunnableFunction(
|
||||
"nsSound::PurgeLastSound", [player = std::move(mSoundPlayer)]() {
|
||||
// Capture move mSoundPlayer to lambda then
|
||||
// PlaySoundW(nullptr, nullptr, SND_PURGE) will be called before
|
||||
// freeing the nsSoundPlayer.
|
||||
::PlaySoundW(nullptr, nullptr, SND_PURGE);
|
||||
}), NS_DISPATCH_NORMAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -158,10 +162,11 @@ NS_IMETHODIMP nsSound::OnStreamComplete(nsIStreamLoader *aLoader,
|
|||
PurgeLastSound();
|
||||
|
||||
if (data && dataLen > 0) {
|
||||
RefPtr<nsSoundPlayer> player = new nsSoundPlayer(data, dataLen);
|
||||
MOZ_ASSERT(player, "Could not create player");
|
||||
MOZ_ASSERT(!mSoundPlayer, "mSoundPlayer should be null");
|
||||
mSoundPlayer = new nsSoundPlayer(data, dataLen);
|
||||
MOZ_ASSERT(mSoundPlayer, "Could not create player");
|
||||
|
||||
nsresult rv = mPlayerThread->Dispatch(player, NS_DISPATCH_NORMAL);
|
||||
nsresult rv = mPlayerThread->Dispatch(mSoundPlayer, NS_DISPATCH_NORMAL);
|
||||
if (NS_WARN_IF(FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
@ -238,7 +243,7 @@ NS_IMETHODIMP nsSound::Init() {
|
|||
// at the first time loading sound library.
|
||||
mPlayerThread->Dispatch(
|
||||
NS_NewRunnableFunction(
|
||||
"nsSound::Init", []() { ::PlaySound(nullptr, nullptr, SND_PURGE); }),
|
||||
"nsSound::Init", []() { ::PlaySoundW(nullptr, nullptr, SND_PURGE); }),
|
||||
NS_DISPATCH_NORMAL);
|
||||
|
||||
mInited = true;
|
||||
|
@ -276,10 +281,10 @@ NS_IMETHODIMP nsSound::PlayEventSound(uint32_t aEventId) {
|
|||
return NS_OK;
|
||||
}
|
||||
NS_ASSERTION(sound, "sound is null");
|
||||
|
||||
nsCOMPtr<nsIRunnable> player = new nsSoundPlayer(nsDependentString(sound));
|
||||
MOZ_ASSERT(player, "Could not create player");
|
||||
nsresult rv = mPlayerThread->Dispatch(player, NS_DISPATCH_NORMAL);
|
||||
MOZ_ASSERT(!mSoundPlayer, "mSoundPlayer should be null");
|
||||
mSoundPlayer = new nsSoundPlayer(nsDependentString(sound));
|
||||
MOZ_ASSERT(mSoundPlayer, "Could not create player");
|
||||
nsresult rv = mPlayerThread->Dispatch(mSoundPlayer, NS_DISPATCH_NORMAL);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "mozilla/StaticPtr.h"
|
||||
|
||||
class nsIThread;
|
||||
class nsIRunnable;
|
||||
|
||||
class nsSound : public nsISound,
|
||||
public nsIStreamLoaderObserver,
|
||||
|
@ -37,6 +38,7 @@ class nsSound : public nsISound,
|
|||
nsresult CreatePlayerThread();
|
||||
|
||||
nsCOMPtr<nsIThread> mPlayerThread;
|
||||
nsCOMPtr<nsIRunnable> mSoundPlayer;
|
||||
bool mInited;
|
||||
|
||||
static mozilla::StaticRefPtr<nsISound> sInstance;
|
||||
|
|
Загрузка…
Ссылка в новой задаче