From 42c4a2ac773ef0f33831b5dd2a2e109f30118bcf Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 01:41:25 -0800 Subject: [PATCH 01/37] Bumping gaia.json for 2 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/f07673802f2d Author: Jose Antonio Olivera Ortega Desc: Merge pull request #13504 from jaoo/927486 Bug 927486 - [Settings] Modify Message settings category. r=arthurcc ======== https://hg.mozilla.org/integration/gaia-central/rev/7be0e40410a4 Author: Jose Antonio Olivera Ortega Desc: Bug 927486 - [Settings] Modify Message settings category --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 553ec0c8c8b..4d86ffbaf57 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "6ce2fe088a1113ac761dfa1f6a6a09fb7f38f787", + "revision": "f07673802f2dcdd2a797b21294a6b37dadb253fd", "repo_path": "/integration/gaia-central" } From 33cb5325c2adb1eb8eace51f9ffb3361c7a6f658 Mon Sep 17 00:00:00 2001 From: Georgia Wang Date: Thu, 24 Oct 2013 12:06:40 +0800 Subject: [PATCH 02/37] Bug 921322 - Part1: Add "searchForNextTag" in StkProactiveCmdHelper. r=yoshi --- dom/system/gonk/ril_worker.js | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/dom/system/gonk/ril_worker.js b/dom/system/gonk/ril_worker.js index 7d66a0894ce..1b2b1155d7b 100644 --- a/dom/system/gonk/ril_worker.js +++ b/dom/system/gonk/ril_worker.js @@ -9905,20 +9905,19 @@ let StkCommandParamsFactory = { processSetupCall: function processSetupCall(cmdDetails, ctlvs) { let call = {}; + let iter = Iterator(ctlvs); - for (let i = 0; i < ctlvs.length; i++) { - let ctlv = ctlvs[i]; - if (ctlv.tag == COMPREHENSIONTLV_TAG_ALPHA_ID) { - if (!call.confirmMessage) { - call.confirmMessage = ctlv.value.identifier; - } else { - call.callMessage = ctlv.value.identifier; - break; - } - } + let ctlv = StkProactiveCmdHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); + if (ctlv) { + call.confirmMessage = ctlv.value.identifier; } - let ctlv = StkProactiveCmdHelper.searchForTag(COMPREHENSIONTLV_TAG_ADDRESS, ctlvs); + ctlv = StkProactiveCmdHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); + if (ctlv) { + call.callMessage = ctlv.value.identifier; + } + + ctlv = StkProactiveCmdHelper.searchForTag(COMPREHENSIONTLV_TAG_ADDRESS, ctlvs); if (!ctlv) { RIL.sendStkTerminalResponse({ command: cmdDetails, @@ -10430,8 +10429,12 @@ let StkProactiveCmdHelper = { }, searchForTag: function searchForTag(tag, ctlvs) { - for (let i = 0; i < ctlvs.length; i++) { - let ctlv = ctlvs[i]; + let iter = Iterator(ctlvs); + return this.searchForNextTag(tag, iter); + }, + + searchForNextTag: function searchForNextTag(tag, iter) { + for (let [index, ctlv] in iter) { if ((ctlv.tag & ~COMPREHENSIONTLV_FLAG_CR) == tag) { return ctlv; } From baf4418943e5099f7c22ffe41dc680e2d2be3ea6 Mon Sep 17 00:00:00 2001 From: Georgia Wang Date: Tue, 29 Oct 2013 16:32:18 +0800 Subject: [PATCH 03/37] Bug 921322 - Part2: xpcshell test for searchForNextTag. r=yoshi --- dom/system/gonk/tests/test_ril_worker_stk.js | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/dom/system/gonk/tests/test_ril_worker_stk.js b/dom/system/gonk/tests/test_ril_worker_stk.js index 214921bfe7b..9af66856203 100644 --- a/dom/system/gonk/tests/test_ril_worker_stk.js +++ b/dom/system/gonk/tests/test_ril_worker_stk.js @@ -342,6 +342,47 @@ add_test(function test_write_length() { }); // Test Proactive commands. +/** + * Verify Proactive command helper : searchForNextTag + */ +add_test(function test_stk_proactive_command_search_next_tag() { + let worker = newUint8Worker(); + let pduHelper = worker.GsmPDUHelper; + let berHelper = worker.BerTlvHelper; + let stkHelper = worker.StkProactiveCmdHelper; + + let tag_test = [ + 0xD0, + 0x3C, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x31, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x32, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x33, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x34, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x35]; + + for (let i = 0; i < tag_test.length; i++) { + pduHelper.writeHexOctet(tag_test[i]); + } + + let berTlv = berHelper.decode(tag_test.length); + let iter = Iterator(berTlv.value); + let tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); + do_check_eq(tlv.value.identifier, "alpha id 1"); + + tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); + do_check_eq(tlv.value.identifier, "alpha id 2"); + + tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); + do_check_eq(tlv.value.identifier, "alpha id 3"); + + tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); + do_check_eq(tlv.value.identifier, "alpha id 4"); + + tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); + do_check_eq(tlv.value.identifier, "alpha id 5"); + + run_next_test(); +}); /** * Verify Proactive Command : Refresh From 1e86e2b539673becf2a9f0e46ebfe61c2a458318 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 01:55:26 -0800 Subject: [PATCH 04/37] Bumping gaia.json for 2 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/59dfb682808c Author: gasolin Desc: Merge pull request #13277 from MBRSL/bug-931726-gUM bug - 931726 [HW test] change recording test to gUM test, r=gasolin ======== https://hg.mozilla.org/integration/gaia-central/rev/3fe0f100e1b6 Author: Tom Jao Desc: Bug 931726 - [HW test] change recording test to gUM test, remove audioloop test --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 4d86ffbaf57..afdf789cce7 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "f07673802f2dcdd2a797b21294a6b37dadb253fd", + "revision": "59dfb682808c843082fef49fbfd98a5b0b599000", "repo_path": "/integration/gaia-central" } From 1401cfd37d1b998ae9e425b3a73d3bb5133b9f70 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 02:05:25 -0800 Subject: [PATCH 05/37] Bumping gaia.json for 2 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/d2dbb99dd87c Author: Timothy Guan-tin Chien Desc: Merge pull request #13498 from timdream/keyboard-preload Bug 936349 - Correct keyboard manager start-up, r=rudyl ======== https://hg.mozilla.org/integration/gaia-central/rev/72e5af4570b1 Author: Timothy Guan-tin Chien Desc: Bug 936349 - Correct keyboard manager start-up --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index afdf789cce7..0a891b298b8 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "59dfb682808c843082fef49fbfd98a5b0b599000", + "revision": "d2dbb99dd87cf0ce355ff7f4bb5492247eb9ec06", "repo_path": "/integration/gaia-central" } From b61fdc469330dbdd12c0629ad005a1a0272ccd8b Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 02:30:24 -0800 Subject: [PATCH 06/37] Bumping gaia.json for 2 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/e4179e43038b Author: Fernando Campo Desc: Merge pull request #13238 from fcampo/exported-label-translate-929552 Bug 929552 - Footer message is not translated (r=pike,arcturus) ======== https://hg.mozilla.org/integration/gaia-central/rev/cb6dee968ed6 Author: Fernando Campo Desc: Bug 929552 - Footer message is not translated --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 0a891b298b8..f2da5f85c77 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "d2dbb99dd87cf0ce355ff7f4bb5492247eb9ec06", + "revision": "e4179e43038bdb3ea8cb8d5eb682fcd37a703eb4", "repo_path": "/integration/gaia-central" } From 019be0b8d8cabd40cb9e0b40bdca39a18438da99 Mon Sep 17 00:00:00 2001 From: Vicamo Yang Date: Fri, 8 Nov 2013 18:38:16 +0800 Subject: [PATCH 07/37] Bug 936359 - Honor the DEBUG flag in RilContentHelper.js. r=hsinyi --- dom/system/gonk/RILContentHelper.js | 30 ++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/dom/system/gonk/RILContentHelper.js b/dom/system/gonk/RILContentHelper.js index 5502c0cca9b..a66c9fd4802 100644 --- a/dom/system/gonk/RILContentHelper.js +++ b/dom/system/gonk/RILContentHelper.js @@ -450,7 +450,7 @@ function RILContentHelper() { this.updateDebugFlag(); this.numClients = gNumRadioInterfaces; - debug("Number of clients: " + this.numClients); + if (DEBUG) debug("Number of clients: " + this.numClients); this.rilContexts = []; this.voicemailInfos = []; @@ -605,7 +605,7 @@ RILContentHelper.prototype = { let rilContext = cpmm.sendSyncMessage("RIL:GetRilContext", {clientId: cId})[0]; if (!rilContext) { - debug("Received null rilContext from chrome process."); + if (DEBUG) debug("Received null rilContext from chrome process."); continue; } this.rilContexts[cId].cardState = rilContext.cardState; @@ -910,7 +910,7 @@ RILContentHelper.prototype = { }, sendMMI: function sendMMI(clientId, window, mmi) { - debug("Sending MMI " + mmi); + if (DEBUG) debug("Sending MMI " + mmi); if (!window) { throw Components.Exception("Can't get window object", Cr.NS_ERROR_UNEXPECTED); @@ -932,7 +932,7 @@ RILContentHelper.prototype = { }, cancelMMI: function cancelMMI(clientId, window) { - debug("Cancel MMI"); + if (DEBUG) debug("Cancel MMI"); if (!window) { throw Components.Exception("Can't get window object", Cr.NS_ERROR_UNEXPECTED); @@ -1443,7 +1443,7 @@ RILContentHelper.prototype = { }, registerMobileConnectionMsg: function registerMobileConnectionMsg(clientId, listener) { - debug("Registering for mobile connection related messages"); + if (DEBUG) debug("Registering for mobile connection related messages"); this.registerListener("_mobileConnectionListeners", clientId, listener); cpmm.sendAsyncMessage("RIL:RegisterMobileConnectionMsg"); }, @@ -1453,7 +1453,7 @@ RILContentHelper.prototype = { }, registerVoicemailMsg: function registerVoicemailMsg(listener) { - debug("Registering for voicemail-related messages"); + if (DEBUG) debug("Registering for voicemail-related messages"); // To follow the listener registration scheme, we add a dummy clientId 0. // All voicemail events are routed to listener for client id 0. // See |handleVoicemailNotification|. @@ -1469,7 +1469,7 @@ RILContentHelper.prototype = { }, registerCellBroadcastMsg: function registerCellBroadcastMsg(listener) { - debug("Registering for Cell Broadcast related messages"); + if (DEBUG) debug("Registering for Cell Broadcast related messages"); //TODO: Bug 921326 - Cellbroadcast API: support multiple sim cards this.registerListener("_cellBroadcastListeners", 0, listener); cpmm.sendAsyncMessage("RIL:RegisterCellBroadcastMsg"); @@ -1481,7 +1481,7 @@ RILContentHelper.prototype = { }, registerIccMsg: function registerIccMsg(clientId, listener) { - debug("Registering for ICC related messages"); + if (DEBUG) debug("Registering for ICC related messages"); this.registerListener("_iccListeners", clientId, listener); cpmm.sendAsyncMessage("RIL:RegisterIccMsg"); }, @@ -1574,7 +1574,9 @@ RILContentHelper.prototype = { receiveMessage: function receiveMessage(msg) { let request; - debug("Received message '" + msg.name + "': " + JSON.stringify(msg.json)); + if (DEBUG) { + debug("Received message '" + msg.name + "': " + JSON.stringify(msg.json)); + } let data = msg.json.data; let clientId = msg.json.clientId; @@ -1783,9 +1785,11 @@ RILContentHelper.prototype = { }, handleGetAvailableNetworks: function handleGetAvailableNetworks(message) { - debug("handleGetAvailableNetworks: " + JSON.stringify(message)); + if (DEBUG) debug("handleGetAvailableNetworks: " + JSON.stringify(message)); if (message.errorMsg) { - debug("Received error from getAvailableNetworks: " + message.errorMsg); + if (DEBUG) { + debug("Received error from getAvailableNetworks: " + message.errorMsg); + } this.fireRequestError(message.requestId, message.errorMsg); return; } @@ -1946,7 +1950,7 @@ RILContentHelper.prototype = { }, handleSendCancelMMI: function handleSendCancelMMI(message) { - debug("handleSendCancelMMI " + JSON.stringify(message)); + if (DEBUG) debug("handleSendCancelMMI " + JSON.stringify(message)); let request = this.takeRequest(message.requestId); let requestWindow = this._windowsMap[message.requestId]; delete this._windowsMap[message.requestId]; @@ -2013,7 +2017,7 @@ RILContentHelper.prototype = { try { handler.apply(listener, args); } catch (e) { - debug("listener for " + name + " threw an exception: " + e); + if (DEBUG) debug("listener for " + name + " threw an exception: " + e); } } }, From 92bd65cb3b9d62d88b0c9f072a6bf74778c037a9 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 02:40:26 -0800 Subject: [PATCH 08/37] Bumping gaia.json for 4 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/16511add58fa Author: GaryChen(pychen) Desc: Merge pull request #13476 from mpizza/Bug_931229_build Bug 931229 - With kb set to Greek, move to email field, layout remains G... r=rudyl. ======== https://hg.mozilla.org/integration/gaia-central/rev/3d5ce8b6dcab Author: mpizza Desc: Bug 931229 - With kb set to Greek, move to email field, layout remains Greek and can't switch ======== https://hg.mozilla.org/integration/gaia-central/rev/03ddafa229d8 Author: Zac Desc: Merge pull request #13505 from AndreiH/bug936016 Bug 936016 - Re-enable test_cards_view_with_three_apps , test_cards_view... ======== https://hg.mozilla.org/integration/gaia-central/rev/dbce16eab32a Author: Andrei Hutusoru Desc: Bug 936016 - Re-enable test_cards_view_with_three_apps , test_cards_view_kill_app_with_three_apps --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index f2da5f85c77..a141f9feb9a 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "e4179e43038bdb3ea8cb8d5eb682fcd37a703eb4", + "revision": "16511add58fac0cdf5491ef56facf1f943e690e4", "repo_path": "/integration/gaia-central" } From 20b2b21c5c99e16d9f55986b0d32224dd9beb261 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 02:55:24 -0800 Subject: [PATCH 09/37] Bumping gaia.json for 6 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/eea3b81e2205 Author: Albert Desc: Merge pull request #13365 from acperez/bug-929572 Bug 929572 - If the grid isn't valid, report a build error. r=yurenju,johnhu ======== https://hg.mozilla.org/integration/gaia-central/rev/0b06d9dfb39b Author: Albert Desc: Bug 929572 - If the grid isn't valid, report a build error. r=yurenju,johnhu ======== https://hg.mozilla.org/integration/gaia-central/rev/3bf1f792d0fb Author: Zac Desc: Merge pull request #13500 from AndreiH/bug936109 Bug 936109 - Xfail test_sms_with_attachments ======== https://hg.mozilla.org/integration/gaia-central/rev/5529620650cd Author: Andrei Hutusoru Desc: Bug 936109 - Xfail test_sms_with_attachments ======== https://hg.mozilla.org/integration/gaia-central/rev/8557707f8652 Author: Zac Desc: Merge pull request #13501 from AndreiH/bug936022 Bug 936022 - Re-enable test_gallery_edit_photo.py ======== https://hg.mozilla.org/integration/gaia-central/rev/354096cfc047 Author: Andrei Hutusoru Desc: Bug 936022 - Re-enable test_gallery_edit_photo.py --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index a141f9feb9a..b3abca86aea 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "16511add58fac0cdf5491ef56facf1f943e690e4", + "revision": "eea3b81e2205f86f2fe0d925a7b1e7611cb0c6be", "repo_path": "/integration/gaia-central" } From 3f9416c3e1fe9b38891281f46d95c733025066c0 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 03:05:24 -0800 Subject: [PATCH 10/37] Bumping gaia.json for 2 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/c337a87fb03f Author: Zac Desc: Merge pull request #13481 from bobsilverberg/bug935061 Bug 935061 - Re-enable test_play_ogg_video.py ======== https://hg.mozilla.org/integration/gaia-central/rev/5744a8329742 Author: Bob Silverberg Desc: Bug 935061 - Re-enable test_play_ogg_video.py --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index b3abca86aea..72cc0fa7787 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "eea3b81e2205f86f2fe0d925a7b1e7611cb0c6be", + "revision": "c337a87fb03f11d81953570c3f4e852192d0d1be", "repo_path": "/integration/gaia-central" } From 335c821772a2552da6be11e9930a9420b4434fb9 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 03:30:25 -0800 Subject: [PATCH 11/37] Bumping gaia.json for 1 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/4455d755eb61 Author: root Desc: Bug 923821 - Repair and re-enable test_killall.py TestKillAll.test_kill_all. r=zcampbell r=dhunt --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 72cc0fa7787..416ef6369af 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "c337a87fb03f11d81953570c3f4e852192d0d1be", + "revision": "4455d755eb61a4da12936fe9f50ac85a888bcdb3", "repo_path": "/integration/gaia-central" } From 8e823ef0262eb3a6c692dc117aa4c5479b9af3c6 Mon Sep 17 00:00:00 2001 From: Cervantes Yu Date: Tue, 1 Oct 2013 19:28:44 +0800 Subject: [PATCH 12/37] Bug 890870 - Start freezing the Nuwa process after PreloadSlowThings(). r=khuey --- dom/ipc/ContentChild.cpp | 20 ++++++++++++++++++ toolkit/xre/nsEmbedFunctions.cpp | 35 -------------------------------- 2 files changed, 20 insertions(+), 35 deletions(-) diff --git a/dom/ipc/ContentChild.cpp b/dom/ipc/ContentChild.cpp index 59f27358a8a..1f7315d649d 100644 --- a/dom/ipc/ContentChild.cpp +++ b/dom/ipc/ContentChild.cpp @@ -1290,6 +1290,14 @@ ContentChild::RecvCycleCollect() return true; } +#ifdef MOZ_NUWA_PROCESS +static void +OnFinishNuwaPreparation () +{ + MakeNuwaProcess(); +} +#endif + static void PreloadSlowThings() { @@ -1297,6 +1305,18 @@ PreloadSlowThings() nsLayoutStylesheetCache::UserContentSheet(); TabChild::PreloadSlowThings(); + +#ifdef MOZ_NUWA_PROCESS + // After preload of slow things, start freezing threads. + if (IsNuwaProcess()) { + // Perform GC before freezing the Nuwa process to reduce memory usage. + ContentChild::GetSingleton()->RecvGarbageCollect(); + + MessageLoop::current()-> + PostTask(FROM_HERE, + NewRunnableFunction(OnFinishNuwaPreparation)); + } +#endif } bool diff --git a/toolkit/xre/nsEmbedFunctions.cpp b/toolkit/xre/nsEmbedFunctions.cpp index 2cf97571585..5b9ad55195c 100644 --- a/toolkit/xre/nsEmbedFunctions.cpp +++ b/toolkit/xre/nsEmbedFunctions.cpp @@ -77,11 +77,6 @@ using mozilla::_ipdltest::IPDLUnitTestProcessChild; #endif // ifdef MOZ_IPDL_TESTS -#ifdef MOZ_NUWA_PROCESS -#include "nsITimer.h" -#define NUWA_PREPARATION_TIME 1000 -#endif - using namespace mozilla; using mozilla::ipc::BrowserProcessSubThread; @@ -107,13 +102,6 @@ static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID); static const PRUnichar kShellLibraryName[] = L"shell32.dll"; #endif -#ifdef MOZ_NUWA_PROCESS -extern "C" { -void PrepareNuwaProcess() __attribute__((weak)); -void MakeNuwaProcess() __attribute__((weak)); -}; -#endif - nsresult XRE_LockProfileDirectory(nsIFile* aDirectory, nsISupports* *aLockObject) @@ -277,16 +265,6 @@ SetTaskbarGroupId(const nsString& aId) } #endif -#ifdef MOZ_NUWA_PROCESS -void -OnFinishNuwaPreparation(nsITimer *aTimer, void *aClosure) -{ - NS_ASSERTION(MakeNuwaProcess != nullptr, - "MakeNuwaProcess() is not available!"); - MakeNuwaProcess(); -} -#endif - nsresult XRE_InitChildProcess(int aArgc, char* aArgv[], @@ -534,19 +512,6 @@ XRE_InitChildProcess(int aArgc, return NS_ERROR_FAILURE; } -#ifdef MOZ_NUWA_PROCESS - nsCOMPtr timer; - if (aProcess == GeckoProcessType_Content && - CommandLine::ForCurrentProcess()->HasSwitch(L"nuwa")) { - // Wait the Nuwa process for NUWA_PREPARATION_TIME ms. - timer = do_CreateInstance(NS_TIMER_CONTRACTID); - rv = timer->InitWithFuncCallback(OnFinishNuwaPreparation, - nullptr, - NUWA_PREPARATION_TIME, - nsITimer::TYPE_ONE_SHOT); - } -#endif - // Run the UI event loop on the main thread. uiMessageLoop.MessageLoop::Run(); From 2662326c9c2e084c26009273b07fd1429db373b0 Mon Sep 17 00:00:00 2001 From: Robert Longson Date: Fri, 8 Nov 2013 09:28:42 +0000 Subject: [PATCH 13/37] Bug 935902 - Fix access to filter standard attributes for gaussian blur and component transfer. r=jwatt --- .../SVGFEComponentTransferElement.webidl | 2 ++ dom/webidl/SVGFEGaussianBlurElement.webidl | 2 ++ layout/reftests/svg/filter-result-01-ref.svg | 18 +++++++++++++++ layout/reftests/svg/filter-result-01.svg | 23 +++++++++++++++++++ layout/reftests/svg/reftest.list | 1 + 5 files changed, 46 insertions(+) create mode 100644 layout/reftests/svg/filter-result-01-ref.svg create mode 100644 layout/reftests/svg/filter-result-01.svg diff --git a/dom/webidl/SVGFEComponentTransferElement.webidl b/dom/webidl/SVGFEComponentTransferElement.webidl index 8a774f447bd..5a41636e6a4 100644 --- a/dom/webidl/SVGFEComponentTransferElement.webidl +++ b/dom/webidl/SVGFEComponentTransferElement.webidl @@ -13,3 +13,5 @@ interface SVGFEComponentTransferElement : SVGElement { readonly attribute SVGAnimatedString in1; }; + +SVGFEComponentTransferElement implements SVGFilterPrimitiveStandardAttributes; diff --git a/dom/webidl/SVGFEGaussianBlurElement.webidl b/dom/webidl/SVGFEGaussianBlurElement.webidl index d63fbbe983c..9a5193be876 100644 --- a/dom/webidl/SVGFEGaussianBlurElement.webidl +++ b/dom/webidl/SVGFEGaussianBlurElement.webidl @@ -17,3 +17,5 @@ interface SVGFEGaussianBlurElement : SVGElement { void setStdDeviation(float stdDeviationX, float stdDeviationY); }; + +SVGFEGaussianBlurElement implements SVGFilterPrimitiveStandardAttributes; diff --git a/layout/reftests/svg/filter-result-01-ref.svg b/layout/reftests/svg/filter-result-01-ref.svg new file mode 100644 index 00000000000..ab03d027a41 --- /dev/null +++ b/layout/reftests/svg/filter-result-01-ref.svg @@ -0,0 +1,18 @@ + + + + Reference for filter result property + + + + + + + + + + + diff --git a/layout/reftests/svg/filter-result-01.svg b/layout/reftests/svg/filter-result-01.svg new file mode 100644 index 00000000000..2a2a4cea2b2 --- /dev/null +++ b/layout/reftests/svg/filter-result-01.svg @@ -0,0 +1,23 @@ + + + + Testcase for filter result property + + + + + + + + + + + + diff --git a/layout/reftests/svg/reftest.list b/layout/reftests/svg/reftest.list index 3bc98702e9c..dab30785e6c 100644 --- a/layout/reftests/svg/reftest.list +++ b/layout/reftests/svg/reftest.list @@ -150,6 +150,7 @@ fails-if(Android||B2G) pref(security.fileuri.strict_origin_policy,true) == filte == filter-foreignObject-01.svg pass.svg == filter-in-mask-01.svg pass.svg skip-if(B2G) == filter-invalidation-01.svg pass.svg +== filter-result-01.svg filter-result-01-ref.svg skip-if(B2G) == filter-scaled-01.svg pass.svg skip-if(B2G) == filter-scaled-02.html filter-scaled-02-ref.html == filter-translated-01.svg filter-translated-01-ref.svg From 7067a85ea3fce64d8e2e35ce4cac6ac0a5d7cd05 Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Fri, 8 Nov 2013 10:37:31 +0100 Subject: [PATCH 14/37] Bug 933798 - Don't inhibit name optimizations in try blocks. r=bhackett --- js/src/frontend/BytecodeEmitter.cpp | 6 +---- js/src/jit-test/tests/basic/bug934997.js | 30 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 js/src/jit-test/tests/basic/bug934997.js diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index aae140620bf..be342126f05 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -1144,12 +1144,8 @@ TryConvertFreeName(BytecodeEmitter *bce, ParseNode *pn) // The only statements within a lazy function which can push lexical // scopes are try/catch blocks. Use generic ops in this case. for (StmtInfoBCE *stmt = bce->topStmt; stmt; stmt = stmt->down) { - switch (stmt->type) { - case STMT_TRY: - case STMT_FINALLY: + if (stmt->type == STMT_CATCH) return true; - default:; - } } size_t hops = 0; diff --git a/js/src/jit-test/tests/basic/bug934997.js b/js/src/jit-test/tests/basic/bug934997.js new file mode 100644 index 00000000000..91d81f02948 --- /dev/null +++ b/js/src/jit-test/tests/basic/bug934997.js @@ -0,0 +1,30 @@ +function test1() { + var BUGNUMBER = ''; + var summary = ''; + var actual = ''; + test(BUGNUMBER); + function test() { + try { + (function () { eval("'foo'.b()", arguments) })(); + } catch(ex) { + actual = ex + ''; + } + } + assertEq(actual, 'TypeError: "foo".b is not a function'); +} +test1(); + +function test2() { + var BUGNUMBER = ''; + var summary = ''; + function g() { + 'use strict'; + try { + eval('function foo() { var a, arguments, b;}'); + } catch (x) { + return (x instanceof SyntaxError); + } + }; + assertEq(g(), true); +} +test2(); From 874e3d93ecc50d805ab9954b3289759c3ee1296b Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Fri, 8 Nov 2013 09:53:24 +0000 Subject: [PATCH 15/37] Bug 935903 - Unmark shared script data at start of GC r=billm --- js/src/jsgc.cpp | 3 +++ js/src/jsscript.cpp | 22 ++++++++++++++++------ js/src/jsscript.h | 3 +++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index ab4f6386108..dec94d79a54 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -2912,6 +2912,9 @@ BeginMarkPhase(JSRuntime *rt) WeakMapBase::resetCompartmentWeakMapList(c); } + if (rt->gcIsFull) + UnmarkScriptData(rt); + MarkRuntime(gcmarker); BufferGrayRoots(gcmarker); diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp index 37e458da104..b326f8db75f 100644 --- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -1519,21 +1519,31 @@ MarkScriptData(JSRuntime *rt, const jsbytecode *bytecode) SharedScriptData::fromBytecode(bytecode)->marked = true; } +void +js::UnmarkScriptData(JSRuntime *rt) +{ + JS_ASSERT(rt->gcIsFull); + ScriptDataTable &table = rt->scriptDataTable(); + for (ScriptDataTable::Enum e(table); !e.empty(); e.popFront()) { + SharedScriptData *entry = e.front(); + entry->marked = false; + } +} + void js::SweepScriptData(JSRuntime *rt) { JS_ASSERT(rt->gcIsFull); ScriptDataTable &table = rt->scriptDataTable(); - bool keepAtoms = false; - for (ThreadDataIter iter(rt); !iter.done(); iter.next()) - keepAtoms |= iter->gcKeepAtoms; + for (ThreadDataIter iter(rt); !iter.done(); iter.next()) { + if (iter->gcKeepAtoms) + return; + } for (ScriptDataTable::Enum e(table); !e.empty(); e.popFront()) { SharedScriptData *entry = e.front(); - if (entry->marked) { - entry->marked = false; - } else if (!keepAtoms) { + if (!entry->marked) { js_free(entry); e.removeFront(); } diff --git a/js/src/jsscript.h b/js/src/jsscript.h index fa6bfd290fa..ea762a95e6c 100644 --- a/js/src/jsscript.h +++ b/js/src/jsscript.h @@ -1404,6 +1404,9 @@ typedef HashSet ScriptDataTable; +extern void +UnmarkScriptData(JSRuntime *rt); + extern void SweepScriptData(JSRuntime *rt); From 866d35d8d24e53ec6672daabcf0aefbbf5ae8d45 Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Wed, 16 Oct 2013 09:45:27 +0100 Subject: [PATCH 16/37] Bug 926678 - Ensure GC gets triggered when gcMallocBytes drops below zero r=billm --- js/src/gc/Zone.cpp | 5 ++++- js/src/gc/Zone.h | 17 ++++++++++++----- js/src/jsgc.cpp | 30 +++++++++++++++++------------- js/src/jsgc.h | 4 ++-- js/src/vm/Runtime.cpp | 14 ++++++++------ js/src/vm/Runtime.h | 16 ++++++++++++++-- 6 files changed, 57 insertions(+), 29 deletions(-) diff --git a/js/src/gc/Zone.cpp b/js/src/gc/Zone.cpp index 72d64852911..b71ed93b710 100644 --- a/js/src/gc/Zone.cpp +++ b/js/src/gc/Zone.cpp @@ -38,6 +38,7 @@ JS::Zone::Zone(JSRuntime *rt) scheduledForDestruction(false), maybeAlive(true), gcMallocBytes(0), + gcMallocGCTriggered(false), gcGrayRoots(), data(nullptr), types(this) @@ -112,6 +113,7 @@ void Zone::resetGCMallocBytes() { gcMallocBytes = ptrdiff_t(gcMaxMallocBytes); + gcMallocGCTriggered = false; } void @@ -128,7 +130,8 @@ Zone::setGCMaxMallocBytes(size_t value) void Zone::onTooMuchMalloc() { - TriggerZoneGC(this, gcreason::TOO_MUCH_MALLOC); + if (!gcMallocGCTriggered) + gcMallocGCTriggered = TriggerZoneGC(this, JS::gcreason::TOO_MUCH_MALLOC); } void diff --git a/js/src/gc/Zone.h b/js/src/gc/Zone.h index c11c73f956d..55cb553a476 100644 --- a/js/src/gc/Zone.h +++ b/js/src/gc/Zone.h @@ -250,7 +250,16 @@ struct Zone : public JS::shadow::Zone, * gcMaxMallocBytes down to zero. This counter should be used only when it's * not possible to know the size of a free. */ - ptrdiff_t gcMallocBytes; + mozilla::Atomic gcMallocBytes; + + /* + * Whether a GC has been triggered as a result of gcMallocBytes falling + * below zero. + * + * This should be a bool, but Atomic only supports 32-bit and pointer-sized + * types. + */ + mozilla::Atomic gcMallocGCTriggered; /* This compartment's gray roots. */ js::Vector gcGrayRoots; @@ -278,10 +287,8 @@ struct Zone : public JS::shadow::Zone, * Note: this code may be run from worker threads. We * tolerate any thread races when updating gcMallocBytes. */ - ptrdiff_t oldCount = gcMallocBytes; - ptrdiff_t newCount = oldCount - ptrdiff_t(nbytes); - gcMallocBytes = newCount; - if (JS_UNLIKELY(newCount <= 0 && oldCount > 0)) + gcMallocBytes -= ptrdiff_t(nbytes); + if (JS_UNLIKELY(isTooMuchMalloc())) onTooMuchMalloc(); } diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index dec94d79a54..e1c093e0ded 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -1937,29 +1937,31 @@ TriggerOperationCallback(JSRuntime *rt, JS::gcreason::Reason reason) rt->triggerOperationCallback(JSRuntime::TriggerCallbackMainThread); } -void +bool js::TriggerGC(JSRuntime *rt, JS::gcreason::Reason reason) { /* Wait till end of parallel section to trigger GC. */ if (InParallelSection()) { ForkJoinSlice::Current()->requestGC(reason); - return; + return true; } /* Don't trigger GCs when allocating under the operation callback lock. */ if (rt->currentThreadOwnsOperationCallbackLock()) - return; + return false; JS_ASSERT(CurrentThreadCanAccessRuntime(rt)); - if (rt->isHeapBusy()) - return; + /* GC is already running. */ + if (rt->isHeapCollecting()) + return false; JS::PrepareForFullGC(rt); TriggerOperationCallback(rt, reason); + return true; } -void +bool js::TriggerZoneGC(Zone *zone, JS::gcreason::Reason reason) { /* @@ -1968,35 +1970,37 @@ js::TriggerZoneGC(Zone *zone, JS::gcreason::Reason reason) */ if (InParallelSection()) { ForkJoinSlice::Current()->requestZoneGC(zone, reason); - return; + return true; } /* Zones in use by a thread with an exclusive context can't be collected. */ if (zone->usedByExclusiveThread) - return; + return false; JSRuntime *rt = zone->runtimeFromMainThread(); /* Don't trigger GCs when allocating under the operation callback lock. */ if (rt->currentThreadOwnsOperationCallbackLock()) - return; + return false; - if (rt->isHeapBusy()) - return; + /* GC is already running. */ + if (rt->isHeapCollecting()) + return false; if (rt->gcZeal() == ZealAllocValue) { TriggerGC(rt, reason); - return; + return true; } if (rt->isAtomsZone(zone)) { /* We can't do a zone GC of the atoms compartment. */ TriggerGC(rt, reason); - return; + return true; } PrepareZoneForGC(zone); TriggerOperationCallback(rt, reason); + return true; } void diff --git a/js/src/jsgc.h b/js/src/jsgc.h index dc9e3416832..a61c8c61863 100644 --- a/js/src/jsgc.h +++ b/js/src/jsgc.h @@ -690,11 +690,11 @@ extern void TraceRuntime(JSTracer *trc); /* Must be called with GC lock taken. */ -extern void +extern bool TriggerGC(JSRuntime *rt, JS::gcreason::Reason reason); /* Must be called with GC lock taken. */ -extern void +extern bool TriggerZoneGC(Zone *zone, JS::gcreason::Reason reason); extern void diff --git a/js/src/vm/Runtime.cpp b/js/src/vm/Runtime.cpp index 1985db85d18..1bc0bd3974c 100644 --- a/js/src/vm/Runtime.cpp +++ b/js/src/vm/Runtime.cpp @@ -235,6 +235,7 @@ JSRuntime::JSRuntime(JSUseHelperThreads useHelperThreads) gcSliceCallback(nullptr), gcFinalizeCallback(nullptr), gcMallocBytes(0), + gcMallocGCTriggered(false), scriptAndCountsVector(nullptr), NaNValue(DoubleNaNValue()), negativeInfinityValue(DoubleValue(NegativeInfinity())), @@ -726,10 +727,8 @@ void JSRuntime::updateMallocCounter(JS::Zone *zone, size_t nbytes) { /* We tolerate any thread races when updating gcMallocBytes. */ - ptrdiff_t oldCount = gcMallocBytes; - ptrdiff_t newCount = oldCount - ptrdiff_t(nbytes); - gcMallocBytes = newCount; - if (JS_UNLIKELY(newCount <= 0 && oldCount > 0)) + gcMallocBytes -= ptrdiff_t(nbytes); + if (JS_UNLIKELY(gcMallocBytes <= 0)) onTooMuchMalloc(); else if (zone) zone->updateMallocCounter(nbytes); @@ -738,8 +737,11 @@ JSRuntime::updateMallocCounter(JS::Zone *zone, size_t nbytes) JS_FRIEND_API(void) JSRuntime::onTooMuchMalloc() { - if (CurrentThreadCanAccessRuntime(this)) - TriggerGC(this, JS::gcreason::TOO_MUCH_MALLOC); + if (!CurrentThreadCanAccessRuntime(this)) + return; + + if (!gcMallocGCTriggered) + gcMallocGCTriggered = TriggerGC(this, JS::gcreason::TOO_MUCH_MALLOC); } JS_FRIEND_API(void *) diff --git a/js/src/vm/Runtime.h b/js/src/vm/Runtime.h index a144c8af0e3..71698bbe52c 100644 --- a/js/src/vm/Runtime.h +++ b/js/src/vm/Runtime.h @@ -1233,7 +1233,16 @@ struct JSRuntime : public JS::shadow::Runtime, * Malloc counter to measure memory pressure for GC scheduling. It runs * from gcMaxMallocBytes down to zero. */ - volatile ptrdiff_t gcMallocBytes; + mozilla::Atomic gcMallocBytes; + + /* + * Whether a GC has been triggered as a result of gcMallocBytes falling + * below zero. + * + * This should be a bool, but Atomic only supports 32-bit and pointer-sized + * types. + */ + mozilla::Atomic gcMallocGCTriggered; public: void setNeedsBarrier(bool needs) { @@ -1548,7 +1557,10 @@ struct JSRuntime : public JS::shadow::Runtime, void setGCMaxMallocBytes(size_t value); - void resetGCMallocBytes() { gcMallocBytes = ptrdiff_t(gcMaxMallocBytes); } + void resetGCMallocBytes() { + gcMallocBytes = ptrdiff_t(gcMaxMallocBytes); + gcMallocGCTriggered = false; + } /* * Call this after allocating memory held by GC things, to update memory From 16bce1034afcda581ac099f1a7f9aa8e5f2a0913 Mon Sep 17 00:00:00 2001 From: Robert Longson Date: Fri, 8 Nov 2013 10:49:55 +0000 Subject: [PATCH 17/37] Test for bug 935994 r=jwatt,bas --- layout/reftests/svg/reftest.list | 1 + layout/reftests/svg/stroke-dashoffset-01.svg | 30 ++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 layout/reftests/svg/stroke-dashoffset-01.svg diff --git a/layout/reftests/svg/reftest.list b/layout/reftests/svg/reftest.list index dab30785e6c..68e1ecdc875 100644 --- a/layout/reftests/svg/reftest.list +++ b/layout/reftests/svg/reftest.list @@ -316,6 +316,7 @@ HTTP(..) == text-scale-03.svg text-scale-03-ref.svg fails-if(OSX==10.8) == stroke-dasharray-01.svg stroke-dasharray-01-ref.svg # bug 896487 == stroke-dasharray-and-pathLength-01.svg pass.svg == stroke-dasharray-and-text-01.svg stroke-dasharray-and-text-01-ref.svg +== stroke-dashoffset-01.svg pass.svg == stroke-linecap-square-w-zero-length-segs-01.svg pass.svg == stroke-linecap-square-w-zero-length-segs-02.svg pass.svg == textPath-01.svg textPath-01-ref.svg diff --git a/layout/reftests/svg/stroke-dashoffset-01.svg b/layout/reftests/svg/stroke-dashoffset-01.svg new file mode 100644 index 00000000000..e79325c4ebe --- /dev/null +++ b/layout/reftests/svg/stroke-dashoffset-01.svg @@ -0,0 +1,30 @@ + + + Test that stroke-dashoffset is independent of stroke-width + + + + + + + + + + + + + + + + + + + + + + + + From 0c1bcd9ef9fe2dc6a885a7b5c08f238e77ce8961 Mon Sep 17 00:00:00 2001 From: Brian Hackett Date: Fri, 8 Nov 2013 06:48:36 -0700 Subject: [PATCH 18/37] Bug 936004 - Trace template object in JSOP_REST caches, r=jandem. --- js/src/jit/BaselineIC.cpp | 5 +++++ js/src/jit/BaselineIC.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/js/src/jit/BaselineIC.cpp b/js/src/jit/BaselineIC.cpp index 1f2b5c52d6e..a071e4846ef 100644 --- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -419,6 +419,11 @@ ICStub::trace(JSTracer *trc) MarkObject(trc, &stub->templateObject(), "baseline-newobject-template"); break; } + case ICStub::Rest_Fallback: { + ICRest_Fallback *stub = toRest_Fallback(); + MarkObject(trc, &stub->templateObject(), "baseline-rest-template"); + break; + } default: break; } diff --git a/js/src/jit/BaselineIC.h b/js/src/jit/BaselineIC.h index de5750bebf3..308ecea725f 100644 --- a/js/src/jit/BaselineIC.h +++ b/js/src/jit/BaselineIC.h @@ -5873,7 +5873,7 @@ class ICRest_Fallback : public ICFallbackStub return space->allocate(code, templateObject); } - JSObject *templateObject() { + HeapPtrObject &templateObject() { return templateObject_; } From f807ee373695fd3ba7c5fb777b974c8fb140e5bc Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Fri, 8 Nov 2013 08:55:38 -0500 Subject: [PATCH 19/37] Bug 936445 - Remove some unused variables from the parser code; r=hsivonen --- parser/htmlparser/src/nsParser.cpp | 4 ---- parser/htmlparser/src/nsScanner.cpp | 6 ------ 2 files changed, 10 deletions(-) diff --git a/parser/htmlparser/src/nsParser.cpp b/parser/htmlparser/src/nsParser.cpp index 0e3502fd345..f529d2f6b54 100644 --- a/parser/htmlparser/src/nsParser.cpp +++ b/parser/htmlparser/src/nsParser.cpp @@ -54,10 +54,6 @@ using mozilla::dom::EncodingUtils; #define NS_PARSER_FLAG_FLUSH_TOKENS 0x00000020 #define NS_PARSER_FLAG_CAN_TOKENIZE 0x00000040 -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_CID(kCParserCID, NS_PARSER_CID); -static NS_DEFINE_IID(kIParserIID, NS_IPARSER_IID); - //-------------- Begin ParseContinue Event Definition ------------------------ /* The parser can be explicitly interrupted by passing a return value of diff --git a/parser/htmlparser/src/nsScanner.cpp b/parser/htmlparser/src/nsScanner.cpp index 54c5776c5b9..b1181d1a339 100644 --- a/parser/htmlparser/src/nsScanner.cpp +++ b/parser/htmlparser/src/nsScanner.cpp @@ -47,12 +47,6 @@ nsReadEndCondition::nsReadEndCondition(const PRUnichar* aTerminateChars) : } } -#ifdef __INCREMENTAL -const int kBufsize=1; -#else -const int kBufsize=64; -#endif - /** * Use this constructor if you want i/o to be based on * a single string you hand in during construction. From 2fb693668e5a756cf02307616003369788368fad Mon Sep 17 00:00:00 2001 From: Ziga Seilnacht Date: Fri, 8 Nov 2013 09:03:04 -0500 Subject: [PATCH 20/37] Bug 782037 - Fix NameError with missing `depfinished` function when there is a makefile error. r=gps --- build/pymake/pymake/data.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/build/pymake/pymake/data.py b/build/pymake/pymake/data.py index a71cfb85755..6fea059ac85 100644 --- a/build/pymake/pymake/data.py +++ b/build/pymake/pymake/data.py @@ -844,11 +844,15 @@ class RemakeRuleContext(object): self._depfinishedserial(False, False) def _startdepparallel(self, d): + dep, weak = d + if weak: + depfinished = self._weakdepfinishedparallel + else: + depfinished = self._depfinishedparallel if self.makefile.error: depfinished(True, False) else: - dep, weak = d - dep.make(self.makefile, self.targetstack, weak and self._weakdepfinishedparallel or self._depfinishedparallel) + dep.make(self.makefile, self.targetstack, depfinished) def _weakdepfinishedparallel(self, error, didanything): if error: From 353b709e0b448476f1c30a1e6187b14fc26ace09 Mon Sep 17 00:00:00 2001 From: Ziga Seilnacht Date: Fri, 8 Nov 2013 09:03:19 -0500 Subject: [PATCH 21/37] Bug 874210 - Fix pymake stack depth issues when many targets and prerequisites are present. r=gps --- build/pymake/make.py | 9 --------- build/pymake/pymake/data.py | 3 ++- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/build/pymake/make.py b/build/pymake/make.py index 845ddb12e72..8379b71f01a 100755 --- a/build/pymake/make.py +++ b/build/pymake/make.py @@ -17,15 +17,6 @@ if __name__ == '__main__': gc.disable() - # This is meant as a temporary workaround until issues with many targets - # and prerequisites is addressed. Bug 874210 tracks. - # - # The default recursion limit for CPython is 1000. - try: - sys.setrecursionlimit(10000) - except Exception: - print >>sys.stderr, 'Unable to increase Python recursion limit.' - pymake.command.main(sys.argv[1:], os.environ, os.getcwd(), cb=sys.exit) pymake.process.ParallelContext.spin() assert False, "Not reached" diff --git a/build/pymake/pymake/data.py b/build/pymake/pymake/data.py index 6fea059ac85..dcd7e922580 100644 --- a/build/pymake/pymake/data.py +++ b/build/pymake/pymake/data.py @@ -780,7 +780,8 @@ class RemakeTargetParallel(object): return self.currunning = True - self.rlist.pop(0).runcommands(self.indent, self.commandscb) + rule = self.rlist.pop(0) + self.makefile.context.defer(rule.runcommands, self.indent, self.commandscb) def commandscb(self, error): assert error in (True, False) From 049577ca57183e0495e44fc0b601d9a749bb8c3c Mon Sep 17 00:00:00 2001 From: Ziga Seilnacht Date: Fri, 8 Nov 2013 09:04:28 -0500 Subject: [PATCH 22/37] Bug 935050 - Manually flush native command's stdout and stderr, multiprocessing exits via os._exit. r=gps --- build/pymake/pymake/process.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/pymake/pymake/process.py b/build/pymake/pymake/process.py index d6b39b2fba2..0c6e757886d 100644 --- a/build/pymake/pymake/process.py +++ b/build/pymake/pymake/process.py @@ -415,6 +415,10 @@ class PythonJob(Job): finally: os.environ.clear() os.environ.update(oldenv) + # multiprocessing exits via os._exit, make sure that all output + # from command gets written out before that happens. + sys.stdout.flush() + sys.stderr.flush() return 0 def job_runner(job): From e59b789a544e5ca8273435cb5623d9f75b23e2b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Kopeck=C3=83=C2=BD?= Date: Fri, 8 Nov 2013 09:04:30 -0500 Subject: [PATCH 23/37] Bug 936196 - Explicitly include unistd.h for getpid() on XP_UNIX. r=BenWa --- gfx/thebes/gfxPlatform.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index 8b54d7ec783..ae036cb4cc9 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -18,6 +18,8 @@ #ifdef XP_WIN #include #define getpid _getpid +#else +#include #endif #include "nsXULAppAPI.h" From 77684a025036860ea6ae971b855f2fbc7e997a2b Mon Sep 17 00:00:00 2001 From: Sotaro Ikeda Date: Fri, 8 Nov 2013 09:09:46 -0500 Subject: [PATCH 24/37] Bug 929005 - Change from android::Vector to android::List. r=doublec --- .../omx/mediaresourcemanager/MediaResourceManagerService.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/media/omx/mediaresourcemanager/MediaResourceManagerService.h b/content/media/omx/mediaresourcemanager/MediaResourceManagerService.h index af4755030e4..06af8988265 100644 --- a/content/media/omx/mediaresourcemanager/MediaResourceManagerService.h +++ b/content/media/omx/mediaresourcemanager/MediaResourceManagerService.h @@ -73,7 +73,7 @@ protected: // The lock protects mVideoDecoderSlots and mVideoCodecRequestQueue called // from multiple threads. Mutex mLock; - typedef Vector > Fifo; + typedef List > Fifo; // Queue of media resource requests. // Hold IMediaResourceManagerClient that requesting a media resource as IBinder. Fifo mVideoCodecRequestQueue; From 3aa33e147d9717905c6a144b87679bcb4933defa Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 07:00:25 -0800 Subject: [PATCH 25/37] Bumping gaia.json for 1 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/dc7a50bca585 Author: Arthur Chen Desc: Revert "Bug 928851 - Adopt new API of enabling/disabing RIL radio" This reverts commit 2cd2a529e5f1ab72569886998435bc46e22bf825. --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 416ef6369af..3b171772c6d 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "4455d755eb61a4da12936fe9f50ac85a888bcdb3", + "revision": "dc7a50bca58536301c07399243b9350e3dedc896", "repo_path": "/integration/gaia-central" } From d2e92b317daf7e30d7d28d11dbb40119d47ab195 Mon Sep 17 00:00:00 2001 From: Horia Iosif Olaru Date: Fri, 8 Nov 2013 10:07:36 -0500 Subject: [PATCH 26/37] Bug 841601 - Add background-blend-mode to the style parsing mechanism. r=heycam --- layout/style/nsCSSPropList.h | 13 +++++++++++++ layout/style/nsComputedDOMStyle.cpp | 8 ++++++++ layout/style/nsComputedDOMStyle.h | 1 + layout/style/nsComputedDOMStylePropertyList.h | 1 + layout/style/nsRuleNode.cpp | 10 ++++++++++ layout/style/nsStyleStruct.cpp | 5 +++++ layout/style/nsStyleStruct.h | 4 +++- layout/style/test/property_database.js | 12 ++++++++++++ modules/libpref/src/init/all.js | 7 +++++++ 9 files changed, 60 insertions(+), 1 deletion(-) diff --git a/layout/style/nsCSSPropList.h b/layout/style/nsCSSPropList.h index 32c6ddc1b71..af92d93337a 100644 --- a/layout/style/nsCSSPropList.h +++ b/layout/style/nsCSSPropList.h @@ -544,6 +544,19 @@ CSS_PROP_BACKGROUND( kBackgroundInlinePolicyKTable, CSS_PROP_NO_OFFSET, eStyleAnimType_None) +CSS_PROP_BACKGROUND( + background-blend-mode, + background_blend_mode, + BackgroundBlendMode, + CSS_PROPERTY_PARSE_VALUE_LIST | + CSS_PROPERTY_APPLIES_TO_FIRST_LETTER_AND_FIRST_LINE | + CSS_PROPERTY_APPLIES_TO_PLACEHOLDER | + CSS_PROPERTY_VALUE_LIST_USES_COMMAS, + "layout.css.background-blend-mode.enabled", + VARIANT_KEYWORD, // used by list parsing + kBlendModeKTable, + CSS_PROP_NO_OFFSET, + eStyleAnimType_None) CSS_PROP_BACKGROUND( background-origin, background_origin, diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index fda61e30fe8..dcdb1c5ed39 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -2010,6 +2010,14 @@ nsComputedDOMStyle::DoGetBackgroundInlinePolicy() return val; } +CSSValue* +nsComputedDOMStyle::DoGetBackgroundBlendMode() +{ + return GetBackgroundList(&nsStyleBackground::Layer::mBlendMode, + &nsStyleBackground::mBlendModeCount, + nsCSSProps::kBlendModeKTable); +} + CSSValue* nsComputedDOMStyle::DoGetBackgroundOrigin() { diff --git a/layout/style/nsComputedDOMStyle.h b/layout/style/nsComputedDOMStyle.h index 9f3867d8293..2cc2d6b61f1 100644 --- a/layout/style/nsComputedDOMStyle.h +++ b/layout/style/nsComputedDOMStyle.h @@ -260,6 +260,7 @@ private: mozilla::dom::CSSValue* DoGetBackgroundRepeat(); mozilla::dom::CSSValue* DoGetBackgroundClip(); mozilla::dom::CSSValue* DoGetBackgroundInlinePolicy(); + mozilla::dom::CSSValue* DoGetBackgroundBlendMode(); mozilla::dom::CSSValue* DoGetBackgroundOrigin(); mozilla::dom::CSSValue* DoGetBackgroundSize(); diff --git a/layout/style/nsComputedDOMStylePropertyList.h b/layout/style/nsComputedDOMStylePropertyList.h index b9d607f50e8..efb55411cfc 100644 --- a/layout/style/nsComputedDOMStylePropertyList.h +++ b/layout/style/nsComputedDOMStylePropertyList.h @@ -53,6 +53,7 @@ COMPUTED_STYLE_PROP(animation_timing_function, AnimationTimingFunction) COMPUTED_STYLE_PROP(backface_visibility, BackfaceVisibility) //// COMPUTED_STYLE_PROP(background, Background) COMPUTED_STYLE_PROP(background_attachment, BackgroundAttachment) +COMPUTED_STYLE_PROP(background_blend_mode, BackgroundBlendMode) COMPUTED_STYLE_PROP(background_clip, BackgroundClip) COMPUTED_STYLE_PROP(background_color, BackgroundColor) COMPUTED_STYLE_PROP(background_image, BackgroundImage) diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index 13b83cb0633..3069b873b4a 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -6050,6 +6050,14 @@ nsRuleNode::ComputeBackgroundData(void* aStartStruct, parentBG->mBackgroundInlinePolicy, NS_STYLE_BG_INLINE_POLICY_CONTINUOUS, 0, 0, 0, 0); + // background-blend-mode: enum, inherit, initial [list] + SetBackgroundList(aContext, *aRuleData->ValueForBackgroundBlendMode(), + bg->mLayers, + parentBG->mLayers, &nsStyleBackground::Layer::mBlendMode, + uint8_t(NS_STYLE_BLEND_NORMAL), parentBG->mBlendModeCount, + bg->mBlendModeCount, maxItemCount, rebuild, + canStoreInRuleTree); + // background-origin: enum, inherit, initial [list] SetBackgroundList(aContext, *aRuleData->ValueForBackgroundOrigin(), bg->mLayers, @@ -6092,6 +6100,8 @@ nsRuleNode::ComputeBackgroundData(void* aStartStruct, bg->mAttachmentCount, fillCount); FillBackgroundList(bg->mLayers, &nsStyleBackground::Layer::mClip, bg->mClipCount, fillCount); + FillBackgroundList(bg->mLayers, &nsStyleBackground::Layer::mBlendMode, + bg->mBlendModeCount, fillCount); FillBackgroundList(bg->mLayers, &nsStyleBackground::Layer::mOrigin, bg->mOriginCount, fillCount); FillBackgroundList(bg->mLayers, &nsStyleBackground::Layer::mPosition, diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index 95e58f5c4f9..ad8479a5964 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -1904,6 +1904,7 @@ nsStyleBackground::nsStyleBackground() , mPositionCount(1) , mImageCount(1) , mSizeCount(1) + , mBlendModeCount(1) , mBackgroundColor(NS_RGBA(0, 0, 0, 0)) , mBackgroundInlinePolicy(NS_STYLE_BG_INLINE_POLICY_CONTINUOUS) { @@ -1921,6 +1922,7 @@ nsStyleBackground::nsStyleBackground(const nsStyleBackground& aSource) , mPositionCount(aSource.mPositionCount) , mImageCount(aSource.mImageCount) , mSizeCount(aSource.mSizeCount) + , mBlendModeCount(aSource.mBlendModeCount) , mLayers(aSource.mLayers) // deep copy , mBackgroundColor(aSource.mBackgroundColor) , mBackgroundInlinePolicy(aSource.mBackgroundInlinePolicy) @@ -1937,6 +1939,7 @@ nsStyleBackground::nsStyleBackground(const nsStyleBackground& aSource) mPositionCount = std::max(mPositionCount, count); mImageCount = std::max(mImageCount, count); mSizeCount = std::max(mSizeCount, count); + mBlendModeCount = std::max(mSizeCount, count); } } @@ -2144,6 +2147,7 @@ nsStyleBackground::Layer::SetInitialValues() mClip = NS_STYLE_BG_CLIP_BORDER; mOrigin = NS_STYLE_BG_ORIGIN_PADDING; mRepeat.SetInitialValues(); + mBlendMode = NS_STYLE_BLEND_NORMAL; mPosition.SetInitialValues(); mSize.SetInitialValues(); mImage.SetNull(); @@ -2168,6 +2172,7 @@ nsStyleBackground::Layer::operator==(const Layer& aOther) const mClip == aOther.mClip && mOrigin == aOther.mOrigin && mRepeat == aOther.mRepeat && + mBlendMode == aOther.mBlendMode && mPosition == aOther.mPosition && mSize == aOther.mSize && mImage == aOther.mImage; diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index 62bfb516113..9d45a92fee4 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -443,6 +443,7 @@ struct nsStyleBackground { uint8_t mAttachment; // [reset] See nsStyleConsts.h uint8_t mClip; // [reset] See nsStyleConsts.h uint8_t mOrigin; // [reset] See nsStyleConsts.h + uint8_t mBlendMode; // [reset] See nsStyleConsts.h Repeat mRepeat; // [reset] See nsStyleConsts.h Position mPosition; // [reset] nsStyleImage mImage; // [reset] @@ -488,7 +489,8 @@ struct nsStyleBackground { mRepeatCount, mPositionCount, mImageCount, - mSizeCount; + mSizeCount, + mBlendModeCount; // Layers are stored in an array, matching the top-to-bottom order in // which they are specified in CSS. The number of layers to be used // should come from the background-image property. We create diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index 3e585c86fd5..4fcf577a84d 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -4762,6 +4762,18 @@ if (SpecialPowers.getBoolPref("layout.css.mix-blend-mode.enabled")) { }; } +if (SpecialPowers.getBoolPref("layout.css.background-blend-mode.enabled")) { + gCSSProperties["background-blend-mode"] = { + domProp: "backgroundBlendMode", + inherited: false, + type: CSS_TYPE_LONGHAND, + initial_values: [ "normal" ], + other_values: [ "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", + "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity" ], + invalid_values: [] + }; +} + if (SpecialPowers.getBoolPref("layout.css.unset-value.enabled")) { gCSSProperties["animation-direction"].invalid_values.push("normal, unset"); gCSSProperties["animation-name"].invalid_values.push("bounce, unset", "unset, bounce"); diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index a38e4ee2ec7..37470293a48 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -1919,6 +1919,13 @@ pref("layout.css.scope-pseudo.enabled", false); pref("layout.css.scope-pseudo.enabled", true); #endif +// Is support for background-blend-mode enabled? +#ifdef RELEASE_BUILD +pref("layout.css.background-blend-mode.enabled", false); +#else +pref("layout.css.background-blend-mode.enabled", true); +#endif + // Is support for CSS vertical text enabled? pref("layout.css.vertical-text.enabled", false); From d0c7a64e0cbec4b2745e61156b45a0080a77fcd7 Mon Sep 17 00:00:00 2001 From: Horia Iosif Olaru Date: Fri, 8 Nov 2013 10:08:03 -0500 Subject: [PATCH 27/37] Bug 841601 - Add background-blend-mode implementation. r=roc --- layout/base/nsCSSRendering.cpp | 36 ++++++++++++++++++++++++++++++++++ layout/base/nsCSSRendering.h | 6 +++++- layout/base/nsDisplayList.cpp | 27 +++++++++++++++++++++---- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 4fe63c1abc2..4cd365dd8f5 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -320,6 +320,30 @@ static nscolor MakeBevelColor(mozilla::css::Side whichSide, uint8_t style, nscolor aBackgroundColor, nscolor aBorderColor); +static gfxContext::GraphicsOperator GetGFXBlendMode(uint8_t mBlendMode) +{ + switch (mBlendMode) { + case NS_STYLE_BLEND_NORMAL: return gfxContext::OPERATOR_OVER; + case NS_STYLE_BLEND_MULTIPLY: return gfxContext::OPERATOR_MULTIPLY; + case NS_STYLE_BLEND_SCREEN: return gfxContext::OPERATOR_SCREEN; + case NS_STYLE_BLEND_OVERLAY: return gfxContext::OPERATOR_OVERLAY; + case NS_STYLE_BLEND_DARKEN: return gfxContext::OPERATOR_DARKEN; + case NS_STYLE_BLEND_LIGHTEN: return gfxContext::OPERATOR_LIGHTEN; + case NS_STYLE_BLEND_COLOR_DODGE: return gfxContext::OPERATOR_COLOR_DODGE; + case NS_STYLE_BLEND_COLOR_BURN: return gfxContext::OPERATOR_COLOR_BURN; + case NS_STYLE_BLEND_HARD_LIGHT: return gfxContext::OPERATOR_HARD_LIGHT; + case NS_STYLE_BLEND_SOFT_LIGHT: return gfxContext::OPERATOR_SOFT_LIGHT; + case NS_STYLE_BLEND_DIFFERENCE: return gfxContext::OPERATOR_DIFFERENCE; + case NS_STYLE_BLEND_EXCLUSION: return gfxContext::OPERATOR_EXCLUSION; + case NS_STYLE_BLEND_HUE: return gfxContext::OPERATOR_HUE; + case NS_STYLE_BLEND_SATURATION: return gfxContext::OPERATOR_SATURATION; + case NS_STYLE_BLEND_COLOR: return gfxContext::OPERATOR_COLOR; + case NS_STYLE_BLEND_LUMINOSITY: return gfxContext::OPERATOR_LUMINOSITY; + } + + return gfxContext::OPERATOR_OVER; +} + static InlineBackgroundData* gInlineBGData = nullptr; // Initialize any static variables used by nsCSSRendering. @@ -2561,10 +2585,18 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext, nsBackgroundLayerState state = PrepareBackgroundLayer(aPresContext, aForFrame, aFlags, aBorderArea, clipState.mBGClipArea, *bg, layer); if (!state.mFillArea.IsEmpty()) { + if (state.mCompositingOp != gfxContext::OPERATOR_OVER) { + NS_ASSERTION(ctx->CurrentOperator() == gfxContext::OPERATOR_OVER, + "It is assumed the initial operator is OPERATOR_OVER, when it is restored later"); + ctx->SetOperator(state.mCompositingOp); + } state.mImageRenderer.DrawBackground(aPresContext, aRenderingContext, state.mDestArea, state.mFillArea, state.mAnchor + aBorderArea.TopLeft(), clipState.mDirtyRect); + if (state.mCompositingOp != gfxContext::OPERATOR_OVER) { + ctx->SetOperator(gfxContext::OPERATOR_OVER); + } } } } @@ -2856,6 +2888,7 @@ nsCSSRendering::PrepareBackgroundLayer(nsPresContext* aPresContext, * background-origin * background-size * background-break (-moz-background-inline-policy) + * background-blend-mode * * (background-color applies to the entire element and not to individual * layers, so it is irrelevant to this method.) @@ -2978,6 +3011,9 @@ nsCSSRendering::PrepareBackgroundLayer(nsPresContext* aPresContext, state.mFillArea.height = bgClipRect.height; } state.mFillArea.IntersectRect(state.mFillArea, bgClipRect); + + state.mCompositingOp = GetGFXBlendMode(aLayer.mBlendMode); + return state; } diff --git a/layout/base/nsCSSRendering.h b/layout/base/nsCSSRendering.h index 65b16ee0c12..e9c206b4f3c 100644 --- a/layout/base/nsCSSRendering.h +++ b/layout/base/nsCSSRendering.h @@ -213,7 +213,7 @@ struct nsBackgroundLayerState { * @param aFlags some combination of nsCSSRendering::PAINTBG_* flags */ nsBackgroundLayerState(nsIFrame* aForFrame, const nsStyleImage* aImage, uint32_t aFlags) - : mImageRenderer(aForFrame, aImage, aFlags) {} + : mImageRenderer(aForFrame, aImage, aFlags), mCompositingOp(gfxContext::OPERATOR_OVER) {} /** * The nsImageRenderer that will be used to draw the background. @@ -237,6 +237,10 @@ struct nsBackgroundLayerState { * PrepareBackgroundLayer. */ nsPoint mAnchor; + /** + * The compositing operation that the image should use + */ + gfxContext::GraphicsOperator mCompositingOp; }; struct nsCSSRendering { diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index 7391bc3c698..5fbefcaaa48 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -1739,11 +1739,15 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil drawBackgroundImage, drawBackgroundColor); } + // An auxiliary list is necessary in case we have background blending; if that + // is the case, background items need to be wrapped by a blend container to + // isolate blending to the background + nsDisplayList bgItemList; // Even if we don't actually have a background color to paint, we may still need // to create an item for hit testing. if ((drawBackgroundColor && color != NS_RGBA(0,0,0,0)) || aBuilder->IsForEventDelivery()) { - aList->AppendNewToTop( + bgItemList.AppendNewToTop( new (aBuilder) nsDisplayBackgroundColor(aBuilder, aFrame, bg, drawBackgroundColor ? color : NS_RGBA(0, 0, 0, 0))); } @@ -1751,25 +1755,40 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil if (isThemed) { nsDisplayThemedBackground* bgItem = new (aBuilder) nsDisplayThemedBackground(aBuilder, aFrame); - aList->AppendNewToTop(bgItem); + bgItemList.AppendNewToTop(bgItem); + aList->AppendToTop(&bgItemList); return true; } if (!bg) { + aList->AppendToTop(&bgItemList); return false; } + bool needBlendContainer = false; + // Passing bg == nullptr in this macro will result in one iteration with // i = 0. NS_FOR_VISIBLE_BACKGROUND_LAYERS_BACK_TO_FRONT(i, bg) { if (bg->mLayers[i].mImage.IsEmpty()) { continue; } + + if (bg->mLayers[i].mBlendMode != NS_STYLE_BLEND_NORMAL) { + needBlendContainer = true; + } + nsDisplayBackgroundImage* bgItem = new (aBuilder) nsDisplayBackgroundImage(aBuilder, aFrame, i, bg); - aList->AppendNewToTop(bgItem); + bgItemList.AppendNewToTop(bgItem); } + if (needBlendContainer) { + bgItemList.AppendNewToTop( + new (aBuilder) nsDisplayBlendContainer(aBuilder, aFrame, &bgItemList)); + } + + aList->AppendToTop(&bgItemList); return false; } @@ -2091,7 +2110,7 @@ nsDisplayBackgroundImage::GetOpaqueRegion(nsDisplayListBuilder* aBuilder, if (mBackgroundStyle->mBackgroundInlinePolicy == NS_STYLE_BG_INLINE_POLICY_EACH_BOX || (!mFrame->GetPrevContinuation() && !mFrame->GetNextContinuation())) { const nsStyleBackground::Layer& layer = mBackgroundStyle->mLayers[mLayer]; - if (layer.mImage.IsOpaque()) { + if (layer.mImage.IsOpaque() && layer.mBlendMode == NS_STYLE_BLEND_NORMAL) { nsPresContext* presContext = mFrame->PresContext(); result = GetInsideClipRegion(this, presContext, layer.mClip, mBounds, aSnap); } From a0b62367437c6b17961f748a974359071ccd3b51 Mon Sep 17 00:00:00 2001 From: Horia Iosif Olaru Date: Fri, 8 Nov 2013 10:08:23 -0500 Subject: [PATCH 28/37] Bug 841601 - Add background-blend-mode tests. r=roc --- .../css-blending/as-image/blue100x100.png | Bin 0 -> 47176 bytes .../css-blending/as-image/brown100x100.png | Bin 0 -> 47836 bytes .../css-blending/as-image/green100x100.jpg | Bin 0 -> 3595 bytes .../css-blending/as-image/green100x100.png | Bin 14667 -> 47813 bytes .../as-image/green100x100_alpha.png | Bin 0 -> 47847 bytes .../css-blending/as-image/green_square.svg | 3 + .../css-blending/as-image/red100x100.png | Bin 0 -> 47519 bytes .../background-blending-alpha-ref.html | 62 ++++++++++++++++++ .../background-blending-alpha.html | 22 +++++++ ...ackground-blending-gradient-color-ref.html | 20 ++++++ .../background-blending-gradient-color.html | 22 +++++++ ...ground-blending-gradient-gradient-ref.html | 20 ++++++ ...background-blending-gradient-gradient.html | 22 +++++++ ...ackground-blending-gradient-image-ref.html | 20 ++++++ .../background-blending-gradient-image.html | 21 ++++++ .../background-blending-image-color-jpg.html | 26 ++++++++ .../background-blending-image-color-png.html | 25 +++++++ .../background-blending-image-color-ref.html | 21 ++++++ .../background-blending-image-color-svg.html | 25 +++++++ .../background-blending-image-gradient.html | 21 ++++++ .../background-blending-image-image-ref.html | 20 ++++++ .../background-blending-image-image.html | 22 +++++++ .../background-blending-isolation-ref.html | 27 ++++++++ .../background-blending-isolation.html | 31 +++++++++ .../background-blending-list-repeat-ref.html | 33 ++++++++++ .../background-blending-list-repeat.html | 24 +++++++ ...ckground-blending-multiple-images-ref.html | 33 ++++++++++ .../background-blending-multiple-images.html | 24 +++++++ layout/reftests/css-blending/reftest.list | 13 ++++ layout/style/test/Makefile.in | 1 + .../test/test_background_blend_mode.html | 51 ++++++++++++++ 31 files changed, 609 insertions(+) create mode 100644 layout/reftests/css-blending/as-image/blue100x100.png create mode 100644 layout/reftests/css-blending/as-image/brown100x100.png create mode 100644 layout/reftests/css-blending/as-image/green100x100.jpg create mode 100644 layout/reftests/css-blending/as-image/green100x100_alpha.png create mode 100644 layout/reftests/css-blending/as-image/green_square.svg create mode 100644 layout/reftests/css-blending/as-image/red100x100.png create mode 100644 layout/reftests/css-blending/background-blending-alpha-ref.html create mode 100644 layout/reftests/css-blending/background-blending-alpha.html create mode 100644 layout/reftests/css-blending/background-blending-gradient-color-ref.html create mode 100644 layout/reftests/css-blending/background-blending-gradient-color.html create mode 100644 layout/reftests/css-blending/background-blending-gradient-gradient-ref.html create mode 100644 layout/reftests/css-blending/background-blending-gradient-gradient.html create mode 100644 layout/reftests/css-blending/background-blending-gradient-image-ref.html create mode 100644 layout/reftests/css-blending/background-blending-gradient-image.html create mode 100644 layout/reftests/css-blending/background-blending-image-color-jpg.html create mode 100644 layout/reftests/css-blending/background-blending-image-color-png.html create mode 100644 layout/reftests/css-blending/background-blending-image-color-ref.html create mode 100644 layout/reftests/css-blending/background-blending-image-color-svg.html create mode 100644 layout/reftests/css-blending/background-blending-image-gradient.html create mode 100644 layout/reftests/css-blending/background-blending-image-image-ref.html create mode 100644 layout/reftests/css-blending/background-blending-image-image.html create mode 100644 layout/reftests/css-blending/background-blending-isolation-ref.html create mode 100644 layout/reftests/css-blending/background-blending-isolation.html create mode 100644 layout/reftests/css-blending/background-blending-list-repeat-ref.html create mode 100644 layout/reftests/css-blending/background-blending-list-repeat.html create mode 100644 layout/reftests/css-blending/background-blending-multiple-images-ref.html create mode 100644 layout/reftests/css-blending/background-blending-multiple-images.html create mode 100644 layout/style/test/test_background_blend_mode.html diff --git a/layout/reftests/css-blending/as-image/blue100x100.png b/layout/reftests/css-blending/as-image/blue100x100.png new file mode 100644 index 0000000000000000000000000000000000000000..79f972cd5fa4aa8cbe252523afc47b98278bf0a0 GIT binary patch literal 47176 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 h3^q{cl=C#4@7kSjl?-^$!@DQK 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%0AmgU`QWhY#Iy-&z9q zcP*`IP~?f*LJxRwN*(-C^4(>YOl#Z9sHzW%CVYfzruQ2QpC9T3#vfK_RX#g=#NOW2 zDOX8W4)2^dh2C$R%MW^KgwVW%1l8CB;n==k!Az!&C_87IyLAAaO`@(!lW#Y9Zv|0> zc`k7+IGYr=_RWV;&h-GXBATh;O2nWXh_Jr-(0g_e2UrQuAKsG!{8IJ;Z;Ht@AkP9{ zh&2w3nwB}yu=|fAJyE@q`&DP1y9;ig>T+PNKT|tK>WrnNP{S7EfmH16S8(v=;{cVm zh>NwA3!Y0M3ijTWw1Zs;N>i;fU{Rd$hK=Zd2?K%0A8%tUL}* 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 K&t;ucLK6UvX^n^g literal 0 HcmV?d00001 diff --git a/layout/reftests/css-blending/as-image/brown100x100.png b/layout/reftests/css-blending/as-image/brown100x100.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a2d6d849f90f2330159d9d71a3948850c70a35 GIT binary patch literal 47836 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%0D9K9S)FL#wAdY#y9hAUn5fN0W5&{5 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 literal 0 HcmV?d00001 diff --git a/layout/reftests/css-blending/as-image/green100x100.jpg b/layout/reftests/css-blending/as-image/green100x100.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b920f7c0678cf3f159ff509b63c09606c677f21 GIT binary patch literal 3595 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 literal 0 HcmV?d00001 diff --git a/layout/reftests/css-blending/as-image/green100x100.png b/layout/reftests/css-blending/as-image/green100x100.png index 8cdba4ce099a9fc9c01eb59ba87790f10024fd4c..0eea75c96a76ed107369990ae47ddc8e2e4470f9 100644 GIT binary patch literal 47813 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 literal 14667 zcmeI3&2Jk;7{(`!5XGn`kU(%*ZB>a%v1ixLCf(KACD z=AFr2e0y`_%?pKB3J9SK>uZfI`suRw`E&H|@vU?7^y9f`t(743{0rT6 zNLooNI*Pg|E$by!Qx~tO3sPB8D_E&uwNg~ehN2s)CJkP4tw19)cH72Q)joZCNSgJ7iK=Mm;8W8ph2q?9}oq+dP@QRIf{~S+?T^Y&DlnJgFaT z_9zu;*eR*8Vk|0pQB|8|#ZVPPQH#p5p(r3puAInW(ZYA_)P9^SW7^3)q3g8|A1lj9 z339lO(GFwZPHUcT?-3jYdnO(=0%cZl#(I#XcHofpMvXROVH$*amIM{jr+4X+yJ$xblE&Mu{z z!|Iy2CLU`YO>5{J*u4L`fq8ylpFKuzp9E(ejXYJRnw=yG+iA~^$;uwB3GR{2Q;vHk zbDNmm;2m##7xLEe%{eL8)0=4yFEyhccEZ>ST~e!Cy(K$)2gs)=Vep894JT2LH;l3dmdOg93de3)0}m0v8t%6bM|91~(SC zxQL)Y;DR)`vB1Se1O);Yq`{2^E-oS{5V#->ZY*$d5kY~#1!-_&fs2a>3Ir}lgBuH6 zTtrYHa6uZ}Sm5F!f&zgH(%{Ad7Z(u}2wac`Hx{_Kh@e2=f;70Xz{N!b1p*hO!Hoqj zE+QxpxF8K~EO2oVL4m*pX>enKi;D;f1TIK}8w*@qL{K1bK^ojx;Nl{J0)Y$C;Kl+M z7ZDT)T#yDgJ`-1A^s_$_(BJy?=#Tmy{PO4_{XwAQtZi8c9bH1`*2f4vI;Nk0AkwDo1aC$7Th21Tzc#7 z!ZY{t;9M&YK3vFxd#~Tkf-Q+^Xv^hKn7DQS#qTp$>;K#Tc|d1)d_0eCU!VK#xAv<( Q{fgFCHyU5PapR+Z0jV$LlmGw# diff --git a/layout/reftests/css-blending/as-image/green100x100_alpha.png b/layout/reftests/css-blending/as-image/green100x100_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..1402d81f45630d958b521869480bf14b272d2807 GIT binary patch literal 47847 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 + + diff --git a/layout/reftests/css-blending/as-image/red100x100.png b/layout/reftests/css-blending/as-image/red100x100.png new file mode 100644 index 0000000000000000000000000000000000000000..adb1bed7f0ea5ae6f48228ff191024be64eda6de GIT binary patch literal 47519 zcmdqJWmH^2w4jRx2_6V8!65{94-ni!aCdk2ZW0JC!Cf17cM0z9+PJ$l(!e8k?z~xV ze$1Np=KgxMx@uRSs=ZHDom2IrzOyUzyP_2Od!qL+Ffiyc(%*i(Nz;E38SyQ3+)7Y= z69_J1GOEaL!57&y8j#j?&@LWYz8B0>R@d4 zNz%&M%)`Oi#^sZ^3im-san~Y!LYHiu(PqSar_~yeX9UF z>gcSl;hBEAA|fp&N`iC|_iHdne?AtSD3peCk-84SPAp)0c9uLggedS=V#rrZdem=& z~QrUSboEjVcj4I7AukgPFf0@d`JfG1!IzT&}W67*G@y7H+q6uhRLhlgMKLv%!QS* zlx{)$Px{FgbwZ9DB8mZ?dzbvn+nHHN5aCl zDrTLpxIYBq%bj1eB5Ksek^s-7QuI1=(4-zWZE5uu3IJfulo9&Eft~BpK2Fm0OzwOC z!9^U|F}x&hp+Ygi1||!_(zb_$}aH^>wo#hH|*8Xzrn-qj92 z)Ii7qdJo9IK7|-F0AHlA+_tIWOoI?YGSCJA3?YHOFhN`0XSJOsJZ}$H+RjEy@^O9m zl!7XOa|Lmo#C3=AK&osFu>+q>eo;;|wbE6j~EkVpfL<>SD7%5`xE?n5{Ub-lcB zWt4x&%bHY^*%~v^L`mzde=0qyEGaGhIkR8B z@(})0C@s1TKVW7__qrv(J&yqD&7G!nLA>ij!>}anqS3uC>=vm6AFqw;_}yEQqlt_qkeZe84%_5c$|pcB>==1)MOS z)ekMaZ%(f2)xFM;gS4X-7xgF-)=Kq|M)Rbb{xyPxv3#q4* z7&1*%sh2G9Etp>;;_~YkxY&Q6`W?xS%g>1RrA>DbsuvVdQ%Ul7p7{P5^WOd4uJi+f z5AAWUd@GgtatZ6oZZavug8zurF4IY?azV;sGFqAyB6kTc@j$2%$lP$7lYl!&pMZ4C z^df>lkP1;LplinPf>W^dm3YlZpyP8cT331(#&>3anx3{?>xz240r zeX^sGm`Y>KB+2eqmC3p^O3 zS@kCS{LEm$!aWT`-TI7uKU~Ik?{sxcp6rMueMmqiivWeA`GEFwjX4L@#h-AC zMWtPPGH_`EM-#D3yL;HnayM1e%T#yel#jKW9lI*t!INHcE!Yd$gJjc%4A2g>4&MZ{ zygoZnpJ5GwJQdo1U&8xBXB}{D3jC78(U3otRQSGCFJ);r)>YDuIuVKuYzE zBJDu2xH}L!x0RRFYZbli3Zw0eKHvT>D+?RnXp{#b{RKhxaTJj$g@EwKA4`wV(%Nx7 zdC|3q0M1@Uft$D%Y5o9Ni|;9DpW{T$YGSeqc(%nwY~M%f7>Z-Fk~^|qFA1ssLXP0# zz>Mms;TnabS3El~-|NC^k!D6CcR^e6pZfUQa2;VYh~-ztHxh6c1amm}1O}ZaJ~d`V zYeBWPDZfrNi0TrS^3XgobGzY(!%qLS<%LsSj>3DBr1F4Ulz@s&)|~=5_Dt)<%UQV= z{D)7BsFRhGZWf-ZXrE?`VXRC<8=(hT!>rCV{0t?1#%sC4BwfY*Ypg#?KEfo-mS=+! zPqX0{1qv`8g;mDt_MC5Rn|u1^4wf)UKuLy54tWQ&?>^$BN0m)+W)k&Cfq8{-!Jtpp zjG~XNu=)-|AdjymlA%p5*yP`$2;cpf;R8>F+o)~))a36`n8{eZQ%T#Cj9QYr&ux8| zeJx;|_DS3(g)|n+5Y!+Yukg4040m8`$7l~*gU7^pFQ{BFs~(!o(K!7O(?*UN_)#>* zwyWC+&Pahi*CP?9Z#mwFB+oTi(7RI=7YQa)IHNmBeVSlrrbGCFh$ozm{N1U`7)eyB zO``u8PrmL$5e|z10P#cpD#|BG)T`gNR;wz6)AH#cs6K)& zkp&YRPZo%BAd$5%N=Uy&_Cpf_$)wa5$DkjP+|5=DtFC@ITk$+X6Y z_~S5%qphM`UXwM)I#|6jurU`EJ7*jU^G{nwWNr!t6%+-E8pJ+n%8hnOC9u`)g|KK{ z_t(K>LQG~K0L?gld?s2)&L0G?y7Ax1$!iTFG7|Yn{g%^c$Bp_jUCd>ZN*7pfzGm}) zU3OC~$L&7Qwypn;RI_(n=`LFtnb4NY+-Px;#>hyOkS10op2w0)o55YV2(a-zL+;0{ ztv>=2vSK@M7^Dhdorn&%1|8~c=aLY}v9>#zR)Ln|!AbTE*1kva1>e!tDS26YXMdg&FCY-$Lkmp+sf16+6JO^uEB_;?+{*k^_r)W zC^+dlQ%av1vKLx9jtkfWv2stM2wJubY2}1;IHQ9Ck|j94fpYh{2k@SEBucE1OAZB= zUSNVoy}RjVoe@YK8OJ_cW|s00RP9uduuftbz+EQOCw-m8D?O-14&oK;6-=uyV#LsK zDJmTob#oOppc9PkLCi(v#Pj^wwY<^9O;Cj~LF>v}r6}%-Eu;L*;!J9805zig%<&Lc zG-kVztdaqY4W7Q&RTF+!nWTE5yN*SE*Fx+{l4}APVOKC`-U~2#PAaRN}W854ZB2#iJTt z&@V2MW`gU?8(ATtWdK`y+ZLHqHz?8Wy51 zLVu26fOg#qW@J`8*)WD93`sR($Fgx!Bl$Sln~E#07DR#S5}&dK!H%#PJSGwQjQ&~c zy!`Tv@kpQFaua65z%WYE^iK^EjQY}0H=OJMno@7iXDm%5DjM{b%{ylBy4lK5{gn!3 z9shnWKZkh70|oFld8yDh`BC>i>|%7U+mmkmqYLD6v{o{J_@X z*)q{6=p?yMZj^~9zPurJlIqO<>WgCzV{*bMwe#aSMu?CuKhn3@Pxxxtc-=AYZPhpX zT(JwM?;zccFffYF1h)kGI|Kbn{iObIp!C54zOfBq^-F@Cw9EA5W+Y4@KFV`G>_Az3 z#!d3o=QTdt&Ya9nOSN(K`0-&8cl`K@=Ed139NS-&&D04isBPDc@hAbCk5-gi3JB%u z-06k8m|aNQjv#ek^=WcOX6n-$VW2?yvU8A!cXVp?(v+sD4UTx zB|Kx~)%Xf6st>+1?8sY=GD?=%c@VKQWy+XxeS{VgUyZnyeO4?6yPTvs8*(YMzAW7M z#X=ZKBNfpH(RX;12p1{g!3+6Wmj2uOBpFFt0*ZREGG963>bhRHp4i?-p^LVLz{!-J zxJ%Lt_~IyH3AsMZKOpg?vEwBOeahcK7T?L~JYo6*G2QJc zCsgino02fHoW;=H;=w;TpaW{I(fTkK7IyBJIQM|rfx;@+C2@7t$9)NRs~6@wOf!$0 z_mEF33X@)JQ>V^T^;Q(I@EH%XlpU~0Y{kk`Lc6^dte1od_p%}9Z1`Xp z80YLM0y!@#o2$-mP~=INk-&pAxp`f#c5Hc7%bGBAr?_n??rlvi8 z_6sdn>4#;~zn=EPC|vZJcU=OqV{`)cE9l$<)*3Twg&Y1$P8u81ool+ z=N%bvmh0Zy*njlQ+DnS|o(vIS>iXaM?3x0zrrCD~XP5ffBwzf4mmIbyFmq;s%;~l7 z*Yob@;>!cJL{cU=+eXj;fUw%Y{AA$|%0|eqEweheV4G3}OuOd%yFhL2xMIl}%aXBV z>mre3bYNxiwt;V@)q~H#{33zPWjhzpBJ!orV?IEIP6ZlgZ7SZ^X}W*^Skl=h>_vC> zo`BJ`T4Hq*42Bh<&_E2jF&Ws{_O{7c(bs1By#C zxze+cdmQ&yPpzl_ZAl>pRl}dQ=2CMj+c)17Tv+;GXN*ib^#NIsJ2WAtGV*9bT~h)o zQh&#usz0Z|9Z_>mu|-CLHX!s(MZMU3t;`DK35tY?xy;+tyv&F+bQqf|Oik}EI5Rzw zk8N@&cu$--yd9$2Pw+l(H8*chP9eU82z_cakXBahcCRSYJU9D#;fF%}$*gyOajGUr z7tg)4w9}~FbNF`a54#%!e&nxCrP1#V>uqyA;=-S$3JME#KmL|S7DScg z|4eJEqMfHtvbS}+ZT!Z=E9cny5Z310aA*9p??$0>HrcER?Lz5um)e?X5AQi5TSBy8 z0CJYav%T^}T=RQxR}14+tj%&|#NtpzM1odiODnPvgACm@d!OSDBRx;rn`UVTot?rL zl6f<Da#=5N1uvzNo@QTA;w75x676V>$T#GF|dRaF`t9M0H~(ebzl?7a_1-wD1`&>M;|t zQ@k%Rz80C`BO7har_2vce=QtM;6E*AAc7W$RY2i81ghS3ZZ@E_D^|j;992o>i-bp& z^%NrdTqNPQ9xE<7n-%$r7HoPzF(o2NA6T7t+EHc{h6t{f9nB5EOmzW8}y;+P=qLj+~!F-4g>>7-a zRDID(b;Q#tz?-@GV|K3vNqB{W>Q(Sv;t3VZEdno;+3q4`wxFcE29Z$0Fh)Z!`RcI~ z#-l5-Cf%b~zWdo9cXtHw?s+ISqP@R!H@TTNcTBU^IA$SturA%xuO?Zg%cX^9K9q{yeKGByNY#fPNKvA!?9FIfaW7F=2#x&~v8}Y$G=^raXg7 zZ|~uI;yLo^>=Ig6Mbl%u875pVB4{x_2+Kibb?q&!_?J)Ms2i;RD6a8VUKf!=PU~k$ z@Kc>c&*`RwZ@G-OW$PdeVKfX0b#waZU}0hsSSPexg# z|17C-xR(F3%^1YIA+o*A30oYN!RW5fClIcyTHU*>Y_8ZrFYfH;pM%yBgDU>X3IcviabWnHmXrg$)IV)0 z4U&vtP-ppQYgk6(&y3Q4lF^;{!}k6Eq}USj3biv`S37A#Khb?N|F7kP}qaKPu{A5@z0rB-)jy{xCUb_~8w^!@n(kZ5qE7iBxc0%nNF2=WEcpK=?>Q%Zy0Nkr$_Mx2vIyQzgmDWXK!wSmnhW5ph z&M^tpFXLUz)hy1gq%ZQk>lQZf9h<~aRe+9l&JeI35ro15%%p87Q&$y+NBs<+(hxt@ zPG_o7QAFNXQ2>nqqM+-RNtooL#JXOS9*we~;0;Ac(dpAYVe65Q8TG-G z$K+iTp3rw%J}NYbp+kcoWg<%s4Wet}lGhi= zY@^rNa1$U6Ao*1l{isBe(LPfs|<*NU2xgWGB#kaV?_H( zI7OAYvt@`&{H#qTfIP<0%Y zuF!;5+H?Xbf%xOeU2&b{C%LpLFpZy~a1kQ1cID+n0Zso=S+eG!YG)y_w;npYSX5DFv7dSw=t>z$XXBzJh8iJ$LOhVlRlB131euqNW?&Z`lAOL+KFN>EO$xtmy0pHoS? z?u0~qyjvIYI{ik{L)1SJH+LR`5P8xnlxSRiuZU?P9Ritb_?3~xFmN;81N?; z>+DHh$2w9Cj{6HZ*0Jckt`lLNX>|1^3lDGS_8Jqk5YC^naGEg09B;}s3Bbd=ab+@@Fw2k$l`_d7~2Vo7X__E5owriH2p#jLvPhoDPi9gg{6H8J7b~E zrU#$))YH0L#zbOY)w#Hy@U$-H{E1w)+>mZy#-OjjV^>^LL%%5ivm$JQJ3}&WmB!)M z*htMu1bgCQemd?)>Yq)ZIXA1Q&*`XYLmxnb+%}=RO!`vMa=EYZ1LDtxqh~Idn=lnn z?EMs3X)!v&gIO0z&KlQjPAfdNBOEQxnK+hUORiYW)kin!-6zAdv>|G!UID&k)dbCo z3F1qU$lWq6kkfXTmUaCS*fUkAx^G&br(Ac-B&jpMuCVc<%J<9Lub^otVowYbkji9% zD2Co|*gr30LeVDA$8V(e7|1M!~a@mQZL8?cK-Xqz9L8d~L6 z;X=6v)n{R1h?cyQCa}_G;q|U&Ifrek={w)mYEP{=Ok#t$yv&xE3}U_*gK9luo}_N+ zQU<1Rp)H*SnQ56|%10j=1p>$RKFfXfM`89V(PrI*r-MI5pZG-U|0@hG=a-U7X&7TMz&5y7&NDp(lgyQSqgV^qT@ZOYc&v3ZVrX z99m!|QPfmlbYk|eOd$-%rom2rE6MjTgdje#Zl!3USnFopx_@&-VjW zKKKbQ9ET}hG{7v2GCdW=hbO~R6JHyrVgb`Jr-y3WAL%&^{wCVG72C5)5K3c+EHOuL0>5{yon`5 zGQ8Ug zEl+%b11m&*GVdWnG}%(I7V%Q^NRG4qvzr;KtEt-}%8@YD1aEH$Tj* zt{!YKTXB{x9*l-)3ua?vuD%FLDqrDiy%Zu~Wq$-fh08y< z$DV`8b>h?!YtNXU8Dv&kPo}Gr3RPb>{h5(0jGdM!5(H25yWioSpUk#p^bFYQUl%!Q zHZ$F#NC>7CJzi6B2KvTR=oacMps%JqlKEFXL@$jC{vGINeaS(;v zCSVgb`mu`A6;fBd$V7kiJOIM)9_=)h;F2A{tr5i6IDLg5#rRG5=U2-GX`@@n;7V2H zJ1MeB4-)lT+oEcZX_Ichcd=)rZE)VcfIwnq#5@sw;}hcKzs2{Pl-T zGu(OwE@JN|&nRd}wrEx+oSuv@&v(686tl-z7DY3YnzDw^Jw)0tVX@njhR^apwk3IR z9;}W>kFz*&9Zx+lezv_go6Yv^lLfP93;A>K8x}_MyH0?{uLmnY<7{`~T%?cnJFk9@*mVWAHv3H}Rno#~E>q{gq5G-sWYq zokg=vN9^gJLbEW0SmmGVFr6 zEj+qQfK|Fm`EpYK;|teA)zzUg|_g;>M!KZ=~=BBj-BNm8wECMkr6oHt%}3)btaRJuwqv zT%REkTe2h?ZS(F3s!EZq7VF^(`pky}E4r_T@MA}n6M<&@2vJ%!S;c5X38J9?&Kh0B zu6gsbupRILh~bG34u?*vFo=o2p8(|fUo9*SMdW+1^C^$j2h1TscEu;#rMc9YdNh9sgfNY@E`q%I#anjX-C7a`h8Abph4qs|b` z=O~g#Oc=^$Um8@JNxRG;=lZS+X06}0Ww~F0--ERim^C#p&+qk;6z(Kp*_jak zaO1g-M86cHQPGvgRG2f>?4EO;#;&D*)@6)j>8N6a&{r7*~LlEmB<75(Nq@w{`fpC4|)@ zMW4PGKme< zb0S|3!qhSoDm$*G6)7sSUK|S~Eq7J^|0=xbC{8%Yu?xZy!PG!MyH0-vGceMP__^jy z5eW78peZP$1aweCsuPm~qCcBhj$s?r>_u9^3Z4%XT|Yb1Jv#T-%F6wZfihoRl#lXp+}? z*%y`VhR@|1ak+%uWL1g~8L>$SjB)r?iBw~ce_634&y+R)w5wuE_+Ew04t0lzLb)hq z=00GP$OO}Q$)B30eynnqoX&A#0CNO;O?G-6w4nK~{E`Leq0%jmytG zp$X&-(c%>6{A|taYdfW+pO+exo!Sw1ifK4lM&~QWBsB@!IQ<3tyxBVdR_<&V79RbQ z1}i$$8ReT@b(nCt;r&m%ypu{PJ*UM~aXmMT5)kSm|7HvcHVZbZ4^(qTuym}AzbEleEcl%cF|cINN{=||8w!TA3Dk}C$!_Pk&FS3&nx1EeS% z4C%gOPV$`!DS)RP#`oP@DM)xqLjLT+?E{E^;3Yfn{EvlSBl#7L~ipJ^b+lcS{dG7D{z>Q)MQT((hFWbWf&(-&n|t!`VbW~m~z#LHcmzR-Aoge zFgu)$d270L^|#|TbD)6s2L3mU|<94ofKZ!LtBqkD=DkSWgfDHEA@y`NUnqLo- zH$y!&-@zRl=H-d>M)%VjiEzAdbM0P64IG*A$RkBbGurrr*3C??) zjn9NLz2+?)1B4Uzu-@FP=K_fSF%X!Vzk(Tq;0piOpwY}GTtuRSRvNLJ& zH*PDuZBP-*z*ULwl2G1PlBVOsmd|J(&&EWX$+>3)>i-8e_#(h4{3omTzmN^0faf<* z=~n-PCQcH`TSm%S(gfaxpq~Dzw0M@z!@o5kb7C8cYSQ%l#uvk#BAu2XEf;bljBgbl ziy-{Y1#Dksz0ZFTur=?z<(%AVWj(-gfbbaX3H{3 z>&xvCOnsF|dGR7xSShsi68`RKMD54+l*tzX?Hf{5QlYz%kY{$2&LDXhDO_9@P`QAv zj-9t9s?VTrQ9f6SHD_eOazt^^W9|9{B$fZA50aYL>0uigS&awQx%QYpFz~ey;&o&1 z6DgMDR)xyBM^#onjvU8%Y*qMIi{a_?>IqkyYS^=R?6!_4Zrq?d`7)%FIj2)9)%g3N z-v7SMtHTJ>qp2XD!q6@aUB)@g_B38oIL`aH&%*}zTgatPr{TY(U>7x%M z`Sy=Bz+cV;yj4iG#_G8FoB3$LZVh?oXqNd};Xgv~D0>auD9Y7U)CRom@y1;;n5Jlh zCb5}*{xylyBz#y7VM#|R33)A?*O#0rZ5awuz7y)@ZZ|jqZBV4v$Z{Q?Qn9t(V1Ap_WE(CEmok%Tf(9|q z@iH&EuAOyDK?0n;9jBWr6Z-1TZ?0;|W>=Fpu1M3;rS)rNOk*dZwjLk#OM$~h~U*)d9LXUQi z+*foU=*Qh0ITI4zE0iL)`&G;)Fjn#NG_=eoQRlW{7Up+tG+@h6r`;a=eRndi$_uI^ zrOE`H;YP_Pyf&Kj?Pn?(xTp12!%$p-Oye}@>8IUw2B^^akOY`sx3Hbd+lRG-fdIUE z`WH{g6U5r_AFS_2(kMY+JydFbQzby?ek6R&jqVC?lXLYhB?x>ea-q->Lq#qbDiDgal9Hu6&Lzw@AA!Ufk|+v?b%)wzhBZV}nA}Jk`JV3|O2MnXOp)pA5p{X8$z` z;0UZ`=yX1>-POABN*s|<9P=w|ECJ(dkM~2jM?|BvHP0;2cDgNX_T^#J;9)qrO>s{1 zax`N@zS-dX+!-6{yQ`zJBuggGO=GDcPKde4#A{o{D9eN%kAkHY&0uuPy*W0H>o zm6;jk|43QIV)NGs6PTjS=c@WZ?LXXB%Q&w8&LVi(3xE9O?*9qvT9Czo0&kE`+yP$vAFO-hiy6T= zoqcawpvIq|f7&3%sPUdDu=<`}-}uVkakYQ)qX2%WlkfkesMia8;eIpkzK-brj|IN9 zoX>P0gXH%kd5pyciEaP*<_fa@K$JF%PP9KbH4Fua)1+_0V4G3imx~byDJb8^$9UJNI=Rjp;GpqZ>{}AD50Df3Nl#KMJ4akX`#Gh2z&-_R4jB2`X4u6 zDOFd-H+)3QjyQ-aE@T%0p)A@|3r9ZDIetty2_4=IVXu=mKmMb@M!nVU@rCc2OYa%} z)2r}C>dxX2c17lXnZn^PMg)bQ`;)3R)t`KY#q(HUR&rH%1ST1WIi6)5v(w0@aGx_NgS_0dzTK;w8`dtZf2>Kf}ah9I)!#Mcm4I@wsc0XqA4-akRgF1_-v`?%~NR2 zLO;Z{!}vG8{R~sMT_217Rw_ZX?j9FJOyA(h&BHHI_ehN=f33CZl|!N(0utWLXg6TG z0F0Gi17?sh}?a2MEy6-POXAyFX}e>{n6ym&AdVf=u_ z*(jfqFjIfgN>YB{cb-3PF=D(3$zdk9VkWY=qnXS%W$soq?I3;LkkQpKVedrJ=(9*u zr226d%hR=IrsXb4D0lKhG3U*#7DnSD@Q^4WvoEH^y zNOQ0wjK)jIwLA@VP8^!+5g!$i7XSBD&TxX;&@ZWnLrLOwL^5COpZW8y{8%Alrf*-g z&7g8F?#G_8!2@T>eeB{yh#H)62+r?2HxE=wT-awS=$9YyKuk90w2r_M647>Hl~q$o zmz*cju|y8|97GdVljFRqrrRlgXo7Fu!Bj_~yFv#v3UH_EF3_Kn*5@%5;993 zw+iK5S);N4*-K=~Xzec@Y1=+x5u$MPliACfXt!Q79{fwI{NR-5AY>}Ft>z@LQW~#% zYN>Vb8T1%8YGU;sux6k#p)lcq{oI~Mi`KMmT<1dQM^3nyt;^j1mtU__G}Zrl8qW&u z&N0c=NNhb+#&+Y!xyO7SiWZYWJ1vxe6>(jp0>${|QQ#|m1*%AX<}(Yu)UcXu`~~UN z37o>B3P9x|rR+R0`<+5Z5ISKtUT?fxO;1yYoxHDqgfgglHM!|;{#1sd3Ga>2Le9Ix za{YEh!QUo}?cuVoDL12Sv7Hkf^A!w*P`|1>wvPIyS<;$4-u@nW4(=_J;}5Y^9gmWy z9gFjBi-vqhK9}VlR{*YIBsYeZ-mALQS=3{c&XI}p72KD@^7VA;%&$V=nMa%k3z5Me zUq*giPK7l0fnp@=421AszD3~AZ*WP7iA){6nt9G^EhMp3(6F9?*~dGFv|HaM(zs;> zhDE~j3-GJDgUG6iHn<><@AK|a6vO!5A4Nh_H&S7^9;I+~>W8IHOPfN|>M1%MrB@{z zw^iY&gQ5jT^4B8Y=|>swJq!IXzV+kG zxX|9VYr#@wX1%SsfhfKGqyd?C%zV8P?dDQ_2QDKFlxDy4TxGQ^xlL zPNZX!Jc>GjG57cM5ZXuwR@59V-s5kD$se!m;w06%!nA_5=+KF@Hp?VcLMsOQUiJ9h zg|3OczUw?&0`Sj{z$|)r3Sm%UKG)6QNa?kFLixCXVG^=ddr4=RC4SqFH^#NcRlxhO zohK@@CErc$A$2+6&vRNStXd6e>jh5lDFH#+rUt7*Qr5kun zIP%Kp|-yhIcn<2<}#86$LEu!)nx8A^?g(Bg|_)a2345%i-K3$cNCI9meYgn~NoZ=7szOhOhKFy&IA>p$^B$dpiE=lz@ z;R$n_`1Pd%2a^;5uqz&;VRB#EHqDOR$L)PF5kn(tz&?d{*DDVr!Xz`_+fDQ_PQe@A zpB^?*>Wn?7Q^th2pkitvr8o!Jxz&%niqT(Uz$JJn=@$*_z}C+b1Bv<*gkJg;R5!0E_$8}IZymHV|QAQW(vk?D4js{eWr zfoR}o_6^aFd~|$>0i_H$ZSs!n5&W$mFQ#5*X5KPv<(^lbNY!{L=TAk~%#|8HMsyc! z(Yqa0_!4{n`0RfD^N%4-9vAODFCVbi_l*DMjRh=^xD8;SpY<}V)}T(Pxv^&q5E}VT($MKa{?+!S&3D$=btY!tDme+0M=bkUQ(p2 z)lwNIvpeIcf?KP!=6sDZ&g-wR$HGu08RL%lH;2oPHy_M5e@Q*X5sY7~SSMrP3mlk$ zzskd2o9FE-D+{P=C!Z(BRv5wDMO><=B61$UxV zCiLPK#s@`-aBHB1YsJajV>gW#t4m9nQVBRc0jfU4YSG7JX`kArx6<#V zpqc8VBRp+MG5Qcc;W(@5%$6FaeUkfwmn^Hj*AoH1OnKS+suRsq+5y$!?+}h>)pe@M z8*mY+#cRcdEIIl7gDu7X#tq*UIw&P;Z~XOTih_(L?S- z(-iv$frHBB;n(~c zOqHbN{V~^bGnR+>_~TDWRYrcqV;we+kXeKJJFj|?GQQc=A=@$U$mv%%y!I5eXld@xn}i=%3xmbD*djTqj@~j zjvAuRXMvvN!$(`?QA^vl!atI79O@Q*Yd)X)*z)5ygnzzWp3zQY;D+#zhCYa_u-BUg zB9qj9md~CAI!m&30KH6T6E~QPbl7m-X|$~lFda~pU6-SXsI#0TndrYZQa~uMdxb*q3YM;kmKtAiMAN69V_v1qgr)pmMEYI{fp;%|+_%!(38U^gUWYVs0M_k~=}A6t z_ui_7H=>P7`V&{fRa3$^kXjL!46o>6--?C{AXtha>wAG93)?&!fIV?4b0H|}2TL~r z&wVru@k|GniyZ_=?&2JMmHheuq`aoTeOi01WzQ-#d6{S?6}SP!x-s2eGWZ2_hKvX{ zsNJ)*S`aksJoE1x^*e4E@7HnpWZZK==%W(?fHs#Dc64^bnM;GOAoi?l=0SkYJcFMU zc)Z0pdP-AbRlah6;d$w)E7h?(@hHJ)HlR80iD&<6iicnVvM=d%%ewp(94=3cBXXUY z&0)7QPeKzf5)8Pt?W&iq|ld{h#7#N>9fMw&N2@DxtEVU z3DpDVcsgGq&kP!lebo7mvv$2R{GR%kI$QK-o=03d&JA7{_PqehA`2(4er7A)XA9>m z4bP9Gkp0f*&dNu!1xP96YsH+$Q@X@l7U_b`|J}4l$iK5B{`bQD*S9T}vL+$b;cqF{gY9aG=V&X-! z(%Rah)e7qa@?=0}Qc{;8D*+l}z<(DTBGAX%{J5#9iAI0px4_CY33FZ#Jr#pf3DjqY0nK-Q~-s*l+Zy!&vObQnPehR8PySIE59;Oh1d{oPLe)uyn0w#QY z^CoNRdpQt%q`E!Z$$v?B_9NZ;+ps9~BB}G~t&4!5vK!^)aIxzg#T4d?MrOv-m}Y%5 zpy}*>J5=6*QAf9r>8_B}ruBRW-Skca7<@kVNbk4y9DT%n=Ct-q-9c3=;yuZocqleg zJZ6PIcz!n^awQMlB^=|apxEX(Q8G~Wo6LfByFLHEn0xPNx`OC`RErXwD2W=9AbRhv z79=_morvChFIO+odk{nr5}oM1Ui~7tdgtn$i`$-W{jK-Md+YuA&YHE(oO5RFb7s%X z-uts>_MAi4=j-&jj5!C!57Gstq+X7t!}0Jt^&WKU(Ai72U|#H-p%|;SDG!1B5p$5j zLk#+?z8oQu{rmc$jp2W~iG&y|dlfiw>DnvZ63HpXeI*n;xLnX@xjRs50Jd@u3;d#o zI$WeGoOl10-1mF3dcS4M`RrxIP*a8N+sQwdOnN2(%?RWBzshpE^U{=NWt<+~7l^>d zBehSva|jdxRIe1kf&L^@HIsf7J<0LF_yp>g5*73v+wh=rCTxhR-ImcFc)k7IWYFJ! z#msU~@8RF2>*l|=(&WX2Jq>+VFRw;X11BG;GaLRHmSQ&oJZvs)QRq>|TuQk9_iWGk z(aulwi!S%GH*X6+Ei#=N+_UaJlSYp#4X+@9f3U$7X~1kwOhtq-#S{4PWW~SC|3hEPTXE z4b791&uRW1k1JvBQaAjSl<*^lA1#c4U|Sr#v6{M*g#PtMdJpOU@$~|0lh)Xy9G|QO z*?g-rpsBXXwmC`CXCF}2X8$`jpAK}z-hU7GW_J9h$Mr{*(sP*s1!Y`F6%KV_G~BD^ zg5g5H82APf0iSF!Rd)N%zgc~_$$>u?tk#BPgxzUWo@-nCK$r-UP4UWWhML=MYiuo5 z9%sl3pwCb3JM&>*15dNB$K`$r793o^2VRLqgX|hEeJ@9?#%H`CzGK7JEfIS3?_oRo zQ1^_8bFr$^ISBN9u?${5XLj+0?Cx;}sawu9z4l&k-`a-n;t#RaTXwmDM#fRsrs<~h(q)7*fc&B^E;Cx4?1v5aB;2q?bb ztUfC6zdZ}=(7x~EO6D@lcUNNIH5i2Zh_&&||F)&vga`(o47Y4yX=>dAkCTZ)TwZV6 z>EW#@3z3vT@7T@ZQJyYA`oSM<-}sq58usa2N+-yuCeS@qZU1yt3&~~0btC8YS3;@Y zQ8X)OFz>dWubBL#j-5Gp^lWE3s9jL-C8=|khl!}3c!KlcI(y*YbiP}DPM44M$}X1g z)PXU)^1-j>h(x*kta1FIJ89h%y?-_Vzg*}H93T4fETlN`&c6YoBKYklN#pwL+Jd5B&t6*-5zU(YN1C< zu98V)_qBzS{0+AC;%=YJGL;)cWO9tnAIrCBXg2G@7@ikW3I2~R>;U#a_m|GJThf}l zjJFxjx*!WZ1U}Y4O_OJiW?~rg8Oi0?K2n%RMqdKjYU-EqOfZu+pS{pLb}LP)dGdw2 z%jH!F^?7h*7YWF9KOj?(_G0=Qv9szn;eN%okKWKE%G9jg{;x(G>Dq3KK7-tCJL_MV zU(!)V#Q|38p2Pa6*TBs&J)t{cVuJ);aX0v#^b~Qx>-ng4_j?Wn%ZoWf%*JK*F|X-ZR2^4AFnwiuO7CYy*5fT4ly6Au{xNqZZ5f~=gj{;e{tP9?rXY;7X9x= zzH9$+L~9COab#RPd7t2&(#2_Are<0}aW*+0eun8PXO;}DJ(ZMJ)+uTLe8)KOIj*Ur zo|lw@QD6IqH#56ZC%@7-<)?%Gjg^*IFV#Bzv`vLs;9XcO^%uk}^`-*ReJH3};ZLdX zyM>mQ=3XePnBD`#VK3c?ddnL$nPiq?I;P#KF_q8no}}E0pIGWE)887no4H9SrS#|K z>MC)v_Y5QLf-TZNL@!M0q;Kb7^o$A+D&pA6=x)rJ^ zD-qqx=1_v>rNWT+CP?jDNJyO{5P|Fe8_a6njCOFv3sLmf+a>L(Hv98X@L3pLT;P__ zhPO)%cWgb4acu-hl+e$ORU=0fKqQT=r@o6Lc))5z;n*VXq)wh~d*khY7aulWU^^&v1W!7NQ* zJ66343P$6fVa$-iMGHoBeZ0jdlwl_qzmIFWE&IAyZx;__nz_IZuIE*kzJWJ$(GQGd zG4ph*^)YI2oO|gCXZ`)d%V7a;^OD=dO0?KQP1f!~p@VAypnZw1-VwMqrucBTzFt>! z3v}*?Mk0OjW@WDXNsd{oe+2(t9;1fbG{2LmJl0$;(v*}!SE4=h5&qeEr$w{Dd6-Li zU5;_VArA?sb#pS@tuY+}z9KGLA7iz;0?%Z>F59>T|O6FTpr^>TK8pPgyv+&nJU zy@hq2nm~b7Y|u2X?;j0Yz`oaC#{+m2uS%uMSM-DajfA*Mn-_Iq`2XorZ(q59E-qqD zfM8iQJD_Ao6sA|%*%w`DfjxLo=}aBi|F6c9d9Y^9sWs$2V=uLHIr(-2dG4jQ@m*J> z(EYOl`efXJ-Uj(sFpG8UV5RmE1kCXhq7P0~PHIr5u-tTL9P-A5FV3X}S-j)sVQl^_kNVHWT{y+nFSG~hVQHP?K&iwII`#IXC>stExOrM~10&v~x zq}>2haA`o{j3-k*GIeAbA~-c@>I0=tJ^iz?>gPLCaJ?$Alr6L5|Mjuei!MlGUpf2) zci}=vo@b$2+nbW+T-kut%KF5CG9ieC`MD3MQ?wKC;ralw?z-NEL|pEU0Uv(e z(lpjwa=hi8+@*!4Y9LLjm%w#PuJ`Fa`NsA}=5uux;184eC|-$sAPR905xLPsbGK#? zrHBiB0YE>ZhM(m?P);=0j+3te&6G=6yL7k5JLUqHcQyMvVE!F>U?WkgXCoENa0ev3 zA=4!hErT&?Db0VpID)Q3Y2N#u5$*f$m;o!enITI}T*z^Qk@WzKeRyVpcmI^9`aLTo zP0#d5M#UWVt;he)Fb(9>_HsGyCSljydBC0st>gU|+V_{qbi&}fGgFzlEu6#9aE*iX z!FkUV;?I>`U+KKW91zVva+v$yy!3lV3tCTCu7#ALuUvW03@=w77)=fx+eB`v{UXQq zPaN>Td$ub1=UKO1?OCv^d<1ymA~`79zX0alHNexEi9koAuBc5=*9{in{$EMzZ;-wR z%l$Mvjt8vy;FO0~fJxJPY;~w>NrFi-a=43YnfGLUsWkhtnQ2RVS@v#@%hs5bO3Y5J{gGs6-QOuit8`ttO6F~@9l-TS(HJFFUw z?QPe&(d7(C3Jx?)nBoZ;4xaKchoL`69{E9C$8A5{9$g!nrmZy`0cD#Guz8LvIC3^! z-GK^Oi0*Vi@VbmF2yRf=Gr9ill8qaIvGZ>P&EBb>3IN|eMh+h~1ILmA!RqaDrfqdC_)sPB;bew5F#u`0k=F1QrHjr6@e*=?M4o}NoZ21_Xq zTkfhxW_I%j$99x??_T)rsRgY4Vr0}q_45(^N7Ax1KF&i($#mPANZ*D&x9nzW3chGi z?}{hvqyqLM`fY7({~aPW<_Y#mK#|auo@;J-v!g3Vb6ddp<&PRA!1v;Y3TAZXD#V8` zC}<&Rif#cY4JuRV)*3opwuO2gH*fQT?3fl(FWwV_ypSs)G?2j5OX!1(Sy^yc)0xrU z9ci1tV!=`N75KRMN_ao^01Y)50hXfmea^2-%QPA2I8IpLb(VaS^kY7T8|e#!ghXhl z(dAiC$VRLAYhLgZuE}eln@Q-{NUQ&3?c)>PsgVOoUcYFX`OQhs8-)1*ZnHQ5%}}8= zzEUH++HP`U+_~)^w6=&v+Yh}NNEFMT1+U%}+G6a$yT?ZB)B<+^|H&6VA}Fo-hNECt z4>VflZ`$@9Rw3Q;$`H+6z|M<`kvlB&h=cJ=&E zr*`3K%=9{nrndl60GtM3W(wPx>*PL;Rh0{!tkoNj%&>;1oN}Q53Q7r@LGYI8np*oD z&nvB*?k$16Z<-xcIrF~nx&m3OFCV0Mwnqy-=k*?%u?q%_UxIJTq)* z0|8zspKD*K!Bva^N`1la6W>;b;t6Ssi6?{KHwPe(Df}jRr3@U;0H?xY<;r; zdI^uRZVli;{YJDS^AZ1OW(QfOYaXEk@S3=Fl^^kJ{%WW9LfICAJ_+QUNyctY140;` z;J#9rNa2UQ?E1@9k_ulbtTp&C@-HS`DtOo;bSvUL8_kar{3mR-0?= z{kJ=h^IY^!*T=oG|Lk~gzUtP0G79>Xp%btco(fD3rfn+P{r9_o8C*p#~DGY(ka ztzG|p4pTfwhb7+|EvKJzyYprN)*CLQyAP$v$HqgN67phLk?V_lRp`aNcA2Jsi%O2@ zgk=_Y)LlR=rbkt`_P#5D_|SmIFRr`T)2cF;2}5H^`jax(Jqb(>pe$(%_h(2M_kw6V zf<17Ou5P_1Pj}{|Z1tgCwx+Lfcm1YNb>~c+Y5x>4|D$`PB^@Y3DpBatD|kQ!eQIuu zHh&8|a`vjVbUyA^klArBLF=OaCaR_1k%91~>H$y+DVLwg(={$H(S0(~FzBk(Wrqj| zD0#mPs<`$GZ>%bkGGV{6f5@ z;WtfzJ_sDrY$Ew=8Q_C*Ny4$&?z^;QDsI0}p(MM^ZixNjeLadT3 zDxlw>m#6bFD^KngwSG>=E}(# zRggR*y2=Vsa0$EPh2AaVeM9wr5k@VKbPxNZR`1UA{&&d#w@mym$;j8iGoVGC9YTu3 zgnBza$uFyHvQ^lzx4HsBRu{B<4Es5I&Co@RSn8aPW73jVP0F|hbGOb zcZiTV;#(J5a|?j-&K`vC3&pdq7yznfN$=W9LgK_P!FAeab=8K|5T#bJtRo;fsRm#- zL{dWfgH-m}@;a)B``8QPqHQ3}Uqfz<4s>AKj#5A+5twYkHIQ2dqpFA5o*ZlkW~yjg zlaMW_KyaSON$_k#ck|{MM=Rrsi>YQi++&TwjBXs(;1ClM&C+}t$mF)yx^*ug?i(tS zK|jYk#Y0~h!0mG)0p~=5(8X8v>Va$e*^J0!_y@z*8Y5WM=wai}&##*kh)-rpoWzr( zIw+u-Ck0J8^m8>}R!y*80Ox+M9vUEdiln^vOoFah<%Tf&Tx@7G=fx=ILq*^67(y%P zIDI7k`CCg~--(R{|9T8>UJZ(BuIKDeU5nB{i35u_R(pao1LcPbSiNv-4!%MBPE)q$ zsyveoM!Fqq5_Bt>KAq$tc;}$)-XEl04~dkK-RDyAbM0zu=;Hb-waQBg(j7(9dXW`} zN}K$gOIx*XM>qlbyfvH)oyLJlIqM8<9_OnH*Xq@V5cgjpoBPJ?^nuC#@g2q0mlOUk z2rQor2gr4otzEZYr>;rocxFvC zct!C%E-@h?A(1Nws15&qT2OFsKZ~A?HS#==(F=qS)bgCQ^L*Tc28$G6EH$KZ4?&bZ z#}xNtxtR_=al}}U3hBT4!mttclnk@!Dcw}Tt6tyL^u@Z!-iwJKPsD|SD@JDCsvPH> zyI@n7lP1-(4ZnQZP4)x6bBop*P5_L6;>XHIt`hS^>>AOq7EhD>jToDEDV?LQIj1f!VcCgNYuBs(Y=Ani+uZ$*t8PA>qaxJjKG65pg11 z^A9b9J-y-1Bn1pO-kLw|&dSBzOz!?6rFiK`c>x`W<`#_s35tSr^}f6(ZX8Wi%v84n z-?{1M7zNyV*hpi%Roy>hb^V<%Z{Aqi>tUMXZOMU)AcPpCLNKBT|1ye->K@XCfi^W( z=j62^oAW1EM`h(1-s&5$z~m&j@bGIM`Cl3%UkPa)C1?p8^E7%ooWsNyND)x1w`Ja8 zdV@g%<3rkXgih+Y zCcXM=O;&c%9gz)*GHPjp{6B}tfAM&Ra>cN|2o>U{3j7qcAD$w4li2DJ28YA<@|Fhq zZ$RHZbW(cZShw?x-clgS!32Ulv<}wn8DPMy6d<3Q|KOEdz9yzL1`_D^>;**vA$kc( zz+@`*!K<&R`IBv4?&qNQTv9tNnZX-MS0vgFrcGJu=?5w#_UGtves>CjcurPsa@MzQt*N+11j!^o~9Uy+B^IBMOB<-Kc8alX7G zaFEl?xtN7Ktc6w-(949N(xP`)HWs2&+i(x$#UC2C2%-t+OR&WBsw!0JNfi2h{yKa) zB2^>Y--Rl4V4a2f*E}gAgfb>dmN?Tm5Nh$vK4H$j+dfltyrAkk^hFivq2KlOg$iD; zl=o(&W~Pbx9qIK%eHcZwdQv18Q^XaRL^j})?2i;CaZ2I_-;LLe8>zUJ{fryAg>HA_@OOLHRNJLw&NJ7cz9cBE%{Wc z9C=4=@ed)x)wuPuAkSgw%rS;fzR=i>{buV`Hv>jn4CqJd^6j`AQi#Z9?D?4c=M00P z^m~E_A8_OCKJ6lp-;Ih(0zA>xqwqslC|J1iqIUzWvO(|tJMQA}C?-3Z&}O5In&<=q zu{fs9jE*xlqIoVMBLz~I{ZK4^g@web+Gn$Ff%M2vq;+h&$$6X~cWE+qab zzbCH(&@{6XCBE@pzs(_Y|^~tv9QWRZk?EGs6#ba105z&ahN&@AjY` z1Kl%CZ7VMD&{0TVkE#A$IX%K3lwH+d1=XojV8i)#LsPJ~;V1h$9ek4}xJ#FQz?7?M zAF%tnhS5(#8CIMj;)uwE4f%K31UaP~nc;13{1@bcy>o2p*?zRlP3zq!Hbf{dbvQ#<3sVzcVvInTquU!Q;F zqO08BF@NhKsS@7%F!YXEeyA>*VcycIJLGQiv<^xPY$|EFJh|7u%y z`QE9fioOkMM$($r1m+_|g_TSWW}Dg{0<;&XegwSS3qy%z(blK5-|h{zlWeQdthUO4fWm6D-m6_C?nir8m)l&65QQ2HDXH9hDp&?90Wo zueBn57aeu|B1w;X31OC5?kQ`!X>t>jJyeM>sL;$HA67N^jkrbGRkbiQiu)KEn_t24Jr-ZfPE~8+s5gT3Lgh zf=85aM`?(6a|mW0rc2RT9)k-iS!7IOy%xtH&~nj!sSNE983tETW=oAAI-XAP*a$zq z_1(qjP&MX^yZia^f~Xr^7@#F$IAKk-5;p}l_?l$6>{XZ~=~f4T5vg72L7OPj;HHHw z`nkg*C%WapOga)T5;>v+Z8E2czR79ea4wDn$@C}+vNHA+6Lpxg5kudj`WQy4yh$hG z6?#XxbrN03thZ|-8|uMVOrD;ZJ*R5majD@dUdqM|IvtK6H7|4i_Jhk_Des%$cTW|E z1DyIUUOiL!M^3_drh(63P9<>M?TKfJxm?42>7kPPiRZ`jhSJ#U7wE~^`DC`x)U$+~ zDE45&4OfEt6A9D(%CcpVG9^1F-@51y*@T&Zp+J!~E%O`z5oQzdyCb@pRoW@LhM%|V zt;G@jK0o(VD~NdE@&_#HGpKqy$sWkX#RCl#XR5Bqwfl&}RtL+Ox&KwAa5ooo#=8hV z1Uul5#N%539=)T+C>o^>p@N*l9%h354Ql+W#`V_zcR~qaxG%FB+yP`xJKyk9Zse+O zNMZ}A4Ie!Lo)XSFjDOgb@zAwKj{!2u?vb3neB>M&0q|SsrgyC2HTU3~%(CSD9+sbm zWCYS|@1v2E3=v}I&HJ>0?K#e|bZWdIk*&$kBl=#Vl0k4Z&$j$o^~S>VxSVu(!5y@t z&M;?;C@28u`dq>$j*hjj66k8zDq!Fcb_eQsAH+YuU@u51#~yTF=0j$~KZs3PI!~;j z8XB9c)-zG@Vu`2l=-&}w#$(a6-(6n!hZ(CY^(BhODfBf?0M^!4SUhpf0L*Y^JH$SA zCnG|u8Y9-7jPc0(jVOEM6Z(5SNqMZIG$-Z&r6WH`5^h7-&v^Ab*w`f@SCEzs(WjgF zAGeO-scd-~ZP#DMGkA+$z0=5S{qs}>TMlBs2G=H(4)^9};{CX%EvG1+UR*w7J9n&q za=!7}(CDn%B(!kJVz#toTR26t%E69Ro^Z=Y&GSWTTTB z$s6*ACGSC5VNZqqX9{z5&fhPX#8hY_wykY0&RU1Oh|(sdv_2T2uajzJBa+Wj?uS>< z`wT_x)I#~HLDk8upGjzfX)FpI$#pcg&_CF+L*DDX>~p--#|#ZqOUN^V+$es-(NN9o zEqwwTFVfq_B`W?79)KZNCI9Byj#Heeg;=ng?$)fmly~siXP>sY1l=$dceh@fG+)W@ zJ_$~f^HzcB6qWoS$DPE&n6o{CeLH=j&U8vxE+ra6q#55VF?=#=409IoKJmFtS_Mf8 zChav!4Yg;Wg;HhvaOWk`h5TRn(;V&yuFni1LcSD;^9l!fKWx>?;?q z+!p}KjiW>>`-|Ey;|d}TSJJhk?+6;6|6r_QoFj?i3N59ZuGSoWTL1lquhkCa6EpUR zFw!I$rQ6PK)IYs0rM!jZjsA)CK$Kzh?DPrctI!fNh?Q$~H z`A-+gN2Cyd84o&9Gl&*MejnD0xQ$eoG<&jzGNTGHu&nJ&3dOX*e6jC?t*r9In`IM9 z%>VVuQ3Ili{1^`4id}?yL`a{mBt;tpizvvG>5DA4W27jp)0CT>3T8P63cWNHM{l-Q zK~_Epxg0!OpcMY_&ok0De8r6Dk76OruADSH@j4;kHoU#5cpWK*&fK8aI?6E34#=lD zziQ)eqVp@=3ZcP3G=30cwd{Hw2JWJ)Znjhkw7SZsTV2OyXzO%kfW^xC4)Vomdur8e zw^HPqQ;mmBG6V1h{pAG)QUZgz&`*RL%35NA$7K8h-PtX=>zAj)Es6k7LX)OY+Uc(^ z%f_90D{qCa!%M*7e$M*uA_$V$PTueK=XQFk#0WWgIrj(R!Dae1tw_=Kq?zR{W&ME@=anf9#LT z2h+t!QF}S;Pcos6twlOsKz72aBm1xJjZlq6p*R^9o4^QW!9e^*(|fAQcOWr?k-PUE za|2I>$|(&S7!KSjyTuE?YX7fW$Zg$Ke$R`3k7In5D*Tq0v=3)eKAEcn_gQ`rV}N!$?@$1|n|47bLc+>zr7YpKJw6WxPWvXtJYmjmn1`_~m## z;=6IWa-KY;8zKkmycO?uG8|C* zU|@!INhl`);K%=oC%G_g$E!+P@JXKS29F5gqv=Ay^c;+%q*EPSg-=o={QMIUjNQs+z@; z=gvTSnZX!mroV#IU>DZG@9TBXxc!6BP8JWVta4iL+?s+(1f>y_l}6Ll`#b)-iDFmrQoqj~?*BcMCd;%AAlZry~-e0Fg|EIDi6GbyBy zpnvj;2+JR;A2T}0!|Chw2!*h4ZJgciH!>~8$sMduK1J3WPauw({g96% zPVVfsfo}MJpJyVN;&>O{j;XOEKC?3S zCt^AS7CLeXof0aKXCbG*D9Uj4f_YpWDOiw-lF>n;S;jn6^o@%13MVvj-wVliSmW$L zdk0QvL`@vHu;~4K1%#m0=t)d1^>()bQhmsB zj;DC`=fG=iIIvV9yD_hGT%i)n@^k0uBHw6~52G+cf1jV!PQ;aoxFJ^aD%x@r4w>2s z=3n9yVS)U8IiGx0cqD#kzd zgz@gw&`%BwQRU9|zX3W2*#VhyiLB^}f3ldKgCXeUqgH&qRvrt-3fnJVd`S&pY6!fY)HFJ`qBdFxjy&U9WKdFB|Xl2R?DpHhB{ zf3hM^t-YS83GF6T|Aa$+9~G!-cT;F4HLe7tiqj`%klJZf>xl*-C4656)w&vne&^OU zm7*N2m{@wb`Es|Q6@IP+W^|V&3l_8~(z$!h(Ecsam1^LTSW@v6u1AgH&E*A(lygiY z=-6<=5RsE4f^?wE_Q2+!=BIKLx_hu^GZ=Y}u!%5{Sh22N>wqz@gtTgj=kCt%pR6Y) zH$1&%ihd)SB&Jm=%!#%z1{k6oKT6}K>Pu|K; zR3+w9PS;~J?JslE@|ygY3YW!Bn6$QPB+O_&p}0C=v%fA3t28(W<-XXk<~VhJjJfzQ z{-xSe0@J3AjduzW-b2E$-O(WX5@q_jHDV=z6(T+Gp~MsPSuh)@&ukqam8kVz`I1y2 zJ-iyuS1!9RbOM5R6JpP;F~Wsgu!Lm9JOede5&}YjkGm6cmO4URHh} z`s?UBwa*DdVPa)BM+a86o*%aWr0OEUTtryr`MK%LOj#!3j*FEzYj*`sUXzhdHJ(4> zC7f9VAlt&tUofprOz}-FiN^9)b^`q@*412F`3h)0MUwwA)c?KE z=W1QW_4_N^pLi9vwr<#Gs0WgNa%*XyDuOk4;<10~=w`iGC8IQKOI`=28ObwD*$o6` z`PDb8T*(rPEE@*c>oYk;`f5}55|Pty28a8*lhSx@R2?_G{9Mt%6yneNlUtK^m2fWg z&uw$j`=17xuoUO{G4f}?4iw%+`M5v$B5eAmFz5{Nmd{o8XBeI7a(bK@`)4gu@=^Db zioOV+rYdWjX3PVy&na83rku2VD4a1NVl~`t=S(5}1MAa{ax$X%f`a5Sw0q{Ba2>JE zbpI($Tj)`k@258>Q5;0Gzati1WZhiP5~1~`tK)%!l|D@pgbyUNpohljwSL3Y{Rx}5 z7W!v1<}q*Bo_=uTb19AcS)_-Y?fzw3e$zrjCCh^gYI zw(+3U$;IwfwTE9or(TgMmrzeq{yU#t{hpt^48oksq-9K~IkyvJ3+t)wyUS=!#{~s; z&_Bbh%VlJgl$;My`f;mzDkwVTnENbi+*=CY?Y7ZsG--D~mQ$e|_&m1+KZht$XOlD) zrXJ8blnm__rQ>kHmtse!8mBFSCZu)_omx6h1kXdFF}v(R;|r zy7wmSORik7T+7kk33b85Ulji~l8&!OE|6(N^*(*{8{M;iZ5>_?(|DJlDJyEV_tG8( z1mvVYwRCK+;GipWwJ$9?4aEn&;^d-$&NP(ok(H&~8l z8491+y=2`G`U3x8^(0q;b~AoqD%r|9F7-GQaS7JsI0|1L{GQCl)rS2!5K-=J_zh!7 ztxVL8nzs@VH5p&1u==i>N;e{H(yoM6X7jd#?;w={d$|~6g+x;eJLLf+%L@k3~8lwC|&YDq!`)2zd?O=GlBAPwZ;$c=(Cfgj8+<=uxiVlyr}7%o4Sh? zDkK6)^Uldxxv$JZI+>8h4*!z6uUuZ)e9t?o0b=N4bX-xTWa!C!t#{DKLKUD+_hw9D zY*pE%1rzLj!gHf&5ceWtMA*RP8GUYV(e2}3J=cPpW-DGBXaYJz1m4`QF3_L0;3;`H zIQ%51{mBp|7Mn-tFE={0L-V#ypNxRKsDUyr^!E(e`;-~-Z!ny6ao*N4@9-}iH(^E% zPP7t7M4p=+B(2P1_4vX)Js)mzWkS&Qf5X0qrA%FYdoPvZn14dj*F+qnQ^-K zw1FAG8d~UcBTi+dZ$5<4JaAF8h@PIJm5k+jm9N6^1oxs^Hr*!pTWQk>8ak-;&Y{M6 zc*#fNOnaD-A+{UmY-Y_vqpQZ)cliPY0$#^e$~iWrj_@Xk%kG zK-GNug;xGF8yB;u5xeV0;-J*S{&W-W*N6KVX>hy9v}6B>-n+r8Q4<17RbCo`u`)yD z+4iLrRCFT6bif-+7NWNxcCPhl;0n6g|KwevJA1A_-Z$f$j(U3c&$|{sL=6TyRyRV( z(7mXVE}iPqDc-%2K)W=%sEcuyU$%GsFUX~R@xMJHnji4F?AWi7fQNqv=<%jhZwd_t zyTBD&8q%u=fS3E9f>`GhuHB#BKaF9AeOF7aUTEAR&g;-;FDvY9mY_TWrpK$TfS5O# z-+kpabz=W^DfJI@9W`~4>seQYSKz%y=39ZsoUrH`?C-+jmr(AgY<15!P>~#iJYQ<= zHJrA1J&BKb@}-fX zl>?_!Dgx3qv2qb(ZGO(*M8$yk?zX=Vg9gJY`1!9_l~_~P4Gki~+^9<2pS>{6UhzzN zwC}i#`(D3&LtlhjCmX?_*kN+a8 zUWPr*Qr&fig=5x{$(W&6^$mZzN3%3yQc#v|Nzvj@M=O1;pFDbNiPzdG@xpJ}H!`SX zqQJK*`!&+qPRF)(ci{nZZ)MM_TO9fqF`oHntly_Vu*Zj3(KaX14k{x9Kwk6pA9Y zIkL2DXwq_Z!~Pg*Xc3X6&t5FU1VYPJd2JgA#eP0lQ~tGB;FgIWKN7iZakia1SnI@S zQerF~ZV49P?(y(5W2IMQiQqS)Snfx-uWT2 zry7V=0)(Mmq{e@q)|>wZ_crg-{nhsR-s>FaqcNsnK7R4}M~vV8G-4}+Sp5q=u_p#K zNl4b0?_+0@nGUia&hK3zMq&~khzo=o4-JN7;Fy%K@PFcD)CtW7=)PF#Q zRx?#I02H7d8`k7t5Y>K< z!N!5XNk`eN_vb+}W`5_MEdZp+-1%oNMY{c+oAETv-wCyk^Y%4(2l@KgG|9_|5wl{- z{X3{HVW{H2=Z)%kv76L)1~%qmQm=y;F(}2%k8|SOD73ElqocM@BlS@|PR{EQ-_pO@ z0E7yV9qkgGm*Zii>E^|=89vPLWCpnUhNNSGgxkbCu%3xzi$2kO{(jTbVIj%g*YuTA zOmQ$h`X^Ppe+4lF0_XZd%Qm-Ps}VDalAd*Ky`8_F<>PvKQw~D6wQq%F4XMX7Mhw88 z8fNPJjVl$}65)KAoDnP=;vM5qYw4A*F#E7^qs235$d2?wLz0qzbV33e0iqOqL;40v zE5%)|bl3@Woy|4zf&nD)VP8Y}@PW0|)nvVvV&yu;hst$7ZJF};Hf|}2uzr2a);oG} zcNy8)juW5nTgAdF)UY<6{0LRMP8GVeKN~*@)NDw{X|o)5sWHvOZsN=gTn?;)cC5`! z5^9jY3=_-@ld4_=eL4w0_V+vBda3YqFXu}=&yPcVC!2Z5Ztoo%N#sng2{WW{5`40K zWb4gEHrdhKlIzROOMSgAxLkVQc5$Lnd$MJ~o@YrMk@RoN^+ugs@jTUY^!ZPVW>y3% zU!Wy%?{Lrg>qc)yeFb?;%2K0Hxq}HKk#??yWGLJZNyu*WI;O610qPq%-Lv^sR?k~(4QaBmsl*u_3Jd5DWe1a4nIx;Q6b~#shUTF){V5ud$U1;`>_V`7!nb5?o!I#|-73U2&3(72s^%reOHjR*nF@zYmuutE za4JvrKnH&6Y?HK#fBSRMzq)_9)v-FCZa%8aYcc;~%ce>4ob@ty%E+J_Modq4Ol1g# zI&Ht)J{_P!Ufg&R2_aF0dPefe8cHHb?mH#wv8zpv8_ zW{s#Ny{feVk(6~X7z0Vcm4D8eBR}U*gSSW@gK@?0@%jB|qD{q{9800@q3=sqQ>$;S zA~WS#Uk0zCtz|%-7S47>t>{B#K}$0z<6gFyxA;{@Vzksav^7XjmjW_DxNs+UdSG&?8At zW#N|-R$>Ht2;o8~0uh@lM{+ya2Tl%!zAYcmCpWWJy+ouK&UiI?e=sMSz)NnfDs)P{ zKyZ?87C}Tq_T}RfGI1Yya`jywL!tZMd2PwF0Qrnz0L`m?-I=jEF?%j{c zsC%?-{^{V-cmwcwvXUig_ATU(I_BHP$4TF@D$_^UviTcSDDI-YV|4Y~c5*;p6*&^V z3GhRv8=uF0YK*n8)vw&pN@}QgPwa$NfQQq-gxC|*o*7I4U|&BBFRAWvWo9hgT7&M-##n2( z-J5BmQPdra_eq*Qgzh>`%*B+xDws-w@YS$&X;);jB;s?3W10>a+gD*7d{Up`-S=zz zxnq&TyKj_1@Hlty@1)shIN_?FxWI%P;J1$h73Jr+xe~0M;@7L!dO(T$omYJsv4%a+ zw;3j#PgpWn>xS$a-IIoXO~GfJH1m6qryfg&(X1`0`c;(ulRY<1xtx5T(=}@-Z%X~~ z&#$e56ug{dDEeVq)&0o`57uU9sMh?lFCDt0|DT+)$#t%NA2>d2VN3jen*=PN%h-^; zD`&EwZfNp--Cr71ey;2Q>l!}*-OT;$Q$Lk`v6bL88{QP@gRKbcLPU@ROmfyQj?0q_ zw3##)Rw6q3=PILMi$@}3%Z@oBYN(dcUrRdc<{n6we5W8iIdBb`6#3Jitz$vI>R*Pp zNVZY*ishK|uh<@Vt|i_NDHO(_yLXrgWez{d$A#>1HMLeh|1tK>9R0>7XJ^jA?SfZ- zaW-+(*8<~Sler_eR)vT{aAX;d>cV{g`P=ZN_rg6@`%Me~;Y7&@ycvHO3_}BVAAc`7 zs^4{)SrhdC|14D~8gDiCd5$l~FBk@fzzh4223`j0Y7&;N&O8=Yu3xNq{G8qXa|Ngr zz|YOX($U(B`HQu!y^A!hDSypY*IU5i=4)x(-u zm`9M?l8>LCSww_~Ur1O)grAF9fRA5*m+vu&aPtdE2#ZJvh%*28!6NhYF(>6=Wh0@Z zsPx~jd%TinvGekBli=m`_4VcP736XCu;t|!7Z?8zG6DkJk0rQ0{aw5){J32_S^ta3 z|Iksi_O$e{ck{CUzuLQhUk1WB4B%)i5{XD8Y-J)*Z;vuGRVno=@ng`*T?E0bDiB4R`%<3>gc#U?eg$wlD)C(G9si_f&}=>6>FwBv2J wZ}d4nk-LAo4($*0T1zK`#_?_c|GRkTd|m0dTfe%T@eal;&#$G=XSa?%0Af-Jn*aa+ literal 0 HcmV?d00001 diff --git a/layout/reftests/css-blending/background-blending-alpha-ref.html b/layout/reftests/css-blending/background-blending-alpha-ref.html new file mode 100644 index 00000000000..6a7055938db --- /dev/null +++ b/layout/reftests/css-blending/background-blending-alpha-ref.html @@ -0,0 +1,62 @@ + + + + +
+
+
+ + diff --git a/layout/reftests/css-blending/background-blending-alpha.html b/layout/reftests/css-blending/background-blending-alpha.html new file mode 100644 index 00000000000..ba17205b8fc --- /dev/null +++ b/layout/reftests/css-blending/background-blending-alpha.html @@ -0,0 +1,22 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-gradient-color-ref.html b/layout/reftests/css-blending/background-blending-gradient-color-ref.html new file mode 100644 index 00000000000..09dd590607e --- /dev/null +++ b/layout/reftests/css-blending/background-blending-gradient-color-ref.html @@ -0,0 +1,20 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-gradient-color.html b/layout/reftests/css-blending/background-blending-gradient-color.html new file mode 100644 index 00000000000..b5df02bca90 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-gradient-color.html @@ -0,0 +1,22 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-gradient-gradient-ref.html b/layout/reftests/css-blending/background-blending-gradient-gradient-ref.html new file mode 100644 index 00000000000..6dd4b183973 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-gradient-gradient-ref.html @@ -0,0 +1,20 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-gradient-gradient.html b/layout/reftests/css-blending/background-blending-gradient-gradient.html new file mode 100644 index 00000000000..f8d9dc6d763 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-gradient-gradient.html @@ -0,0 +1,22 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-gradient-image-ref.html b/layout/reftests/css-blending/background-blending-gradient-image-ref.html new file mode 100644 index 00000000000..09dd590607e --- /dev/null +++ b/layout/reftests/css-blending/background-blending-gradient-image-ref.html @@ -0,0 +1,20 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-gradient-image.html b/layout/reftests/css-blending/background-blending-gradient-image.html new file mode 100644 index 00000000000..0ffe44d8299 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-gradient-image.html @@ -0,0 +1,21 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-image-color-jpg.html b/layout/reftests/css-blending/background-blending-image-color-jpg.html new file mode 100644 index 00000000000..2832caeb537 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-image-color-jpg.html @@ -0,0 +1,26 @@ + + + +
+ + diff --git a/layout/reftests/css-blending/background-blending-image-color-png.html b/layout/reftests/css-blending/background-blending-image-color-png.html new file mode 100644 index 00000000000..6ded901a315 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-image-color-png.html @@ -0,0 +1,25 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-image-color-ref.html b/layout/reftests/css-blending/background-blending-image-color-ref.html new file mode 100644 index 00000000000..d9ebe355eaa --- /dev/null +++ b/layout/reftests/css-blending/background-blending-image-color-ref.html @@ -0,0 +1,21 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-image-color-svg.html b/layout/reftests/css-blending/background-blending-image-color-svg.html new file mode 100644 index 00000000000..8a3f05d4639 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-image-color-svg.html @@ -0,0 +1,25 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-image-gradient.html b/layout/reftests/css-blending/background-blending-image-gradient.html new file mode 100644 index 00000000000..6b9e48d4615 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-image-gradient.html @@ -0,0 +1,21 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-image-image-ref.html b/layout/reftests/css-blending/background-blending-image-image-ref.html new file mode 100644 index 00000000000..b123024a786 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-image-image-ref.html @@ -0,0 +1,20 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-image-image.html b/layout/reftests/css-blending/background-blending-image-image.html new file mode 100644 index 00000000000..846f7cd10b4 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-image-image.html @@ -0,0 +1,22 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-isolation-ref.html b/layout/reftests/css-blending/background-blending-isolation-ref.html new file mode 100644 index 00000000000..8b1a50d534e --- /dev/null +++ b/layout/reftests/css-blending/background-blending-isolation-ref.html @@ -0,0 +1,27 @@ + + + +
+
+ diff --git a/layout/reftests/css-blending/background-blending-isolation.html b/layout/reftests/css-blending/background-blending-isolation.html new file mode 100644 index 00000000000..80ead0163b0 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-isolation.html @@ -0,0 +1,31 @@ + + + + +
+
+ + diff --git a/layout/reftests/css-blending/background-blending-list-repeat-ref.html b/layout/reftests/css-blending/background-blending-list-repeat-ref.html new file mode 100644 index 00000000000..e87329c0c46 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-list-repeat-ref.html @@ -0,0 +1,33 @@ + + + +
+
+
+
+ diff --git a/layout/reftests/css-blending/background-blending-list-repeat.html b/layout/reftests/css-blending/background-blending-list-repeat.html new file mode 100644 index 00000000000..53eb0f040ec --- /dev/null +++ b/layout/reftests/css-blending/background-blending-list-repeat.html @@ -0,0 +1,24 @@ + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-multiple-images-ref.html b/layout/reftests/css-blending/background-blending-multiple-images-ref.html new file mode 100644 index 00000000000..e15793e7ba8 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-multiple-images-ref.html @@ -0,0 +1,33 @@ + + + +
+
+
+
+ diff --git a/layout/reftests/css-blending/background-blending-multiple-images.html b/layout/reftests/css-blending/background-blending-multiple-images.html new file mode 100644 index 00000000000..274ab18c09b --- /dev/null +++ b/layout/reftests/css-blending/background-blending-multiple-images.html @@ -0,0 +1,24 @@ + + + +
+ diff --git a/layout/reftests/css-blending/reftest.list b/layout/reftests/css-blending/reftest.list index 5db2670f073..81b6f7719b7 100644 --- a/layout/reftests/css-blending/reftest.list +++ b/layout/reftests/css-blending/reftest.list @@ -3,3 +3,16 @@ pref(layout.css.mix-blend-mode.enabled,true) == blend-constant-background-color. pref(layout.css.mix-blend-mode.enabled,true) == blend-gradient-background-color.html blend-gradient-background-color-ref.html pref(layout.css.mix-blend-mode.enabled,true) == blend-image.html blend-image-ref.html pref(layout.css.mix-blend-mode.enabled,true) == blend-difference-stacking.html blend-difference-stacking-ref.html + +pref(layout.css.background-blend-mode.enabled,true) == background-blending-alpha.html background-blending-alpha-ref.html +pref(layout.css.background-blend-mode.enabled,true) == background-blending-gradient-color.html background-blending-gradient-color-ref.html +fuzzy-if(azureSkiaGL,3,7597) fuzzy-if(azureQuartz,3,7597) fuzzy-if(d2d,1,3800) pref(layout.css.background-blend-mode.enabled,true) == background-blending-gradient-gradient.html background-blending-gradient-gradient-ref.html +fuzzy-if(azureSkiaGL,2,7174) fuzzy-if(azureQuartz,2,7174) pref(layout.css.background-blend-mode.enabled,true) == background-blending-gradient-image.html background-blending-gradient-color-ref.html +fuzzy-if(azureQuartz,2,10000) fuzzy-if(azureSkia||d2d||gtk2Widget,1,10000) pref(layout.css.background-blend-mode.enabled,true) == background-blending-image-color-jpg.html background-blending-image-color-ref.html +pref(layout.css.background-blend-mode.enabled,true) == background-blending-image-color-png.html background-blending-image-color-ref.html +pref(layout.css.background-blend-mode.enabled,true) == background-blending-image-color-svg.html background-blending-image-color-ref.html +fuzzy-if(azureSkiaGL,2,7174) fuzzy-if(azureQuartz,2,7174) pref(layout.css.background-blend-mode.enabled,true) == background-blending-image-gradient.html background-blending-gradient-color-ref.html +pref(layout.css.background-blend-mode.enabled,true) == background-blending-image-image.html background-blending-image-color-ref.html +pref(layout.css.background-blend-mode.enabled,true) == background-blending-isolation.html background-blending-isolation-ref.html +pref(layout.css.background-blend-mode.enabled,true) == background-blending-list-repeat.html background-blending-list-repeat-ref.html +pref(layout.css.background-blend-mode.enabled,true) == background-blending-multiple-images.html background-blending-multiple-images-ref.html diff --git a/layout/style/test/Makefile.in b/layout/style/test/Makefile.in index 5d7f6c7c744..80eacde102f 100644 --- a/layout/style/test/Makefile.in +++ b/layout/style/test/Makefile.in @@ -213,6 +213,7 @@ MOCHITEST_FILES = test_acid3_test46.html \ bug732209-css.sjs \ test_bug795520.html \ viewport_units_iframe.html \ + test_background_blend_mode.html \ $(NULL) VISITED_REFTEST_FILES = \ diff --git a/layout/style/test/test_background_blend_mode.html b/layout/style/test/test_background_blend_mode.html new file mode 100644 index 00000000000..4409f200bb5 --- /dev/null +++ b/layout/style/test/test_background_blend_mode.html @@ -0,0 +1,51 @@ + + + + Test for miscellaneous computed style issues + + + + +
Mozilla Bug +

+ +
+
+
+ + From 9600a1a039a7bb869c9ea28be57720a4401f1648 Mon Sep 17 00:00:00 2001 From: Horia Iosif Olaru Date: Fri, 8 Nov 2013 10:09:08 -0500 Subject: [PATCH 29/37] Bug 841601 - Add a second batch of tests for background-blending which tests each blend mode. r=roc The reference results are copied over from the svg tests. --- .../background-blending-color-burn-ref.svg | 22 ++++++++++++++++ .../background-blending-color-burn.html | 16 ++++++++++++ .../background-blending-color-dodge-ref.svg | 22 ++++++++++++++++ .../background-blending-color-dodge.html | 14 ++++++++++ .../background-blending-color-ref.svg | 22 ++++++++++++++++ .../background-blending-color.html | 14 ++++++++++ .../background-blending-darken-ref.svg | 22 ++++++++++++++++ .../background-blending-darken.html | 14 ++++++++++ .../background-blending-difference-ref.svg | 22 ++++++++++++++++ .../background-blending-difference.html | 14 ++++++++++ .../background-blending-exclusion-ref.svg | 22 ++++++++++++++++ .../background-blending-exclusion.html | 14 ++++++++++ .../background-blending-hard-light-ref.svg | 22 ++++++++++++++++ .../background-blending-hard-light.html | 14 ++++++++++ .../background-blending-hue-ref.svg | 22 ++++++++++++++++ .../css-blending/background-blending-hue.html | 14 ++++++++++ .../background-blending-lighten-ref.svg | 22 ++++++++++++++++ .../background-blending-lighten.html | 14 ++++++++++ .../background-blending-luminosity-ref.svg | 22 ++++++++++++++++ .../background-blending-luminosity.html | 14 ++++++++++ .../background-blending-multiply-ref.svg | 22 ++++++++++++++++ .../background-blending-multiply.html | 14 ++++++++++ .../background-blending-normal-ref.svg | 22 ++++++++++++++++ .../background-blending-normal.html | 14 ++++++++++ .../background-blending-overlay-ref.svg | 22 ++++++++++++++++ .../background-blending-overlay.html | 14 ++++++++++ .../background-blending-saturation-ref.svg | 22 ++++++++++++++++ .../background-blending-saturation.html | 14 ++++++++++ .../background-blending-screen-ref.svg | 22 ++++++++++++++++ .../background-blending-screen.html | 14 ++++++++++ .../background-blending-soft-light-ref.svg | 22 ++++++++++++++++ .../background-blending-soft-light.html | 14 ++++++++++ layout/reftests/css-blending/blend-modes.css | 26 +++++++++++++++++++ layout/reftests/css-blending/reftest.list | 18 +++++++++++++ 34 files changed, 622 insertions(+) create mode 100644 layout/reftests/css-blending/background-blending-color-burn-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-color-burn.html create mode 100644 layout/reftests/css-blending/background-blending-color-dodge-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-color-dodge.html create mode 100644 layout/reftests/css-blending/background-blending-color-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-color.html create mode 100644 layout/reftests/css-blending/background-blending-darken-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-darken.html create mode 100644 layout/reftests/css-blending/background-blending-difference-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-difference.html create mode 100644 layout/reftests/css-blending/background-blending-exclusion-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-exclusion.html create mode 100644 layout/reftests/css-blending/background-blending-hard-light-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-hard-light.html create mode 100644 layout/reftests/css-blending/background-blending-hue-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-hue.html create mode 100644 layout/reftests/css-blending/background-blending-lighten-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-lighten.html create mode 100644 layout/reftests/css-blending/background-blending-luminosity-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-luminosity.html create mode 100644 layout/reftests/css-blending/background-blending-multiply-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-multiply.html create mode 100644 layout/reftests/css-blending/background-blending-normal-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-normal.html create mode 100644 layout/reftests/css-blending/background-blending-overlay-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-overlay.html create mode 100644 layout/reftests/css-blending/background-blending-saturation-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-saturation.html create mode 100644 layout/reftests/css-blending/background-blending-screen-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-screen.html create mode 100644 layout/reftests/css-blending/background-blending-soft-light-ref.svg create mode 100644 layout/reftests/css-blending/background-blending-soft-light.html create mode 100644 layout/reftests/css-blending/blend-modes.css diff --git a/layout/reftests/css-blending/background-blending-color-burn-ref.svg b/layout/reftests/css-blending/background-blending-color-burn-ref.svg new file mode 100644 index 00000000000..48191f349e5 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-color-burn-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-color-burn.html b/layout/reftests/css-blending/background-blending-color-burn.html new file mode 100644 index 00000000000..b6307608dc7 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-color-burn.html @@ -0,0 +1,16 @@ + + + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-color-dodge-ref.svg b/layout/reftests/css-blending/background-blending-color-dodge-ref.svg new file mode 100644 index 00000000000..724a4e184bc --- /dev/null +++ b/layout/reftests/css-blending/background-blending-color-dodge-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-color-dodge.html b/layout/reftests/css-blending/background-blending-color-dodge.html new file mode 100644 index 00000000000..51efd478f00 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-color-dodge.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-color-ref.svg b/layout/reftests/css-blending/background-blending-color-ref.svg new file mode 100644 index 00000000000..29360156175 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-color-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-color.html b/layout/reftests/css-blending/background-blending-color.html new file mode 100644 index 00000000000..6e00e094f1c --- /dev/null +++ b/layout/reftests/css-blending/background-blending-color.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-darken-ref.svg b/layout/reftests/css-blending/background-blending-darken-ref.svg new file mode 100644 index 00000000000..d4d16a54bef --- /dev/null +++ b/layout/reftests/css-blending/background-blending-darken-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-darken.html b/layout/reftests/css-blending/background-blending-darken.html new file mode 100644 index 00000000000..a4286d16724 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-darken.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-difference-ref.svg b/layout/reftests/css-blending/background-blending-difference-ref.svg new file mode 100644 index 00000000000..c04c51e0aba --- /dev/null +++ b/layout/reftests/css-blending/background-blending-difference-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-difference.html b/layout/reftests/css-blending/background-blending-difference.html new file mode 100644 index 00000000000..647d5d8cbea --- /dev/null +++ b/layout/reftests/css-blending/background-blending-difference.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-exclusion-ref.svg b/layout/reftests/css-blending/background-blending-exclusion-ref.svg new file mode 100644 index 00000000000..b4edd89076a --- /dev/null +++ b/layout/reftests/css-blending/background-blending-exclusion-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-exclusion.html b/layout/reftests/css-blending/background-blending-exclusion.html new file mode 100644 index 00000000000..f1a9f81e1a9 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-exclusion.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-hard-light-ref.svg b/layout/reftests/css-blending/background-blending-hard-light-ref.svg new file mode 100644 index 00000000000..21afb50c38f --- /dev/null +++ b/layout/reftests/css-blending/background-blending-hard-light-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-hard-light.html b/layout/reftests/css-blending/background-blending-hard-light.html new file mode 100644 index 00000000000..61ac1533bac --- /dev/null +++ b/layout/reftests/css-blending/background-blending-hard-light.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-hue-ref.svg b/layout/reftests/css-blending/background-blending-hue-ref.svg new file mode 100644 index 00000000000..907064b5434 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-hue-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-hue.html b/layout/reftests/css-blending/background-blending-hue.html new file mode 100644 index 00000000000..8ae44e5d2ac --- /dev/null +++ b/layout/reftests/css-blending/background-blending-hue.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-lighten-ref.svg b/layout/reftests/css-blending/background-blending-lighten-ref.svg new file mode 100644 index 00000000000..4ec1bf08a06 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-lighten-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-lighten.html b/layout/reftests/css-blending/background-blending-lighten.html new file mode 100644 index 00000000000..cd69c4c6093 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-lighten.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-luminosity-ref.svg b/layout/reftests/css-blending/background-blending-luminosity-ref.svg new file mode 100644 index 00000000000..8dc3c2247fd --- /dev/null +++ b/layout/reftests/css-blending/background-blending-luminosity-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-luminosity.html b/layout/reftests/css-blending/background-blending-luminosity.html new file mode 100644 index 00000000000..4c530c91327 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-luminosity.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-multiply-ref.svg b/layout/reftests/css-blending/background-blending-multiply-ref.svg new file mode 100644 index 00000000000..0addf25093c --- /dev/null +++ b/layout/reftests/css-blending/background-blending-multiply-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-multiply.html b/layout/reftests/css-blending/background-blending-multiply.html new file mode 100644 index 00000000000..2174ed5b448 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-multiply.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-normal-ref.svg b/layout/reftests/css-blending/background-blending-normal-ref.svg new file mode 100644 index 00000000000..8b86b744877 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-normal-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-normal.html b/layout/reftests/css-blending/background-blending-normal.html new file mode 100644 index 00000000000..f860846c7b9 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-normal.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-overlay-ref.svg b/layout/reftests/css-blending/background-blending-overlay-ref.svg new file mode 100644 index 00000000000..320697f7106 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-overlay-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-overlay.html b/layout/reftests/css-blending/background-blending-overlay.html new file mode 100644 index 00000000000..a5be65fa987 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-overlay.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-saturation-ref.svg b/layout/reftests/css-blending/background-blending-saturation-ref.svg new file mode 100644 index 00000000000..a8fb06a5a86 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-saturation-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-saturation.html b/layout/reftests/css-blending/background-blending-saturation.html new file mode 100644 index 00000000000..ed5173346aa --- /dev/null +++ b/layout/reftests/css-blending/background-blending-saturation.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-screen-ref.svg b/layout/reftests/css-blending/background-blending-screen-ref.svg new file mode 100644 index 00000000000..d99af71dc90 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-screen-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/css-blending/background-blending-screen.html b/layout/reftests/css-blending/background-blending-screen.html new file mode 100644 index 00000000000..5f5fe0f56be --- /dev/null +++ b/layout/reftests/css-blending/background-blending-screen.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/background-blending-soft-light-ref.svg b/layout/reftests/css-blending/background-blending-soft-light-ref.svg new file mode 100644 index 00000000000..485314e389c --- /dev/null +++ b/layout/reftests/css-blending/background-blending-soft-light-ref.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + diff --git a/layout/reftests/css-blending/background-blending-soft-light.html b/layout/reftests/css-blending/background-blending-soft-light.html new file mode 100644 index 00000000000..13cf76fce41 --- /dev/null +++ b/layout/reftests/css-blending/background-blending-soft-light.html @@ -0,0 +1,14 @@ + + + + + +
+ diff --git a/layout/reftests/css-blending/blend-modes.css b/layout/reftests/css-blending/blend-modes.css new file mode 100644 index 00000000000..9a827c7bd03 --- /dev/null +++ b/layout/reftests/css-blending/blend-modes.css @@ -0,0 +1,26 @@ +body { + margin: 0; +} + +.reftest { + width: 160px; + height: 160px; + background-size: + 160px 40px, 160px 40px, 160px 40px, 160px 40px, + 40px 160px, 40px 160px, 40px 160px, 40px 160px; + + background-position: + 0px 0px, 0px 40px, 0px 80px, 0px 120px, + 0px 0px, 40px 0px, 80px 0, 120px 0; + + + background-repeat: no-repeat; + background-image: url(as-image/red100x100.png), + url(as-image/green100x100.png), + url(as-image/blue100x100.png), + url(as-image/brown100x100.png), + url(as-image/red100x100.png), + url(as-image/green100x100.png), + url(as-image/blue100x100.png), + url(as-image/brown100x100.png); +} \ No newline at end of file diff --git a/layout/reftests/css-blending/reftest.list b/layout/reftests/css-blending/reftest.list index 81b6f7719b7..b44b7b57cce 100644 --- a/layout/reftests/css-blending/reftest.list +++ b/layout/reftests/css-blending/reftest.list @@ -16,3 +16,21 @@ pref(layout.css.background-blend-mode.enabled,true) == background-blending-image pref(layout.css.background-blend-mode.enabled,true) == background-blending-isolation.html background-blending-isolation-ref.html pref(layout.css.background-blend-mode.enabled,true) == background-blending-list-repeat.html background-blending-list-repeat-ref.html pref(layout.css.background-blend-mode.enabled,true) == background-blending-multiple-images.html background-blending-multiple-images-ref.html + +pref(layout.css.background-blend-mode.enabled,true) == background-blending-color-burn.html background-blending-color-burn-ref.svg +pref(layout.css.background-blend-mode.enabled,true) == background-blending-color-dodge.html background-blending-color-dodge-ref.svg +# need to investigate why these tests are fuzzy - first suspect is a possible color space conversion on some platforms; same for mix-blend-mode tests +fuzzy-if(azureQuartz,2,8000) fuzzy-if(azureSkia||gtk2Widget,2,9600) fuzzy-if(d2d,1,8000) pref(layout.css.background-blend-mode.enabled,true) == background-blending-color.html background-blending-color-ref.svg +pref(layout.css.background-blend-mode.enabled,true) == background-blending-darken.html background-blending-darken-ref.svg +pref(layout.css.background-blend-mode.enabled,true) == background-blending-difference.html background-blending-difference-ref.svg +pref(layout.css.background-blend-mode.enabled,true) == background-blending-exclusion.html background-blending-exclusion-ref.svg +fuzzy-if(azureQuartz||d2d,1,1600) pref(layout.css.background-blend-mode.enabled,true) == background-blending-hard-light.html background-blending-hard-light-ref.svg +fuzzy-if(azureQuartz,2,8000) fuzzy-if(d2d,1,9600) fuzzy-if(azureSkia||gtk2Widget,2,9600) pref(layout.css.background-blend-mode.enabled,true) == background-blending-hue.html background-blending-hue-ref.svg +pref(layout.css.background-blend-mode.enabled,true) == background-blending-lighten.html background-blending-lighten-ref.svg +fuzzy-if(azureQuartz,2,8000) fuzzy-if(d2d,1,8000) fuzzy-if(azureSkia||gtk2Widget,2,9600) pref(layout.css.background-blend-mode.enabled,true) == background-blending-luminosity.html background-blending-luminosity-ref.svg +pref(layout.css.background-blend-mode.enabled,true) == background-blending-multiply.html background-blending-multiply-ref.svg +pref(layout.css.background-blend-mode.enabled,true) == background-blending-normal.html background-blending-normal-ref.svg +fuzzy-if(azureSkia||gtk2Widget,1,1600) pref(layout.css.background-blend-mode.enabled,true) == background-blending-overlay.html background-blending-overlay-ref.svg +fuzzy-if(d2d,1,1600) fuzzy-if(azureSkia||gtk2Widget,2,12800) fuzzy-if(OSX==10.6,1,1600) pref(layout.css.background-blend-mode.enabled,true) == background-blending-saturation.html background-blending-saturation-ref.svg +fuzzy-if(d2d||azureSkia||gtk2Widget,1,1600) pref(layout.css.background-blend-mode.enabled,true) == background-blending-screen.html background-blending-screen-ref.svg +fuzzy-if(azureQuartz,1,1600) fuzzy-if(d2d||azureSkia||gtk2Widget,10,4800) pref(layout.css.background-blend-mode.enabled,true) == background-blending-soft-light.html background-blending-soft-light-ref.svg From 07ffde8fd3f18901a627cb6231a286db21d7633b Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 07:11:25 -0800 Subject: [PATCH 30/37] Bumping gaia.json for 3 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/45da563521df Author: Arthur Chen Desc: Bug 928851 - Adopt new API of enabling/disabing RIL radio ======== https://hg.mozilla.org/integration/gaia-central/rev/58f3c3b357d2 Author: Ben Kelly Desc: Merge pull request #13488 from wanderview/contacts-fast-remove Bug 936206: Short-circuit contact remove(). r=jmcf ======== https://hg.mozilla.org/integration/gaia-central/rev/ff76872c96f2 Author: Ben Kelly Desc: Bug 936206: Short-circuit contact remove(). --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 3b171772c6d..177f8eb3f92 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "dc7a50bca58536301c07399243b9350e3dedc896", + "revision": "45da563521dfd7e7883ebce9bae0728d522a4fad", "repo_path": "/integration/gaia-central" } From 5667cb55ae22b97288af7110f0595a400df2cfe5 Mon Sep 17 00:00:00 2001 From: Shawn Huang Date: Fri, 8 Nov 2013 23:25:20 +0800 Subject: [PATCH 31/37] Bug 932770 - [bluedroid] Implement GetPairedDeviceInternal, r=echou --- dom/bluetooth/BluetoothCommon.h | 1 + dom/bluetooth/BluetoothServiceBluedroid.cpp | 154 +++++++++++++++++--- 2 files changed, 134 insertions(+), 21 deletions(-) diff --git a/dom/bluetooth/BluetoothCommon.h b/dom/bluetooth/BluetoothCommon.h index b78db30956e..84a7361f025 100644 --- a/dom/bluetooth/BluetoothCommon.h +++ b/dom/bluetooth/BluetoothCommon.h @@ -98,6 +98,7 @@ extern bool gBluetoothDebugFlag; // Bluetooth address format: xx:xx:xx:xx:xx:xx (or xx_xx_xx_xx_xx_xx) #define BLUETOOTH_ADDRESS_LENGTH 17 #define BLUETOOTH_ADDRESS_NONE "00:00:00:00:00:00" +#define BLUETOOTH_ADDRESS_BYTES 6 BEGIN_BLUETOOTH_NAMESPACE diff --git a/dom/bluetooth/BluetoothServiceBluedroid.cpp b/dom/bluetooth/BluetoothServiceBluedroid.cpp index 52d3c5924cc..6c36e16bdb1 100644 --- a/dom/bluetooth/BluetoothServiceBluedroid.cpp +++ b/dom/bluetooth/BluetoothServiceBluedroid.cpp @@ -63,15 +63,19 @@ private: */ static bluetooth_device_t* sBtDevice; static const bt_interface_t* sBtInterface; -static bool sIsBtEnabled = false; static bool sAdapterDiscoverable = false; +static bool sIsBtEnabled = false; static nsString sAdapterBdAddress; static nsString sAdapterBdName; static uint32_t sAdapterDiscoverableTimeout; +static InfallibleTArray sAdapterBondedAddressArray; +static InfallibleTArray sRemoteDevicesPack; static nsTArray > sBondingRunnableArray; static nsTArray > sChangeDiscoveryRunnableArray; +static nsTArray > sGetPairedDeviceRunnableArray; static nsTArray > sSetPropertyRunnableArray; static nsTArray > sUnbondingRunnableArray; +static nsTArray sRequestedDeviceCountArray; /** * Static callback functions @@ -168,7 +172,8 @@ AdapterStateChangeCallback(bt_state_t aStatus) signalName = NS_LITERAL_STRING("Disabled"); } - BluetoothSignal signal(signalName, NS_LITERAL_STRING(KEY_MANAGER), BluetoothValue(true)); + BluetoothSignal signal(signalName, NS_LITERAL_STRING(KEY_MANAGER), + BluetoothValue(true)); nsRefPtr t = new DistributeBluetoothSignalTask(signal); if (NS_FAILED(NS_DispatchToMainThread(t))) { @@ -251,13 +256,30 @@ AdapterPropertiesChangeCallback(bt_status_t aStatus, int aNumProperties, BluetoothNamedValue(NS_LITERAL_STRING("DiscoverableTimeout"), propertyValue)); } else if (p.type == BT_PROPERTY_ADAPTER_BONDED_DEVICES) { - //FIXME: This will be implemented in the later patchset - return; + // We have to cache addresses of bonded devices. Unlike BlueZ, + // bluedroid would not send an another BT_PROPERTY_ADAPTER_BONDED_DEVICES + // event after bond completed + bt_bdaddr_t* deviceBdAddressTypes = (bt_bdaddr_t*)p.val; + int numOfAddresses = p.len / BLUETOOTH_ADDRESS_BYTES; + BT_LOGD("Adapter property: BONDED_DEVICES. Count: %d", numOfAddresses); + + // Whenever reloading paired devices, force refresh + sAdapterBondedAddressArray.Clear(); + + for (int index = 0; index < numOfAddresses; index++) { + nsAutoString deviceBdAddress; + BdAddressTypeToString(deviceBdAddressTypes + index, deviceBdAddress); + sAdapterBondedAddressArray.AppendElement(deviceBdAddress); + } + + propertyValue = sAdapterBondedAddressArray; + propertiesArray.AppendElement( + BluetoothNamedValue(NS_LITERAL_STRING("Devices"), propertyValue)); } else if (p.type == BT_PROPERTY_UUIDS) { //FIXME: This will be implemented in the later patchset return; } else { - BT_LOGR("Unhandled adapter property type: %d", p.type); + BT_LOGD("Unhandled adapter property type: %d", p.type); return; } @@ -279,6 +301,12 @@ AdapterPropertiesChangeCallback(bt_status_t aStatus, int aNumProperties, } } +/* + * RemoteDevicePropertiesChangeCallback will be called, as the + * following conditions: + * 1. When BT is turning on, bluedroid automatically execute this callback + * 2. When get_remote_device_properties() + */ static void RemoteDevicePropertiesChangeCallback(bt_status_t aStatus, bt_bdaddr_t *aBdAddress, @@ -287,32 +315,62 @@ RemoteDevicePropertiesChangeCallback(bt_status_t aStatus, { MOZ_ASSERT(!NS_IsMainThread()); - // First, get remote device bd_address since it will be the key of - // return name value pair. + if (sRequestedDeviceCountArray.IsEmpty()) { + MOZ_ASSERT(sGetPairedDeviceRunnableArray.IsEmpty()); + return; + } + + sRequestedDeviceCountArray[0]--; + + InfallibleTArray props; + nsString remoteDeviceBdAddress; BdAddressTypeToString(aBdAddress, remoteDeviceBdAddress); - - InfallibleTArray deviceProperties; + props.AppendElement( + BluetoothNamedValue(NS_LITERAL_STRING("Address"), remoteDeviceBdAddress)); for (int i = 0; i < aNumProperties; ++i) { bt_property_t p = aProperties[i]; if (p.type == BT_PROPERTY_BDNAME) { BluetoothValue propertyValue = NS_ConvertUTF8toUTF16((char*)p.val); - deviceProperties.AppendElement( + props.AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("Name"), propertyValue)); } else if (p.type == BT_PROPERTY_CLASS_OF_DEVICE) { uint32_t cod = *(uint32_t*)p.val; - deviceProperties.AppendElement( + props.AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("Class"), BluetoothValue(cod))); + nsString icon; ClassToIcon(cod, icon); - deviceProperties.AppendElement( + props.AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("Icon"), BluetoothValue(icon))); } else { - BT_LOGR("Other non-handled device properties. Type: %d", p.type); + BT_LOGD("Other non-handled device properties. Type: %d", p.type); } } + + // Use address as the index + sRemoteDevicesPack.AppendElement( + BluetoothNamedValue(remoteDeviceBdAddress, props)); + + if (sRequestedDeviceCountArray[0] == 0) { + MOZ_ASSERT(!sGetPairedDeviceRunnableArray.IsEmpty()); + + if (sGetPairedDeviceRunnableArray.IsEmpty()) { + BT_LOGR("No runnable to return"); + return; + } + + DispatchBluetoothReply(sGetPairedDeviceRunnableArray[0], + sRemoteDevicesPack, EmptyString()); + + // After firing it, clean up cache + sRemoteDevicesPack.Clear(); + + sRequestedDeviceCountArray.RemoveElementAt(0); + sGetPairedDeviceRunnableArray.RemoveElementAt(0); + } } static void @@ -444,20 +502,38 @@ BondStateChangedCallback(bt_status_t aStatus, bt_bdaddr_t* aRemoteBdAddress, { MOZ_ASSERT(!NS_IsMainThread()); - if (aState == BT_BOND_STATE_BONDING) { - //We don't need to handle bonding state - return; - } - - bool bonded = (aState == BT_BOND_STATE_BONDED); nsAutoString remoteAddress; BdAddressTypeToString(aRemoteBdAddress, remoteAddress); + bool bonded; + + if (aState == BT_BOND_STATE_BONDING) { + // We don't need to handle bonding state + return; + } else if (aState == BT_BOND_STATE_NONE) { + bonded = false; + sAdapterBondedAddressArray.RemoveElement(remoteAddress); + } else if (aState == BT_BOND_STATE_BONDED) { + bonded = true; + sAdapterBondedAddressArray.AppendElement(remoteAddress); + } + + // Update bonded address list to BluetoothAdapter + InfallibleTArray propertiesChangeArray; + propertiesChangeArray.AppendElement( + BluetoothNamedValue(NS_LITERAL_STRING("Devices"), + sAdapterBondedAddressArray)); + BluetoothValue value(propertiesChangeArray); + BluetoothSignal signal(NS_LITERAL_STRING("PropertyChanged"), + NS_LITERAL_STRING(KEY_ADAPTER), + BluetoothValue(propertiesChangeArray)); + NS_DispatchToMainThread(new DistributeBluetoothSignalTask(signal)); + + // Update bonding status to gaia InfallibleTArray propertiesArray; propertiesArray.AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("address"), remoteAddress)); propertiesArray.AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("status"), bonded)); - BluetoothSignal newSignal(NS_LITERAL_STRING(PAIRED_STATUS_CHANGED_ID), NS_LITERAL_STRING(KEY_ADAPTER), BluetoothValue(propertiesArray)); @@ -634,6 +710,10 @@ BluetoothServiceBluedroid::GetDefaultAdapterPathInternal( v.get_ArrayOfBluetoothNamedValue().AppendElement( BluetoothNamedValue(NS_LITERAL_STRING("Name"), sAdapterBdName)); + v.get_ArrayOfBluetoothNamedValue().AppendElement( + BluetoothNamedValue(NS_LITERAL_STRING("Devices"), + sAdapterBondedAddressArray)); + nsAutoString replyError; DispatchBluetoothReply(runnable.get(), v, replyError); @@ -646,8 +726,12 @@ nsresult BluetoothServiceBluedroid::GetConnectedDevicePropertiesInternal( uint16_t aProfileId, BluetoothReplyRunnable* aRunnable) { - return NS_OK; + MOZ_ASSERT(NS_IsMainThread()); + //FIXME: This will be implemented in later patches + DispatchBluetoothReply(aRunnable, BluetoothValue(true), EmptyString()); + + return NS_OK; } nsresult @@ -656,6 +740,34 @@ BluetoothServiceBluedroid::GetPairedDevicePropertiesInternal( { MOZ_ASSERT(NS_IsMainThread()); + if (!IsReady()) { + NS_NAMED_LITERAL_STRING(errorStr, "Bluetooth service is not ready yet!"); + DispatchBluetoothReply(aRunnable, BluetoothValue(), errorStr); + return NS_OK; + } + + int requestedDeviceCount = aDeviceAddress.Length(); + if (requestedDeviceCount == 0) { + InfallibleTArray emptyArr; + DispatchBluetoothReply(aRunnable, BluetoothValue(emptyArr), EmptyString()); + return NS_OK; + } + + for (int i = 0; i < requestedDeviceCount; i++) { + // Retrieve all properties of devices + bt_bdaddr_t addressType; + StringToBdAddressType(aDeviceAddress[i], &addressType); + int ret = sBtInterface->get_remote_device_properties(&addressType); + if (ret != BT_STATUS_SUCCESS) { + DispatchBluetoothReply(aRunnable, BluetoothValue(true), + NS_LITERAL_STRING("GetPairedDeviceFailed")); + return NS_OK; + } + } + + sRequestedDeviceCountArray.AppendElement(requestedDeviceCount); + sGetPairedDeviceRunnableArray.AppendElement(aRunnable); + return NS_OK; } From f500a4dc2037120312a96d1c781ae9a43fe14607 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 07:45:25 -0800 Subject: [PATCH 32/37] Bumping gaia.json for 4 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/2d259d659aa7 Author: Florin Strugariu Desc: Merge pull request #13510 from zacc/bug_936364 bug 936364 Address test_settings_wallpaper.py intermittent ======== https://hg.mozilla.org/integration/gaia-central/rev/5e2ee581ce47 Author: Zac Campbell Desc: bug 936364 Address test_settings_wallpaper.py intermittent ======== https://hg.mozilla.org/integration/gaia-central/rev/4de9ba817034 Author: Ben Kelly Desc: Merge pull request #13487 from wanderview/contacts-avoid-imgloader-reload Bug 936202: Defer imgLoader.reload() when inserting contacts. r=jmcf ======== https://hg.mozilla.org/integration/gaia-central/rev/1345191d46a2 Author: Ben Kelly Desc: Bug 936202: Defer imgLoader.reload() when inserting contacts. --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 177f8eb3f92..ef2e69109dc 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "45da563521dfd7e7883ebce9bae0728d522a4fad", + "revision": "2d259d659aa76ec7afc2e41d411cffb5cc826363", "repo_path": "/integration/gaia-central" } From b781f11c878247fac68e8c2e4869d72c6b1f98c3 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 08:35:24 -0800 Subject: [PATCH 33/37] Bumping gaia.json for 1 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/c1dfcf7022f4 Author: bmac Desc: Bug 920524 - [Clock] Timer sound selection does not preview sound r=jugglinmike --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index ef2e69109dc..e9260e0dcf7 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "2d259d659aa76ec7afc2e41d411cffb5cc826363", + "revision": "c1dfcf7022f47a06da80667b27ab5733223d4c1a", "repo_path": "/integration/gaia-central" } From 453c37e91cf18250cb18614ae08618dbaddee17e Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 08:55:25 -0800 Subject: [PATCH 34/37] Bumping gaia.json for 2 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/0fd166333772 Author: Ben Kelly Desc: Merge pull request #13489 from wanderview/contacts-overlay-hide-list Bug 936215: Hide contacts list while showing overlay. r=jmcf ======== https://hg.mozilla.org/integration/gaia-central/rev/c6582278679d Author: Ben Kelly Desc: Bug 936215: Hide contacts list while showing overlay. --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index e9260e0dcf7..9baf5f08351 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "c1dfcf7022f47a06da80667b27ab5733223d4c1a", + "revision": "0fd1663337729c472ed0b49036540fbc1f4852ac", "repo_path": "/integration/gaia-central" } From 42a5b5777e3a407fb106664ba30c6c25dae59ef9 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 09:35:25 -0800 Subject: [PATCH 35/37] Bumping gaia.json for 3 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/dc22cb96998e Author: Eitan Isaacson Desc: Merge pull request #13368 from eeejay/bug-920839 Bug 920839 - Value Selector accessibility improvements. r=timdream ======== https://hg.mozilla.org/integration/gaia-central/rev/1a2ebd989db0 Author: Eitan Isaacson Desc: Bug 920839 - Added spinbutton ARIA markup to value picker. ======== https://hg.mozilla.org/integration/gaia-central/rev/1cff0273e0b1 Author: Eitan Isaacson Desc: Bug 920839 - ARIA fixes to value selector. --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 9baf5f08351..aa624adb14d 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "0fd1663337729c472ed0b49036540fbc1f4852ac", + "revision": "dc22cb96998eff0cab1f4efba87cb74aa1f98281", "repo_path": "/integration/gaia-central" } From cfcc9e881489df9fd0bf2a0c8275f2e61b9511a3 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 09:45:27 -0800 Subject: [PATCH 36/37] Bumping gaia.json for 2 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/0b9f621ff0fc Author: Amir Nissim Desc: Merge pull request #13181 from EverythingMe/919555-remove-appIndex Bug 919555 - [e.me][perf] Remove app index duplicacy ======== https://hg.mozilla.org/integration/gaia-central/rev/2a1dfb60ed7c Author: Amir Nissim Desc: Bug 919555 - [e.me][perf] Remove app index duplicacy [r=ranbena, crdlc] --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index aa624adb14d..584f6b57ce3 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "dc22cb96998eff0cab1f4efba87cb74aa1f98281", + "revision": "0b9f621ff0fcca8f0aedcbf5dc032821d31a5af4", "repo_path": "/integration/gaia-central" } From 2e46134a0b4db6e3f18aec319d0fa25da54d0e28 Mon Sep 17 00:00:00 2001 From: Gaia Pushbot Date: Fri, 8 Nov 2013 09:55:25 -0800 Subject: [PATCH 37/37] Bumping gaia.json for 2 gaia-central revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/979add320adb Author: Etienne Segonzac Desc: Merge pull request #13116 from mcjimenez/bug928134 Bug 928134 - When powering on a device for the first time with a SIM customization variant with app preloads, an app install success notification unexpectedly appears r=etienne ======== https://hg.mozilla.org/integration/gaia-central/rev/3e4e6a58ce16 Author: Carmen Jimenez Cabezas Desc: Bug 928134 - When powering on a device for the first time with a SIM customization variant with app preloads, an app install success notification unexpectedly appears --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 584f6b57ce3..6ba05cbb7f6 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,4 +1,4 @@ { - "revision": "0b9f621ff0fcca8f0aedcbf5dc032821d31a5af4", + "revision": "979add320adbf777379cfd1044978392c576aaf8", "repo_path": "/integration/gaia-central" }