author | Carsten "Tomcat" Book <cbook@mozilla.com> |
Wed, 11 Feb 2015 14:51:31 +0100 | |
changeset 228504 | 117e52087be31a7cba51699f9b8e73b9b9e0cf25 |
parent 228477 | a803874de08577b9fad063866f9c61262fb3bf75 (current diff) |
parent 228503 | 84ddb2bacfc0ddde75161aad37009ce3690fabdd (diff) |
child 228606 | 38058cb42a0ee28016d2cc619568b45249202799 |
push id | 28263 |
push user | cbook@mozilla.com |
push date | Wed, 11 Feb 2015 13:51:51 +0000 |
treeherder | mozilla-central@117e52087be3 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge |
milestone | 38.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/b2g/config/dolphin/sources.xml +++ b/b2g/config/dolphin/sources.xml @@ -10,17 +10,17 @@ <!--original fetch url was git://codeaurora.org/--> <remote fetch="https://git.mozilla.org/external/caf" name="caf"/> <!--original fetch url was https://git.mozilla.org/releases--> <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/> <!-- B2G specific things. --> <project name="platform_build" path="build" remote="b2g" revision="f47964c89a9c34d9a2e77afa3608d9ec604c3d20"> <copyfile dest="Makefile" src="core/root.mk"/> </project> - <project name="gaia" path="gaia" remote="mozillaorg" revision="8c7865486a1b11076b849bbf8f7fccbaffbfafe7"/> + <project name="gaia" path="gaia" remote="mozillaorg" revision="462a2ef9e98134255c144e373c7392440e3ee03b"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/> <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/> <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/> <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/> <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="da777082e02eec11c4b7e27679bdb15f47a44f66"/> @@ -129,16 +129,16 @@ <project name="platform/external/icu4c" path="external/icu4c" revision="2bb01561780583cc37bc667f0ea79f48a122d8a2"/> <!-- dolphin specific things --> <project name="device/sprd" path="device/sprd" revision="8609ba49ab518822691528312b9c87b656164c58"/> <project name="platform/external/wpa_supplicant_8" path="external/wpa_supplicant_8" revision="4e58336019b5cbcfd134caf55b142236cf986618"/> <project name="platform/frameworks/av" path="frameworks/av" revision="4387fe988e5a1001f29ce05fcfda03ed2d32137b"/> <project name="platform/hardware/akm" path="hardware/akm" revision="6d3be412647b0eab0adff8a2768736cf4eb68039"/> <project groups="invensense" name="platform/hardware/invensense" path="hardware/invensense" revision="e6d9ab28b4f4e7684f6c07874ee819c9ea0002a2"/> <project name="platform/hardware/ril" path="hardware/ril" revision="865ce3b4a2ba0b3a31421ca671f4d6c5595f8690"/> - <project name="kernel/common" path="kernel" revision="b1b623fcc5c8a22f4e9cb30470378496e03c9404"/> + <project name="kernel/common" path="kernel" revision="0b4249f88cb8faadfbf80be207af14198dec08e3"/> <project name="platform/system/core" path="system/core" revision="53d584d4a4b4316e4de9ee5f210d662f89b44e7e"/> - <project name="u-boot" path="u-boot" revision="64b93dbec64421a05bc7ffdbc03917700d171570"/> + <project name="u-boot" path="u-boot" revision="6980cf8f8cf9c1d43ff92b7af13425a5ed531d12"/> <project name="vendor/sprd/gps" path="vendor/sprd/gps" revision="6974f8e771d4d8e910357a6739ab124768891e8f"/> <project name="vendor/sprd/open-source" path="vendor/sprd/open-source" revision="f56ab768cb9f1ad42fb0809ffec1424b1e693369"/> <project name="vendor/sprd/partner" path="vendor/sprd/partner" revision="8649c7145972251af11b0639997edfecabfc7c2e"/> <project name="vendor/sprd/proprietories" path="vendor/sprd/proprietories" revision="d2466593022f7078aaaf69026adf3367c2adb7bb"/> </manifest>
--- a/b2g/config/emulator-ics/sources.xml +++ b/b2g/config/emulator-ics/sources.xml @@ -14,17 +14,17 @@ <!--original fetch url was git://github.com/apitrace/--> <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/> <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/> <!-- Gonk specific things and forks --> <project name="platform_build" path="build" remote="b2g" revision="6295c4eb38de793159368aa7f745ef3faf7208aa"> <copyfile dest="Makefile" src="core/root.mk"/> </project> <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/> - <project name="gaia.git" path="gaia" remote="mozillaorg" revision="8c7865486a1b11076b849bbf8f7fccbaffbfafe7"/> + <project name="gaia.git" path="gaia" remote="mozillaorg" revision="462a2ef9e98134255c144e373c7392440e3ee03b"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/> <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="eb1795a9002eb142ac58c8d68f8f4ba094af07ca"/> <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="2c31ac3a31a340b40ecd9c291df9b9613d3afa72"/> <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="da777082e02eec11c4b7e27679bdb15f47a44f66"/> <!-- Stock Android things --> <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -12,17 +12,17 @@ <!--original fetch url was https://git.mozilla.org/releases--> <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/> <!-- B2G specific things. --> <project name="platform_build" path="build" remote="b2g" revision="ac778ae59be38aea284a04c89640b1a11c26a5de"> <copyfile dest="Makefile" src="core/root.mk"/> </project> <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> - <project name="gaia" path="gaia" remote="mozillaorg" revision="8c7865486a1b11076b849bbf8f7fccbaffbfafe7"/> + <project name="gaia" path="gaia" remote="mozillaorg" revision="462a2ef9e98134255c144e373c7392440e3ee03b"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/> <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="da777082e02eec11c4b7e27679bdb15f47a44f66"/> <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/> <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/> <!-- Stock Android things --> <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/> <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/emulator-kk/sources.xml +++ b/b2g/config/emulator-kk/sources.xml @@ -10,17 +10,17 @@ <!--original fetch url was git://codeaurora.org/--> <remote fetch="https://git.mozilla.org/external/caf" name="caf"/> <!--original fetch url was https://git.mozilla.org/releases--> <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/> <!-- B2G specific things. --> <project name="platform_build" path="build" remote="b2g" revision="f47964c89a9c34d9a2e77afa3608d9ec604c3d20"> <copyfile dest="Makefile" src="core/root.mk"/> </project> - <project name="gaia" path="gaia" remote="mozillaorg" revision="8c7865486a1b11076b849bbf8f7fccbaffbfafe7"/> + <project name="gaia" path="gaia" remote="mozillaorg" revision="462a2ef9e98134255c144e373c7392440e3ee03b"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/> <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/> <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/> <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/> <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="da777082e02eec11c4b7e27679bdb15f47a44f66"/>
--- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -14,17 +14,17 @@ <!--original fetch url was git://github.com/apitrace/--> <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/> <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/> <!-- Gonk specific things and forks --> <project name="platform_build" path="build" remote="b2g" revision="6295c4eb38de793159368aa7f745ef3faf7208aa"> <copyfile dest="Makefile" src="core/root.mk"/> </project> <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/> - <project name="gaia.git" path="gaia" remote="mozillaorg" revision="8c7865486a1b11076b849bbf8f7fccbaffbfafe7"/> + <project name="gaia.git" path="gaia" remote="mozillaorg" revision="462a2ef9e98134255c144e373c7392440e3ee03b"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/> <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="eb1795a9002eb142ac58c8d68f8f4ba094af07ca"/> <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="2c31ac3a31a340b40ecd9c291df9b9613d3afa72"/> <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="da777082e02eec11c4b7e27679bdb15f47a44f66"/> <!-- Stock Android things --> <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/flame-kk/sources.xml +++ b/b2g/config/flame-kk/sources.xml @@ -10,17 +10,17 @@ <!--original fetch url was git://codeaurora.org/--> <remote fetch="https://git.mozilla.org/external/caf" name="caf"/> <!--original fetch url was https://git.mozilla.org/releases--> <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/> <!-- B2G specific things. --> <project name="platform_build" path="build" remote="b2g" revision="f47964c89a9c34d9a2e77afa3608d9ec604c3d20"> <copyfile dest="Makefile" src="core/root.mk"/> </project> - <project name="gaia" path="gaia" remote="mozillaorg" revision="8c7865486a1b11076b849bbf8f7fccbaffbfafe7"/> + <project name="gaia" path="gaia" remote="mozillaorg" revision="462a2ef9e98134255c144e373c7392440e3ee03b"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/> <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/> <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/> <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/> <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="da777082e02eec11c4b7e27679bdb15f47a44f66"/>
--- a/b2g/config/flame/sources.xml +++ b/b2g/config/flame/sources.xml @@ -12,17 +12,17 @@ <!--original fetch url was https://git.mozilla.org/releases--> <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/> <!-- B2G specific things. --> <project name="platform_build" path="build" remote="b2g" revision="ac778ae59be38aea284a04c89640b1a11c26a5de"> <copyfile dest="Makefile" src="core/root.mk"/> </project> <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> - <project name="gaia" path="gaia" remote="mozillaorg" revision="8c7865486a1b11076b849bbf8f7fccbaffbfafe7"/> + <project name="gaia" path="gaia" remote="mozillaorg" revision="462a2ef9e98134255c144e373c7392440e3ee03b"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/> <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="da777082e02eec11c4b7e27679bdb15f47a44f66"/> <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/> <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/> <!-- Stock Android things --> <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="e95b4ce22c825da44d14299e1190ea39a5260bde"/> <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="471afab478649078ad7c75ec6b252481a59e19b8"/>
--- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,9 +1,9 @@ { "git": { - "git_revision": "8c7865486a1b11076b849bbf8f7fccbaffbfafe7", + "git_revision": "462a2ef9e98134255c144e373c7392440e3ee03b", "remote": "https://git.mozilla.org/releases/gaia.git", "branch": "" }, - "revision": "c97ae9ec825f591d669e8b7128b81493b88dcf3f", + "revision": "e6a1cfc70305b3695b694d7e66b03c51f2a45b1f", "repo_path": "integration/gaia-central" }
--- a/b2g/config/nexus-4/sources.xml +++ b/b2g/config/nexus-4/sources.xml @@ -12,17 +12,17 @@ <!--original fetch url was https://git.mozilla.org/releases--> <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/> <!-- B2G specific things. --> <project name="platform_build" path="build" remote="b2g" revision="ac778ae59be38aea284a04c89640b1a11c26a5de"> <copyfile dest="Makefile" src="core/root.mk"/> </project> <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> - <project name="gaia" path="gaia" remote="mozillaorg" revision="8c7865486a1b11076b849bbf8f7fccbaffbfafe7"/> + <project name="gaia" path="gaia" remote="mozillaorg" revision="462a2ef9e98134255c144e373c7392440e3ee03b"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/> <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="da777082e02eec11c4b7e27679bdb15f47a44f66"/> <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/> <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/> <!-- Stock Android things --> <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/> <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/nexus-5-l/sources.xml +++ b/b2g/config/nexus-5-l/sources.xml @@ -10,17 +10,17 @@ <!--original fetch url was git://codeaurora.org/--> <remote fetch="https://git.mozilla.org/external/caf" name="caf"/> <!--original fetch url was https://git.mozilla.org/releases--> <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/> <!-- B2G specific things. --> <project name="platform_build" path="build" remote="b2g" revision="7f2ee9f4cb926684883fc2a2e407045fd9db2199"> <copyfile dest="Makefile" src="core/root.mk"/> </project> - <project name="gaia" path="gaia" remote="mozillaorg" revision="8c7865486a1b11076b849bbf8f7fccbaffbfafe7"/> + <project name="gaia" path="gaia" remote="mozillaorg" revision="462a2ef9e98134255c144e373c7392440e3ee03b"/> <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/> <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/> <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/> <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/> <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/> <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/> <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/> <project name="apitrace" path="external/apitrace" remote="apitrace" revision="da777082e02eec11c4b7e27679bdb15f47a44f66"/>
--- a/dom/events/EventDispatcher.cpp +++ b/dom/events/EventDispatcher.cpp @@ -392,17 +392,17 @@ EventTargetChainItemForChromeTarget(nsTA /* static */ nsresult EventDispatcher::Dispatch(nsISupports* aTarget, nsPresContext* aPresContext, WidgetEvent* aEvent, nsIDOMEvent* aDOMEvent, nsEventStatus* aEventStatus, EventDispatchingCallback* aCallback, - nsCOMArray<EventTarget>* aTargets) + nsTArray<EventTarget*>* aTargets) { PROFILER_LABEL("EventDispatcher", "Dispatch", js::ProfileEntry::Category::EVENTS); NS_ASSERTION(aEvent, "Trying to dispatch without WidgetEvent!"); NS_ENSURE_TRUE(!aEvent->mFlags.mIsBeingDispatched, NS_ERROR_DOM_INVALID_STATE_ERR); NS_ASSERTION(!aTargets || !aEvent->message, "Wrong parameters!"); @@ -471,17 +471,17 @@ EventDispatcher::Dispatch(nsISupports* a // Set the target to be the original dispatch target, aEvent->target = target; // but use chrome event handler or TabChildGlobal for event target chain. target = piTarget; } } #ifdef DEBUG - if (!nsContentUtils::IsSafeToRunScript()) { + if (aEvent->message != NS_EVENT_NULL && !nsContentUtils::IsSafeToRunScript()) { nsresult rv = NS_ERROR_FAILURE; if (target->GetContextForEventHandlers(&rv) || NS_FAILED(rv)) { nsCOMPtr<nsINode> node = do_QueryInterface(target); if (node && nsContentUtils::IsChromeDoc(node->OwnerDoc())) { NS_WARNING("Fix the caller!"); } else { NS_ERROR("This is unsafe! Fix the caller!"); @@ -620,17 +620,17 @@ EventDispatcher::Dispatch(nsISupports* a break; } } if (NS_SUCCEEDED(rv)) { if (aTargets) { aTargets->Clear(); aTargets->SetCapacity(chain.Length()); for (uint32_t i = 0; i < chain.Length(); ++i) { - aTargets->AppendObject(chain[i].CurrentTarget()->GetTargetForDOMEvent()); + aTargets->AppendElement(chain[i].CurrentTarget()->GetTargetForDOMEvent()); } } else { // Event target chain is created. Handle the chain. EventChainPostVisitor postVisitor(preVisitor); EventTargetChainItem::HandleEventTargetChain(chain, postVisitor, aCallback, cd); preVisitor.mEventStatus = postVisitor.mEventStatus;
--- a/dom/events/EventDispatcher.h +++ b/dom/events/EventDispatcher.h @@ -250,17 +250,17 @@ public: * @note Use this method when dispatching a WidgetEvent. */ static nsresult Dispatch(nsISupports* aTarget, nsPresContext* aPresContext, WidgetEvent* aEvent, nsIDOMEvent* aDOMEvent = nullptr, nsEventStatus* aEventStatus = nullptr, EventDispatchingCallback* aCallback = nullptr, - nsCOMArray<dom::EventTarget>* aTargets = nullptr); + nsTArray<dom::EventTarget*>* aTargets = nullptr); /** * Dispatches an event. * If aDOMEvent is not nullptr, it is used for dispatching * (aEvent can then be nullptr) and (if aDOMEvent is not |trusted| already), * the |trusted| flag is set based on the UniversalXPConnect capability. * Otherwise this works like EventDispatcher::Dispatch. * @note Use this method when dispatching nsIDOMEvent.
--- a/dom/events/EventListenerService.cpp +++ b/dom/events/EventListenerService.cpp @@ -166,21 +166,21 @@ NS_IMETHODIMP EventListenerService::GetEventTargetChainFor(nsIDOMEventTarget* aEventTarget, uint32_t* aCount, nsIDOMEventTarget*** aOutArray) { *aCount = 0; *aOutArray = nullptr; NS_ENSURE_ARG(aEventTarget); WidgetEvent event(true, NS_EVENT_NULL); - nsCOMArray<EventTarget> targets; + nsTArray<EventTarget*> targets; nsresult rv = EventDispatcher::Dispatch(aEventTarget, nullptr, &event, nullptr, nullptr, nullptr, &targets); NS_ENSURE_SUCCESS(rv, rv); - int32_t count = targets.Count(); + int32_t count = targets.Length(); if (count == 0) { return NS_OK; } *aOutArray = static_cast<nsIDOMEventTarget**>( nsMemory::Alloc(sizeof(nsIDOMEventTarget*) * count)); NS_ENSURE_TRUE(*aOutArray, NS_ERROR_OUT_OF_MEMORY);
--- a/dom/system/gonk/NetworkManager.js +++ b/dom/system/gonk/NetworkManager.js @@ -129,22 +129,61 @@ try { function defineLazyRegExp(obj, name, pattern) { obj.__defineGetter__(name, function() { delete obj[name]; return obj[name] = new RegExp(pattern); }); } +function NetworkInterfaceLinks() +{ + this.resetLinks(); +} +NetworkInterfaceLinks.prototype = { + linkRoutes: null, + gateways: null, + interfaceName: null, + extraRoutes: null, + + setLinks: function(linkRoutes, gateways, interfaceName) { + this.linkRoutes = linkRoutes; + this.gateways = gateways; + this.interfaceName = interfaceName; + }, + + resetLinks: function() { + this.linkRoutes = []; + this.gateways = []; + this.interfaceName = ""; + this.extraRoutes = []; + }, + + compareGateways: function(gateways) { + if (this.gateways.length != gateways.length) { + return false; + } + + for (let i = 0; i < this.gateways.length; i++) { + if (this.gateways[i] != gateways[i]) { + return false; + } + } + + return true; + } +}; + /** * This component watches for network interfaces changing state and then * adjusts routes etc. accordingly. */ function NetworkManager() { this.networkInterfaces = {}; + this.networkInterfaceLinks = {}; Services.obs.addObserver(this, TOPIC_XPCOM_SHUTDOWN, false); Services.obs.addObserver(this, TOPIC_MOZSETTINGS_CHANGED, false); try { this._manageOfflineStatus = Services.prefs.getBoolPref(PREF_MANAGE_OFFLINE_STATUS); } catch(ex) { // Ignore. @@ -298,16 +337,17 @@ NetworkManager.prototype = { Cr.NS_ERROR_INVALID_ARG); } let networkId = this.getNetworkId(network); if (networkId in this.networkInterfaces) { throw Components.Exception("Network with that type already registered!", Cr.NS_ERROR_INVALID_ARG); } this.networkInterfaces[networkId] = network; + this.networkInterfaceLinks[networkId] = new NetworkInterfaceLinks(); if (network.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN) { debug("Force setting " + SETTINGS_DUN_REQUIRED + " to true."); this.tetheringSettings[SETTINGS_DUN_REQUIRED] = true; } Services.obs.notifyObservers(network, TOPIC_INTERFACE_REGISTERED, null); debug("Network '" + networkId + "' registered."); @@ -315,17 +355,20 @@ NetworkManager.prototype = { _addSubnetRoutes: function(network) { let ips = {}; let prefixLengths = {}; let length = network.getAddresses(ips, prefixLengths); for (let i = 0; i < length; i++) { debug('Adding subnet routes: ' + ips.value[i] + '/' + prefixLengths.value[i]); gNetworkService.modifyRoute(Ci.nsINetworkService.MODIFY_ROUTE_ADD, - network.name, ips.value[i], prefixLengths.value[i]); + network.name, ips.value[i], prefixLengths.value[i]) + .catch((aError) => { + debug("_addSubnetRoutes error: " + aError); + }); } }, updateNetworkInterface: function(network) { if (!(network instanceof Ci.nsINetworkInterface)) { throw Components.Exception("Argument must be nsINetworkInterface.", Cr.NS_ERROR_INVALID_ARG); } @@ -341,18 +384,26 @@ NetworkManager.prototype = { // something through netd, so we add createNetwork/destroyNetwork // to deal with that explicitly. switch (network.state) { case Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED: gNetworkService.createNetwork(network.name, () => { // Add host route for data calls if (this.isNetworkTypeMobile(network.type)) { - gNetworkService.removeHostRoutes(network.name); - this.setHostRoutes(network); + let currentInterfaceLinks = this.networkInterfaceLinks[networkId]; + let newLinkRoutes = network.getDnses().concat(network.httpProxyHost); + // If gateways have changed, remove all old routes first. + this._handleGateways(networkId, network.getGateways()) + .then(() => this._updateRoutes(currentInterfaceLinks.linkRoutes, + newLinkRoutes, + network.getGateways(), network.name)) + .then(() => currentInterfaceLinks.setLinks(newLinkRoutes, + network.getGateways(), + network.name)); } // Remove pre-created default route and let setAndConfigureActive() // to set default route only on preferred network gNetworkService.removeDefaultRoute(network); // Dun type is a special case where we add the default route to a // secondary table. @@ -381,17 +432,17 @@ NetworkManager.prototype = { Services.obs.notifyObservers(network, TOPIC_CONNECTION_STATE_CHANGED, this.convertConnectionType(network)); }); break; case Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED: // Remove host route for data calls if (this.isNetworkTypeMobile(network.type)) { - this.removeHostRoutes(network); + this._cleanupAllHostRoutes(networkId); } // Remove secondary default route for dun. if (network.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN) { this.removeSecondaryDefaultRoute(network); } // Remove routing table in /proc/net/route if (network.type == Ci.nsINetworkInterface.NETWORK_TYPE_WIFI) { gNetworkService.resetRoutingTable(network); @@ -430,31 +481,40 @@ NetworkManager.prototype = { throw Components.Exception("Argument must be nsINetworkInterface.", Cr.NS_ERROR_INVALID_ARG); } let networkId = this.getNetworkId(network); if (!(networkId in this.networkInterfaces)) { throw Components.Exception("No network with that type registered.", Cr.NS_ERROR_INVALID_ARG); } + + // This is for in case a network gets unregistered without being + // DISCONNECTED. + if (this.isNetworkTypeMobile(network.type)) { + this._cleanupAllHostRoutes(networkId); + } + delete this.networkInterfaces[networkId]; if (network.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN) { this.tetheringSettings[SETTINGS_DUN_REQUIRED] = libcutils.property_get("ro.tethering.dun_required") === "1"; } Services.obs.notifyObservers(network, TOPIC_INTERFACE_UNREGISTERED, null); debug("Network '" + networkId + "' unregistered."); }, _manageOfflineStatus: true, networkInterfaces: null, + networkInterfaceLinks: null, + _dataDefaultServiceId: null, _preferredNetworkType: DEFAULT_PREFERRED_NETWORK_TYPE, get preferredNetworkType() { return this._preferredNetworkType; }, set preferredNetworkType(val) { if ([Ci.nsINetworkInterface.NETWORK_TYPE_WIFI, @@ -472,17 +532,34 @@ NetworkManager.prototype = { Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE].indexOf(val) == -1) { throw "Invalid network type"; } this._overriddenActive = network; this.setAndConfigureActive(); }, - _updateRoutes: function(doAdd, ipAddresses, networkName, gateways) { + _updateRoutes: function(oldLinks, newLinks, gateways, interfaceName) { + // Returns items that are in base but not in target. + function getDifference(base, target) { + return base.filter(function(i) { return target.indexOf(i) < 0; }); + } + + let addedLinks = getDifference(newLinks, oldLinks); + let removedLinks = getDifference(oldLinks, newLinks); + + if (addedLinks.length === 0 && removedLinks.length === 0) { + return Promise.resolve(); + } + + return this._setHostRoutes(false, removedLinks, interfaceName, gateways) + .then(this._setHostRoutes(true, addedLinks, interfaceName, gateways)); + }, + + _setHostRoutes: function(doAdd, ipAddresses, networkName, gateways) { let getMaxPrefixLength = (aIp) => { return aIp.match(this.REGEXP_IPV4) ? IPV4_MAX_PREFIX_LENGTH : IPV6_MAX_PREFIX_LENGTH; } let promises = []; ipAddresses.forEach((aIpAddress) => { let gateway = this.selectGateway(gateways, aIpAddress); @@ -512,56 +589,115 @@ NetworkManager.prototype = { }, addHostRoute: function(network, host) { if (!this.isValidatedNetwork(network)) { return Promise.reject("Invalid network interface."); } return this.resolveHostname(network, host) - .then((ipAddresses) => this._updateRoutes(true, - ipAddresses, - network.name, - network.getGateways())); + .then((ipAddresses) => { + let promises = []; + let networkId = this.getNetworkId(network); + + ipAddresses.forEach((aIpAddress) => { + let promise = + this._setHostRoutes(true, [aIpAddress], network.name, network.getGateways()) + .then(() => this.networkInterfaceLinks[networkId].extraRoutes.push(aIpAddress)); + + promises.push(promise); + }); + + return Promise.all(promises); + }); }, removeHostRoute: function(network, host) { if (!this.isValidatedNetwork(network)) { return Promise.reject("Invalid network interface."); } return this.resolveHostname(network, host) - .then((ipAddresses) => this._updateRoutes(false, - ipAddresses, - network.name, - network.getGateways())); + .then((ipAddresses) => { + let promises = []; + let networkId = this.getNetworkId(network); + + ipAddresses.forEach((aIpAddress) => { + let found = this.networkInterfaceLinks[networkId].extraRoutes.indexOf(aIpAddress); + if (found < 0) { + return; // continue + } + + let promise = + this._setHostRoutes(false, [aIpAddress], network.name, network.getGateways()) + .then(() => { + this.networkInterfaceLinks[networkId].extraRoutes.splice(found, 1); + }, () => { + // We should remove it even if the operation failed. + this.networkInterfaceLinks[networkId].extraRoutes.splice(found, 1); + }); + promises.push(promise); + }); + + return Promise.all(promises); + }); }, isNetworkTypeSecondaryMobile: function(type) { return (type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS || type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL || type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS || type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN); }, isNetworkTypeMobile: function(type) { return (type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE || this.isNetworkTypeSecondaryMobile(type)); }, - setHostRoutes: function(network) { - let hosts = network.getDnses().concat(network.httpProxyHost); + _handleGateways: function(networkId, gateways) { + let currentNetworkLinks = this.networkInterfaceLinks[networkId]; + if (currentNetworkLinks.gateways.length == 0 || + currentNetworkLinks.compareGateways(gateways)) { + return Promise.resolve(); + } - return this._updateRoutes(true, hosts, network.name, network.getGateways()); + let currentExtraRoutes = currentNetworkLinks.extraRoutes; + return this._cleanupAllHostRoutes(networkId) + .then(() => { + // If gateways have changed, re-add extra host routes with new gateways. + if (currentExtraRoutes.length > 0) { + this._setHostRoutes(true, + currentExtraRoutes, + currentNetworkLinks.interfaceName, + gateways) + .then(() => { + currentNetworkLinks.extraRoutes = currentExtraRoutes; + }); + } + }); }, - removeHostRoutes: function(network) { - let hosts = network.getDnses().concat(network.httpProxyHost); + _cleanupAllHostRoutes: function(networkId) { + let currentNetworkLinks = this.networkInterfaceLinks[networkId]; + let hostRoutes = currentNetworkLinks.linkRoutes.concat( + currentNetworkLinks.extraRoutes); + + if (hostRoutes.length === 0) { + return Promise.resolve(); + } - return this._updateRoutes(false, hosts, network.name, network.getGateways()); + return this._setHostRoutes(false, + hostRoutes, + currentNetworkLinks.interfaceName, + currentNetworkLinks.gateways) + .catch((aError) => { + debug("Error (" + aError + ") on _cleanupAllHostRoutes, keep proceeding."); + }) + .then(() => currentNetworkLinks.resetLinks()); }, selectGateway: function(gateways, host) { for (let i = 0; i < gateways.length; i++) { let gateway = gateways[i]; if (gateway.match(this.REGEXP_IPV4) && host.match(this.REGEXP_IPV4) || gateway.indexOf(":") != -1 && host.indexOf(":") != -1) { return gateway;
--- a/dom/system/gonk/NetworkService.js +++ b/dom/system/gonk/NetworkService.js @@ -51,16 +51,76 @@ function isError(code) { let type = netdResponseType(code); return (type !== NETD_COMMAND_PROCEEDING && type !== NETD_COMMAND_OKAY); } function debug(msg) { dump("-*- NetworkService: " + msg + "\n"); } +function Task(id, params, setupFunction) { + this.id = id; + this.params = params; + this.setupFunction = setupFunction; +} + +function NetworkWorkerRequestQueue(networkService) { + this.networkService = networkService; + this.tasks = []; +} +NetworkWorkerRequestQueue.prototype = { + runQueue: function() { + if (this.tasks.length === 0) { + return; + } + + let task = this.tasks[0]; + if (DEBUG) debug("run task id: " + task.id); + + if (typeof task.setupFunction === 'function') { + // If setupFunction returns false, skip sending to Network Worker but call + // handleWorkerMessage() directly with task id, as if the response was + // returned from Network Worker. + if (!task.setupFunction()) { + this.networkService.handleWorkerMessage({id: task.id}); + return; + } + } + + gNetworkWorker.postMessage(task.params); + }, + + enqueue: function(id, params, setupFunction) { + if (DEBUG) debug("enqueue id: " + id); + this.tasks.push(new Task(id, params, setupFunction)); + + if (this.tasks.length === 1) { + this.runQueue(); + } + }, + + dequeue: function(id) { + if (DEBUG) debug("dequeue id: " + id); + + if (!this.tasks.length || this.tasks[0].id != id) { + if (DEBUG) debug("Id " + id + " is not on top of the queue"); + return; + } + + this.tasks.shift(); + if (this.tasks.length > 0) { + // Run queue on the next tick. + Services.tm.currentThread.dispatch(() => { + this.runQueue(); + }, Ci.nsIThread.DISPATCH_NORMAL); + } + } +}; + + /** * This component watches for network interfaces changing state and then * adjusts routes etc. accordingly. */ function NetworkService() { if(DEBUG) debug("Starting net_worker."); let self = this; @@ -71,41 +131,52 @@ function NetworkService() { self.handleWorkerMessage(event); } }; gNetworkWorker.start(networkListener); } // Callbacks to invoke when a reply arrives from the net_worker. this.controlCallbacks = Object.create(null); + this.addedRoutes = new Map(); + this.netWorkerRequestQueue = new NetworkWorkerRequestQueue(this); this.shutdown = false; Services.obs.addObserver(this, "xpcom-shutdown", false); } NetworkService.prototype = { classID: NETWORKSERVICE_CID, classInfo: XPCOMUtils.generateCI({classID: NETWORKSERVICE_CID, contractID: NETWORKSERVICE_CONTRACTID, classDescription: "Network Service", interfaces: [Ci.nsINetworkService]}), QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkService]), // Helpers + addedRoutes: null, idgen: 0, - controlMessage: function(params, callback) { + controlMessage: function(params, callback, setupFunction) { if (this.shutdown) { return; } + let id = this.idgen++; + params.id = id; if (callback) { - let id = this.idgen++; - params.id = id; this.controlCallbacks[id] = callback; } + + // For now, we use setupFunction to determine if this command needs to be + // queued or not. + if (setupFunction) { + this.netWorkerRequestQueue.enqueue(id, params, setupFunction); + return; + } + if (gNetworkWorker) { gNetworkWorker.postMessage(params); } }, handleWorkerMessage: function(response) { if(DEBUG) debug("NetworkManager received message from worker: " + JSON.stringify(response)); let id = response.id; @@ -113,16 +184,18 @@ NetworkService.prototype = { Services.obs.notifyObservers(null, response.topic, response.reason); return; } let callback = this.controlCallbacks[id]; if (callback) { callback.call(this, response); delete this.controlCallbacks[id]; } + + this.netWorkerRequestQueue.dequeue(id); }, // nsINetworkService getNetworkInterfaceStats: function(networkName, callback) { if(DEBUG) debug("getNetworkInterfaceStats for " + networkName); let file = new FileUtils.File("/proc/net/dev"); @@ -302,57 +375,84 @@ NetworkService.prototype = { let options = { cmd: "removeDefaultRoute", ifname: network.name, gateways: gateways }; this.controlMessage(options); }, + _routeToString: function(interfaceName, host, prefixLength, gateway) { + return host + "-" + prefixLength + "-" + gateway + "-" + interfaceName; + }, + modifyRoute: function(action, interfaceName, host, prefixLength, gateway) { let command; switch (action) { case Ci.nsINetworkService.MODIFY_ROUTE_ADD: command = 'addHostRoute'; break; case Ci.nsINetworkService.MODIFY_ROUTE_REMOVE: command = 'removeHostRoute'; break; default: if (DEBUG) debug('Unknown action: ' + action); return Promise.reject(); } + let route = this._routeToString(interfaceName, host, prefixLength, gateway); + let setupFunc = () => { + let count = this.addedRoutes.get(route); + if (DEBUG) debug(command + ": " + route + " -> " + count); + + // Return false if there is no need to send the command to network worker. + if ((action == Ci.nsINetworkService.MODIFY_ROUTE_ADD && count) || + (action == Ci.nsINetworkService.MODIFY_ROUTE_REMOVE && + (!count || count > 1))) { + return false; + } + + return true; + }; + if (DEBUG) debug(command + " " + host + " on " + interfaceName); - let deferred = Promise.defer(); let options = { cmd: command, ifname: interfaceName, gateway: gateway, prefixLength: prefixLength, ip: host }; - this.controlMessage(options, function(data) { - if (data.error) { - deferred.reject(data.reason); - return; - } - deferred.resolve(); + + return new Promise((aResolve, aReject) => { + this.controlMessage(options, (data) => { + let count = this.addedRoutes.get(route); + + // Remove route from addedRoutes on success or failure. + if (action == Ci.nsINetworkService.MODIFY_ROUTE_REMOVE) { + if (count > 1) { + this.addedRoutes.set(route, count - 1); + } else { + this.addedRoutes.delete(route); + } + } + + if (data.error) { + aReject(data.reason); + return; + } + + if (action == Ci.nsINetworkService.MODIFY_ROUTE_ADD) { + this.addedRoutes.set(route, count ? count + 1 : 1); + } + + aResolve(); + }, setupFunc); }); - return deferred.promise; - }, - - removeHostRoutes: function(ifname) { - if(DEBUG) debug("Going to remove all host routes on " + ifname); - let options = { - cmd: "removeHostRoutes", - ifname: ifname, - }; - this.controlMessage(options); }, addSecondaryRoute: function(ifname, route) { if(DEBUG) debug("Going to add route to secondary table on " + ifname); let options = { cmd: "addSecondaryRoute", ifname: ifname, ip: route.ip,
--- a/dom/system/gonk/NetworkUtils.cpp +++ b/dom/system/gonk/NetworkUtils.cpp @@ -1480,17 +1480,16 @@ void NetworkUtils::ExecuteCommand(Networ #define BUILD_ENTRY(c) {#c, &NetworkUtils::c} BUILD_ENTRY(removeNetworkRoute), BUILD_ENTRY(setDNS), BUILD_ENTRY(setDefaultRoute), BUILD_ENTRY(removeDefaultRoute), BUILD_ENTRY(addHostRoute), BUILD_ENTRY(removeHostRoute), - BUILD_ENTRY(removeHostRoutes), BUILD_ENTRY(addSecondaryRoute), BUILD_ENTRY(removeSecondaryRoute), BUILD_ENTRY(setNetworkInterfaceAlarm), BUILD_ENTRY(enableNetworkInterfaceAlarm), BUILD_ENTRY(disableNetworkInterfaceAlarm), BUILD_ENTRY(setWifiOperationMode), BUILD_ENTRY(setDhcpServer), BUILD_ENTRY(setWifiTethering), @@ -1950,16 +1949,21 @@ CommandResult NetworkUtils::addHostRoute return CommandResult::Pending(); } /** * Add host route for given network interface. */ CommandResult NetworkUtils::addHostRouteLegacy(NetworkParams& aOptions) { + if (aOptions.mGateway.IsEmpty()) { + ERROR("addHostRouteLegacy does not support empty gateway."); + return EINVAL; + } + NS_ConvertUTF16toUTF8 autoIfname(aOptions.mIfname); NS_ConvertUTF16toUTF8 autoHostname(aOptions.mIp); NS_ConvertUTF16toUTF8 autoGateway(aOptions.mGateway); int type, prefix; type = getIpType(autoHostname.get()); if (type != AF_INET && type != AF_INET6) { return EAFNOSUPPORT; @@ -2021,37 +2025,16 @@ CommandResult NetworkUtils::removeHostRo return EINVAL; } prefix = type == AF_INET ? 32 : 128; return mNetUtils->do_ifc_remove_route(autoIfname.get(), autoHostname.get(), prefix, autoGateway.get()); } -/** - * Remove the routes associated with the named interface. - */ -CommandResult NetworkUtils::removeHostRoutes(NetworkParams& aOptions) -{ - if (SDK_VERSION < 20) { - return removeHostRoutesLegacy(aOptions); - } - - NU_DBG("Don't know how to remove host routes on a interface"); - return SUCCESS; -} - -/** - * Remove the routes associated with the named interface. - */ -CommandResult NetworkUtils::removeHostRoutesLegacy(NetworkParams& aOptions) -{ - return mNetUtils->do_ifc_remove_host_routes(GET_CHAR(mIfname)); -} - CommandResult NetworkUtils::removeNetworkRoute(NetworkParams& aOptions) { if (SDK_VERSION < 20) { return removeNetworkRouteLegacy(aOptions); } static CommandFunc COMMAND_CHAIN[] = { clearAddrForInterface,
--- a/dom/system/gonk/NetworkUtils.h +++ b/dom/system/gonk/NetworkUtils.h @@ -286,17 +286,16 @@ private: CommandResult dhcpRequest(NetworkParams& aOptions); CommandResult enableInterface(NetworkParams& aOptions); CommandResult disableInterface(NetworkParams& aOptions); CommandResult resetConnections(NetworkParams& aOptions); CommandResult setDefaultRoute(NetworkParams& aOptions); CommandResult addHostRoute(NetworkParams& aOptions); CommandResult removeDefaultRoute(NetworkParams& aOptions); CommandResult removeHostRoute(NetworkParams& aOptions); - CommandResult removeHostRoutes(NetworkParams& aOptions); CommandResult removeNetworkRoute(NetworkParams& aOptions); CommandResult setDNS(NetworkParams& aOptions); CommandResult addSecondaryRoute(NetworkParams& aOptions); CommandResult removeSecondaryRoute(NetworkParams& aOptions); CommandResult setNetworkInterfaceAlarm(NetworkParams& aOptions); CommandResult enableNetworkInterfaceAlarm(NetworkParams& aOptions); CommandResult disableNetworkInterfaceAlarm(NetworkParams& aOptions); CommandResult setWifiOperationMode(NetworkParams& aOptions); @@ -305,17 +304,16 @@ private: CommandResult setUSBTethering(NetworkParams& aOptions); CommandResult enableUsbRndis(NetworkParams& aOptions); CommandResult updateUpStream(NetworkParams& aOptions); CommandResult createNetwork(NetworkParams& aOptions); CommandResult destroyNetwork(NetworkParams& aOptions); CommandResult addHostRouteLegacy(NetworkParams& aOptions); CommandResult removeHostRouteLegacy(NetworkParams& aOptions); - CommandResult removeHostRoutesLegacy(NetworkParams& aOptions); CommandResult setDefaultRouteLegacy(NetworkParams& aOptions); CommandResult removeDefaultRouteLegacy(NetworkParams& aOptions); CommandResult removeNetworkRouteLegacy(NetworkParams& aOptions); /** * function pointer array holds all netd commands should be executed * in sequence to accomplish a given command by other module.
--- a/dom/system/gonk/nsINetworkService.idl +++ b/dom/system/gonk/nsINetworkService.idl @@ -154,17 +154,17 @@ interface nsIDhcpRequestCallback : nsISu */ void dhcpRequestResult(in boolean success, in jsval dhcpInfo); }; /** * Provide network services. */ -[scriptable, uuid(138ab267-0007-4c3e-8bfc-a7e1be0b5a6f)] +[scriptable, uuid(e40dd966-cb04-4dc7-ac4b-6382769c00b9)] interface nsINetworkService : nsISupports { const long MODIFY_ROUTE_ADD = 0; const long MODIFY_ROUTE_REMOVE = 1; /** * Enable or disable Wifi Tethering * @@ -341,24 +341,16 @@ interface nsINetworkService : nsISupport */ jsval modifyRoute(in long action, in DOMString interfaceName, in DOMString host, in long prefixLength, [optional] in DOMString gateway); /** - * Remove all host routes. - * - * @param interfaceName - * The interface name we want remove from the routing table. - */ - void removeHostRoutes(in DOMString interfaceName); - - /** * Add route to secondary routing table. * * @param interfaceName * The network interface for this route. * @param route * The route info should have the following fields: * .ip: destination ip address * .prefix: destination prefix
--- a/dom/system/gonk/ril_worker.js +++ b/dom/system/gonk/ril_worker.js @@ -77,148 +77,16 @@ let RILQUIRKS_HAVE_QUERY_ICC_LOCK_RETRY_ let RILQUIRKS_SEND_STK_PROFILE_DOWNLOAD; // Ril quirk to attach data registration on demand. let RILQUIRKS_DATA_REGISTRATION_ON_DEMAND; // Ril quirk to control the uicc/data subscription. let RILQUIRKS_SUBSCRIPTION_CONTROL; -function BufObject(aContext) { - this.context = aContext; -} -BufObject.prototype = { - context: null, - - mToken: 0, - mTokenRequestMap: null, - - init: function() { - this._init(); - - // This gets incremented each time we send out a parcel. - this.mToken = 1; - - // Maps tokens we send out with requests to the request type, so that - // when we get a response parcel back, we know what request it was for. - this.mTokenRequestMap = new Map(); - }, - - /** - * Process one parcel. - */ - processParcel: function() { - let response_type = this.readInt32(); - - let request_type, options; - if (response_type == RESPONSE_TYPE_SOLICITED) { - let token = this.readInt32(); - let error = this.readInt32(); - - options = this.mTokenRequestMap.get(token); - if (!options) { - if (DEBUG) { - this.context.debug("Suspicious uninvited request found: " + - token + ". Ignored!"); - } - return; - } - - this.mTokenRequestMap.delete(token); - request_type = options.rilRequestType; - - options.rilRequestError = error; - if (DEBUG) { - this.context.debug("Solicited response for request type " + request_type + - ", token " + token + ", error " + error); - } - } else if (response_type == RESPONSE_TYPE_UNSOLICITED) { - request_type = this.readInt32(); - if (DEBUG) { - this.context.debug("Unsolicited response for request type " + request_type); - } - } else { - if (DEBUG) { - this.context.debug("Unknown response type: " + response_type); - } - return; - } - - this.context.RIL.handleParcel(request_type, this.readAvailable, options); - }, - - /** - * Start a new outgoing parcel. - * - * @param type - * Integer specifying the request type. - * @param options [optional] - * Object containing information about the request, e.g. the - * original main thread message object that led to the RIL request. - */ - newParcel: function(type, options) { - if (DEBUG) { - this.context.debug("New outgoing parcel of type " + type + - ", token " + this.mToken); - } - - // We're going to leave room for the parcel size at the beginning. - this.outgoingIndex = this.PARCEL_SIZE_SIZE; - this.writeInt32(this._reMapRequestType(type)); - this.writeInt32(this.mToken); - - if (!options) { - options = {}; - } - options.rilRequestType = type; - options.rilRequestError = null; - this.mTokenRequestMap.set(this.mToken, options); - this.mToken++; - return this.mToken; - }, - - simpleRequest: function(type, options) { - this.newParcel(type, options); - this.sendParcel(); - }, - - onSendParcel: function(parcel) { - postRILMessage(this.context.clientId, parcel); - }, - - /** - * Remapping the request type to different values based on RIL version. - * We only have to do this for SUBSCRIPTION right now, so I just make it - * simple. A generic logic or structure could be discussed if we have more - * use cases, especially the cases from different partners. - */ - _reMapRequestType: function(type) { - let newType = type; - switch (type) { - case REQUEST_SET_UICC_SUBSCRIPTION: - case REQUEST_SET_DATA_SUBSCRIPTION: - if (this.context.RIL.version < 9) { - // Shift the CAF's proprietary parcels. Please see - // https://www.codeaurora.org/cgit/quic/la/platform/hardware/ril/tree/include/telephony/ril.h?h=b2g_jb_3.2 - newType = type - 1; - } - break; - } - - return newType; - } -}; - -(function() { - let base = require("resource://gre/modules/workers/worker_buf.js").Buf; - for (let p in base) { - BufObject.prototype[p] = base[p]; - } -})(); - const TELEPHONY_REQUESTS = [ REQUEST_GET_CURRENT_CALLS, REQUEST_ANSWER, REQUEST_CONFERENCE, REQUEST_DIAL, REQUEST_DIAL_EMERGENCY_CALL, REQUEST_HANGUP, REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND,
--- a/gfx/layers/LayerMetricsWrapper.h +++ b/gfx/layers/LayerMetricsWrapper.h @@ -333,16 +333,25 @@ public: const nsIntRect* GetClipRect() const { MOZ_ASSERT(IsValid()); return mLayer->GetClipRect(); } + bool GetForceDispatchToContentRegion() const { + MOZ_ASSERT(IsValid()); + + if (mLayer->AsContainerLayer()) { + return mLayer->AsContainerLayer()->GetForceDispatchToContentRegion(); + } + return false; + } + // Expose an opaque pointer to the layer. Mostly used for printf // purposes. This is not intended to be a general-purpose accessor // for the underlying layer. const void* GetLayer() const { MOZ_ASSERT(IsValid()); return (void*)mLayer;
--- a/gfx/layers/Layers.cpp +++ b/gfx/layers/Layers.cpp @@ -919,17 +919,18 @@ ContainerLayer::ContainerLayer(LayerMana mPreYScale(1.0f), mInheritedXScale(1.0f), mInheritedYScale(1.0f), mPresShellResolution(1.0f), mScaleToResolution(false), mUseIntermediateSurface(false), mSupportsComponentAlphaChildren(false), mMayHaveReadbackChild(false), - mChildrenChanged(false) + mChildrenChanged(false), + mForceDispatchToContentRegion(false) { mContentFlags = 0; // Clear NO_TEXT, NO_TEXT_OVER_TRANSPARENT } ContainerLayer::~ContainerLayer() {} bool ContainerLayer::InsertAfter(Layer* aChild, Layer* aAfter) @@ -1076,16 +1077,17 @@ ContainerLayer::RepositionChild(Layer* a } void ContainerLayer::FillSpecificAttributes(SpecificLayerAttributes& aAttrs) { aAttrs = ContainerLayerAttributes(mPreXScale, mPreYScale, mInheritedXScale, mInheritedYScale, mPresShellResolution, mScaleToResolution, + mForceDispatchToContentRegion, reinterpret_cast<uint64_t>(mHMDInfo.get())); } bool ContainerLayer::HasMultipleChildren() { uint32_t count = 0; for (Layer* child = GetFirstChild(); child; child = child->GetNextSibling()) { @@ -1743,16 +1745,19 @@ ContainerLayer::PrintInfo(std::stringstr aStream << " [usesTmpSurf]"; } if (1.0 != mPreXScale || 1.0 != mPreYScale) { aStream << nsPrintfCString(" [preScale=%g, %g]", mPreXScale, mPreYScale).get(); } if (mScaleToResolution) { aStream << nsPrintfCString(" [presShellResolution=%g]", mPresShellResolution).get(); } + if (mForceDispatchToContentRegion) { + aStream << " [force-dtc]"; + } if (mHMDInfo) { aStream << nsPrintfCString(" [hmd=%p]", mHMDInfo.get()).get(); } } void ContainerLayer::DumpPacket(layerscope::LayersPacket* aPacket, const void* aParent) {
--- a/gfx/layers/Layers.h +++ b/gfx/layers/Layers.h @@ -911,16 +911,20 @@ public: * to be ignored. If a layer has a mask layer, and that mask layer's alpha * value is zero at the event point, then the layer and its subtree should * be ignored. * For each layer, if the point is outside its hit region, we ignore the layer * and move onto the next. If the point is inside its hit region but * outside the dispatch-to-content region, we can initiate a gesture without * consulting the content thread. Otherwise we must dispatch the event to * content. + * Note that if a layer or any ancestor layer returns true for + * GetForceDispatchToContentRegion() then we must treat the dispatch-to-content + * region as encompassing the hit region, and therefore must consult the + * content thread before initiating a gesture. */ /** * CONSTRUCTION PHASE ONLY * Set the event handling region. */ void SetEventRegions(const EventRegions& aRegions) { if (mEventRegions != aRegions) { @@ -1962,16 +1966,30 @@ public: * content flag set. */ static bool HasOpaqueAncestorLayer(Layer* aLayer); void SetChildrenChanged(bool aVal) { mChildrenChanged = aVal; } + void SetForceDispatchToContentRegion(bool aVal) { + if (mForceDispatchToContentRegion == aVal) { + return; + } + + MOZ_LAYERS_LOG_IF_SHADOWABLE(this, ("Layer::Mutated(%p) ForceDispatchToContentRegion", this)); + mForceDispatchToContentRegion = aVal; + Mutated(); + } + + bool GetForceDispatchToContentRegion() const { + return mForceDispatchToContentRegion; + } + /** * VR */ void SetVRHMDInfo(gfx::VRHMDInfo* aHMD) { mHMDInfo = aHMD; } gfx::VRHMDInfo* GetVRHMDInfo() { return mHMDInfo; } protected: friend class ReadbackProcessor; @@ -2018,16 +2036,17 @@ protected: // Whether the compositor should scale to mPresShellResolution. bool mScaleToResolution; bool mUseIntermediateSurface; bool mSupportsComponentAlphaChildren; bool mMayHaveReadbackChild; // This is updated by ComputeDifferences. This will be true if we need to invalidate // the intermediate surface. bool mChildrenChanged; + bool mForceDispatchToContentRegion; nsRefPtr<gfx::VRHMDInfo> mHMDInfo; }; /** * A Layer which just renders a solid color in its visible region. It actually * can fill any area that contains the visible region, so if you need to * restrict the area filled, set a clip region on this layer. */
--- a/gfx/layers/apz/src/APZCTreeManager.cpp +++ b/gfx/layers/apz/src/APZCTreeManager.cpp @@ -315,16 +315,30 @@ APZCTreeManager::RecycleOrCreateNode(Tre node->RecycleWith(aApzc); return node.forget(); } } nsRefPtr<HitTestingTreeNode> node = new HitTestingTreeNode(aApzc, false); return node.forget(); } +static bool +ShouldForceDispatchToContent(HitTestingTreeNode* aParent, + const LayerMetricsWrapper& aLayer) +{ + // Make it so that if the flag is set on the layer tree, it automatically + // propagates to all the nodes in the corresponding subtree rooted at that + // layer in the hit-test tree. This saves having to walk up the tree every + // we want to see if a hit-test node is affected by this flag. + if (aParent && aParent->GetForceDispatchToContent()) { + return true; + } + return aLayer.GetForceDispatchToContentRegion(); +} + HitTestingTreeNode* APZCTreeManager::PrepareNodeForLayer(const LayerMetricsWrapper& aLayer, const FrameMetrics& aMetrics, uint64_t aLayersId, const gfx::Matrix4x4& aAncestorTransform, HitTestingTreeNode* aParent, HitTestingTreeNode* aNextSibling, TreeBuildingState& aState) @@ -339,17 +353,18 @@ APZCTreeManager::PrepareNodeForLayer(con needsApzc = false; } nsRefPtr<HitTestingTreeNode> node = nullptr; if (!needsApzc) { node = RecycleOrCreateNode(aState, nullptr); AttachNodeToTree(node, aParent, aNextSibling); node->SetHitTestData(GetEventRegions(aLayer), aLayer.GetTransform(), - aLayer.GetClipRect() ? Some(nsIntRegion(*aLayer.GetClipRect())) : Nothing()); + aLayer.GetClipRect() ? Some(nsIntRegion(*aLayer.GetClipRect())) : Nothing(), + ShouldForceDispatchToContent(aParent, aLayer)); return node; } AsyncPanZoomController* apzc = nullptr; // If we get here, aLayer is a scrollable layer and somebody // has registered a GeckoContentController for it, so we need to ensure // it has an APZC instance to manage its scrolling. @@ -435,17 +450,18 @@ APZCTreeManager::PrepareNodeForLayer(con aState.mIsFirstPaint && (aLayersId == aState.mOriginatingLayersId)); // Since this is the first time we are encountering an APZC with this guid, // the node holding it must be the primary holder. It may be newly-created // or not, depending on whether it went through the newApzc branch above. MOZ_ASSERT(node->IsPrimaryHolder() && node->GetApzc() && node->GetApzc()->Matches(guid)); nsIntRegion clipRegion = ComputeClipRegion(state->mController, aLayer); - node->SetHitTestData(GetEventRegions(aLayer), aLayer.GetTransform(), Some(clipRegion)); + node->SetHitTestData(GetEventRegions(aLayer), aLayer.GetTransform(), Some(clipRegion), + ShouldForceDispatchToContent(aParent, aLayer)); apzc->SetAncestorTransform(aAncestorTransform); PrintAPZCInfo(aLayer, apzc); // Bind the APZC instance into the tree of APZCs AttachNodeToTree(node, aParent, aNextSibling); // For testing, log the parent scroll id of every APZC that has a @@ -489,17 +505,18 @@ APZCTreeManager::PrepareNodeForLayer(con // Even though different layers associated with a given APZC may be at // different levels in the layer tree (e.g. one being an uncle of another), // we require from Layout that the CSS transforms up to their common // ancestor be the same. MOZ_ASSERT(aAncestorTransform == apzc->GetAncestorTransform()); nsIntRegion clipRegion = ComputeClipRegion(state->mController, aLayer); - node->SetHitTestData(GetEventRegions(aLayer), aLayer.GetTransform(), Some(clipRegion)); + node->SetHitTestData(GetEventRegions(aLayer), aLayer.GetTransform(), Some(clipRegion), + ShouldForceDispatchToContent(aParent, aLayer)); } return node; } HitTestingTreeNode* APZCTreeManager::UpdateHitTestingTree(TreeBuildingState& aState, const LayerMetricsWrapper& aLayer,
--- a/gfx/layers/apz/src/HitTestingTreeNode.cpp +++ b/gfx/layers/apz/src/HitTestingTreeNode.cpp @@ -16,16 +16,17 @@ namespace mozilla { namespace layers { HitTestingTreeNode::HitTestingTreeNode(AsyncPanZoomController* aApzc, bool aIsPrimaryHolder) : mApzc(aApzc) , mIsPrimaryApzcHolder(aIsPrimaryHolder) + , mForceDispatchToContent(false) { if (mIsPrimaryApzcHolder) { MOZ_ASSERT(mApzc); } } void HitTestingTreeNode::RecycleWith(AsyncPanZoomController* aApzc) @@ -150,21 +151,23 @@ bool HitTestingTreeNode::IsPrimaryHolder() const { return mIsPrimaryApzcHolder; } void HitTestingTreeNode::SetHitTestData(const EventRegions& aRegions, const gfx::Matrix4x4& aTransform, - const Maybe<nsIntRegion>& aClipRegion) + const Maybe<nsIntRegion>& aClipRegion, + bool aForceDispatchToContent) { mEventRegions = aRegions; mTransform = aTransform; mClipRegion = aClipRegion; + mForceDispatchToContent = aForceDispatchToContent; } bool HitTestingTreeNode::IsOutsideClip(const ParentLayerPoint& aPoint) const { // test against clip rect in ParentLayer coordinate space return (mClipRegion.isSome() && !mClipRegion->Contains(aPoint.x, aPoint.y)); } @@ -205,30 +208,39 @@ HitTestingTreeNode::HitTest(const Parent return HitTestResult::HitNothing; } LayerIntPoint point = RoundedToInt(pointInLayerPixels.ref()); // test against event regions in Layer coordinate space if (!mEventRegions.mHitRegion.Contains(point.x, point.y)) { return HitTestResult::HitNothing; } - if (mEventRegions.mDispatchToContentHitRegion.Contains(point.x, point.y)) { + if (mForceDispatchToContent || + mEventRegions.mDispatchToContentHitRegion.Contains(point.x, point.y)) + { return HitTestResult::HitDispatchToContentRegion; } return HitTestResult::HitLayer; } +bool +HitTestingTreeNode::GetForceDispatchToContent() const +{ + return mForceDispatchToContent; +} + void HitTestingTreeNode::Dump(const char* aPrefix) const { if (mPrevSibling) { mPrevSibling->Dump(aPrefix); } - printf_stderr("%sHitTestingTreeNode (%p) APZC (%p) g=(%s) r=(%s) t=(%s) c=(%s)\n", + printf_stderr("%sHitTestingTreeNode (%p) APZC (%p) g=(%s) %sr=(%s) t=(%s) c=(%s)\n", aPrefix, this, mApzc.get(), mApzc ? Stringify(mApzc->GetGuid()).c_str() : "", + mForceDispatchToContent ? "fdtc " : "", Stringify(mEventRegions).c_str(), Stringify(mTransform).c_str(), mClipRegion ? Stringify(mClipRegion.ref()).c_str() : "none"); if (mLastChild) { mLastChild->Dump(nsPrintfCString("%s ", aPrefix).get()); } } void
--- a/gfx/layers/apz/src/HitTestingTreeNode.h +++ b/gfx/layers/apz/src/HitTestingTreeNode.h @@ -76,24 +76,27 @@ public: AsyncPanZoomController* GetApzc() const; AsyncPanZoomController* GetNearestContainingApzc() const; bool IsPrimaryHolder() const; /* Hit test related methods */ void SetHitTestData(const EventRegions& aRegions, const gfx::Matrix4x4& aTransform, - const Maybe<nsIntRegion>& aClipRegion); + const Maybe<nsIntRegion>& aClipRegion, + bool aForceDispatchToContent); bool IsOutsideClip(const ParentLayerPoint& aPoint) const; /* Convert aPoint into the LayerPixel space for the layer corresponding to * this node. */ Maybe<LayerPoint> Untransform(const ParentLayerPoint& aPoint) const; /* Assuming aPoint is inside the clip region for this node, check which of the * event region spaces it falls inside. */ HitTestResult HitTest(const ParentLayerPoint& aPoint) const; + /* Returns the mForceDispatchToContent flag. */ + bool GetForceDispatchToContent() const; /* Debug helpers */ void Dump(const char* aPrefix = "") const; private: void SetApzcParent(AsyncPanZoomController* aApzc); nsRefPtr<HitTestingTreeNode> mLastChild; @@ -117,14 +120,19 @@ private: gfx::Matrix4x4 mTransform; /* This is clip rect for L that we wish to use for hit-testing purposes. Note * that this may not be exactly the same as the clip rect on layer L because * of the touch-sensitive region provided by the GeckoContentController, or * because we may use the composition bounds of the layer if the clip is not * present. This value is in L's ParentLayerPixels. */ Maybe<nsIntRegion> mClipRegion; + + /* If this flag is set, then events to this node and the entire subtree under + * should always be treated as dispatch-to-content. + */ + bool mForceDispatchToContent; }; } } #endif // mozilla_layers_HitTestingTreeNode_h
--- a/gfx/layers/ipc/LayerTransactionParent.cpp +++ b/gfx/layers/ipc/LayerTransactionParent.cpp @@ -381,16 +381,17 @@ LayerTransactionParent::RecvUpdate(Infal return false; } const ContainerLayerAttributes& attrs = specific.get_ContainerLayerAttributes(); containerLayer->SetPreScale(attrs.preXScale(), attrs.preYScale()); containerLayer->SetInheritedScale(attrs.inheritedXScale(), attrs.inheritedYScale()); containerLayer->SetScaleToResolution(attrs.scaleToResolution(), attrs.presShellResolution()); + containerLayer->SetForceDispatchToContentRegion(attrs.forceDispatchToContentRegion()); if (attrs.hmdInfo()) { if (!IsSameProcess()) { NS_WARNING("VR layers currently not supported with cross-process compositing"); return false; } containerLayer->SetVRHMDInfo(reinterpret_cast<mozilla::gfx::VRHMDInfo*>(attrs.hmdInfo())); }
--- a/gfx/layers/ipc/LayersMessages.ipdlh +++ b/gfx/layers/ipc/LayersMessages.ipdlh @@ -229,16 +229,17 @@ struct PaintedLayerAttributes { }; struct ContainerLayerAttributes { float preXScale; float preYScale; float inheritedXScale; float inheritedYScale; float presShellResolution; bool scaleToResolution; + bool forceDispatchToContentRegion; // This is a bare pointer; LayerTransactionParent::RecvUpdate prevents this // from being used when !IsSameProcess(), but we should make this truly // cross process at some point by passing the HMDConfig uint64_t hmdInfo; }; struct ColorLayerAttributes { LayerColor color; nsIntRect bounds; }; struct CanvasLayerAttributes { GraphicsFilterType filter; nsIntRect bounds; }; struct RefLayerAttributes { int64_t id; };
--- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -582,18 +582,17 @@ nsDisplayListBuilder::nsDisplayListBuild mAllowMergingAndFlattening(true), mWillComputePluginGeometry(false), mInTransform(false), mIsInChromePresContext(false), mSyncDecodeImages(false), mIsPaintingToWindow(false), mIsCompositingCheap(false), mContainsPluginItem(false), - mAncestorHasTouchEventHandler(false), - mAncestorHasScrollEventHandler(false), + mAncestorHasApzAwareEventHandler(false), mHaveScrollableDisplayPort(false), mWindowDraggingAllowed(false), mIsBuildingForPopup(nsLayoutUtils::IsPopup(aReferenceFrame)) { MOZ_COUNT_CTOR(nsDisplayListBuilder); PL_InitArenaPool(&mPool, "displayListArena", 1024, std::max(NS_ALIGNMENT_OF(void*),NS_ALIGNMENT_OF(double))-1); RecomputeCurrentAnimatedGeometryRoot(); @@ -1625,16 +1624,19 @@ already_AddRefed<LayerManager> nsDisplay layerManager->SetUserData(&gLayerManagerLayerBuilder, oldBuilder); return nullptr; } // Root is being scaled up by the X/Y resolution. Scale it back down. root->SetPostScale(1.0f/containerParameters.mXScale, 1.0f/containerParameters.mYScale); root->SetScaleToResolution(presShell->ScaleToResolution(), containerParameters.mXScale); + root->SetForceDispatchToContentRegion( + aBuilder->IsBuildingLayerEventRegions() && + nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(presShell)); if (gfxPrefs::LayoutUseContainersForRootFrames()) { bool isRoot = presContext->IsRootContentDocument(); nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame(); nsRect viewport(aBuilder->ToReferenceFrame(frame), frame->GetSize()); @@ -3146,19 +3148,17 @@ nsDisplayLayerEventRegions::AddFrame(nsD } } if (borderBoxHasRoundedCorners || (aFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT)) { mMaybeHitRegion.Or(mMaybeHitRegion, borderBox); } else { mHitRegion.Or(mHitRegion, borderBox); } - if (aBuilder->GetAncestorHasTouchEventHandler() || - aBuilder->GetAncestorHasScrollEventHandler()) - { + if (aBuilder->GetAncestorHasApzAwareEventHandler()) { mDispatchToContentHitRegion.Or(mDispatchToContentHitRegion, borderBox); } } void nsDisplayLayerEventRegions::AddInactiveScrollPort(const nsRect& aRect) { mDispatchToContentHitRegion.Or(mDispatchToContentHitRegion, aRect); @@ -4059,16 +4059,19 @@ nsDisplayOwnLayer::BuildLayer(nsDisplayL nsDisplaySubDocument::nsDisplaySubDocument(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, nsDisplayList* aList, uint32_t aFlags) : nsDisplayOwnLayer(aBuilder, aFrame, aList, aFlags) , mScrollParentId(aBuilder->GetCurrentScrollParentId()) { MOZ_COUNT_CTOR(nsDisplaySubDocument); + mForceDispatchToContentRegion = + aBuilder->IsBuildingLayerEventRegions() && + nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(aFrame->PresContext()->PresShell()); } #ifdef NS_BUILD_REFCNT_LOGGING nsDisplaySubDocument::~nsDisplaySubDocument() { MOZ_COUNT_DTOR(nsDisplaySubDocument); } #endif @@ -4080,17 +4083,19 @@ nsDisplaySubDocument::BuildLayer(nsDispl nsIFrame* rootScrollFrame = presContext->PresShell()->GetRootScrollFrame(); ContainerLayerParameters params = aContainerParameters; if ((mFlags & GENERATE_SCROLLABLE_LAYER) && rootScrollFrame->GetContent() && nsLayoutUtils::GetCriticalDisplayPort(rootScrollFrame->GetContent(), nullptr)) { params.mInLowPrecisionDisplayPort = true; } - return nsDisplayOwnLayer::BuildLayer(aBuilder, aManager, params); + nsRefPtr<Layer> layer = nsDisplayOwnLayer::BuildLayer(aBuilder, aManager, params); + layer->AsContainerLayer()->SetForceDispatchToContentRegion(mForceDispatchToContentRegion); + return layer.forget(); } UniquePtr<FrameMetrics> nsDisplaySubDocument::ComputeFrameMetrics(Layer* aLayer, const ContainerLayerParameters& aContainerParameters) { if (!(mFlags & GENERATE_SCROLLABLE_LAYER)) { return UniquePtr<FrameMetrics>(nullptr);
--- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -340,25 +340,20 @@ public: { return (gfxPrefs::LayoutEventRegionsEnabled() && mMode == PAINTING); } bool IsInsidePointerEventsNoneDoc() { return CurrentPresShellState()->mInsidePointerEventsNoneDoc; } - bool GetAncestorHasTouchEventHandler() { return mAncestorHasTouchEventHandler; } - void SetAncestorHasTouchEventHandler(bool aValue) + bool GetAncestorHasApzAwareEventHandler() { return mAncestorHasApzAwareEventHandler; } + void SetAncestorHasApzAwareEventHandler(bool aValue) { - mAncestorHasTouchEventHandler = aValue; - } - bool GetAncestorHasScrollEventHandler() { return mAncestorHasScrollEventHandler; } - void SetAncestorHasScrollEventHandler(bool aValue) - { - mAncestorHasScrollEventHandler = aValue; + mAncestorHasApzAwareEventHandler = aValue; } bool HaveScrollableDisplayPort() const { return mHaveScrollableDisplayPort; } void SetHaveScrollableDisplayPort() { mHaveScrollableDisplayPort = true; } bool SetIsCompositingCheap(bool aCompositingCheap) { bool temp = mIsCompositingCheap; mIsCompositingCheap = aCompositingCheap; @@ -573,18 +568,17 @@ public: : mBuilder(aBuilder), mPrevFrame(aBuilder->mCurrentFrame), mPrevReferenceFrame(aBuilder->mCurrentReferenceFrame), mPrevAnimatedGeometryRoot(mBuilder->mCurrentAnimatedGeometryRoot), mPrevLayerEventRegions(aBuilder->mLayerEventRegions), mPrevOffset(aBuilder->mCurrentOffsetToReferenceFrame), mPrevDirtyRect(aBuilder->mDirtyRect), mPrevIsAtRootOfPseudoStackingContext(aBuilder->mIsAtRootOfPseudoStackingContext), - mPrevAncestorHasTouchEventHandler(aBuilder->mAncestorHasTouchEventHandler), - mPrevAncestorHasScrollEventHandler(aBuilder->mAncestorHasScrollEventHandler) + mPrevAncestorHasApzAwareEventHandler(aBuilder->mAncestorHasApzAwareEventHandler) { if (aForChild->IsTransformed()) { aBuilder->mCurrentOffsetToReferenceFrame = nsPoint(); aBuilder->mCurrentReferenceFrame = aForChild; } else if (aBuilder->mCurrentFrame == aForChild->GetParent()) { aBuilder->mCurrentOffsetToReferenceFrame += aForChild->GetPosition(); } else { aBuilder->mCurrentReferenceFrame = @@ -619,31 +613,29 @@ public: } ~AutoBuildingDisplayList() { mBuilder->mCurrentFrame = mPrevFrame; mBuilder->mCurrentReferenceFrame = mPrevReferenceFrame; mBuilder->mLayerEventRegions = mPrevLayerEventRegions; mBuilder->mCurrentOffsetToReferenceFrame = mPrevOffset; mBuilder->mDirtyRect = mPrevDirtyRect; mBuilder->mIsAtRootOfPseudoStackingContext = mPrevIsAtRootOfPseudoStackingContext; - mBuilder->mAncestorHasTouchEventHandler = mPrevAncestorHasTouchEventHandler; - mBuilder->mAncestorHasScrollEventHandler = mPrevAncestorHasScrollEventHandler; + mBuilder->mAncestorHasApzAwareEventHandler = mPrevAncestorHasApzAwareEventHandler; mBuilder->mCurrentAnimatedGeometryRoot = mPrevAnimatedGeometryRoot; } private: nsDisplayListBuilder* mBuilder; const nsIFrame* mPrevFrame; const nsIFrame* mPrevReferenceFrame; nsIFrame* mPrevAnimatedGeometryRoot; nsDisplayLayerEventRegions* mPrevLayerEventRegions; nsPoint mPrevOffset; nsRect mPrevDirtyRect; bool mPrevIsAtRootOfPseudoStackingContext; - bool mPrevAncestorHasTouchEventHandler; - bool mPrevAncestorHasScrollEventHandler; + bool mPrevAncestorHasApzAwareEventHandler; }; /** * A helper class to temporarily set the value of mInTransform. */ class AutoInTransformSetter; friend class AutoInTransformSetter; class AutoInTransformSetter { @@ -915,18 +907,17 @@ private: // True when we're building a display list that's directly or indirectly // under an nsDisplayTransform bool mInTransform; bool mIsInChromePresContext; bool mSyncDecodeImages; bool mIsPaintingToWindow; bool mIsCompositingCheap; bool mContainsPluginItem; - bool mAncestorHasTouchEventHandler; - bool mAncestorHasScrollEventHandler; + bool mAncestorHasApzAwareEventHandler; // True when the first async-scrollable scroll frame for which we build a // display list has a display port. An async-scrollable scroll frame is one // which WantsAsyncScroll(). bool mHaveScrollableDisplayPort; bool mWindowDraggingAllowed; bool mIsBuildingForPopup; }; @@ -3040,16 +3031,17 @@ public: NS_DISPLAY_DECL_NAME("SubDocument", TYPE_SUBDOCUMENT) mozilla::UniquePtr<FrameMetrics> ComputeFrameMetrics(Layer* aLayer, const ContainerLayerParameters& aContainerParameters); protected: ViewID mScrollParentId; + bool mForceDispatchToContentRegion; }; /** * A display item for subdocuments to capture the resolution from the presShell * and ensure that it gets applied to all the right elements. This item creates * a container layer. */ class nsDisplayResolution : public nsDisplaySubDocument {
--- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -15,16 +15,17 @@ #include "nsCharTraits.h" #include "nsFontMetrics.h" #include "nsPresContext.h" #include "nsIContent.h" #include "nsIDOMHTMLDocument.h" #include "nsIDOMHTMLElement.h" #include "nsFrameList.h" #include "nsGkAtoms.h" +#include "nsHtml5Atoms.h" #include "nsIAtom.h" #include "nsCSSPseudoElements.h" #include "nsCSSAnonBoxes.h" #include "nsCSSColorUtils.h" #include "nsView.h" #include "nsViewManager.h" #include "nsPlaceholderFrame.h" #include "nsIScrollableFrame.h" @@ -7833,8 +7834,39 @@ nsLayoutUtils::SetBSizeFromFontMetrics(c } else { NS_WARNING("Cannot get font metrics - defaulting sizes to 0"); aMetrics.SetBlockStartAscent(aMetrics.BSize(aLineWM) = 0); } aMetrics.SetBlockStartAscent(aMetrics.BlockStartAscent() + aFramePadding.BStart(aFrameWM)); aMetrics.BSize(aLineWM) += aFramePadding.BStartEnd(aFrameWM); } + +/* static */ bool +nsLayoutUtils::HasApzAwareListeners(EventListenerManager* aElm) +{ + if (!aElm) { + return false; + } + return aElm->HasListenersFor(nsGkAtoms::ontouchstart) || + aElm->HasListenersFor(nsGkAtoms::ontouchmove) || + aElm->HasListenersFor(nsGkAtoms::onwheel) || + aElm->HasListenersFor(nsGkAtoms::onDOMMouseScroll) || + aElm->HasListenersFor(nsHtml5Atoms::onmousewheel); +} + +/* static */ bool +nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(nsIPresShell* aShell) +{ + if (nsIDocument* doc = aShell->GetDocument()) { + WidgetEvent event(true, NS_EVENT_NULL); + nsTArray<EventTarget*> targets; + nsresult rv = EventDispatcher::Dispatch(doc, nullptr, &event, nullptr, + nullptr, nullptr, &targets); + NS_ENSURE_SUCCESS(rv, false); + for (size_t i = 0; i < targets.Length(); i++) { + if (HasApzAwareListeners(targets[i]->GetExistingListenerManager())) { + return true; + } + } + } + return false; +}
--- a/layout/base/nsLayoutUtils.h +++ b/layout/base/nsLayoutUtils.h @@ -58,16 +58,17 @@ class nsPIDOMWindow; class imgIRequest; class nsIDocument; struct gfxPoint; struct nsStyleFont; struct nsStyleImageOrientation; struct nsOverflowAreas; namespace mozilla { +class EventListenerManager; class SVGImageContext; struct IntrinsicSize; struct ContainerLayerParameters; class WritingMode; namespace dom { class DOMRectList; class Element; class HTMLImageElement; @@ -2546,16 +2547,19 @@ public: static bool IsOutlineStyleAutoEnabled(); static void SetBSizeFromFontMetrics(const nsIFrame* aFrame, nsHTMLReflowMetrics& aMetrics, const mozilla::LogicalMargin& aFramePadding, mozilla::WritingMode aLineWM, mozilla::WritingMode aFrameWM); + static bool HasApzAwareListeners(mozilla::EventListenerManager* aElm); + static bool HasDocumentLevelListenersForApzAwareEvents(nsIPresShell* aShell); + private: static uint32_t sFontSizeInflationEmPerLine; static uint32_t sFontSizeInflationMinTwips; static uint32_t sFontSizeInflationLineThreshold; static int32_t sFontSizeInflationMappingIntercept; static uint32_t sFontSizeInflationMaxRatio; static bool sFontSizeInflationForceEnabled; static bool sFontSizeInflationDisabledInMasterProcess;
--- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -1904,28 +1904,18 @@ public: static void CheckForApzAwareEventHandlers(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame) { nsIContent* content = aFrame->GetContent(); if (!content) { return; } EventListenerManager* elm = nsContentUtils::GetExistingListenerManagerForNode(content); - if (!elm) { - return; - } - if (elm->HasListenersFor(nsGkAtoms::ontouchstart) || - elm->HasListenersFor(nsGkAtoms::ontouchmove)) { - aBuilder->SetAncestorHasTouchEventHandler(true); - } - if (elm->HasListenersFor(nsGkAtoms::onwheel) || - elm->HasListenersFor(nsGkAtoms::onDOMMouseScroll) || - elm->HasListenersFor(nsHtml5Atoms::onmousewheel)) - { - aBuilder->SetAncestorHasScrollEventHandler(true); + if (nsLayoutUtils::HasApzAwareListeners(elm)) { + aBuilder->SetAncestorHasApzAwareEventHandler(true); } } void nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, nsDisplayList* aList) { if (GetStateBits() & NS_FRAME_TOO_DEEP_IN_FRAME_TREE)
--- a/layout/generic/nsSubDocumentFrame.cpp +++ b/layout/generic/nsSubDocumentFrame.cpp @@ -482,18 +482,17 @@ nsSubDocumentFrame::BuildDisplayList(nsD if (subdocRootFrame) { nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame(); nsDisplayListBuilder::AutoCurrentScrollParentIdSetter idSetter( aBuilder, ignoreViewportScrolling && rootScrollFrame && rootScrollFrame->GetContent() ? nsLayoutUtils::FindOrCreateIDFor(rootScrollFrame->GetContent()) : aBuilder->GetCurrentScrollParentId()); - aBuilder->SetAncestorHasTouchEventHandler(false); - aBuilder->SetAncestorHasScrollEventHandler(false); + aBuilder->SetAncestorHasApzAwareEventHandler(false); subdocRootFrame-> BuildDisplayListForStackingContext(aBuilder, dirty, &childItems); } if (!aBuilder->IsForEventDelivery()) { // If we are going to use a displayzoom below then any items we put under // it need to have underlying frames from the subdocument. So we need to // calculate the bounds based on which frame will be the underlying frame
--- a/layout/ipc/RenderFrameParent.cpp +++ b/layout/ipc/RenderFrameParent.cpp @@ -610,25 +610,39 @@ RenderFrameParent::TakeFocusForClick() } fm->SetFocus(element, nsIFocusManager::FLAG_BYMOUSE | nsIFocusManager::FLAG_NOSCROLL); } } // namespace layout } // namespace mozilla +nsDisplayRemote::nsDisplayRemote(nsDisplayListBuilder* aBuilder, + nsIFrame* aFrame, + RenderFrameParent* aRemoteFrame) + : nsDisplayItem(aBuilder, aFrame) + , mRemoteFrame(aRemoteFrame) +{ + mForceDispatchToContentRegion = + aBuilder->IsBuildingLayerEventRegions() && + nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(aFrame->PresContext()->PresShell()); +} + already_AddRefed<Layer> nsDisplayRemote::BuildLayer(nsDisplayListBuilder* aBuilder, LayerManager* aManager, const ContainerLayerParameters& aContainerParameters) { int32_t appUnitsPerDevPixel = mFrame->PresContext()->AppUnitsPerDevPixel(); nsIntRect visibleRect = GetVisibleRect().ToNearestPixels(appUnitsPerDevPixel); visibleRect += aContainerParameters.mOffset; nsRefPtr<Layer> layer = mRemoteFrame->BuildLayer(aBuilder, mFrame, aManager, visibleRect, this, aContainerParameters); + if (layer && layer->AsContainerLayer()) { + layer->AsContainerLayer()->SetForceDispatchToContentRegion(mForceDispatchToContentRegion); + } return layer.forget(); } void nsDisplayRemote::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect, HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames) { if (mRemoteFrame->HitTest(aRect)) {
--- a/layout/ipc/RenderFrameParent.h +++ b/layout/ipc/RenderFrameParent.h @@ -161,20 +161,17 @@ private: * process's layer tree. */ class nsDisplayRemote : public nsDisplayItem { typedef mozilla::layout::RenderFrameParent RenderFrameParent; public: nsDisplayRemote(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, - RenderFrameParent* aRemoteFrame) - : nsDisplayItem(aBuilder, aFrame) - , mRemoteFrame(aRemoteFrame) - {} + RenderFrameParent* aRemoteFrame); virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder, LayerManager* aManager, const ContainerLayerParameters& aParameters) MOZ_OVERRIDE { return mozilla::LAYER_ACTIVE_FORCE; } virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder, LayerManager* aManager, @@ -182,12 +179,13 @@ public: void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect, HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames) MOZ_OVERRIDE; NS_DISPLAY_DECL_NAME("Remote", TYPE_REMOTE) private: RenderFrameParent* mRemoteFrame; + bool mForceDispatchToContentRegion; }; #endif // mozilla_layout_RenderFrameParent_h
--- a/testing/docker/phone-builder/Dockerfile +++ b/testing/docker/phone-builder/Dockerfile @@ -1,9 +1,9 @@ -FROM quay.io/mozilla/builder:0.0.29 +FROM quay.io/mozilla/builder:0.2.6 MAINTAINER Wander Lairson Costa <wcosta@mozilla.com> # Add utilities and configuration ADD bin /home/worker/bin ADD config /home/worker/.aws/config ADD system-setup.sh /tmp/system-setup.sh RUN /tmp/system-setup.sh
--- a/testing/docker/phone-builder/VERSION +++ b/testing/docker/phone-builder/VERSION @@ -1,1 +1,1 @@ -0.0.7 +0.0.8
--- a/testing/docker/phone-builder/bin/build-phone.sh +++ b/testing/docker/phone-builder/bin/build-phone.sh @@ -24,16 +24,18 @@ if [ ! -d mozharness ]; then fi OBJDIR="$HOME/object-folder" if [ ! -d $OBJDIR ]; then mkdir -p $OBJDIR fi +# Figure out where the remote manifest is so we can use caches for it. +MANIFEST=$(repository-url.py $GECKO_HEAD_REPOSITORY $GECKO_HEAD_REV b2g/config/$TARGET/sources.xml) tc-vcs repo-checkout $OBJDIR/B2G https://git.mozilla.org/b2g/B2G.git $MANIFEST debug_flag="" if [ 0$B2G_DEBUG -ne 0 ]; then debug_flag='--debug' fi backup_file=$(aws --output=text s3 ls s3://b2g-phone-backups/$TARGET/ | tail -1 | awk '{print $NF}')
--- a/testing/taskcluster/mach_commands.py +++ b/testing/taskcluster/mach_commands.py @@ -310,16 +310,20 @@ class Graph(object): test_parameters['build_url'] = build_url test_parameters['tests_url'] = tests_url test_parameters['total_chunks'] = 1 if 'chunks' in test: test_parameters['total_chunks'] = test['chunks'] for chunk in range(1, test_parameters['total_chunks'] + 1): + if 'only_chunks' in test and \ + chunk not in test['only_chunks']: + continue; + test_parameters['chunk'] = chunk test_task = templates.load(test['task'], test_parameters) test_task['taskId'] = slugid() if 'requires' not in test_task: test_task['requires'] = [] test_task['requires'].append(test_parameters['build_slugid'])
--- a/testing/taskcluster/taskcluster_graph/commit_parser.py +++ b/testing/taskcluster/taskcluster_graph/commit_parser.py @@ -1,20 +1,22 @@ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. +import argparse +import copy +import functools +import re import shlex -import argparse -import functools -import copy from try_test_parser import parse_test_opts -TRY_DELIMITER='try:' +TRY_DELIMITER = 'try:' +TEST_CHUNK_SUFFIX = re.compile('(.*)-([0-9]+)$') # The build type aliases are very cryptic and only used in try flags these are # mappings from the single char alias to a longer more recognizable form. BUILD_TYPE_ALIASES = { 'o': 'opt', 'd': 'debug' } @@ -54,19 +56,51 @@ def normalize_test_list(all_tests, job_l results = [] all_entry = tests[0] for test in all_tests: entry = { 'test': test } # If there are platform restrictions copy them across the list. if 'platforms' in all_entry: entry['platforms'] = list(all_entry['platforms']) results.append(entry) - return results + return parse_test_chunks(results) else: - return tests + return parse_test_chunks(tests) + +def parse_test_chunks(tests): + ''' + Test flags may include parameters to narrow down the number of chunks in a + given push. We don't model 1 chunk = 1 job in taskcluster so we must check + each test flag to see if it is actually specifying a chunk. + + :param list tests: Result from normalize_test_list + :returns: List of jobs + ''' + + results = [] + seen_chunks = {} + for test in tests: + matches = TEST_CHUNK_SUFFIX.match(test['test']) + + if not matches: + results.append(test) + continue + + name = matches.group(1) + chunk = int(matches.group(2)) + + if name in seen_chunks: + seen_chunks[name].add(chunk) + else: + seen_chunks[name] = set([chunk]) + test['test'] = name + test['only_chunks'] = seen_chunks[name] + results.append(test) + + return results; def extract_tests_from_platform(test_jobs, build_platform, build_task, tests): ''' Build the list of tests from the current build. :param dict test_jobs: Entire list of tests (from job_flags.yml). :param dict build_platform: Current build platform. :param str build_task: Build task path. @@ -99,17 +133,28 @@ def extract_tests_from_platform(test_job # then we must skip this set. common_platforms = set(test_entry['platforms']) & set(build_platform['platforms']) if not common_platforms: # Tests should not run on this platform... continue # Add the job to the list and ensure to copy it so we don't accidentally # mutate the state of the test job in the future... - results.append(copy.deepcopy(test_job)) + specific_test_job = copy.deepcopy(test_job) + + # Update the task configuration for all tests in the matrix... + for build_name in specific_test_job: + for test_task_name in specific_test_job[build_name]: + test_task = specific_test_job[build_name][test_task_name] + # Copy over the chunk restrictions if given... + if 'only_chunks' in test_entry: + test_task['only_chunks'] = \ + copy.copy(test_entry['only_chunks']) + + results.append(specific_test_job) return results ''' This module exists to deal with parsing the options flags that try uses. We do not try to build a graph or anything here but match up build flags to tasks via the "jobs" datastructure (see job_flags.yml) '''
--- a/testing/taskcluster/tests/test_commit_parser.py +++ b/testing/taskcluster/tests/test_commit_parser.py @@ -338,16 +338,72 @@ class TestCommitParser(unittest.TestCase ], 'additional-parameters': {} } ] result = parse_commit(commit, jobs) self.assertEqual(expected, result) + def test_specific_chunks(self): + ''' + This test covers specifying specific chunks for a given test suite. + ''' + commit = 'try: -b o -p linux -u mochitest-1,mochitest-2 -t none' + jobs = { + 'flags': { + 'builds': ['linux'], + 'tests': ['mochitest'], + }, + 'builds': { + 'linux': { + 'types': { + 'opt': { + 'task': 'task/linux', + }, + 'debug': { + 'task': 'task/linux-debug' + } + } + }, + }, + 'tests': { + 'mochitest': { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/mochitest', + 'chunks': 5 + }, + } + } + } + } + + expected = [ + { + 'task': 'task/linux', + 'dependents': [ + { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/mochitest', + 'chunks': 5, + 'only_chunks': set([1, 2]) + }, + } + } + ], + 'additional-parameters': {} + } + ] + result = parse_commit(commit, jobs) + self.assertEqual(expected, result) + + + def test_commit_with_builds_and_tests(self): ''' This test covers the broad case of a commit which has both builds and tests without any exclusions or other fancy logic. ''' commit = 'try: -b od -p linux,linux64 -u web-platform-tests -t none' jobs = { 'flags': {
--- a/widget/nsBaseWidget.cpp +++ b/widget/nsBaseWidget.cpp @@ -945,19 +945,22 @@ nsBaseWidget::DispatchEventForAPZ(Widget // and EventStateManager did not route the event into the child process. // It's safe to communicate to APZ that the event has been processed. // need a local var to disambiguate between the SetTargetAPZC overloads. void (APZCTreeManager::*setTargetApzcFunc)(uint64_t, const ScrollableLayerGuid&) = &APZCTreeManager::SetTargetAPZC; APZThreadUtils::RunOnControllerThread(NewRunnableMethod( mAPZC.get(), setTargetApzcFunc, aInputBlockId, aGuid)); + bool defaultPrevented = aEvent->AsTouchEvent() + ? (nsIPresShell::gPreventMouseEvents || aEvent->mFlags.mMultipleActionsPrevented) + : aEvent->mFlags.mDefaultPrevented; APZThreadUtils::RunOnControllerThread(NewRunnableMethod( mAPZC.get(), &APZCTreeManager::ContentReceivedInputBlock, aInputBlockId, - aEvent->mFlags.mDefaultPrevented)); + defaultPrevented)); } return status; } void nsBaseWidget::GetPreferredCompositorBackends(nsTArray<LayersBackend>& aHints) {