From bc9c6e01923ee32266316b16a23694ad1b28e146 Mon Sep 17 00:00:00 2001 From: Lars T Hansen Date: Thu, 26 Nov 2015 12:55:06 +0100 Subject: [PATCH 001/153] Bug 1228259 - jitspew is #ifdef JS_JITSPEW not DEBUG. r=h4writer --HG-- extra : rebase_source : 6ac8a0e1095c4a318af15fee745467e5163503e5 extra : amend_source : 9ba9d3d0c9b15a8e3550ace0b88d4068cc945e3b --- js/src/jit/Safepoints.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/jit/Safepoints.cpp b/js/src/jit/Safepoints.cpp index 02f827b316de..e5da950cabb2 100644 --- a/js/src/jit/Safepoints.cpp +++ b/js/src/jit/Safepoints.cpp @@ -201,7 +201,7 @@ SafepointWriter::writeValueSlots(LSafepoint* safepoint) MapSlotsToBitset(frameSlots_, argumentSlots_, stream_, slots); } -#if defined(DEBUG) && defined(JS_NUNBOX32) +#if defined(JS_JITSPEW) && defined(JS_NUNBOX32) static void DumpNunboxPart(const LAllocation& a) { From 2f0f023fc415ab3a09589177f8d39d2be7d6ecfc Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Fri, 13 Nov 2015 16:42:04 +0000 Subject: [PATCH 002/153] Bug 1224230 - Testcase. --- layout/generic/crashtests/1224230-1.html | 22 ++++++++++++++++++++++ layout/generic/crashtests/crashtests.list | 1 + 2 files changed, 23 insertions(+) create mode 100644 layout/generic/crashtests/1224230-1.html diff --git a/layout/generic/crashtests/1224230-1.html b/layout/generic/crashtests/1224230-1.html new file mode 100644 index 000000000000..2743b43aebca --- /dev/null +++ b/layout/generic/crashtests/1224230-1.html @@ -0,0 +1,22 @@ + + + + +
+
+ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam tortor nulla, +eleifend eu eleifend eu, scelerisque sit amet sapien. Sed iaculis tellus ut quam +pharetra consequat. Donec vitae nulla eu mi porta vulputate. In vestibulum, erat +quis aliquam tempor, lectus augue viverra justo, vitae semper nibh neque tempor +orci. Etiam luctus aliquet magna id pellentesque. Interdum et malesuada fames ac +ante ipsum primis in faucibus. Suspendisse sit amet eros volutpat, convallis +purus non, porta sapien. Duis fermentum at tortor nec ultricies. Morbi et lacus +vitae risus elementum condimentum quis vitae justo. Cum sociis natoque penatibus +et magnis dis parturient montes, nascetur ridiculus mus.

diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index 3f6c7d97914d..975e78b46212 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -596,6 +596,7 @@ load 1221874-1.html load 1222783.xhtml load 1223568-1.html load 1223568-2.html +load 1224230-1.html pref(layout.css.grid.enabled,true) load 1225118.html load first-letter-638937-1.html load first-letter-638937-2.html From ef0ba18ad3c9bb433f3f9a2e1396adf9d9a82dd0 Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Fri, 27 Nov 2015 13:43:40 +0100 Subject: [PATCH 003/153] Bug 1218817 - Implement ServiceWorkerRegistrationActor;r=janx --- devtools/server/actors/worker.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/devtools/server/actors/worker.js b/devtools/server/actors/worker.js index 0be25e685a10..a0145a26a24b 100644 --- a/devtools/server/actors/worker.js +++ b/devtools/server/actors/worker.js @@ -228,3 +228,18 @@ WorkerActorList.prototype = { }; exports.WorkerActorList = WorkerActorList; + +function ServiceWorkerRegistrationActor(registration) { + this._registration = registration; +}; + +ServiceWorkerRegistrationActor.prototype = { + actorPrefix: "serviceWorkerRegistration", + + form: function () { + return { + actor: this.actorID, + scope: this._registration.scope + }; + } +}; From 6feb8201a8d6e8197fdab5ce3b29bb04dc226ade Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Fri, 27 Nov 2015 13:44:14 +0100 Subject: [PATCH 004/153] Bug 1218817 - Implement ServiceWorkerRegistrationActorList;r=janx --- devtools/server/actors/worker.js | 88 ++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/devtools/server/actors/worker.js b/devtools/server/actors/worker.js index a0145a26a24b..84c5996f6cb2 100644 --- a/devtools/server/actors/worker.js +++ b/devtools/server/actors/worker.js @@ -243,3 +243,91 @@ ServiceWorkerRegistrationActor.prototype = { }; } }; + +function ServiceWorkerRegistrationActorList() { + this._actors = new Map(); + this._onListChanged = null; + this._mustNotify = false; + this.onRegister = this.onRegister.bind(this); + this.onUnregister = this.onUnregister.bind(this); +}; + +ServiceWorkerRegistrationActorList.prototype = { + getList: function () { + // Create a set of registrations. + let registrations = new Set(); + let array = swm.getAllRegistrations(); + for (let index = 0; index < array.length; ++index) { + registrations.add( + array.queryElementAt(index, Ci.nsIServiceWorkerRegistrationInfo)); + } + + // Delete each actor for which we don't have a registration. + for (let [registration, ] of this._actors) { + if (!registrations.has(registration)) { + this._actors.delete(registration); + } + } + + // Create an actor for each registration for which we don't have one. + for (let registration of registrations) { + if (!this._actors.has(registration)) { + this._actors.set(registration, + new ServiceWorkerRegistrationActor(registration)); + } + } + + if (!this._mustNotify) { + if (this._onListChanged !== null) { + swm.addListener(this); + } + this._mustNotify = true; + } + + let actors = []; + for (let [, actor] of this._actors) { + actors.push(actor); + } + + return Promise.resolve(actors); + }, + + get onListchanged() { + return this._onListchanged; + }, + + set onListChanged(onListChanged) { + if (typeof onListChanged !== "function" && onListChanged !== null) { + throw new Error("onListChanged must be either a function or null."); + } + + if (this._mustNotify) { + if (this._onListChanged === null && onListChanged !== null) { + swm.addListener(this); + } + if (this._onListChanged !== null && onListChanged === null) { + swm.removeListener(this); + } + } + this._onListChanged = onListChanged; + }, + + _notifyListChanged: function () { + this._onListChanged(); + + if (this._onListChanged !== null) { + swm.removeListener(this); + } + this._mustNotify = false; + }, + + onRegister: function (registration) { + this._notifyListChanged(); + }, + + onUnregister: function (registration) { + this._notifyListChanged(); + } +}; + +exports.ServiceWorkerRegistrationActorList = ServiceWorkerRegistrationActorList; From b9ec91717eceaeef4d56dcfe2675e25b523d4c26 Mon Sep 17 00:00:00 2001 From: Fernando Jimenez Date: Fri, 27 Nov 2015 13:56:50 +0100 Subject: [PATCH 005/153] Bug 1223781 - New settings added to settings.json should be applied after OTA without requiring to bump settings DB version. r=gwagner --- .../filepicker_path_handler_chrome.js | 9 +- dom/settings/SettingsDB.jsm | 201 +++++++++++------- dom/settings/tests/chrome.ini | 5 +- dom/settings/tests/test_settings_db.js | 148 +++++++++++++ dom/settings/tests/test_settings_db.xul | 19 ++ .../test_settingsrequestmanager_messages.js | 42 +++- 6 files changed, 345 insertions(+), 79 deletions(-) create mode 100644 dom/settings/tests/test_settings_db.js create mode 100644 dom/settings/tests/test_settings_db.xul diff --git a/b2g/components/test/mochitest/filepicker_path_handler_chrome.js b/b2g/components/test/mochitest/filepicker_path_handler_chrome.js index a175746cb93f..7cc7a84fd04a 100644 --- a/b2g/components/test/mochitest/filepicker_path_handler_chrome.js +++ b/b2g/components/test/mochitest/filepicker_path_handler_chrome.js @@ -12,13 +12,18 @@ var ppmm = Cc['@mozilla.org/parentprocessmessagemanager;1'] .getService(Ci.nsIMessageListenerManager); var pickResult = null; +var timer = null; function processPickMessage(message) { let sender = message.target.QueryInterface(Ci.nsIMessageSender); // reply FilePicker's message sender.sendAsyncMessage('file-picked', pickResult); - // notify caller - sendAsyncMessage('file-picked-posted', { type: 'file-picked-posted' }); + timer = Cc["@mozilla.org/timer;1"] + .createInstance(Components.interfaces.nsITimer); + timer.initWithCallback(function() { + // notify caller + sendAsyncMessage('file-picked-posted', { type: 'file-picked-posted' }); + }, 3000, Ci.nsITimer.TYPE_ONE_SHOT); } function updatePickResult(result) { diff --git a/dom/settings/SettingsDB.jsm b/dom/settings/SettingsDB.jsm index d4b07a624fe5..3c1cbd791179 100644 --- a/dom/settings/SettingsDB.jsm +++ b/dom/settings/SettingsDB.jsm @@ -8,10 +8,16 @@ var Cc = Components.classes; var Ci = Components.interfaces; var Cu = Components.utils; -Cu.importGlobalProperties(['Blob', 'File']); +Cu.importGlobalProperties(["Blob", "File"]); Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/AppsUtils.jsm"); -this.EXPORTED_SYMBOLS = ["SettingsDB", "SETTINGSDB_NAME", "SETTINGSSTORE_NAME"]; +this.EXPORTED_SYMBOLS = [ + "SettingsDB", + "SETTINGSDB_NAME", + "SETTINGSSTORE_NAME", + "SETTINGSDB_VERSION" +]; var DEBUG = false; var VERBOSE = false; @@ -53,7 +59,10 @@ SettingsDB.prototype = { __proto__: IndexedDBHelper.prototype, - upgradeSchema: function upgradeSchema(aTransaction, aDb, aOldVersion, aNewVersion) { + _dbVersion: SETTINGSDB_VERSION, + + upgradeSchema(aTransaction, aDb, aOldVersion, aNewVersion) { + if (DEBUG) debug("Upgrade schema ", aOldVersion, aNewVersion); let objectStore; if (aOldVersion == 0) { objectStore = aDb.createObjectStore(SETTINGSSTORE_NAME, { keyPath: "settingName" }); @@ -67,75 +76,11 @@ SettingsDB.prototype = { objectStore = aTransaction.objectStore(SETTINGSSTORE_NAME); } - // Loading resource://app/defaults/settings.json doesn't work because - // settings.json is not in the omnijar. - // So we look for the app dir instead and go from here... - let settingsFile = FileUtils.getFile("DefRt", ["settings.json"], false); - if (!settingsFile || (settingsFile && !settingsFile.exists())) { - // On b2g desktop builds the settings.json file is moved in the - // profile directory by the build system. - settingsFile = FileUtils.getFile("ProfD", ["settings.json"], false); - if (!settingsFile || (settingsFile && !settingsFile.exists())) { - return; - } - } - - let chan = NetUtil.newChannel({ - uri: NetUtil.newURI(settingsFile), - loadUsingSystemPrincipal: true}); - let stream = chan.open(); - // Obtain a converter to read from a UTF-8 encoded input stream. - let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] - .createInstance(Ci.nsIScriptableUnicodeConverter); - converter.charset = "UTF-8"; - let rawstr = converter.ConvertToUnicode(NetUtil.readInputStreamToString( - stream, - stream.available()) || ""); - let settings; - try { - settings = JSON.parse(rawstr); - } catch(e) { - if (DEBUG) debug("Error parsing " + settingsFile.path + " : " + e); - return; - } - stream.close(); - - objectStore.openCursor().onsuccess = function(event) { - let cursor = event.target.result; - if (cursor) { - let value = cursor.value; - if (value.settingName in settings) { - if (VERBOSE) debug("Upgrade " +settings[value.settingName]); - value.defaultValue = this.prepareValue(settings[value.settingName]); - delete settings[value.settingName]; - if ("settingValue" in value) { - value.userValue = this.prepareValue(value.settingValue); - delete value.settingValue; - } - cursor.update(value); - } else if ("userValue" in value || "settingValue" in value) { - value.defaultValue = undefined; - if (aOldVersion == 1 && value.settingValue) { - value.userValue = this.prepareValue(value.settingValue); - delete value.settingValue; - } - cursor.update(value); - } else { - cursor.delete(); - } - cursor.continue(); - } else { - for (let name in settings) { - let value = this.prepareValue(settings[name]); - if (VERBOSE) debug("Set new:" + name +", " + value); - objectStore.add({ settingName: name, defaultValue: value, userValue: undefined }); - } - } - }.bind(this); + this.loadDefaultSettings(objectStore, aOldVersion); }, // If the value is a data: uri, convert it to a Blob. - convertDataURIToBlob: function(aValue) { + convertDataURIToBlob(aValue) { /* base64 to ArrayBuffer decoding, from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding */ @@ -199,7 +144,7 @@ SettingsDB.prototype = { return aValue }, - getObjectKind: function(aObject) { + getObjectKind(aObject) { if (aObject === null || aObject === undefined) { return "primitive"; } else if (Array.isArray(aObject)) { @@ -220,7 +165,7 @@ SettingsDB.prototype = { }, // Makes sure any property that is a data: uri gets converted to a Blob. - prepareValue: function(aObject) { + prepareValue(aObject) { let kind = this.getObjectKind(aObject); if (kind == "array") { let res = []; @@ -242,8 +187,118 @@ SettingsDB.prototype = { return res; }, - init: function init() { - this.initDBHelper(SETTINGSDB_NAME, SETTINGSDB_VERSION, + loadDefaultSettings(aObjectStore, aOldVersion) { + // Loading resource://app/defaults/settings.json doesn't work because + // settings.json is not in the omnijar. + // So we look for the app dir instead and go from here... + let settingsFile = FileUtils.getFile("DefRt", ["settings.json"], false); + if (!settingsFile || (settingsFile && !settingsFile.exists())) { + // On b2g desktop builds the settings.json file is moved in the + // profile directory by the build system. + settingsFile = FileUtils.getFile("ProfD", ["settings.json"], false); + if (!settingsFile || (settingsFile && !settingsFile.exists())) { + return; + } + } + + let chan = NetUtil.newChannel({ + uri: NetUtil.newURI(settingsFile), + loadUsingSystemPrincipal: true + }); + let stream = chan.open(); + // Obtain a converter to read from a UTF-8 encoded input stream. + let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] + .createInstance(Ci.nsIScriptableUnicodeConverter); + converter.charset = "UTF-8"; + let rawstr = converter.ConvertToUnicode( + NetUtil.readInputStreamToString(stream, stream.available()) || "" + ); + let settings; + try { + settings = JSON.parse(rawstr); + } catch(e) { + if (DEBUG) debug("Error parsing " + settingsFile.path + " : " + e); + return; + } + stream.close(); + + aObjectStore.openCursor().onsuccess = event => { + let cursor = event.target.result; + if (cursor) { + let value = cursor.value; + if (value.settingName in settings) { + if (VERBOSE) { + debug("Upgrade " + value.settingName + " " + + settings[value.settingName]); + } + value.defaultValue = this.prepareValue(settings[value.settingName]); + delete settings[value.settingName]; + if ("settingValue" in value) { + value.userValue = this.prepareValue(value.settingValue); + delete value.settingValue; + } + cursor.update(value); + } else if ("userValue" in value || "settingValue" in value) { + value.defaultValue = undefined; + if (aOldVersion !== undefined && + aOldVersion == 1 && value.settingValue) { + value.userValue = this.prepareValue(value.settingValue); + delete value.settingValue; + } + cursor.update(value); + } else { + cursor.delete(); + } + cursor.continue(); + } else { + for (let name in settings) { + let value = this.prepareValue(settings[name]); + if (VERBOSE) debug("Set new:" + name +", " + value); + aObjectStore.add({ + settingName: name, + defaultValue: value, + userValue: undefined + }); + } + } + }; + }, + + /** + * Only for testing purposes. + */ + set dbVersion(version) { + this._dbVersion = SETTINGSDB_VERSION || version; + }, + + init() { + this.initDBHelper(SETTINGSDB_NAME, this._dbVersion, [SETTINGSSTORE_NAME]); + + // We need to store the db version to avoid reading the setting.json + // file twice on the very first run and after an OTA update where + // the db version was bumped. + // upgradeSchema already takes care of loading and applying the + // setting.json content in these two scenarios. + const dbVersionPref = "settings.api.db.version"; + let oldDbVersion = 0; + try { + oldDbVersion = Services.prefs.getIntPref(dbVersionPref); + } catch(e) {} + Services.prefs.setIntPref(dbVersionPref, this._dbVersion); + + if (!AppsUtils.isFirstRun(Services.prefs) || + oldDbVersion != this._dbVersion) { + return; + } + + // We get there in case of a first run after an OTA update where + // the settings db version was not bumped. In this case, we need to + // load and apply the content of the settings.json file. + this.newTxn("readwrite", SETTINGSSTORE_NAME, (txn, store) => { + this.loadDefaultSettings(store); + }, null, error => { + dump("*** WARNING *** Settings DB initialization error " + error + "\n"); + }); } } diff --git a/dom/settings/tests/chrome.ini b/dom/settings/tests/chrome.ini index f2fca29a73c7..8f3861b05fac 100644 --- a/dom/settings/tests/chrome.ini +++ b/dom/settings/tests/chrome.ini @@ -1,10 +1,13 @@ [DEFAULT] skip-if = buildapp != 'b2g' support-files = + test_settings_db.js test_settings_service.js test_settings_service_callback.js [test_settings_service.xul] -skip-if= buildapp == 'mulet' +skip-if = buildapp == 'mulet' [test_settings_service_callback.xul] +[test_settings_db.xul] +skip-if = toolkit == 'gonk' # Bug 1225157 diff --git a/dom/settings/tests/test_settings_db.js b/dom/settings/tests/test_settings_db.js new file mode 100644 index 000000000000..75f7c663aaba --- /dev/null +++ b/dom/settings/tests/test_settings_db.js @@ -0,0 +1,148 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const Cu = Components.utils; + +Cu.import("resource://gre/modules/AppsUtils.jsm"); +Cu.import("resource://gre/modules/FileUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/SettingsDB.jsm"); + +SimpleTest.waitForExplicitFinish(); + +let settings = { + "setting1": "value1" +}; + +let settingsDB; + +const saveTestSettingsJson = () => { + let file = FileUtils.getFile("ProfD", ["settings.json"], false); + let foStream = FileUtils.openFileOutputStream(file); + let json = JSON.stringify(settings); + foStream.write(json, json.length); + foStream.close(); +}; + +const getSettings = () => { + return new Promise((resolve, reject) => { + settingsDB.newTxn("readonly", SETTINGSSTORE_NAME, (txn, store) => { + txn.onabort = reject; + txn.onerror = reject; + let req = store.getAll(); + req.onsuccess = () => { + resolve(req.result); + }; + req.onerror = reject; + }, null, reject); + }); +}; + +const checkSettings = expected => { + return getSettings().then(settings => { + settings.forEach(setting => { + if (expected.has(setting.settingName)) { + let value = expected.get(setting.settingName); + ok(value == setting.defaultValue, + `${setting.defaultValue} should be ${value}`); + expected.delete(setting.settingName); + } + }); + ok(expected.size == 0, `should remove all expected settings`); + }); +}; + +const setFirstRun = () => { + let promises = []; + promises.push(new Promise(resolve => { + SpecialPowers.pushPrefEnv({ + "set": [["gecko.mstone", ""]] + }, resolve); + })); + promises.push(new Promise(resolve => { + SpecialPowers.pushPrefEnv({ + "set": [["gecko.buildID", ""]] + }, resolve); + })); + + return Promise.all(promises); +}; + +const cleanup = () => { + settingsDB.close(); + settingsDB = null; + next(); +}; + +const tests = [() => { + // Create dummy settings.json in the profile dir. + saveTestSettingsJson(); + ok(true, "should create settings.json"); + next(); +}, () => { + // settings.json should be applied on first boot. + settingsDB = new SettingsDB(); + settingsDB.init(); + let expected = new Map(); + expected.set("setting1", "value1"); + checkSettings(expected).then(next); +}, () => { + cleanup(); +}, () => { + // Modifying settings.json but not updating the platform should not + // apply the changes to settings.json. + settings["setting1"] = "modifiedValue1"; + settings["setting2"] = "value2"; + saveTestSettingsJson(); + settingsDB = new SettingsDB(); + settingsDB.init(); + let expected = new Map(); + expected.set("setting1", "value1"); + checkSettings(expected).then(next); +}, () => { + cleanup(); +}, () => { + setFirstRun().then(next); +}, () => { + // Updating the platform should apply changes to settings.json. + settingsDB = new SettingsDB(); + settingsDB.init(); + let expected = new Map(); + expected.set("setting1", "modifiedValue1"); + expected.set("setting2", "value2"); + checkSettings(expected).then(next); +}, () => { + cleanup(); +}, () => { + setFirstRun().then(next); +}, () => { + // Updating the platform and bumping DB version should also apply changes + // to settings.json + settings["setting2"] = "modifiedValue2"; + saveTestSettingsJson(); + settingsDB = new SettingsDB(); + SettingsDB.dbVersion = SETTINGSDB_VERSION + 1; + settingsDB.init(); + let expected = new Map(); + expected.set("setting1", "modifiedValue1"); + expected.set("setting2", "modifiedValue2"); + checkSettings(expected).then(next); +}, () => { + cleanup(); +}]; + +const next = () => { + let step = tests.shift(); + if (!step) { + return SimpleTest.finish(); + } + try { + step(); + } catch(e) { + ok(false, "Test threw: " + e); + } +} + +SpecialPowers.pushPrefEnv({"set":[["settings.api.db.version", 0]]}, next); diff --git a/dom/settings/tests/test_settings_db.xul b/dom/settings/tests/test_settings_db.xul new file mode 100644 index 000000000000..7451bdecbdf5 --- /dev/null +++ b/dom/settings/tests/test_settings_db.xul @@ -0,0 +1,19 @@ + + + + + + + + + + Mozilla Bug 1223781 + + + + + diff --git a/layout/reftests/text-shadow/reftest.list b/layout/reftests/text-shadow/reftest.list index 48f44812006e..7808c9f0d2ea 100644 --- a/layout/reftests/text-shadow/reftest.list +++ b/layout/reftests/text-shadow/reftest.list @@ -36,3 +36,5 @@ fails-if(Android||B2G) needs-focus == text-shadow-selected-2.html text-shadow-se # bug 721750 needs-focus == text-shadow-on-selection-1.html text-shadow-on-selection-1-ref.html needs-focus == text-shadow-on-selection-2.html text-shadow-on-selection-2-ref.html + +== overflow-decoration.html overflow-decoration-ref.html From 6fdb9fbeaafc0b2f442296f4f4314eae7386b1d6 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Sat, 28 Nov 2015 11:56:33 +1100 Subject: [PATCH 042/153] Bug 1040668 part 10 - Implement emphasis mark rendering. r=jfkthame --HG-- extra : source : 1c53ccbaece3931ffe1da5610977e92fcce5f3f6 --- gfx/thebes/gfxFont.cpp | 41 ++++++++++ gfx/thebes/gfxFont.h | 20 +++++ gfx/thebes/gfxTextRun.cpp | 47 +++++++++++- gfx/thebes/gfxTextRun.h | 10 +++ layout/generic/nsLineLayout.cpp | 5 +- layout/generic/nsTextFrame.cpp | 129 +++++++++++++++++++++++++++++++- layout/generic/nsTextFrame.h | 19 +++++ layout/style/nsStyleStruct.cpp | 18 +++++ layout/style/nsStyleStruct.h | 2 + 9 files changed, 286 insertions(+), 5 deletions(-) diff --git a/gfx/thebes/gfxFont.cpp b/gfx/thebes/gfxFont.cpp index aca982f45b55..0f20554625ed 100644 --- a/gfx/thebes/gfxFont.cpp +++ b/gfx/thebes/gfxFont.cpp @@ -48,6 +48,7 @@ #include "graphite2/Font.h" #include +#include using namespace mozilla; using namespace mozilla::gfx; @@ -1849,6 +1850,46 @@ gfxFont::DrawGlyphs(gfxShapedText *aShapedText, return emittedGlyphs; } +// This method is mostly parallel to DrawGlyphs. +void +gfxFont::DrawEmphasisMarks(gfxTextRun* aShapedText, gfxPoint* aPt, + uint32_t aOffset, uint32_t aCount, + const EmphasisMarkDrawParams& aParams) +{ + gfxFloat& inlineCoord = aParams.isVertical ? aPt->y : aPt->x; + uint32_t markLength = aParams.mark->GetLength(); + + gfxFloat clusterStart = NAN; + bool shouldDrawEmphasisMark = false; + for (uint32_t i = 0, idx = aOffset; i < aCount; ++i, ++idx) { + if (aParams.spacing) { + inlineCoord += aParams.direction * aParams.spacing[i].mBefore; + } + if (aShapedText->IsClusterStart(idx)) { + clusterStart = inlineCoord; + } + if (aShapedText->CharMayHaveEmphasisMark(idx)) { + shouldDrawEmphasisMark = true; + } + inlineCoord += aParams.direction * aShapedText->GetAdvanceForGlyph(idx); + if (shouldDrawEmphasisMark && + (i + 1 == aCount || aShapedText->IsClusterStart(idx + 1))) { + MOZ_ASSERT(!std::isnan(clusterStart), "Should have cluster start"); + gfxFloat clusterAdvance = inlineCoord - clusterStart; + // Move the coord backward to get the needed start point. + gfxFloat delta = (clusterAdvance + aParams.advance) / 2; + inlineCoord -= delta; + aParams.mark->Draw(aParams.context, *aPt, DrawMode::GLYPH_FILL, + 0, markLength, nullptr, nullptr, nullptr); + inlineCoord += delta; + shouldDrawEmphasisMark = false; + } + if (aParams.spacing) { + inlineCoord += aParams.direction * aParams.spacing[i].mAfter; + } + } +} + void gfxFont::Draw(gfxTextRun *aTextRun, uint32_t aStart, uint32_t aEnd, gfxPoint *aPt, const TextRunDrawParams& aRunParams, diff --git a/gfx/thebes/gfxFont.h b/gfx/thebes/gfxFont.h index 69eedec04c61..a6fad37adb14 100644 --- a/gfx/thebes/gfxFont.h +++ b/gfx/thebes/gfxFont.h @@ -1307,6 +1307,7 @@ private: class GlyphBufferAzure; struct TextRunDrawParams; struct FontDrawParams; +struct EmphasisMarkDrawParams; class gfxFont { @@ -1601,6 +1602,16 @@ public: gfxPoint *aPt, const TextRunDrawParams& aRunParams, uint16_t aOrientation); + /** + * Draw the emphasis marks for the given text run. Its prerequisite + * and output are similiar to the method Draw(). + * @param aPt the baseline origin of the emphasis marks. + * @param aParams some drawing parameters, see EmphasisMarkDrawParams. + */ + void DrawEmphasisMarks(gfxTextRun* aShapedText, gfxPoint* aPt, + uint32_t aOffset, uint32_t aCount, + const EmphasisMarkDrawParams& aParams); + /** * Measure a run of characters. See gfxTextRun::Metrics. * @param aTight if false, then return the union of the glyph extents @@ -2167,4 +2178,13 @@ struct FontDrawParams { bool haveColorGlyphs; }; +struct EmphasisMarkDrawParams { + gfxContext* context; + gfxFont::Spacing* spacing; + gfxTextRun* mark; + gfxFloat advance; + gfxFloat direction; + bool isVertical; +}; + #endif diff --git a/gfx/thebes/gfxTextRun.cpp b/gfx/thebes/gfxTextRun.cpp index 7dea79f42cd5..b6809394e2f7 100644 --- a/gfx/thebes/gfxTextRun.cpp +++ b/gfx/thebes/gfxTextRun.cpp @@ -1,4 +1,5 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim: set ts=4 et sw=4 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ @@ -665,6 +666,50 @@ gfxTextRun::Draw(gfxContext *aContext, gfxPoint aPt, DrawMode aDrawMode, } } +// This method is mostly parallel to Draw(). +void +gfxTextRun::DrawEmphasisMarks(gfxContext *aContext, gfxTextRun* aMark, + gfxFloat aMarkAdvance, gfxPoint aPt, + uint32_t aStart, uint32_t aLength, + PropertyProvider* aProvider) +{ + MOZ_ASSERT(aStart + aLength <= GetLength()); + + EmphasisMarkDrawParams params; + params.context = aContext; + params.mark = aMark; + params.advance = aMarkAdvance; + params.direction = GetDirection(); + params.isVertical = IsVertical(); + + gfxFloat& inlineCoord = params.isVertical ? aPt.y : aPt.x; + gfxFloat direction = params.direction; + + GlyphRunIterator iter(this, aStart, aLength); + while (iter.NextRun()) { + gfxFont* font = iter.GetGlyphRun()->mFont; + uint32_t start = iter.GetStringStart(); + uint32_t end = iter.GetStringEnd(); + uint32_t ligatureRunStart = start; + uint32_t ligatureRunEnd = end; + ShrinkToLigatureBoundaries(&ligatureRunStart, &ligatureRunEnd); + + inlineCoord += direction * + ComputePartialLigatureWidth(start, ligatureRunStart, aProvider); + + nsAutoTArray spacingBuffer; + bool haveSpacing = GetAdjustedSpacingArray( + ligatureRunStart, ligatureRunEnd, aProvider, + ligatureRunStart, ligatureRunEnd, &spacingBuffer); + params.spacing = haveSpacing ? spacingBuffer.Elements() : nullptr; + font->DrawEmphasisMarks(this, &aPt, ligatureRunStart, + ligatureRunEnd - ligatureRunStart, params); + + inlineCoord += direction * + ComputePartialLigatureWidth(ligatureRunEnd, end, aProvider); + } +} + void gfxTextRun::AccumulateMetricsForRun(gfxFont *aFont, uint32_t aStart, uint32_t aEnd, diff --git a/gfx/thebes/gfxTextRun.h b/gfx/thebes/gfxTextRun.h index 1a049e5b098b..fa804106d325 100644 --- a/gfx/thebes/gfxTextRun.h +++ b/gfx/thebes/gfxTextRun.h @@ -251,6 +251,16 @@ public: gfxFloat *aAdvanceWidth, gfxTextContextPaint *aContextPaint, gfxTextRunDrawCallbacks *aCallbacks = nullptr); + /** + * Draws the emphasis marks for this text run. Uses only GetSpacing + * from aProvider. The provided point is the baseline origin of the + * line of emphasis marks. + */ + void DrawEmphasisMarks(gfxContext* aContext, gfxTextRun* aMark, + gfxFloat aMarkAdvance, gfxPoint aPt, + uint32_t aStart, uint32_t aLength, + PropertyProvider* aProvider); + /** * Computes the ReflowMetrics for a substring. * Uses GetSpacing from aBreakProvider. diff --git a/layout/generic/nsLineLayout.cpp b/layout/generic/nsLineLayout.cpp index f57c98d52be8..fdb13d5a2e12 100644 --- a/layout/generic/nsLineLayout.cpp +++ b/layout/generic/nsLineLayout.cpp @@ -3285,8 +3285,11 @@ nsLineLayout::RelativePositionFrames(PerSpanData* psd, nsOverflowAreas& aOverflo // (1) When PFD_RECOMPUTEOVERFLOW is set due to trimming // (2) When there are text decorations, since we can't recompute the // overflow area until Reflow and VerticalAlignLine have finished + // (3) When there are text emphasis marks, since the marks may be + // put further away if the text is inside ruby. if (pfd->mRecomputeOverflow || - frame->StyleContext()->HasTextDecorationLines()) { + frame->StyleContext()->HasTextDecorationLines() || + frame->StyleText()->HasTextEmphasis()) { nsTextFrame* f = static_cast(frame); r = f->RecomputeOverflow(mBlockReflowState->frame); } diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index c450099d502b..32ba6c1a02b4 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -5116,6 +5116,92 @@ GetInflationForTextDecorations(nsIFrame* aFrame, nscoord aInflationMinFontSize) return nsLayoutUtils::FontSizeInflationInner(aFrame, aInflationMinFontSize); } +static already_AddRefed +GetFontMetricsOfEmphasisMarks(nsStyleContext* aStyleContext, float aInflation) +{ + nsPresContext* pc = aStyleContext->PresContext(); + WritingMode wm(aStyleContext); + gfxFont::Orientation orientation = wm.IsVertical() && !wm.IsSideways() ? + gfxFont::eVertical : gfxFont::eHorizontal; + + const nsStyleFont* styleFont = aStyleContext->StyleFont(); + nsFont font = styleFont->mFont; + font.size = NSToCoordRound(font.size * aInflation * 0.5f); + + RefPtr fm; + pc->DeviceContext()->GetMetricsFor(font, styleFont->mLanguage, + styleFont->mExplicitLanguage, + orientation, pc->GetUserFontSet(), + pc->GetTextPerfMetrics(), + *getter_AddRefs(fm)); + return fm.forget(); +} + +static gfxTextRun* +GenerateTextRunForEmphasisMarks(nsTextFrame* aFrame, nsFontMetrics* aFontMetrics, + WritingMode aWM, const nsStyleText* aStyleText) +{ + const nsString& emphasisString = aStyleText->mTextEmphasisStyleString; + RefPtr ctx = CreateReferenceThebesContext(aFrame); + auto appUnitsPerDevUnit = aFrame->PresContext()->AppUnitsPerDevPixel(); + uint32_t flags = nsLayoutUtils:: + GetTextRunOrientFlagsForStyle(aFrame->StyleContext()); + if (flags == gfxTextRunFactory::TEXT_ORIENT_VERTICAL_MIXED) { + // The emphasis marks should always be rendered upright per spec. + flags = gfxTextRunFactory::TEXT_ORIENT_VERTICAL_UPRIGHT; + } + return aFontMetrics->GetThebesFontGroup()-> + MakeTextRun(emphasisString.get(), emphasisString.Length(), + ctx, appUnitsPerDevUnit, flags, nullptr); +} + +nsRect +nsTextFrame::UpdateTextEmphasis(WritingMode aWM, PropertyProvider& aProvider) +{ + const nsStyleText* styleText = StyleText(); + if (!styleText->HasTextEmphasis()) { + Properties().Delete(EmphasisMarkProperty()); + return nsRect(); + } + + RefPtr fm = + GetFontMetricsOfEmphasisMarks(StyleContext(), GetFontSizeInflation()); + EmphasisMarkInfo* info = new EmphasisMarkInfo; + info->textRun = + GenerateTextRunForEmphasisMarks(this, fm, aWM, styleText); + info->advance = + info->textRun->GetAdvanceWidth(0, info->textRun->GetLength(), nullptr); + + // Calculate the baseline offset + LogicalSide side = styleText->TextEmphasisSide(aWM); + nsFontMetrics* baseFontMetrics = aProvider.GetFontMetrics(); + LogicalSize frameSize = GetLogicalSize(); + // The overflow rect is inflated in the inline direction by half + // advance of the emphasis mark on each side, so that even if a mark + // is drawn for a zero-width character, it won't be clipped. + LogicalRect overflowRect(aWM, -info->advance / 2, + /* BStart to be computed below */0, + frameSize.ISize(aWM) + info->advance, + fm->MaxAscent() + fm->MaxDescent()); + // When the writing mode is vertical-lr the line is inverted, and thus + // the ascent and descent are swapped. + nscoord absOffset = (side == eLogicalSideBStart) != aWM.IsLineInverted() ? + baseFontMetrics->MaxAscent() + fm->MaxDescent() : + baseFontMetrics->MaxDescent() + fm->MaxAscent(); + // XXX emphasis marks should be drawn outside ruby, see bug 1224013. + if (side == eLogicalSideBStart) { + info->baselineOffset = -absOffset; + overflowRect.BStart(aWM) = -overflowRect.BSize(aWM); + } else { + MOZ_ASSERT(side == eLogicalSideBEnd); + info->baselineOffset = absOffset; + overflowRect.BStart(aWM) = frameSize.BSize(aWM); + } + + Properties().Set(EmphasisMarkProperty(), info); + return overflowRect.GetPhysicalRect(aWM, frameSize.GetPhysicalSize(aWM)); +} + void nsTextFrame::UnionAdditionalOverflow(nsPresContext* aPresContext, nsIFrame* aBlock, @@ -5123,9 +5209,10 @@ nsTextFrame::UnionAdditionalOverflow(nsPresContext* aPresContext, nsRect* aVisualOverflowRect, bool aIncludeTextDecorations) { + const WritingMode wm = GetWritingMode(); bool verticalRun = mTextRun->IsVertical(); bool useVerticalMetrics = verticalRun && mTextRun->UseCenterBaseline(); - bool inverted = GetWritingMode().IsLineInverted(); + bool inverted = wm.IsLineInverted(); if (IsFloatingFirstLetterChild()) { // The underline/overline drawable area must be contained in the overflow @@ -5185,7 +5272,6 @@ nsTextFrame::UnionAdditionalOverflow(nsPresContext* aPresContext, const gfxFloat appUnitsPerDevUnit = aPresContext->AppUnitsPerDevPixel(), gfxWidth = measure / appUnitsPerDevUnit; gfxFloat ascent = gfxFloat(mAscent) / appUnitsPerDevUnit; - const WritingMode wm = GetWritingMode(); if (wm.IsVerticalRL()) { ascent = -ascent; } @@ -5295,6 +5381,9 @@ nsTextFrame::UnionAdditionalOverflow(nsPresContext* aPresContext, verticalRun ? nsRect(topOrLeft, 0, bottomOrRight - topOrLeft, measure) : nsRect(0, topOrLeft, measure, bottomOrRight - topOrLeft)); } + + aVisualOverflowRect->UnionRect(*aVisualOverflowRect, + UpdateTextEmphasis(wm, aProvider)); } // Text-shadow overflows @@ -6107,6 +6196,36 @@ nsTextFrame::PaintTextWithSelection(gfxContext* aCtx, return true; } +void +nsTextFrame::DrawEmphasisMarks(gfxContext* aContext, WritingMode aWM, + const gfxPoint& aTextBaselinePt, + uint32_t aOffset, uint32_t aLength, + PropertyProvider& aProvider) +{ + auto info = static_cast( + Properties().Get(EmphasisMarkProperty())); + if (!info) { + MOZ_ASSERT(!StyleText()->HasTextEmphasis()); + return; + } + + nscolor color = nsLayoutUtils:: + GetColor(this, eCSSProperty_text_emphasis_color); + aContext->SetColor(Color::FromABGR(color)); + gfxPoint pt(aTextBaselinePt); + if (!aWM.IsVertical()) { + pt.y += info->baselineOffset; + } else { + if (aWM.IsVerticalRL()) { + pt.x -= info->baselineOffset; + } else { + pt.x += info->baselineOffset; + } + } + mTextRun->DrawEmphasisMarks(aContext, info->textRun, info->advance, + pt, aOffset, aLength, &aProvider); +} + nscolor nsTextFrame::GetCaretColorAt(int32_t aOffset) { @@ -6609,6 +6728,9 @@ nsTextFrame::DrawTextRunAndDecorations( DrawTextRun(aCtx, aTextBaselinePt, aOffset, aLength, aProvider, aTextColor, aAdvanceWidth, aDrawSoftHyphen, aContextPaint, aCallbacks); + // Emphasis marks + DrawEmphasisMarks(aCtx, wm, aTextBaselinePt, aOffset, aLength, aProvider); + // Line-throughs for (uint32_t i = aDecorations.mStrikes.Length(); i-- > 0; ) { const LineDecoration& dec = aDecorations.mStrikes[i]; @@ -6655,7 +6777,8 @@ nsTextFrame::DrawText( // Hide text decorations if we're currently hiding @font-face fallback text const bool drawDecorations = !aProvider.GetFontGroup()->ShouldSkipDrawing() && - decorations.HasDecorationLines(); + (decorations.HasDecorationLines() || + StyleText()->HasTextEmphasis()); if (drawDecorations) { DrawTextRunAndDecorations(aCtx, aDirtyRect, aFramePt, aTextBaselinePt, aOffset, aLength, aProvider, aTextStyle, aTextColor, aClipEdges, aAdvanceWidth, diff --git a/layout/generic/nsTextFrame.h b/layout/generic/nsTextFrame.h index 6fba1cd277fa..caef123e66c5 100644 --- a/layout/generic/nsTextFrame.h +++ b/layout/generic/nsTextFrame.h @@ -440,6 +440,12 @@ public: SelectionType aSelectionType, DrawPathCallbacks* aCallbacks); + void DrawEmphasisMarks(gfxContext* aContext, + mozilla::WritingMode aWM, + const gfxPoint& aTextBaselinePt, + uint32_t aOffset, uint32_t aLength, + PropertyProvider& aProvider); + virtual nscolor GetCaretColorAt(int32_t aOffset) override; int16_t GetSelectionStatus(int16_t* aSelectionFlags); @@ -585,6 +591,11 @@ protected: nsRect* aVisualOverflowRect, bool aIncludeTextDecorations); + // Update information of emphasis marks, and return the visial + // overflow rect of the emphasis marks. + nsRect UpdateTextEmphasis(mozilla::WritingMode aWM, + PropertyProvider& aProvider); + void PaintOneShadow(uint32_t aOffset, uint32_t aLength, nsCSSShadowItem* aShadowDetails, @@ -812,6 +823,14 @@ protected: void ClearMetrics(nsHTMLReflowMetrics& aMetrics); NS_DECLARE_FRAME_PROPERTY(JustificationAssignment, nullptr) + + struct EmphasisMarkInfo + { + nsAutoPtr textRun; + gfxFloat advance; + gfxFloat baselineOffset; + }; + NS_DECLARE_FRAME_PROPERTY(EmphasisMarkProperty, DeleteValue) }; #endif diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index dccf895c7ec9..fdc01d12a293 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -3726,6 +3726,24 @@ nsChangeHint nsStyleText::CalcDifference(const nsStyleText& aOther) const return NS_STYLE_HINT_NONE; } +LogicalSide +nsStyleText::TextEmphasisSide(WritingMode aWM) const +{ + MOZ_ASSERT( + (!(mTextEmphasisPosition & NS_STYLE_TEXT_EMPHASIS_POSITION_LEFT) != + !(mTextEmphasisPosition & NS_STYLE_TEXT_EMPHASIS_POSITION_RIGHT)) && + (!(mTextEmphasisPosition & NS_STYLE_TEXT_EMPHASIS_POSITION_OVER) != + !(mTextEmphasisPosition & NS_STYLE_TEXT_EMPHASIS_POSITION_UNDER))); + Side side = aWM.IsVertical() ? + (mTextEmphasisPosition & NS_STYLE_TEXT_EMPHASIS_POSITION_LEFT + ? eSideLeft : eSideRight) : + (mTextEmphasisPosition & NS_STYLE_TEXT_EMPHASIS_POSITION_OVER + ? eSideTop : eSideBottom); + LogicalSide result = aWM.LogicalSideForPhysicalSide(side); + MOZ_ASSERT(IsBlock(result)); + return result; +} + //----------------------- // nsStyleUserInterface // diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index 49bd372ab064..0f586f289815 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -1811,6 +1811,8 @@ struct nsStyleText { inline bool NewlineIsSignificant(const nsTextFrame* aContextFrame) const; inline bool WhiteSpaceCanWrap(const nsIFrame* aContextFrame) const; inline bool WordCanWrap(const nsIFrame* aContextFrame) const; + + mozilla::LogicalSide TextEmphasisSide(mozilla::WritingMode aWM) const; }; struct nsStyleImageOrientation { From 20e40d505a6d68b7f6763a6f386ffaa6ab0f6446 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Sat, 28 Nov 2015 11:56:33 +1100 Subject: [PATCH 043/153] Bug 1040668 part 11 - Move line leadings adjusting code into a separate function in nsLineLayout. r=dholbert --HG-- extra : source : f4d53f54b2e925eef8da6c6749497888527057bb --- layout/generic/nsLineLayout.cpp | 61 +++++++++++++++++++-------------- layout/generic/nsLineLayout.h | 3 ++ 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/layout/generic/nsLineLayout.cpp b/layout/generic/nsLineLayout.cpp index fdb13d5a2e12..e99ab90009fc 100644 --- a/layout/generic/nsLineLayout.cpp +++ b/layout/generic/nsLineLayout.cpp @@ -1676,6 +1676,40 @@ nsLineLayout::PlaceTopBottomFrames(PerSpanData* psd, } } +void +nsLineLayout::AdjustLeadings(nsIFrame* spanFrame, PerSpanData* psd, + bool* aZeroEffectiveSpanBox) +{ + MOZ_ASSERT(spanFrame == psd->mFrame->mFrame); + if (spanFrame->GetType() == nsGkAtoms::rubyFrame) { + // We may need to extend leadings here for ruby annotations as + // required by section Line Spacing in the CSS Ruby spec. + // See http://dev.w3.org/csswg/css-ruby/#line-height + auto rubyFrame = static_cast(spanFrame); + nscoord startLeading, endLeading; + rubyFrame->GetBlockLeadings(startLeading, endLeading); + nscoord deltaLeading = startLeading + endLeading - + (psd->mBStartLeading + psd->mBEndLeading); + if (deltaLeading > 0) { + // If the total leading is not wide enough for ruby annotations, + // extend the side which is not enough. If both sides are not + // wide enough, replace the leadings with the requested values. + if (startLeading < psd->mBStartLeading) { + psd->mBEndLeading += deltaLeading; + } else if (endLeading < psd->mBEndLeading) { + psd->mBStartLeading += deltaLeading; + } else { + psd->mBStartLeading = startLeading; + psd->mBEndLeading = endLeading; + } + psd->mLogicalBSize += deltaLeading; + // We have adjusted the leadings, it is no longer a zero + // effective span box. + *aZeroEffectiveSpanBox = false; + } + } +} + static float GetInflationForBlockDirAlignment(nsIFrame* aFrame, nscoord aInflationMinFontSize) @@ -1857,32 +1891,7 @@ nsLineLayout::VerticalAlignFrames(PerSpanData* psd) psd->mBStartLeading = leading / 2; psd->mBEndLeading = leading - psd->mBStartLeading; psd->mLogicalBSize = logicalBSize; - if (spanFrame->GetType() == nsGkAtoms::rubyFrame) { - // We may need to extend leadings here for ruby annotations as - // required by section Line Spacing in the CSS Ruby spec. - // See http://dev.w3.org/csswg/css-ruby/#line-height - auto rubyFrame = static_cast(spanFrame); - nscoord startLeading, endLeading; - rubyFrame->GetBlockLeadings(startLeading, endLeading); - nscoord deltaLeading = startLeading + endLeading - leading; - if (deltaLeading > 0) { - // If the total leading is not wide enough for ruby annotations, - // extend the side which is not enough. If both sides are not - // wide enough, replace the leadings with the requested values. - if (startLeading < psd->mBStartLeading) { - psd->mBEndLeading += deltaLeading; - } else if (endLeading < psd->mBEndLeading) { - psd->mBStartLeading += deltaLeading; - } else { - psd->mBStartLeading = startLeading; - psd->mBEndLeading = endLeading; - } - psd->mLogicalBSize += deltaLeading; - // We have adjusted the leadings, it is no longer a zero - // effective span box. - zeroEffectiveSpanBox = false; - } - } + AdjustLeadings(spanFrame, psd, &zeroEffectiveSpanBox); if (zeroEffectiveSpanBox) { // When the span-box is to be ignored, zero out the initial diff --git a/layout/generic/nsLineLayout.h b/layout/generic/nsLineLayout.h index be488cc145f8..12557ff3564c 100644 --- a/layout/generic/nsLineLayout.h +++ b/layout/generic/nsLineLayout.h @@ -662,6 +662,9 @@ protected: void PlaceFrame(PerFrameData* pfd, nsHTMLReflowMetrics& aMetrics); + void AdjustLeadings(nsIFrame* spanFrame, PerSpanData* psd, + bool* aZeroEffectiveSpanBox); + void VerticalAlignFrames(PerSpanData* psd); void PlaceTopBottomFrames(PerSpanData* psd, From 95b800f4cebd1a5cec73f5ef46e5e95c2ad54a8c Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Sat, 28 Nov 2015 11:56:33 +1100 Subject: [PATCH 044/153] Bug 1040668 part 12 - Add line leadings for emphasis marks if necessary. r=dholbert --HG-- extra : source : cb34c48bff0ccf4024385d392dc58bc1f672ea23 --- layout/generic/nsLineLayout.cpp | 51 ++++++++++++++++++++++++++------- layout/generic/nsLineLayout.h | 2 ++ 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/layout/generic/nsLineLayout.cpp b/layout/generic/nsLineLayout.cpp index e99ab90009fc..f908f47e744e 100644 --- a/layout/generic/nsLineLayout.cpp +++ b/layout/generic/nsLineLayout.cpp @@ -1678,9 +1678,13 @@ nsLineLayout::PlaceTopBottomFrames(PerSpanData* psd, void nsLineLayout::AdjustLeadings(nsIFrame* spanFrame, PerSpanData* psd, + const nsStyleText* aStyleText, + nsFontMetrics* aFontMetrics, bool* aZeroEffectiveSpanBox) { MOZ_ASSERT(spanFrame == psd->mFrame->mFrame); + nscoord requiredStartLeading = 0; + nscoord requiredEndLeading = 0; if (spanFrame->GetType() == nsGkAtoms::rubyFrame) { // We may need to extend leadings here for ruby annotations as // required by section Line Spacing in the CSS Ruby spec. @@ -1688,19 +1692,43 @@ nsLineLayout::AdjustLeadings(nsIFrame* spanFrame, PerSpanData* psd, auto rubyFrame = static_cast(spanFrame); nscoord startLeading, endLeading; rubyFrame->GetBlockLeadings(startLeading, endLeading); - nscoord deltaLeading = startLeading + endLeading - - (psd->mBStartLeading + psd->mBEndLeading); + requiredStartLeading += startLeading; + requiredEndLeading += endLeading; + } + if (aStyleText->HasTextEmphasis()) { + // Emphasis marks are symbols rendered using the same font settings + // as the element with its size scaled down to 50%, so we add half + // height of the font metrics to the specified side as leading. + nscoord halfHeight = aFontMetrics->MaxHeight() / 2; + LogicalSide side = aStyleText->TextEmphasisSide(mRootSpan->mWritingMode); + if (side == eLogicalSideBStart) { + requiredStartLeading += halfHeight; + } else { + MOZ_ASSERT(side == eLogicalSideBEnd, + "emphasis marks must be in block axis"); + requiredEndLeading += halfHeight; + } + } + + nscoord requiredLeading = requiredStartLeading + requiredEndLeading; + // If we do not require any additional leadings, don't touch anything + // here even if it is greater than the original leading, because the + // latter could be negative. + if (requiredLeading != 0) { + nscoord leading = psd->mBStartLeading + psd->mBEndLeading; + nscoord deltaLeading = requiredLeading - leading; if (deltaLeading > 0) { - // If the total leading is not wide enough for ruby annotations, - // extend the side which is not enough. If both sides are not - // wide enough, replace the leadings with the requested values. - if (startLeading < psd->mBStartLeading) { + // If the total leading is not wide enough for ruby annotations + // and/or emphasis marks, extend the side which is not enough. If + // both sides are not wide enough, replace the leadings with the + // requested values. + if (requiredStartLeading < psd->mBStartLeading) { psd->mBEndLeading += deltaLeading; - } else if (endLeading < psd->mBEndLeading) { + } else if (requiredEndLeading < psd->mBEndLeading) { psd->mBStartLeading += deltaLeading; } else { - psd->mBStartLeading = startLeading; - psd->mBEndLeading = endLeading; + psd->mBStartLeading = requiredStartLeading; + psd->mBEndLeading = requiredEndLeading; } psd->mLogicalBSize += deltaLeading; // We have adjusted the leadings, it is no longer a zero @@ -1881,9 +1909,10 @@ nsLineLayout::VerticalAlignFrames(PerSpanData* psd) // Special-case for a ::first-letter frame, set the line height to // the frame block size if the user has left line-height == normal + const nsStyleText* styleText = spanFrame->StyleText(); if (spanFramePFD->mIsLetterFrame && !spanFrame->GetPrevInFlow() && - spanFrame->StyleText()->mLineHeight.GetUnit() == eStyleUnit_Normal) { + styleText->mLineHeight.GetUnit() == eStyleUnit_Normal) { logicalBSize = spanFramePFD->mBounds.BSize(lineWM); } @@ -1891,7 +1920,7 @@ nsLineLayout::VerticalAlignFrames(PerSpanData* psd) psd->mBStartLeading = leading / 2; psd->mBEndLeading = leading - psd->mBStartLeading; psd->mLogicalBSize = logicalBSize; - AdjustLeadings(spanFrame, psd, &zeroEffectiveSpanBox); + AdjustLeadings(spanFrame, psd, styleText, fm, &zeroEffectiveSpanBox); if (zeroEffectiveSpanBox) { // When the span-box is to be ignored, zero out the initial diff --git a/layout/generic/nsLineLayout.h b/layout/generic/nsLineLayout.h index 12557ff3564c..b5301d9634f1 100644 --- a/layout/generic/nsLineLayout.h +++ b/layout/generic/nsLineLayout.h @@ -663,6 +663,8 @@ protected: nsHTMLReflowMetrics& aMetrics); void AdjustLeadings(nsIFrame* spanFrame, PerSpanData* psd, + const nsStyleText* aStyleText, + nsFontMetrics* aFontMetrics, bool* aZeroEffectiveSpanBox); void VerticalAlignFrames(PerSpanData* psd); From ee559c1cab2ec98908d7f036065f40c3a6301467 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Sat, 28 Nov 2015 11:56:33 +1100 Subject: [PATCH 045/153] Bug 1040668 part 13 - Move first part of nsStyleFont::GetLanguage to nsPresContext::GetContentLanguage. r=dbaron --HG-- extra : source : 2878e5e63e111995b4a67cd72b0df5a5a2b6531f --- layout/base/nsPresContext.cpp | 18 ++++++++++++++++++ layout/base/nsPresContext.h | 3 ++- layout/style/nsStyleStruct.cpp | 20 +++++++------------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp index de47980d41ad..db352b3cda6c 100644 --- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -1521,6 +1521,24 @@ nsPresContext::GetDefaultFont(uint8_t aFontID, nsIAtom *aLanguage) const return font; } +already_AddRefed +nsPresContext::GetContentLanguage() const +{ + nsAutoString language; + Document()->GetContentLanguage(language); + language.StripWhitespace(); + + // Content-Language may be a comma-separated list of language codes, + // in which case the HTML5 spec says to treat it as unknown + if (!language.IsEmpty() && + !language.Contains(char16_t(','))) { + return do_GetAtom(language); + // NOTE: This does *not* count as an explicit language; in other + // words, it doesn't trigger language-specific hyphenation. + } + return nullptr; +} + void nsPresContext::SetFullZoom(float aZoom) { diff --git a/layout/base/nsPresContext.h b/layout/base/nsPresContext.h index 3781b7a939e9..9be8f6ee3966 100644 --- a/layout/base/nsPresContext.h +++ b/layout/base/nsPresContext.h @@ -525,7 +525,8 @@ public: nsDeviceContext* DeviceContext() { return mDeviceContext; } mozilla::EventStateManager* EventStateManager() { return mEventManager; } - nsIAtom* GetLanguageFromCharset() { return mLanguage; } + nsIAtom* GetLanguageFromCharset() const { return mLanguage; } + already_AddRefed GetContentLanguage() const; float TextZoom() { return mTextZoom; } void SetTextZoom(float aZoom) { diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index fdc01d12a293..c3a5042f1ea4 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -217,22 +217,16 @@ nsStyleFont::UnZoomText(nsPresContext *aPresContext, nscoord aSize) /* static */ already_AddRefed nsStyleFont::GetLanguage(nsPresContext* aPresContext) { - nsAutoString language; - aPresContext->Document()->GetContentLanguage(language); - language.StripWhitespace(); - - // Content-Language may be a comma-separated list of language codes, - // in which case the HTML5 spec says to treat it as unknown - if (!language.IsEmpty() && - !language.Contains(char16_t(','))) { - return do_GetAtom(language); - // NOTE: This does *not* count as an explicit language; in other - // words, it doesn't trigger language-specific hyphenation. - } else { + RefPtr language = aPresContext->GetContentLanguage(); + if (!language) { // we didn't find a (usable) Content-Language, so we fall back // to whatever the presContext guessed from the charset - return do_AddRef(aPresContext->GetLanguageFromCharset()); + // NOTE this should not be used elsewhere, because we want websites + // to use UTF-8 with proper language tag, instead of relying on + // deriving language from charset. See bug 1040668 comment 67. + language = aPresContext->GetLanguageFromCharset(); } + return language.forget(); } nsChangeHint nsStyleFont::CalcFontDifference(const nsFont& aFont1, const nsFont& aFont2) From b96f561251089def1944122463be2226c26bc593 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Sat, 28 Nov 2015 11:56:33 +1100 Subject: [PATCH 046/153] Bug 1040668 part 14 - Add helper function nsStyleUtil::MatchesLanguagePrefix for doing simple language matching. r=dbaron --HG-- extra : source : b9249b9e2e95cca73c7b3637a58cb1ba3a39596a --- layout/generic/nsTextFrame.cpp | 8 +++----- layout/style/nsStyleUtil.h | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index 32ba6c1a02b4..8284f6031b8b 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -21,7 +21,6 @@ #include "nsCOMPtr.h" #include "nsBlockFrame.h" -#include "nsCRT.h" #include "nsFontMetrics.h" #include "nsSplittableFrame.h" #include "nsLineLayout.h" @@ -52,6 +51,7 @@ #include "MathMLTextRunFactory.h" #include "nsExpirationTracker.h" #include "nsUnicodeProperties.h" +#include "nsStyleUtil.h" #include "nsTextFragment.h" #include "nsGkAtoms.h" @@ -2910,10 +2910,8 @@ static bool IsChineseOrJapanese(nsTextFrame* aFrame) if (!language) { return false; } - const char16_t *lang = language->GetUTF16String(); - return (!nsCRT::strncmp(lang, MOZ_UTF16("ja"), 2) || - !nsCRT::strncmp(lang, MOZ_UTF16("zh"), 2)) && - (language->GetLength() == 2 || lang[2] == '-'); + return nsStyleUtil::MatchesLanguagePrefix(language, MOZ_UTF16("ja")) || + nsStyleUtil::MatchesLanguagePrefix(language, MOZ_UTF16("zh")); } #ifdef DEBUG diff --git a/layout/style/nsStyleUtil.h b/layout/style/nsStyleUtil.h index 4199ed960162..196563a554f0 100644 --- a/layout/style/nsStyleUtil.h +++ b/layout/style/nsStyleUtil.h @@ -11,6 +11,7 @@ #include "nsTArrayForwardDeclare.h" #include "gfxFontFamilyList.h" #include "nsStyleStruct.h" +#include "nsCRT.h" class nsCSSValue; class nsStringComparator; @@ -175,6 +176,29 @@ public: const nsSubstring& aStyleText, nsresult* aRv); + template + static bool MatchesLanguagePrefix(const char16_t* aLang, size_t aLen, + const char16_t (&aPrefix)[N]) + { + return !nsCRT::strncmp(aLang, aPrefix, N - 1) && + (aLen == N - 1 || aLang[N - 1] == '-'); + } + + template + static bool MatchesLanguagePrefix(const nsIAtom* aLang, + const char16_t (&aPrefix)[N]) + { + MOZ_ASSERT(aLang); + return MatchesLanguagePrefix(aLang->GetUTF16String(), + aLang->GetLength(), aPrefix); + } + + template + static bool MatchesLanguagePrefix(const nsAString& aLang, + const char16_t (&aPrefix)[N]) + { + return MatchesLanguagePrefix(aLang.Data(), aLang.Length(), aPrefix); + } }; From 2917ce080e496f047ae1fb3aaf5730d06809ed41 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Sat, 28 Nov 2015 11:56:33 +1100 Subject: [PATCH 047/153] Bug 1040668 part 15 - Make the default value of text-emphasis-position aware of the language. r=dbaron --HG-- extra : source : a4618d9f75ddcb7912ee5088d05842c3a4881f35 --- dom/html/nsGenericHTMLElement.cpp | 29 +++++++++++++++++++++++------ layout/style/nsStyleConsts.h | 6 ++++++ layout/style/nsStyleStruct.cpp | 7 +++++-- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp index 6f795fb53769..f46c9c494e63 100644 --- a/dom/html/nsGenericHTMLElement.cpp +++ b/dom/html/nsGenericHTMLElement.cpp @@ -52,6 +52,7 @@ #include "nsRuleData.h" #include "nsIPrincipal.h" #include "nsContainerFrame.h" +#include "nsStyleUtil.h" #include "nsPresState.h" #include "nsILayoutHistoryState.h" @@ -1326,12 +1327,28 @@ nsGenericHTMLElement::MapCommonAttributesIntoExceptHidden(const nsMappedAttribut } } - if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Font)) { - nsCSSValue* lang = aData->ValueForLang(); - if (lang->GetUnit() == eCSSUnit_Null) { - const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::lang); - if (value && value->Type() == nsAttrValue::eString) { - lang->SetStringValue(value->GetStringValue(), eCSSUnit_Ident); + const nsAttrValue* langValue = aAttributes->GetAttr(nsGkAtoms::lang); + if (langValue && langValue->Type() == nsAttrValue::eString) { + if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Font)) { + nsCSSValue* lang = aData->ValueForLang(); + if (lang->GetUnit() == eCSSUnit_Null) { + lang->SetStringValue(langValue->GetStringValue(), eCSSUnit_Ident); + } + } + if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Text)) { + nsCSSValue* emphasisPos = aData->ValueForTextEmphasisPosition(); + if (emphasisPos->GetUnit() == eCSSUnit_Null) { + const nsAString& lang = langValue->GetStringValue(); + if (nsStyleUtil::MatchesLanguagePrefix(lang, MOZ_UTF16("zh"))) { + emphasisPos->SetIntValue(NS_STYLE_TEXT_EMPHASIS_POSITION_DEFAULT_ZH, + eCSSUnit_Enumerated); + } else if (nsStyleUtil::MatchesLanguagePrefix(lang, MOZ_UTF16("ja")) || + nsStyleUtil::MatchesLanguagePrefix(lang, MOZ_UTF16("mn"))) { + // This branch is currently no part of the spec. + // See bug 1040668 comment 69 and comment 75. + emphasisPos->SetIntValue(NS_STYLE_TEXT_EMPHASIS_POSITION_DEFAULT, + eCSSUnit_Enumerated); + } } } } diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 93c78965daf4..d7fe96244d44 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -1073,6 +1073,12 @@ enum class FillMode : uint32_t; #define NS_STYLE_TEXT_EMPHASIS_POSITION_UNDER (1 << 1) #define NS_STYLE_TEXT_EMPHASIS_POSITION_LEFT (1 << 2) #define NS_STYLE_TEXT_EMPHASIS_POSITION_RIGHT (1 << 3) +#define NS_STYLE_TEXT_EMPHASIS_POSITION_DEFAULT \ + (NS_STYLE_TEXT_EMPHASIS_POSITION_OVER | \ + NS_STYLE_TEXT_EMPHASIS_POSITION_RIGHT) +#define NS_STYLE_TEXT_EMPHASIS_POSITION_DEFAULT_ZH \ + (NS_STYLE_TEXT_EMPHASIS_POSITION_UNDER | \ + NS_STYLE_TEXT_EMPHASIS_POSITION_RIGHT) // text-emphasis-style // Note that filled and none here both have zero as their value. This is diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index c3a5042f1ea4..12b33a864257 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -3611,8 +3611,11 @@ nsStyleText::nsStyleText(nsPresContext* aPresContext) mTextSizeAdjust = NS_STYLE_TEXT_SIZE_ADJUST_AUTO; mTextCombineUpright = NS_STYLE_TEXT_COMBINE_UPRIGHT_NONE; mTextEmphasisStyle = NS_STYLE_TEXT_EMPHASIS_STYLE_NONE; - mTextEmphasisPosition = NS_STYLE_TEXT_EMPHASIS_POSITION_OVER | - NS_STYLE_TEXT_EMPHASIS_POSITION_RIGHT; + nsCOMPtr language = aPresContext->GetContentLanguage(); + mTextEmphasisPosition = language && + nsStyleUtil::MatchesLanguagePrefix(language, MOZ_UTF16("zh")) ? + NS_STYLE_TEXT_EMPHASIS_POSITION_DEFAULT_ZH : + NS_STYLE_TEXT_EMPHASIS_POSITION_DEFAULT; mTextEmphasisColor = aPresContext->DefaultColor(); mControlCharacterVisibility = nsCSSParser::ControlCharVisibilityDefault(); From 82da677403ffbcafac4b532bea7d33744d832db8 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Sat, 28 Nov 2015 11:56:33 +1100 Subject: [PATCH 048/153] Bug 1040668 part 16 - Add reftests for text-emphasis. r=dbaron --HG-- extra : source : 1e80db82eba47cbdd8c433535b6a72c4f86b6ee2 --- .../submitted/text-decor-3/reftest.list | 109 +++++++++++- ...e-text-emphasis-position-property-tests.py | 79 ++++++++ ...-text-emphasis-style-property-010-tests.sh | 81 +++++++++ ...rate-text-emphasis-style-property-tests.py | 85 +++++++++ .../text-emphasis-color-property-001-ref.html | 8 + .../text-emphasis-color-property-001.html | 10 ++ .../text-emphasis-color-property-001a.html | 10 ++ .../text-emphasis-color-property-001b.html | 10 ++ .../text-emphasis-color-property-002-ref.html | 8 + .../text-emphasis-color-property-002.html | 10 ++ ...xt-emphasis-position-property-001-ref.html | 8 + .../text-emphasis-position-property-001.html | 10 ++ .../text-emphasis-position-property-001a.html | 10 ++ .../text-emphasis-position-property-001b.html | 10 ++ .../text-emphasis-position-property-001c.html | 10 ++ ...xt-emphasis-position-property-002-ref.html | 8 + .../text-emphasis-position-property-002.html | 10 ++ .../text-emphasis-position-property-002a.html | 10 ++ .../text-emphasis-position-property-002b.html | 10 ++ .../text-emphasis-position-property-002c.html | 10 ++ ...xt-emphasis-position-property-003-ref.html | 8 + .../text-emphasis-position-property-003.html | 10 ++ .../text-emphasis-position-property-003a.html | 10 ++ .../text-emphasis-position-property-003b.html | 10 ++ .../text-emphasis-position-property-003c.html | 10 ++ .../text-emphasis-position-property-003d.html | 10 ++ .../text-emphasis-position-property-003e.html | 10 ++ .../text-emphasis-position-property-003f.html | 10 ++ .../text-emphasis-position-property-003g.html | 10 ++ ...xt-emphasis-position-property-004-ref.html | 8 + .../text-emphasis-position-property-004.html | 10 ++ .../text-emphasis-position-property-004a.html | 10 ++ .../text-emphasis-position-property-004b.html | 10 ++ .../text-emphasis-position-property-004c.html | 10 ++ .../text-emphasis-position-property-004d.html | 10 ++ .../text-emphasis-position-property-004e.html | 10 ++ .../text-emphasis-position-property-004f.html | 10 ++ .../text-emphasis-position-property-004g.html | 10 ++ ...xt-emphasis-position-property-005-ref.html | 8 + .../text-emphasis-position-property-005.html | 10 ++ .../text-emphasis-position-property-005a.html | 10 ++ .../text-emphasis-position-property-005b.html | 10 ++ .../text-emphasis-position-property-005c.html | 10 ++ .../text-emphasis-position-property-005d.html | 10 ++ .../text-emphasis-position-property-005e.html | 10 ++ .../text-emphasis-position-property-005f.html | 10 ++ .../text-emphasis-position-property-005g.html | 10 ++ ...xt-emphasis-position-property-006-ref.html | 8 + .../text-emphasis-position-property-006.html | 10 ++ .../text-emphasis-position-property-006a.html | 10 ++ .../text-emphasis-position-property-006b.html | 10 ++ .../text-emphasis-position-property-006c.html | 10 ++ .../text-emphasis-position-property-006d.html | 10 ++ .../text-emphasis-position-property-006e.html | 10 ++ .../text-emphasis-position-property-006f.html | 10 ++ .../text-emphasis-position-property-006g.html | 10 ++ .../text-emphasis-property-001.html | 10 ++ .../text-emphasis-property-002.html | 10 ++ .../text-emphasis-property-003.html | 10 ++ .../text-emphasis-property-003a.html | 10 ++ .../text-emphasis-property-003b.html | 10 ++ .../text-emphasis-property-004.html | 10 ++ .../text-emphasis-property-004a.html | 10 ++ .../text-emphasis-style-property-001-ref.html | 7 + .../text-emphasis-style-property-001.html | 10 ++ .../text-emphasis-style-property-002-ref.html | 8 + .../text-emphasis-style-property-002.html | 10 ++ .../text-emphasis-style-property-003-ref.html | 8 + .../text-emphasis-style-property-003.html | 10 ++ .../text-emphasis-style-property-004-ref.html | 8 + .../text-emphasis-style-property-004.html | 10 ++ .../text-emphasis-style-property-005-ref.html | 8 + .../text-emphasis-style-property-005.html | 10 ++ .../text-emphasis-style-property-005a.html | 10 ++ .../text-emphasis-style-property-010-ref.html | 7 + .../text-emphasis-style-property-010Cc.html | 83 +++++++++ .../text-emphasis-style-property-010Cf.html | 168 ++++++++++++++++++ .../text-emphasis-style-property-010Cn.html | 26 +++ .../text-emphasis-style-property-010Zl.html | 19 ++ .../text-emphasis-style-property-010Zp.html | 19 ++ .../text-emphasis-style-property-010Zs.html | 35 ++++ .../text-emphasis-style-property-011-ref.html | 8 + .../text-emphasis-style-property-011.html | 10 ++ .../text-emphasis-style-property-011a.html | 10 ++ .../text-emphasis-style-property-011b.html | 10 ++ .../text-emphasis-style-property-012-ref.html | 8 + .../text-emphasis-style-property-012.html | 10 ++ .../text-emphasis-style-property-012a.html | 10 ++ .../text-emphasis-style-property-012b.html | 10 ++ .../text-emphasis-style-property-012c.html | 10 ++ .../text-emphasis-style-property-013-ref.html | 8 + .../text-emphasis-style-property-013.html | 10 ++ .../text-emphasis-style-property-013a.html | 10 ++ .../text-emphasis-style-property-013b.html | 10 ++ .../text-emphasis-style-property-014-ref.html | 8 + .../text-emphasis-style-property-014.html | 10 ++ .../text-emphasis-style-property-014a.html | 10 ++ .../text-emphasis-style-property-014b.html | 10 ++ .../text-emphasis-style-property-015-ref.html | 8 + .../text-emphasis-style-property-015.html | 10 ++ .../text-emphasis-style-property-015a.html | 10 ++ .../text-emphasis-style-property-015b.html | 10 ++ .../text-emphasis-style-property-016-ref.html | 8 + .../text-emphasis-style-property-016.html | 10 ++ .../text-emphasis-style-property-016a.html | 10 ++ .../text-emphasis-style-property-017-ref.html | 8 + .../text-emphasis-style-property-017.html | 10 ++ .../text-emphasis-style-property-017a.html | 10 ++ .../text-emphasis-style-property-017b.html | 10 ++ .../text-emphasis-style-property-018-ref.html | 8 + .../text-emphasis-style-property-018.html | 10 ++ .../text-emphasis-style-property-018a.html | 10 ++ .../text-emphasis-style-property-019-ref.html | 8 + .../text-emphasis-style-property-019.html | 10 ++ .../text-emphasis-style-property-019a.html | 10 ++ .../text-emphasis-style-property-020-ref.html | 8 + .../text-emphasis-style-property-020.html | 10 ++ .../text-emphasis-style-property-020a.html | 10 ++ 118 files changed, 1733 insertions(+), 1 deletion(-) create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-position-property-tests.py create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-style-property-010-tests.sh create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-style-property-tests.py create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-002-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-002.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001c.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002c.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003c.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003d.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003e.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003f.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003g.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004c.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004d.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004e.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004f.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004g.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005c.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005d.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005e.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005f.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005g.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006c.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006d.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006e.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006f.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006g.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-001.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-002.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-004.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-004a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-001-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-001.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-002-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-002.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-003-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-003.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-004-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-004.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cc.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cf.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cn.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zl.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zp.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zs.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012c.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017b.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019a.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020-ref.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020.html create mode 100644 layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020a.html diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/reftest.list b/layout/reftests/w3c-css/submitted/text-decor-3/reftest.list index 5218255fbc4a..7adf19939bb9 100644 --- a/layout/reftests/w3c-css/submitted/text-decor-3/reftest.list +++ b/layout/reftests/w3c-css/submitted/text-decor-3/reftest.list @@ -1,2 +1,109 @@ -pref(layout.css.ruby.enabled,true) == ruby-text-decoration-01.html ruby-text-decoration-01-ref.html +default-preferences pref(layout.css.ruby.enabled,true) +default-preferences pref(layout.css.vertical-text.enabled,true) +default-preferences pref(layout.css.text-emphasis.enabled,true) + +== ruby-text-decoration-01.html ruby-text-decoration-01-ref.html == text-decoration-propagation-01.html text-decoration-propagation-01-ref.html + +# text-emphasis-style +== text-emphasis-style-property-001.html text-emphasis-style-property-001-ref.html +== text-emphasis-style-property-002.html text-emphasis-style-property-002-ref.html +== text-emphasis-style-property-003.html text-emphasis-style-property-003-ref.html +== text-emphasis-style-property-004.html text-emphasis-style-property-004-ref.html +== text-emphasis-style-property-005.html text-emphasis-style-property-005-ref.html +== text-emphasis-style-property-005a.html text-emphasis-style-property-005-ref.html +# START tests from support/generate-text-emphasis-style-property-010-tests.sh +== text-emphasis-style-property-010Zs.html text-emphasis-style-property-010-ref.html +== text-emphasis-style-property-010Zl.html text-emphasis-style-property-010-ref.html +== text-emphasis-style-property-010Zp.html text-emphasis-style-property-010-ref.html +== text-emphasis-style-property-010Cc.html text-emphasis-style-property-010-ref.html +== text-emphasis-style-property-010Cf.html text-emphasis-style-property-010-ref.html +# END tests from support/generate-text-emphasis-style-property-010-tests.sh +== text-emphasis-style-property-010Cn.html text-emphasis-style-property-010-ref.html +# START tests from support/generate-text-emphasis-style-property-tests.py +== text-emphasis-style-property-011.html text-emphasis-style-property-011-ref.html +== text-emphasis-style-property-011a.html text-emphasis-style-property-011-ref.html +== text-emphasis-style-property-011b.html text-emphasis-style-property-011-ref.html +== text-emphasis-style-property-012.html text-emphasis-style-property-012-ref.html +== text-emphasis-style-property-012a.html text-emphasis-style-property-012-ref.html +== text-emphasis-style-property-012b.html text-emphasis-style-property-012-ref.html +== text-emphasis-style-property-012c.html text-emphasis-style-property-012-ref.html +== text-emphasis-style-property-013.html text-emphasis-style-property-013-ref.html +== text-emphasis-style-property-013a.html text-emphasis-style-property-013-ref.html +== text-emphasis-style-property-013b.html text-emphasis-style-property-013-ref.html +== text-emphasis-style-property-014.html text-emphasis-style-property-014-ref.html +== text-emphasis-style-property-014a.html text-emphasis-style-property-014-ref.html +== text-emphasis-style-property-014b.html text-emphasis-style-property-014-ref.html +== text-emphasis-style-property-015.html text-emphasis-style-property-015-ref.html +== text-emphasis-style-property-015a.html text-emphasis-style-property-015-ref.html +== text-emphasis-style-property-015b.html text-emphasis-style-property-015-ref.html +== text-emphasis-style-property-016.html text-emphasis-style-property-016-ref.html +== text-emphasis-style-property-016a.html text-emphasis-style-property-016-ref.html +== text-emphasis-style-property-017.html text-emphasis-style-property-017-ref.html +== text-emphasis-style-property-017a.html text-emphasis-style-property-017-ref.html +== text-emphasis-style-property-017b.html text-emphasis-style-property-017-ref.html +== text-emphasis-style-property-018.html text-emphasis-style-property-018-ref.html +== text-emphasis-style-property-018a.html text-emphasis-style-property-018-ref.html +== text-emphasis-style-property-019.html text-emphasis-style-property-019-ref.html +== text-emphasis-style-property-019a.html text-emphasis-style-property-019-ref.html +== text-emphasis-style-property-020.html text-emphasis-style-property-020-ref.html +== text-emphasis-style-property-020a.html text-emphasis-style-property-020-ref.html +# END tests from support/generate-text-emphasis-style-property-tests.py + +# text-emphasis-color +== text-emphasis-color-property-001.html text-emphasis-color-property-001-ref.html +== text-emphasis-color-property-001a.html text-emphasis-color-property-001-ref.html +== text-emphasis-color-property-002.html text-emphasis-color-property-002-ref.html + +# text-emphasis +== text-emphasis-property-001.html text-emphasis-style-property-001-ref.html +== text-emphasis-property-002.html text-emphasis-style-property-002-ref.html +== text-emphasis-property-003.html text-emphasis-style-property-012-ref.html +== text-emphasis-property-003a.html text-emphasis-style-property-012-ref.html +== text-emphasis-property-003b.html text-emphasis-style-property-012-ref.html +== text-emphasis-property-004.html text-emphasis-color-property-002-ref.html +== text-emphasis-property-004a.html text-emphasis-color-property-002-ref.html + +# text-emphasis-position +# START tests from support/generate-text-emphasis-position-property-tests.py +== text-emphasis-position-property-001.html text-emphasis-position-property-001-ref.html +== text-emphasis-position-property-001a.html text-emphasis-position-property-001-ref.html +== text-emphasis-position-property-001b.html text-emphasis-position-property-001-ref.html +== text-emphasis-position-property-001c.html text-emphasis-position-property-001-ref.html +== text-emphasis-position-property-002.html text-emphasis-position-property-002-ref.html +== text-emphasis-position-property-002a.html text-emphasis-position-property-002-ref.html +== text-emphasis-position-property-002b.html text-emphasis-position-property-002-ref.html +== text-emphasis-position-property-002c.html text-emphasis-position-property-002-ref.html +== text-emphasis-position-property-003.html text-emphasis-position-property-003-ref.html +== text-emphasis-position-property-003a.html text-emphasis-position-property-003-ref.html +== text-emphasis-position-property-003b.html text-emphasis-position-property-003-ref.html +== text-emphasis-position-property-003c.html text-emphasis-position-property-003-ref.html +== text-emphasis-position-property-003d.html text-emphasis-position-property-003-ref.html +== text-emphasis-position-property-003e.html text-emphasis-position-property-003-ref.html +== text-emphasis-position-property-003f.html text-emphasis-position-property-003-ref.html +== text-emphasis-position-property-003g.html text-emphasis-position-property-003-ref.html +== text-emphasis-position-property-004.html text-emphasis-position-property-004-ref.html +== text-emphasis-position-property-004a.html text-emphasis-position-property-004-ref.html +== text-emphasis-position-property-004b.html text-emphasis-position-property-004-ref.html +== text-emphasis-position-property-004c.html text-emphasis-position-property-004-ref.html +== text-emphasis-position-property-004d.html text-emphasis-position-property-004-ref.html +== text-emphasis-position-property-004e.html text-emphasis-position-property-004-ref.html +== text-emphasis-position-property-004f.html text-emphasis-position-property-004-ref.html +== text-emphasis-position-property-004g.html text-emphasis-position-property-004-ref.html +== text-emphasis-position-property-005.html text-emphasis-position-property-005-ref.html +== text-emphasis-position-property-005a.html text-emphasis-position-property-005-ref.html +== text-emphasis-position-property-005b.html text-emphasis-position-property-005-ref.html +== text-emphasis-position-property-005c.html text-emphasis-position-property-005-ref.html +== text-emphasis-position-property-005d.html text-emphasis-position-property-005-ref.html +== text-emphasis-position-property-005e.html text-emphasis-position-property-005-ref.html +== text-emphasis-position-property-005f.html text-emphasis-position-property-005-ref.html +== text-emphasis-position-property-005g.html text-emphasis-position-property-005-ref.html +== text-emphasis-position-property-006.html text-emphasis-position-property-006-ref.html +== text-emphasis-position-property-006a.html text-emphasis-position-property-006-ref.html +== text-emphasis-position-property-006b.html text-emphasis-position-property-006-ref.html +== text-emphasis-position-property-006c.html text-emphasis-position-property-006-ref.html +== text-emphasis-position-property-006d.html text-emphasis-position-property-006-ref.html +== text-emphasis-position-property-006e.html text-emphasis-position-property-006-ref.html +== text-emphasis-position-property-006f.html text-emphasis-position-property-006-ref.html +== text-emphasis-position-property-006g.html text-emphasis-position-property-006-ref.html +# END tests from support/generate-text-emphasis-position-property-tests.py diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-position-property-tests.py b/layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-position-property-tests.py new file mode 100644 index 000000000000..94701b57f2c0 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-position-property-tests.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python +# - * - coding: UTF-8 - * - + +""" +This script generates tests text-emphasis-position-property-001 ~ 006 +which cover all possible values of text-emphasis-position property with +all combination of three main writing modes and two orientations. Only +test files are generated by this script. It also outputs a list of all +tests it generated in the format of Mozilla reftest.list to the stdout. +""" + +from __future__ import unicode_literals + +import itertools + +TEST_FILE = 'text-emphasis-position-property-{:03}{}.html' +REF_FILE = 'text-emphasis-position-property-{:03}-ref.html' +TEST_TEMPLATE = ''' + +CSS Test: text-emphasis-position: {value}, {title} + + + + + +

Pass if the emphasis marks are {position} the text below:

+
試験テスト
+''' + +SUFFIXES = ['', 'a', 'b', 'c', 'd', 'e', 'f', 'g'] + +WRITING_MODES = ["horizontal-tb", "vertical-rl", "vertical-lr"] +POSITION_HORIZONTAL = ["over", "under"] +POSITION_VERTICAL = ["right", "left"] + +REF_MAP_MIXED = { "over": 1, "under": 2, "right": 3, "left": 4 } +REF_MAP_SIDEWAYS = { "right": 5, "left": 6 } +POSITION_TEXT = { "over": "over", "under": "under", + "right": "to the right of", "left": "to the left of" } + +suffixes = [iter(SUFFIXES) for i in range(6)] + +reftest_items = [] + +def write_file(filename, content): + with open(filename, 'wb') as f: + f.write(content.encode('UTF-8')) + +def write_test_file(idx, suffix, wm, orient, value, position): + filename = TEST_FILE.format(idx, suffix) + write_file(filename, TEST_TEMPLATE.format( + value=value, wm=wm, orient=orient, index=idx, position=position, + title=(wm if orient == "mixed" else "{}, {}".format(wm, orient)))) + reftest_items.append("== {} {}".format(filename, REF_FILE.format(idx))) + +def write_test_files(wm, orient, pos1, pos2): + idx = (REF_MAP_MIXED if orient == "mixed" else REF_MAP_SIDEWAYS)[pos1] + position = POSITION_TEXT[pos1] + suffix = suffixes[idx - 1] + write_test_file(idx, next(suffix), wm, orient, pos1 + " " + pos2, position) + write_test_file(idx, next(suffix), wm, orient, pos2 + " " + pos1, position) + +for wm in WRITING_MODES: + if wm == "horizontal-tb": + effective_pos = POSITION_HORIZONTAL + ineffective_pos = POSITION_VERTICAL + else: + effective_pos = POSITION_VERTICAL + ineffective_pos = POSITION_HORIZONTAL + for pos1, pos2 in itertools.product(effective_pos, ineffective_pos): + write_test_files(wm, "mixed", pos1, pos2) + if wm != "horizontal-tb": + write_test_files(wm, "sideways", pos1, pos2) + +print("# START tests from {}".format(__file__)) +reftest_items.sort() +for item in reftest_items: + print(item) +print("# END tests from {}".format(__file__)) diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-style-property-010-tests.sh b/layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-style-property-010-tests.sh new file mode 100644 index 000000000000..3e5667429d1a --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-style-property-010-tests.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash + +# This script generates tests text-emphasis-style-property-010* except +# 010Cn. The tests generated cover all characters listed in the unicode +# data file which should not have emphasis mark specified in the spec. +# This script downloads UnicodeData.txt from the website of the Unicode +# Consortium and extract the characters form that file. It requires +# python (either 2.5+ or 3.x), awk, and wget to work. Only test files +# are generated by this script. It also outputs a list of all tests it +# generated in the format of Mozilla reftest.list to the stdout. Other +# information has been redirected to the stderr. + +UNICODE_DATA_FILE='UnicodeData.txt' +UNICODE_DATA_URL="http://www.unicode.org/Public/8.0.0/ucd/$UNICODE_DATA_FILE" +UNICODE_DATA_DIGEST='38b17e1118206489a7e0ab5d29d7932212d38838df7d3ec025ecb58e8798ec20' + +TEST_FILE='text-emphasis-style-property-010%s.html' +REF_FILE='text-emphasis-style-property-010-ref.html' + +digest_file() { + python -c "import hashlib; +print(hashlib.sha256(open('$1', 'rb').read()).hexdigest())" +} + +check_file() { + [[ -f "$UNICODE_DATA_FILE" ]] || return 1 + digest=`digest_file "$UNICODE_DATA_FILE"` + [[ "$digest" == "$UNICODE_DATA_DIGEST" ]] || return 2 +} + +download_data() { + check_file + if [[ $? -eq 2 ]]; then + echo "Removing incorrect data file..." >&2 + rm "$UNICODE_DATA_FILE" + fi + wget -nc -O"$UNICODE_DATA_FILE" "$UNICODE_DATA_URL" >&2 + + check_file + if [[ $? -ne 0 ]]; then + echo "Failed to get the correct unicode data file!" >&2 + exit 1 + fi +} + +list_codepoints() { + awk -F';' "\$3 == \"$1\" { print \" 0x\"\$1\",\" }" "$UNICODE_DATA_FILE" +} + +write_test_file() { + filename=`printf "$TEST_FILE" $1` + echo "== $filename $REF_FILE" + cat < $filename + + +CSS Test: text-emphasis, $1 + + + + + +

Pass if there is nothing rendered below:

+
+ +
+EOF +} + +download_data +echo "# START tests from $0" +for c in Zs Zl Zp Cc Cf; do + write_test_file "$c" +done +echo "# END tests from $0" diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-style-property-tests.py b/layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-style-property-tests.py new file mode 100644 index 000000000000..eb14e83bc577 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/support/generate-text-emphasis-style-property-tests.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# - * - coding: UTF-8 - * - + +""" +This script generates tests text-emphasis-style-property-011 ~ 020 which +cover all possible values of text-emphasis-style property, except none +and , with horizontal writing mode. It outputs a list of all +tests it generated in the format of Mozilla reftest.list to the stdout. +""" + +from __future__ import unicode_literals + +TEST_FILE = 'text-emphasis-style-property-{:03}{}.html' +TEST_TEMPLATE = ''' + +CSS Test: text-emphasis-style: {title} + + + + + +

Pass if there is a '{char}' above every character below:

+
試験テスト
+''' + +REF_FILE = 'text-emphasis-style-property-{:03}-ref.html' +REF_TEMPLATE = ''' + +CSS Reference: text-emphasis-style: {0} + + + +

Pass if there is a '{1}' above every character below:

+
試{1}験{1}テ{1}ス{1}ト{1}
+''' + +DATA_SET = [ + ('dot', 0x2022, 0x25e6), + ('circle', 0x25cf, 0x25cb), + ('double-circle', 0x25c9, 0x25ce), + ('triangle', 0x25b2, 0x25b3), + ('sesame', 0xfe45, 0xfe46), + ] + +SUFFIXES = ['', 'a', 'b', 'c', 'd', 'e'] + +def get_html_entity(code): + return '&#x{:04X};'.format(code) + +def write_file(filename, content): + with open(filename, 'wb') as f: + f.write(content.encode('UTF-8')) + +def write_test_file(idx, suffix, style, code, name=None): + if not name: + name = style + filename = TEST_FILE.format(idx, suffix) + write_file(filename, TEST_TEMPLATE.format(index=idx, value=style, + char=get_html_entity(code), + code='U+{:04X}'.format(code), + title=name)) + print("== {} {}".format(filename, REF_FILE.format(idx))) + +idx = 10 +def write_files(style, code): + global idx + idx += 1 + fill, shape = style + basic_style = "{} {}".format(fill, shape) + write_file(REF_FILE.format(idx), + REF_TEMPLATE.format(basic_style, get_html_entity(code))) + suffix = iter(SUFFIXES) + write_test_file(idx, next(suffix), basic_style, code) + write_test_file(idx, next(suffix), "{} {}".format(shape, fill), code) + if fill == 'filled': + write_test_file(idx, next(suffix), shape, code) + if shape == 'circle': + write_test_file(idx, next(suffix), fill, code, fill + ', horizontal') + +print("# START tests from {}".format(__file__)) +for name, code, _ in DATA_SET: + write_files(('filled', name), code) +for name, _, code in DATA_SET: + write_files(('open', name), code) +print("# END tests from {}".format(__file__)) diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001-ref.html new file mode 100644 index 000000000000..00c87eeb0625 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-color: currentColor + + + +

Pass if there is a green '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001.html new file mode 100644 index 000000000000..2d4676ad7090 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-color: untouched + + + + + +

Pass if there is a green '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001a.html new file mode 100644 index 000000000000..34c817e6815d --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-color: initial + + + + + +

Pass if there is a green '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001b.html new file mode 100644 index 000000000000..0acb0f768296 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-001b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-color: initial from text-emphasis + + + + + +

Pass if there is a green '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-002-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-002-ref.html new file mode 100644 index 000000000000..2bcc1d6b9bec --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-002-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-color: green + + + +

Pass if there is a green '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-002.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-002.html new file mode 100644 index 000000000000..a215267eb5b8 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-color-property-002.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-color: green + + + + + +

Pass if there is a green '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001-ref.html new file mode 100644 index 000000000000..a401c67beb1f --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-position: over + + + +

Pass if the emphasis marks are over the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001.html new file mode 100644 index 000000000000..feef0532c73d --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over right, horizontal-tb + + + + + +

Pass if the emphasis marks are over the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001a.html new file mode 100644 index 000000000000..731a04e119ac --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right over, horizontal-tb + + + + + +

Pass if the emphasis marks are over the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001b.html new file mode 100644 index 000000000000..36b8e455ee9e --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over left, horizontal-tb + + + + + +

Pass if the emphasis marks are over the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001c.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001c.html new file mode 100644 index 000000000000..81cf7fd7cbd7 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-001c.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left over, horizontal-tb + + + + + +

Pass if the emphasis marks are over the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002-ref.html new file mode 100644 index 000000000000..46659494783f --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-position: under + + + +

Pass if the emphasis marks are under the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002.html new file mode 100644 index 000000000000..034a41ac80b6 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under right, horizontal-tb + + + + + +

Pass if the emphasis marks are under the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002a.html new file mode 100644 index 000000000000..4aae003b7a2b --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right under, horizontal-tb + + + + + +

Pass if the emphasis marks are under the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002b.html new file mode 100644 index 000000000000..3ae17dcabf53 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under left, horizontal-tb + + + + + +

Pass if the emphasis marks are under the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002c.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002c.html new file mode 100644 index 000000000000..e67fce566535 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-002c.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left under, horizontal-tb + + + + + +

Pass if the emphasis marks are under the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003-ref.html new file mode 100644 index 000000000000..770fa1e8f5b2 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-position: right + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003.html new file mode 100644 index 000000000000..b8fcd3d8dc7c --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right over, vertical-rl + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003a.html new file mode 100644 index 000000000000..ded96690c206 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over right, vertical-rl + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003b.html new file mode 100644 index 000000000000..25e69eb1dae1 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right under, vertical-rl + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003c.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003c.html new file mode 100644 index 000000000000..0cf05a3d4dac --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003c.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under right, vertical-rl + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003d.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003d.html new file mode 100644 index 000000000000..64872191927c --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003d.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right over, vertical-lr + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003e.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003e.html new file mode 100644 index 000000000000..b2dc58b2dc2b --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003e.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over right, vertical-lr + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003f.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003f.html new file mode 100644 index 000000000000..ad2613bda9a9 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003f.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right under, vertical-lr + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003g.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003g.html new file mode 100644 index 000000000000..c2cc3d6a8869 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-003g.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under right, vertical-lr + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004-ref.html new file mode 100644 index 000000000000..1e56f5877a9e --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-position: left + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004.html new file mode 100644 index 000000000000..10a42ce812be --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left over, vertical-rl + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004a.html new file mode 100644 index 000000000000..e1fc0a7275f4 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over left, vertical-rl + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004b.html new file mode 100644 index 000000000000..2deb2e66afaa --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left under, vertical-rl + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004c.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004c.html new file mode 100644 index 000000000000..45b14882d7b1 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004c.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under left, vertical-rl + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004d.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004d.html new file mode 100644 index 000000000000..2c0dd0234152 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004d.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left over, vertical-lr + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004e.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004e.html new file mode 100644 index 000000000000..4b17e87c928a --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004e.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over left, vertical-lr + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004f.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004f.html new file mode 100644 index 000000000000..1e7b48b56fc9 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004f.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left under, vertical-lr + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004g.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004g.html new file mode 100644 index 000000000000..02860e4fbd12 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-004g.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under left, vertical-lr + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005-ref.html new file mode 100644 index 000000000000..7427dec9d0a1 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-position: right, sideways + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005.html new file mode 100644 index 000000000000..2eaca9cf0021 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right over, vertical-rl, sideways + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005a.html new file mode 100644 index 000000000000..1061e936ffff --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over right, vertical-rl, sideways + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005b.html new file mode 100644 index 000000000000..f535eb2bc3e6 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right under, vertical-rl, sideways + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005c.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005c.html new file mode 100644 index 000000000000..1118047118f7 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005c.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under right, vertical-rl, sideways + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005d.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005d.html new file mode 100644 index 000000000000..390446cdf951 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005d.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right over, vertical-lr, sideways + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005e.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005e.html new file mode 100644 index 000000000000..6f65274d0c9e --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005e.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over right, vertical-lr, sideways + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005f.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005f.html new file mode 100644 index 000000000000..ecec98122cd7 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005f.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: right under, vertical-lr, sideways + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005g.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005g.html new file mode 100644 index 000000000000..81b220bffb93 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-005g.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under right, vertical-lr, sideways + + + + + +

Pass if the emphasis marks are to the right of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006-ref.html new file mode 100644 index 000000000000..85af6c250e22 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-position: left, sideways + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006.html new file mode 100644 index 000000000000..8933513b74dc --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left over, vertical-rl, sideways + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006a.html new file mode 100644 index 000000000000..5aa8067f5f63 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over left, vertical-rl, sideways + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006b.html new file mode 100644 index 000000000000..6d98ea15f251 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left under, vertical-rl, sideways + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006c.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006c.html new file mode 100644 index 000000000000..1d1acd964d0e --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006c.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under left, vertical-rl, sideways + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006d.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006d.html new file mode 100644 index 000000000000..575f07d5f730 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006d.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left over, vertical-lr, sideways + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006e.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006e.html new file mode 100644 index 000000000000..d03a66cc2858 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006e.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: over left, vertical-lr, sideways + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006f.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006f.html new file mode 100644 index 000000000000..955a5e21212d --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006f.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: left under, vertical-lr, sideways + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006g.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006g.html new file mode 100644 index 000000000000..9f21cc5c9c63 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-position-property-006g.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-position: under left, vertical-lr, sideways + + + + + +

Pass if the emphasis marks are to the left of the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-001.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-001.html new file mode 100644 index 000000000000..ed5635bbce2b --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-001.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis: none + + + + + +

Pass if there is NO emphasis marks above the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-002.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-002.html new file mode 100644 index 000000000000..6e8050a87e6c --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-002.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis: string + + + + + +

Pass if there is a '^' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003.html new file mode 100644 index 000000000000..fc35010e3ab7 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis: circle + + + + + +

Pass if there is a '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003a.html new file mode 100644 index 000000000000..e70518b06249 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis: filled + + + + + +

Pass if there is a '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003b.html new file mode 100644 index 000000000000..79e66bc93a22 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-003b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis: filled circle + + + + + +

Pass if there is a '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-004.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-004.html new file mode 100644 index 000000000000..15d2ab001cc1 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-004.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis: circle green + + + + + +

Pass if there is a green '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-004a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-004a.html new file mode 100644 index 000000000000..6d0d80d29419 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-property-004a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis: green circle + + + + + +

Pass if there is a green '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-001-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-001-ref.html new file mode 100644 index 000000000000..60f8fa7b95cd --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-001-ref.html @@ -0,0 +1,7 @@ + + +CSS Reference: text-emphasis-style: none + + +

Pass if there is NO emphasis marks above the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-001.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-001.html new file mode 100644 index 000000000000..5073a3e5d042 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-001.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: none + + + + + +

Pass if there is NO emphasis marks above the text below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-002-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-002-ref.html new file mode 100644 index 000000000000..e9cf74415ce8 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-002-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: string + + + +

Pass if there is a '^' above every character below:

+
試^験^テ^ス^ト^
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-002.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-002.html new file mode 100644 index 000000000000..6860a00362f8 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-002.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: string + + + + + +

Pass if there is a '^' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-003-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-003-ref.html new file mode 100644 index 000000000000..d9c29d7499ea --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-003-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: filled sesame, vertical + + + +

Pass if there is a '﹅' to the right of every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-003.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-003.html new file mode 100644 index 000000000000..b2af7448f1d7 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-003.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: filled, vertical + + + + + +

Pass if there is a '﹅' to the right of every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-004-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-004-ref.html new file mode 100644 index 000000000000..a1065f4193f8 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-004-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: open sesame, vertical + + + +

Pass if there is a '﹆' to the right of every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-004.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-004.html new file mode 100644 index 000000000000..60c718653a2b --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-004.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: open, vertical + + + + + +

Pass if there is a '﹆' to the right of every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005-ref.html new file mode 100644 index 000000000000..b65490267033 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style, vertical + + + +

Pass if the emphasis marks 'V' are upright:

+
試V験VテVスVトV
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005.html new file mode 100644 index 000000000000..29be3abda073 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style, vertical-rl + + + + + +

Pass if the emphasis marks 'V' are upright:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005a.html new file mode 100644 index 000000000000..af0ad4e0aa72 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-005a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style, vertical-lr + + + + + +

Pass if the emphasis marks 'V' are upright:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010-ref.html new file mode 100644 index 000000000000..93028d6e7c9e --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010-ref.html @@ -0,0 +1,7 @@ + + +CSS Test: text-emphasis on characters without emphasis mark + + +

Pass if there is nothing rendered below:

+
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cc.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cc.html new file mode 100644 index 000000000000..78ded1ca2864 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cc.html @@ -0,0 +1,83 @@ + + +CSS Test: text-emphasis, Cc + + + + + +

Pass if there is nothing rendered below:

+
+ +
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cf.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cf.html new file mode 100644 index 000000000000..012ef378527f --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cf.html @@ -0,0 +1,168 @@ + + +CSS Test: text-emphasis, Cf + + + + + +

Pass if there is nothing rendered below:

+
+ +
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cn.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cn.html new file mode 100644 index 000000000000..90f583df33a9 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Cn.html @@ -0,0 +1,26 @@ + + +CSS Test: text-emphasis, Cn + + + + + +

Pass if there is nothing rendered below:

+
+ +
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zl.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zl.html new file mode 100644 index 000000000000..38840ba38396 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zl.html @@ -0,0 +1,19 @@ + + +CSS Test: text-emphasis, Zl + + + + + +

Pass if there is nothing rendered below:

+
+ +
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zp.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zp.html new file mode 100644 index 000000000000..f0bbdbc8ad10 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zp.html @@ -0,0 +1,19 @@ + + +CSS Test: text-emphasis, Zp + + + + + +

Pass if there is nothing rendered below:

+
+ +
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zs.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zs.html new file mode 100644 index 000000000000..c6e4152522b8 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-010Zs.html @@ -0,0 +1,35 @@ + + +CSS Test: text-emphasis, Zs + + + + + +

Pass if there is nothing rendered below:

+
+ +
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011-ref.html new file mode 100644 index 000000000000..9f28f3f411db --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: filled dot + + + +

Pass if there is a '•' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011.html new file mode 100644 index 000000000000..ed8d0fd4e0ad --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: filled dot + + + + + +

Pass if there is a '•' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011a.html new file mode 100644 index 000000000000..8492801983f5 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: dot filled + + + + + +

Pass if there is a '•' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011b.html new file mode 100644 index 000000000000..894b57e243a1 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-011b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: dot + + + + + +

Pass if there is a '•' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012-ref.html new file mode 100644 index 000000000000..672a659f4e96 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: filled circle + + + +

Pass if there is a '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012.html new file mode 100644 index 000000000000..97c8dfde0794 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: filled circle + + + + + +

Pass if there is a '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012a.html new file mode 100644 index 000000000000..5aa13441c3c0 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: circle filled + + + + + +

Pass if there is a '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012b.html new file mode 100644 index 000000000000..a9ece184d2fe --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: circle + + + + + +

Pass if there is a '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012c.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012c.html new file mode 100644 index 000000000000..62447324734e --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-012c.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: filled, horizontal + + + + + +

Pass if there is a '●' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013-ref.html new file mode 100644 index 000000000000..5d6cb187df6e --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: filled double-circle + + + +

Pass if there is a '◉' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013.html new file mode 100644 index 000000000000..074ef47f1dcf --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: filled double-circle + + + + + +

Pass if there is a '◉' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013a.html new file mode 100644 index 000000000000..b641c21e5854 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: double-circle filled + + + + + +

Pass if there is a '◉' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013b.html new file mode 100644 index 000000000000..2f68d44841a9 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-013b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: double-circle + + + + + +

Pass if there is a '◉' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014-ref.html new file mode 100644 index 000000000000..a18fc957be55 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: filled triangle + + + +

Pass if there is a '▲' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014.html new file mode 100644 index 000000000000..60231abf9351 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: filled triangle + + + + + +

Pass if there is a '▲' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014a.html new file mode 100644 index 000000000000..1c72bda80920 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: triangle filled + + + + + +

Pass if there is a '▲' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014b.html new file mode 100644 index 000000000000..9b32cdd67f86 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-014b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: triangle + + + + + +

Pass if there is a '▲' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015-ref.html new file mode 100644 index 000000000000..a9cef72d31fd --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: filled sesame + + + +

Pass if there is a '﹅' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015.html new file mode 100644 index 000000000000..6c62462adae1 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: filled sesame + + + + + +

Pass if there is a '﹅' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015a.html new file mode 100644 index 000000000000..e059497b048f --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: sesame filled + + + + + +

Pass if there is a '﹅' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015b.html new file mode 100644 index 000000000000..a243600b0646 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-015b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: sesame + + + + + +

Pass if there is a '﹅' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016-ref.html new file mode 100644 index 000000000000..6b104021b1c3 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: open dot + + + +

Pass if there is a '◦' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016.html new file mode 100644 index 000000000000..954f9f4e849a --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: open dot + + + + + +

Pass if there is a '◦' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016a.html new file mode 100644 index 000000000000..aeabcfa70216 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-016a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: dot open + + + + + +

Pass if there is a '◦' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017-ref.html new file mode 100644 index 000000000000..c0be7ffd8ca7 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: open circle + + + +

Pass if there is a '○' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017.html new file mode 100644 index 000000000000..948ccf083f50 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: open circle + + + + + +

Pass if there is a '○' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017a.html new file mode 100644 index 000000000000..b9f58a8885f7 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: circle open + + + + + +

Pass if there is a '○' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017b.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017b.html new file mode 100644 index 000000000000..19ae3c8cb45f --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-017b.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: open, horizontal + + + + + +

Pass if there is a '○' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018-ref.html new file mode 100644 index 000000000000..f9d2980a80c1 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: open double-circle + + + +

Pass if there is a '◎' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018.html new file mode 100644 index 000000000000..30713e614b2c --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: open double-circle + + + + + +

Pass if there is a '◎' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018a.html new file mode 100644 index 000000000000..b3e577df10a3 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-018a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: double-circle open + + + + + +

Pass if there is a '◎' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019-ref.html new file mode 100644 index 000000000000..b8f4f201f001 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: open triangle + + + +

Pass if there is a '△' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019.html new file mode 100644 index 000000000000..20c8069ecc14 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: open triangle + + + + + +

Pass if there is a '△' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019a.html new file mode 100644 index 000000000000..f73bf2111464 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-019a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: triangle open + + + + + +

Pass if there is a '△' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020-ref.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020-ref.html new file mode 100644 index 000000000000..1502d3d7f5a6 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020-ref.html @@ -0,0 +1,8 @@ + + +CSS Reference: text-emphasis-style: open sesame + + + +

Pass if there is a '﹆' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020.html new file mode 100644 index 000000000000..09c5ae5348f3 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: open sesame + + + + + +

Pass if there is a '﹆' above every character below:

+
試験テスト
diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020a.html b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020a.html new file mode 100644 index 000000000000..a32781d618e8 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/text-decor-3/text-emphasis-style-property-020a.html @@ -0,0 +1,10 @@ + + +CSS Test: text-emphasis-style: sesame open + + + + + +

Pass if there is a '﹆' above every character below:

+
試験テスト
From d18f0f73d1de500042abddd6fcd47704b2a8f029 Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Fri, 27 Nov 2015 20:01:32 -0800 Subject: [PATCH 049/153] Back out 350ecdaedef8 (bug 1223781) for test_killswitch_gonk.js permaorange CLOSED TREE --- .../filepicker_path_handler_chrome.js | 9 +- dom/settings/SettingsDB.jsm | 201 +++++++----------- dom/settings/tests/chrome.ini | 5 +- dom/settings/tests/test_settings_db.js | 148 ------------- dom/settings/tests/test_settings_db.xul | 19 -- .../test_settingsrequestmanager_messages.js | 42 +--- 6 files changed, 79 insertions(+), 345 deletions(-) delete mode 100644 dom/settings/tests/test_settings_db.js delete mode 100644 dom/settings/tests/test_settings_db.xul diff --git a/b2g/components/test/mochitest/filepicker_path_handler_chrome.js b/b2g/components/test/mochitest/filepicker_path_handler_chrome.js index 7cc7a84fd04a..a175746cb93f 100644 --- a/b2g/components/test/mochitest/filepicker_path_handler_chrome.js +++ b/b2g/components/test/mochitest/filepicker_path_handler_chrome.js @@ -12,18 +12,13 @@ var ppmm = Cc['@mozilla.org/parentprocessmessagemanager;1'] .getService(Ci.nsIMessageListenerManager); var pickResult = null; -var timer = null; function processPickMessage(message) { let sender = message.target.QueryInterface(Ci.nsIMessageSender); // reply FilePicker's message sender.sendAsyncMessage('file-picked', pickResult); - timer = Cc["@mozilla.org/timer;1"] - .createInstance(Components.interfaces.nsITimer); - timer.initWithCallback(function() { - // notify caller - sendAsyncMessage('file-picked-posted', { type: 'file-picked-posted' }); - }, 3000, Ci.nsITimer.TYPE_ONE_SHOT); + // notify caller + sendAsyncMessage('file-picked-posted', { type: 'file-picked-posted' }); } function updatePickResult(result) { diff --git a/dom/settings/SettingsDB.jsm b/dom/settings/SettingsDB.jsm index 3c1cbd791179..d4b07a624fe5 100644 --- a/dom/settings/SettingsDB.jsm +++ b/dom/settings/SettingsDB.jsm @@ -8,16 +8,10 @@ var Cc = Components.classes; var Ci = Components.interfaces; var Cu = Components.utils; -Cu.importGlobalProperties(["Blob", "File"]); +Cu.importGlobalProperties(['Blob', 'File']); Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/AppsUtils.jsm"); -this.EXPORTED_SYMBOLS = [ - "SettingsDB", - "SETTINGSDB_NAME", - "SETTINGSSTORE_NAME", - "SETTINGSDB_VERSION" -]; +this.EXPORTED_SYMBOLS = ["SettingsDB", "SETTINGSDB_NAME", "SETTINGSSTORE_NAME"]; var DEBUG = false; var VERBOSE = false; @@ -59,10 +53,7 @@ SettingsDB.prototype = { __proto__: IndexedDBHelper.prototype, - _dbVersion: SETTINGSDB_VERSION, - - upgradeSchema(aTransaction, aDb, aOldVersion, aNewVersion) { - if (DEBUG) debug("Upgrade schema ", aOldVersion, aNewVersion); + upgradeSchema: function upgradeSchema(aTransaction, aDb, aOldVersion, aNewVersion) { let objectStore; if (aOldVersion == 0) { objectStore = aDb.createObjectStore(SETTINGSSTORE_NAME, { keyPath: "settingName" }); @@ -76,11 +67,75 @@ SettingsDB.prototype = { objectStore = aTransaction.objectStore(SETTINGSSTORE_NAME); } - this.loadDefaultSettings(objectStore, aOldVersion); + // Loading resource://app/defaults/settings.json doesn't work because + // settings.json is not in the omnijar. + // So we look for the app dir instead and go from here... + let settingsFile = FileUtils.getFile("DefRt", ["settings.json"], false); + if (!settingsFile || (settingsFile && !settingsFile.exists())) { + // On b2g desktop builds the settings.json file is moved in the + // profile directory by the build system. + settingsFile = FileUtils.getFile("ProfD", ["settings.json"], false); + if (!settingsFile || (settingsFile && !settingsFile.exists())) { + return; + } + } + + let chan = NetUtil.newChannel({ + uri: NetUtil.newURI(settingsFile), + loadUsingSystemPrincipal: true}); + let stream = chan.open(); + // Obtain a converter to read from a UTF-8 encoded input stream. + let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] + .createInstance(Ci.nsIScriptableUnicodeConverter); + converter.charset = "UTF-8"; + let rawstr = converter.ConvertToUnicode(NetUtil.readInputStreamToString( + stream, + stream.available()) || ""); + let settings; + try { + settings = JSON.parse(rawstr); + } catch(e) { + if (DEBUG) debug("Error parsing " + settingsFile.path + " : " + e); + return; + } + stream.close(); + + objectStore.openCursor().onsuccess = function(event) { + let cursor = event.target.result; + if (cursor) { + let value = cursor.value; + if (value.settingName in settings) { + if (VERBOSE) debug("Upgrade " +settings[value.settingName]); + value.defaultValue = this.prepareValue(settings[value.settingName]); + delete settings[value.settingName]; + if ("settingValue" in value) { + value.userValue = this.prepareValue(value.settingValue); + delete value.settingValue; + } + cursor.update(value); + } else if ("userValue" in value || "settingValue" in value) { + value.defaultValue = undefined; + if (aOldVersion == 1 && value.settingValue) { + value.userValue = this.prepareValue(value.settingValue); + delete value.settingValue; + } + cursor.update(value); + } else { + cursor.delete(); + } + cursor.continue(); + } else { + for (let name in settings) { + let value = this.prepareValue(settings[name]); + if (VERBOSE) debug("Set new:" + name +", " + value); + objectStore.add({ settingName: name, defaultValue: value, userValue: undefined }); + } + } + }.bind(this); }, // If the value is a data: uri, convert it to a Blob. - convertDataURIToBlob(aValue) { + convertDataURIToBlob: function(aValue) { /* base64 to ArrayBuffer decoding, from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding */ @@ -144,7 +199,7 @@ SettingsDB.prototype = { return aValue }, - getObjectKind(aObject) { + getObjectKind: function(aObject) { if (aObject === null || aObject === undefined) { return "primitive"; } else if (Array.isArray(aObject)) { @@ -165,7 +220,7 @@ SettingsDB.prototype = { }, // Makes sure any property that is a data: uri gets converted to a Blob. - prepareValue(aObject) { + prepareValue: function(aObject) { let kind = this.getObjectKind(aObject); if (kind == "array") { let res = []; @@ -187,118 +242,8 @@ SettingsDB.prototype = { return res; }, - loadDefaultSettings(aObjectStore, aOldVersion) { - // Loading resource://app/defaults/settings.json doesn't work because - // settings.json is not in the omnijar. - // So we look for the app dir instead and go from here... - let settingsFile = FileUtils.getFile("DefRt", ["settings.json"], false); - if (!settingsFile || (settingsFile && !settingsFile.exists())) { - // On b2g desktop builds the settings.json file is moved in the - // profile directory by the build system. - settingsFile = FileUtils.getFile("ProfD", ["settings.json"], false); - if (!settingsFile || (settingsFile && !settingsFile.exists())) { - return; - } - } - - let chan = NetUtil.newChannel({ - uri: NetUtil.newURI(settingsFile), - loadUsingSystemPrincipal: true - }); - let stream = chan.open(); - // Obtain a converter to read from a UTF-8 encoded input stream. - let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] - .createInstance(Ci.nsIScriptableUnicodeConverter); - converter.charset = "UTF-8"; - let rawstr = converter.ConvertToUnicode( - NetUtil.readInputStreamToString(stream, stream.available()) || "" - ); - let settings; - try { - settings = JSON.parse(rawstr); - } catch(e) { - if (DEBUG) debug("Error parsing " + settingsFile.path + " : " + e); - return; - } - stream.close(); - - aObjectStore.openCursor().onsuccess = event => { - let cursor = event.target.result; - if (cursor) { - let value = cursor.value; - if (value.settingName in settings) { - if (VERBOSE) { - debug("Upgrade " + value.settingName + " " + - settings[value.settingName]); - } - value.defaultValue = this.prepareValue(settings[value.settingName]); - delete settings[value.settingName]; - if ("settingValue" in value) { - value.userValue = this.prepareValue(value.settingValue); - delete value.settingValue; - } - cursor.update(value); - } else if ("userValue" in value || "settingValue" in value) { - value.defaultValue = undefined; - if (aOldVersion !== undefined && - aOldVersion == 1 && value.settingValue) { - value.userValue = this.prepareValue(value.settingValue); - delete value.settingValue; - } - cursor.update(value); - } else { - cursor.delete(); - } - cursor.continue(); - } else { - for (let name in settings) { - let value = this.prepareValue(settings[name]); - if (VERBOSE) debug("Set new:" + name +", " + value); - aObjectStore.add({ - settingName: name, - defaultValue: value, - userValue: undefined - }); - } - } - }; - }, - - /** - * Only for testing purposes. - */ - set dbVersion(version) { - this._dbVersion = SETTINGSDB_VERSION || version; - }, - - init() { - this.initDBHelper(SETTINGSDB_NAME, this._dbVersion, + init: function init() { + this.initDBHelper(SETTINGSDB_NAME, SETTINGSDB_VERSION, [SETTINGSSTORE_NAME]); - - // We need to store the db version to avoid reading the setting.json - // file twice on the very first run and after an OTA update where - // the db version was bumped. - // upgradeSchema already takes care of loading and applying the - // setting.json content in these two scenarios. - const dbVersionPref = "settings.api.db.version"; - let oldDbVersion = 0; - try { - oldDbVersion = Services.prefs.getIntPref(dbVersionPref); - } catch(e) {} - Services.prefs.setIntPref(dbVersionPref, this._dbVersion); - - if (!AppsUtils.isFirstRun(Services.prefs) || - oldDbVersion != this._dbVersion) { - return; - } - - // We get there in case of a first run after an OTA update where - // the settings db version was not bumped. In this case, we need to - // load and apply the content of the settings.json file. - this.newTxn("readwrite", SETTINGSSTORE_NAME, (txn, store) => { - this.loadDefaultSettings(store); - }, null, error => { - dump("*** WARNING *** Settings DB initialization error " + error + "\n"); - }); } } diff --git a/dom/settings/tests/chrome.ini b/dom/settings/tests/chrome.ini index 8f3861b05fac..f2fca29a73c7 100644 --- a/dom/settings/tests/chrome.ini +++ b/dom/settings/tests/chrome.ini @@ -1,13 +1,10 @@ [DEFAULT] skip-if = buildapp != 'b2g' support-files = - test_settings_db.js test_settings_service.js test_settings_service_callback.js [test_settings_service.xul] -skip-if = buildapp == 'mulet' +skip-if= buildapp == 'mulet' [test_settings_service_callback.xul] -[test_settings_db.xul] -skip-if = toolkit == 'gonk' # Bug 1225157 diff --git a/dom/settings/tests/test_settings_db.js b/dom/settings/tests/test_settings_db.js deleted file mode 100644 index 75f7c663aaba..000000000000 --- a/dom/settings/tests/test_settings_db.js +++ /dev/null @@ -1,148 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -const Cu = Components.utils; - -Cu.import("resource://gre/modules/AppsUtils.jsm"); -Cu.import("resource://gre/modules/FileUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/SettingsDB.jsm"); - -SimpleTest.waitForExplicitFinish(); - -let settings = { - "setting1": "value1" -}; - -let settingsDB; - -const saveTestSettingsJson = () => { - let file = FileUtils.getFile("ProfD", ["settings.json"], false); - let foStream = FileUtils.openFileOutputStream(file); - let json = JSON.stringify(settings); - foStream.write(json, json.length); - foStream.close(); -}; - -const getSettings = () => { - return new Promise((resolve, reject) => { - settingsDB.newTxn("readonly", SETTINGSSTORE_NAME, (txn, store) => { - txn.onabort = reject; - txn.onerror = reject; - let req = store.getAll(); - req.onsuccess = () => { - resolve(req.result); - }; - req.onerror = reject; - }, null, reject); - }); -}; - -const checkSettings = expected => { - return getSettings().then(settings => { - settings.forEach(setting => { - if (expected.has(setting.settingName)) { - let value = expected.get(setting.settingName); - ok(value == setting.defaultValue, - `${setting.defaultValue} should be ${value}`); - expected.delete(setting.settingName); - } - }); - ok(expected.size == 0, `should remove all expected settings`); - }); -}; - -const setFirstRun = () => { - let promises = []; - promises.push(new Promise(resolve => { - SpecialPowers.pushPrefEnv({ - "set": [["gecko.mstone", ""]] - }, resolve); - })); - promises.push(new Promise(resolve => { - SpecialPowers.pushPrefEnv({ - "set": [["gecko.buildID", ""]] - }, resolve); - })); - - return Promise.all(promises); -}; - -const cleanup = () => { - settingsDB.close(); - settingsDB = null; - next(); -}; - -const tests = [() => { - // Create dummy settings.json in the profile dir. - saveTestSettingsJson(); - ok(true, "should create settings.json"); - next(); -}, () => { - // settings.json should be applied on first boot. - settingsDB = new SettingsDB(); - settingsDB.init(); - let expected = new Map(); - expected.set("setting1", "value1"); - checkSettings(expected).then(next); -}, () => { - cleanup(); -}, () => { - // Modifying settings.json but not updating the platform should not - // apply the changes to settings.json. - settings["setting1"] = "modifiedValue1"; - settings["setting2"] = "value2"; - saveTestSettingsJson(); - settingsDB = new SettingsDB(); - settingsDB.init(); - let expected = new Map(); - expected.set("setting1", "value1"); - checkSettings(expected).then(next); -}, () => { - cleanup(); -}, () => { - setFirstRun().then(next); -}, () => { - // Updating the platform should apply changes to settings.json. - settingsDB = new SettingsDB(); - settingsDB.init(); - let expected = new Map(); - expected.set("setting1", "modifiedValue1"); - expected.set("setting2", "value2"); - checkSettings(expected).then(next); -}, () => { - cleanup(); -}, () => { - setFirstRun().then(next); -}, () => { - // Updating the platform and bumping DB version should also apply changes - // to settings.json - settings["setting2"] = "modifiedValue2"; - saveTestSettingsJson(); - settingsDB = new SettingsDB(); - SettingsDB.dbVersion = SETTINGSDB_VERSION + 1; - settingsDB.init(); - let expected = new Map(); - expected.set("setting1", "modifiedValue1"); - expected.set("setting2", "modifiedValue2"); - checkSettings(expected).then(next); -}, () => { - cleanup(); -}]; - -const next = () => { - let step = tests.shift(); - if (!step) { - return SimpleTest.finish(); - } - try { - step(); - } catch(e) { - ok(false, "Test threw: " + e); - } -} - -SpecialPowers.pushPrefEnv({"set":[["settings.api.db.version", 0]]}, next); diff --git a/dom/settings/tests/test_settings_db.xul b/dom/settings/tests/test_settings_db.xul deleted file mode 100644 index 7451bdecbdf5..000000000000 --- a/dom/settings/tests/test_settings_db.xul +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - Mozilla Bug 1223781 - - - + + + +Mozilla Bug 696253 + +
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/layout/style/test/test_flexbox_align_self_auto.html b/layout/style/test/test_flexbox_align_self_auto.html deleted file mode 100644 index 6072a9a6960b..000000000000 --- a/layout/style/test/test_flexbox_align_self_auto.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - Test behavior of 'align-self:auto' (Bug 696253) - - - - -Mozilla Bug 696253 -
-
-
-
-
-
- - From b1bb11079826cda8d00c7ce2e8d7333f3065e815 Mon Sep 17 00:00:00 2001 From: Jesse Ruderman Date: Sat, 28 Nov 2015 21:37:44 +0100 Subject: [PATCH 056/153] Bug 1225376 part 3 - [css-grid] Crashtest. --- layout/generic/crashtests/1225376.html | 10 ++++++++++ layout/generic/crashtests/crashtests.list | 1 + 2 files changed, 11 insertions(+) create mode 100644 layout/generic/crashtests/1225376.html diff --git a/layout/generic/crashtests/1225376.html b/layout/generic/crashtests/1225376.html new file mode 100644 index 000000000000..f6e35be3eed9 --- /dev/null +++ b/layout/generic/crashtests/1225376.html @@ -0,0 +1,10 @@ + + + + +
+
+
+ + + diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index 975e78b46212..2d6415f4212f 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -598,6 +598,7 @@ load 1223568-1.html load 1223568-2.html load 1224230-1.html pref(layout.css.grid.enabled,true) load 1225118.html +pref(layout.css.grid.enabled,true) load 1225376.html load first-letter-638937-1.html load first-letter-638937-2.html pref(dom.meta-viewport.enabled,true) test-pref(font.size.inflation.emPerLine,15) asserts(1-100) load font-inflation-762332.html # bug 762332 From c49a23f7ceb145773c67e334ef61ef45a3bd50e9 Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Sat, 28 Nov 2015 21:37:44 +0100 Subject: [PATCH 057/153] Bug 1225592 - [css-grid] Apply a max limit to the number of explicit tracks we will store (kMaxLine - 1). Also make the layout code more robust so it doesn't depend on that. r=dholbert --- layout/generic/nsGridContainerFrame.cpp | 23 +++++++++++++---------- layout/style/nsRuleNode.cpp | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp index c58df8496e2b..ab97cfc64b2c 100644 --- a/layout/generic/nsGridContainerFrame.cpp +++ b/layout/generic/nsGridContainerFrame.cpp @@ -1927,28 +1927,31 @@ nsGridContainerFrame::Tracks::Initialize( explicitGridOffset + aFunctions.mMinSizingFunctions.Length()); MOZ_ASSERT(aFunctions.mMinSizingFunctions.Length() == aFunctions.mMaxSizingFunctions.Length()); + // First we initialize the implicit tracks before the explicit grid starts. uint32_t i = 0; - for (; i < explicitGridOffset; ++i) { + uint32_t sentinel = std::min(explicitGridOffset, mSizes.Length()); + for (; i < sentinel; ++i) { mSizes[i].Initialize(percentageBasis, aFunctions.mAutoMinSizing, aFunctions.mAutoMaxSizing); } - uint32_t j = 0; - for (uint32_t len = aFunctions.mMinSizingFunctions.Length(); j < len; ++j) { - mSizes[i + j].Initialize(percentageBasis, - aFunctions.mMinSizingFunctions[j], - aFunctions.mMaxSizingFunctions[j]); + // Now initialize the explicit grid tracks. + sentinel = std::min(i + aFunctions.mMinSizingFunctions.Length(), + mSizes.Length()); + for (uint32_t j = 0; i < sentinel; ++i, ++j) { + mSizes[i].Initialize(percentageBasis, + aFunctions.mMinSizingFunctions[j], + aFunctions.mMaxSizingFunctions[j]); } - i += j; - for (; i < mSizes.Length(); ++i) { + // Finally, initialize the implicit tracks that comes after the explicit grid. + sentinel = mSizes.Length(); + for (; i < sentinel; ++i) { mSizes[i].Initialize(percentageBasis, aFunctions.mAutoMinSizing, aFunctions.mAutoMaxSizing); } mGridGap = aGridGap; - // XXX allow negative values? pending outcome of www-style thread: - // https://lists.w3.org/Archives/Public/www-style/2015Oct/0028.html MOZ_ASSERT(mGridGap >= nscoord(0), "negative grid gap"); } diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index 523de8f520ba..9fee0a12abb2 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -7797,11 +7797,11 @@ SetGridTrackList(const nsCSSValue& aValue, // starting with a (sub list of identifiers), // and alternating between that and . aResult.mIsSubgrid = false; - for (;;) { + for (int32_t line = 1; ; ++line) { AppendGridLineNames(item->mValue, aResult); item = item->mNext; - if (!item) { + if (!item || line == nsStyleGridLine::kMaxLine) { break; } From 08c8793dcd9ec46df8d8f0049d5a067b69723d59 Mon Sep 17 00:00:00 2001 From: Jesse Ruderman Date: Sat, 28 Nov 2015 21:37:44 +0100 Subject: [PATCH 058/153] Bug 1225592 - [css-grid] Crashtest. --- layout/generic/crashtests/1225592.html | 13 +++++++++++++ layout/generic/crashtests/crashtests.list | 1 + 2 files changed, 14 insertions(+) create mode 100644 layout/generic/crashtests/1225592.html diff --git a/layout/generic/crashtests/1225592.html b/layout/generic/crashtests/1225592.html new file mode 100644 index 000000000000..e4b5e6e6d95b --- /dev/null +++ b/layout/generic/crashtests/1225592.html @@ -0,0 +1,13 @@ + + + +
+
+ +
+ + +
+ + + diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index 2d6415f4212f..c25d31b55113 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -599,6 +599,7 @@ load 1223568-2.html load 1224230-1.html pref(layout.css.grid.enabled,true) load 1225118.html pref(layout.css.grid.enabled,true) load 1225376.html +pref(layout.css.grid.enabled,true) load 1225592.html load first-letter-638937-1.html load first-letter-638937-2.html pref(dom.meta-viewport.enabled,true) test-pref(font.size.inflation.emPerLine,15) asserts(1-100) load font-inflation-762332.html # bug 762332 From 07bd900b5980b3279ef513811e69dac41fb937da Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Sat, 28 Nov 2015 21:37:44 +0100 Subject: [PATCH 059/153] Bug 1227099 - [css-grid] Grid container block-size should include a grid-row-gap between each row. r=dholbert --- layout/generic/nsGridContainerFrame.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp index ab97cfc64b2c..fdb3c430e39f 100644 --- a/layout/generic/nsGridContainerFrame.cpp +++ b/layout/generic/nsGridContainerFrame.cpp @@ -2984,6 +2984,7 @@ nsGridContainerFrame::Reflow(nsPresContext* aPresContext, for (uint32_t i = 0; i < mGridRowEnd; ++i) { bSize += gridReflowState.mRows.mSizes[i].mBase; } + bSize += gridReflowState.mRows.SumOfGridGaps(); } else { bSize = computedBSize; } From 61520ea8331368ca7cdb16e7b796c178a2d8d028 Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Sat, 28 Nov 2015 21:37:44 +0100 Subject: [PATCH 060/153] Bug 1227099 - [css-grid] Additional reftests for 'grid-row-gap'. --- .../css-grid/grid-row-gap-002-ref.html | 120 +++++++++++++++++ .../reftests/css-grid/grid-row-gap-002.html | 97 ++++++++++++++ .../css-grid/grid-row-gap-003-ref.html | 122 ++++++++++++++++++ .../reftests/css-grid/grid-row-gap-003.html | 99 ++++++++++++++ .../css-grid/grid-row-gap-004-ref.html | 118 +++++++++++++++++ .../reftests/css-grid/grid-row-gap-004.html | 99 ++++++++++++++ layout/reftests/css-grid/reftest.list | 5 +- 7 files changed, 659 insertions(+), 1 deletion(-) create mode 100644 layout/reftests/css-grid/grid-row-gap-002-ref.html create mode 100644 layout/reftests/css-grid/grid-row-gap-002.html create mode 100644 layout/reftests/css-grid/grid-row-gap-003-ref.html create mode 100644 layout/reftests/css-grid/grid-row-gap-003.html create mode 100644 layout/reftests/css-grid/grid-row-gap-004-ref.html create mode 100644 layout/reftests/css-grid/grid-row-gap-004.html diff --git a/layout/reftests/css-grid/grid-row-gap-002-ref.html b/layout/reftests/css-grid/grid-row-gap-002-ref.html new file mode 100644 index 000000000000..27e1da041e83 --- /dev/null +++ b/layout/reftests/css-grid/grid-row-gap-002-ref.html @@ -0,0 +1,120 @@ + + + + + Reference: 'grid-row-gap' + + + + + + + + + diff --git a/layout/reftests/css-grid/grid-row-gap-002.html b/layout/reftests/css-grid/grid-row-gap-002.html new file mode 100644 index 000000000000..8be50dd368b2 --- /dev/null +++ b/layout/reftests/css-grid/grid-row-gap-002.html @@ -0,0 +1,97 @@ + + + + + CSS Grid Test: 'grid-row-gap' + + + + + + + + + + + diff --git a/layout/reftests/css-grid/grid-row-gap-003-ref.html b/layout/reftests/css-grid/grid-row-gap-003-ref.html new file mode 100644 index 000000000000..257d5d2f50da --- /dev/null +++ b/layout/reftests/css-grid/grid-row-gap-003-ref.html @@ -0,0 +1,122 @@ + + + + + Reference: 'grid-row-gap' sideways-lr + + + + + + + + + diff --git a/layout/reftests/css-grid/grid-row-gap-003.html b/layout/reftests/css-grid/grid-row-gap-003.html new file mode 100644 index 000000000000..02e0c318b6f5 --- /dev/null +++ b/layout/reftests/css-grid/grid-row-gap-003.html @@ -0,0 +1,99 @@ + + + + + CSS Grid Test: 'grid-row-gap' sideways-lr + + + + + + + + + + + diff --git a/layout/reftests/css-grid/grid-row-gap-004-ref.html b/layout/reftests/css-grid/grid-row-gap-004-ref.html new file mode 100644 index 000000000000..e29cb7f66f69 --- /dev/null +++ b/layout/reftests/css-grid/grid-row-gap-004-ref.html @@ -0,0 +1,118 @@ + + + + + Reference: 'grid-row-gap' sideways-rl + + + + + + + + + diff --git a/layout/reftests/css-grid/grid-row-gap-004.html b/layout/reftests/css-grid/grid-row-gap-004.html new file mode 100644 index 000000000000..f1667035e0e9 --- /dev/null +++ b/layout/reftests/css-grid/grid-row-gap-004.html @@ -0,0 +1,99 @@ + + + + + CSS Grid Test: 'grid-row-gap' sideways-rl + + + + + + + + + + + diff --git a/layout/reftests/css-grid/reftest.list b/layout/reftests/css-grid/reftest.list index ab5a32357a38..060e34531c3a 100644 --- a/layout/reftests/css-grid/reftest.list +++ b/layout/reftests/css-grid/reftest.list @@ -73,4 +73,7 @@ fuzzy-if(winWidget,1,36) == grid-auto-min-sizing-definite-001.html grid-auto-min == grid-column-gap-001.html grid-column-gap-001-ref.html == grid-column-gap-002.html grid-column-gap-002-ref.html == grid-column-gap-003.html grid-column-gap-003-ref.html -== grid-row-gap-001-ref.html grid-row-gap-001-ref.html +== grid-row-gap-001.html grid-row-gap-001-ref.html +== grid-row-gap-002.html grid-row-gap-002-ref.html +== grid-row-gap-003.html grid-row-gap-003-ref.html +== grid-row-gap-004.html grid-row-gap-004-ref.html From 14b6070460431b5899fe48591803cef8f48182cd Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Sat, 28 Nov 2015 21:37:44 +0100 Subject: [PATCH 061/153] Bug 1227162 - [css-grid][css-align] Make the scrolled pseudo frame inherit more CSS Align / Grid properties. r=dholbert --- layout/style/ua.css | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/layout/style/ua.css b/layout/style/ua.css index 87aaea8cc64a..98ae01904de0 100644 --- a/layout/style/ua.css +++ b/layout/style/ua.css @@ -165,16 +165,28 @@ blocks with overflow: scroll; */ unicode-bidi: inherit; text-overflow: inherit; + /* Multicol container */ -moz-column-count: inherit; -moz-column-width: inherit; -moz-column-gap: inherit; -moz-column-rule: inherit; - /* CSS3 flexbox properties that apply to the flex container: */ - align-content: inherit; - align-items: inherit; + /* Flex container */ flex-direction: inherit; flex-wrap: inherit; + /* Grid container */ + grid-auto-columns: inherit; + grid-auto-rows: inherit; + grid-auto-flow: inherit; + grid-column-gap: inherit; + grid-row-gap: inherit; + grid-template-areas: inherit; + grid-template-columns: inherit; + grid-template-rows: inherit; + /* CSS Align */ + align-content: inherit; + align-items: inherit; justify-content: inherit; + justify-items: inherit; /* Do not change these. nsCSSFrameConstructor depends on them to create a good frame tree. */ position: static !important; From d51e17c2d091b2b295723ce7a9170cf81ed8fe14 Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Sat, 28 Nov 2015 21:37:44 +0100 Subject: [PATCH 062/153] Bug 1227162 - [css-grid] Reftests for grid container with overflow:hidden. --- .../grid-container-overflow-001-ref.html | 113 ++++++++++++++++ .../css-grid/grid-container-overflow-001.html | 124 ++++++++++++++++++ layout/reftests/css-grid/reftest.list | 1 + 3 files changed, 238 insertions(+) create mode 100644 layout/reftests/css-grid/grid-container-overflow-001-ref.html create mode 100644 layout/reftests/css-grid/grid-container-overflow-001.html diff --git a/layout/reftests/css-grid/grid-container-overflow-001-ref.html b/layout/reftests/css-grid/grid-container-overflow-001-ref.html new file mode 100644 index 000000000000..ace9dfdc6176 --- /dev/null +++ b/layout/reftests/css-grid/grid-container-overflow-001-ref.html @@ -0,0 +1,113 @@ + + + + + Reference: overflow:hidden/auto + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ + + diff --git a/layout/reftests/css-grid/grid-container-overflow-001.html b/layout/reftests/css-grid/grid-container-overflow-001.html new file mode 100644 index 000000000000..1279d4c1c365 --- /dev/null +++ b/layout/reftests/css-grid/grid-container-overflow-001.html @@ -0,0 +1,124 @@ + + + + + CSS Grid Test: overflow:hidden/auto + + + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ + + diff --git a/layout/reftests/css-grid/reftest.list b/layout/reftests/css-grid/reftest.list index 060e34531c3a..19ca69dae42a 100644 --- a/layout/reftests/css-grid/reftest.list +++ b/layout/reftests/css-grid/reftest.list @@ -77,3 +77,4 @@ fuzzy-if(winWidget,1,36) == grid-auto-min-sizing-definite-001.html grid-auto-min == grid-row-gap-002.html grid-row-gap-002-ref.html == grid-row-gap-003.html grid-row-gap-003-ref.html == grid-row-gap-004.html grid-row-gap-004-ref.html +== grid-container-overflow-001.html grid-container-overflow-001-ref.html From 5df657f9e04826455bd59512bf12e463bcd1d3f6 Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Sat, 28 Nov 2015 21:37:44 +0100 Subject: [PATCH 063/153] Bug 1225368 - [css-grid] Make CollectGrowable() deal with frozen tracks; i.e. subtract their base size but don't collect them since they aren't growable. r=dholbert --- layout/generic/nsGridContainerFrame.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp index fdb3c430e39f..d1acf79976a1 100644 --- a/layout/generic/nsGridContainerFrame.cpp +++ b/layout/generic/nsGridContainerFrame.cpp @@ -271,9 +271,11 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::Tracks const LineRange& aRange, nsIFrame* aGridItem); /** - * Collect the tracks which are growable (matching aSelector) and return - * aAvailableSpace minus the sum of mBase's in aPlan for the tracks - * in aRange, or 0 if this subtraction goes below 0. + * Collect the tracks which are growable (matching aSelector) into + * aGrowableTracks, and return the amount of space that can be used + * to grow those tracks. Specifically, we return aAvailableSpace minus + * the sum of mBase's in aPlan (clamped to 0) for the tracks in aRange, + * or zero when there are no growable tracks. * @note aPlan[*].mBase represents a planned new base or limit. */ static nscoord CollectGrowable(nscoord aAvailableSpace, @@ -288,16 +290,15 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::Tracks const uint32_t end = aRange.mEnd; for (uint32_t i = start; i < end; ++i) { const TrackSize& sz = aPlan[i]; - MOZ_ASSERT(!sz.IsFrozen()); space -= sz.mBase; if (space <= 0) { return 0; } - if (sz.mState & aSelector) { + if ((sz.mState & aSelector) && !sz.IsFrozen()) { aGrowableTracks.AppendElement(i); } } - return space; + return aGrowableTracks.IsEmpty() ? 0 : space; } void SetupGrowthPlan(nsTArray& aPlan, From 06f39bb949d70b3c0ca95b443220043b79194887 Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Sat, 28 Nov 2015 21:37:44 +0100 Subject: [PATCH 064/153] Bug 1225368 - [css-grid] More Track Sizing reftests. --- .../css-grid/grid-track-sizing-002-ref.html | 243 ++++++++++++++++++ .../css-grid/grid-track-sizing-002.html | 238 +++++++++++++++++ layout/reftests/css-grid/reftest.list | 1 + 3 files changed, 482 insertions(+) create mode 100644 layout/reftests/css-grid/grid-track-sizing-002-ref.html create mode 100644 layout/reftests/css-grid/grid-track-sizing-002.html diff --git a/layout/reftests/css-grid/grid-track-sizing-002-ref.html b/layout/reftests/css-grid/grid-track-sizing-002-ref.html new file mode 100644 index 000000000000..170283b35dda --- /dev/null +++ b/layout/reftests/css-grid/grid-track-sizing-002-ref.html @@ -0,0 +1,243 @@ + + + + + Reference: freezing tracks in step 2.5 of the Track Sizing Algorithm + + + + + +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + + diff --git a/layout/reftests/css-grid/grid-track-sizing-002.html b/layout/reftests/css-grid/grid-track-sizing-002.html new file mode 100644 index 000000000000..e09818fb2004 --- /dev/null +++ b/layout/reftests/css-grid/grid-track-sizing-002.html @@ -0,0 +1,238 @@ + + + + + CSS Grid Test: freezing tracks in step 2.5 of the Track Sizing Algorithm + + + + + + + +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + + diff --git a/layout/reftests/css-grid/reftest.list b/layout/reftests/css-grid/reftest.list index 19ca69dae42a..bdf337780c7e 100644 --- a/layout/reftests/css-grid/reftest.list +++ b/layout/reftests/css-grid/reftest.list @@ -13,6 +13,7 @@ fails == grid-whitespace-handling-1b.xhtml grid-whitespace-handling-1-ref.xhtml == grid-placement-auto-col-dense-001.html grid-placement-auto-col-dense-001-ref.html == grid-placement-implicit-named-areas-001.html grid-placement-implicit-named-areas-001-ref.html == grid-track-sizing-001.html grid-track-sizing-001-ref.html +== grid-track-sizing-002.html grid-track-sizing-002-ref.html == grid-abspos-items-001.html grid-abspos-items-001-ref.html == grid-abspos-items-002.html grid-abspos-items-002-ref.html == grid-abspos-items-003.html grid-abspos-items-003-ref.html From 6ca8e09bc1a3236d322e7a6828a1606c733f8f2b Mon Sep 17 00:00:00 2001 From: Simon Montagu Date: Sun, 25 Oct 2015 23:53:21 -0700 Subject: [PATCH 065/153] Bug 1218179: move from transitional to non-transitional IDNA2008 processing, r=jfkthame --- netwerk/dns/nsIDNService.cpp | 10 +++++----- netwerk/test/unit/test_idna2008.js | 2 +- netwerk/test/unit/xpcshell.ini | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/netwerk/dns/nsIDNService.cpp b/netwerk/dns/nsIDNService.cpp index e2c1b8a2ca76..da027e264246 100644 --- a/netwerk/dns/nsIDNService.cpp +++ b/netwerk/dns/nsIDNService.cpp @@ -18,12 +18,12 @@ #include "punycode.h" #ifdef IDNA2008 -// Currently we use the transitional processing option -- see +// Currently we use the non-transitional processing option -- see // http://unicode.org/reports/tr46/ -// To switch to non-transitional processing, change the value of this flag -// and kTransitionalProcessing in netwerk/test/unit/test_idna2008.js to false -// (patch in bug 1218179). -const bool kIDNA2008_TransitionalProcessing = true; +// To switch to transitional processing, change the value of this flag +// and kTransitionalProcessing in netwerk/test/unit/test_idna2008.js to true +// (revert bug 1218179). +const bool kIDNA2008_TransitionalProcessing = false; #include "ICUUtils.h" #endif diff --git a/netwerk/test/unit/test_idna2008.js b/netwerk/test/unit/test_idna2008.js index 4b4db14ff4a9..9221a0e605ea 100644 --- a/netwerk/test/unit/test_idna2008.js +++ b/netwerk/test/unit/test_idna2008.js @@ -1,4 +1,4 @@ -const kTransitionalProcessing = true; +const kTransitionalProcessing = false; // Four characters map differently under non-transitional processing: const labels = [ diff --git a/netwerk/test/unit/xpcshell.ini b/netwerk/test/unit/xpcshell.ini index ebe9a04eb515..941f4620e7be 100644 --- a/netwerk/test/unit/xpcshell.ini +++ b/netwerk/test/unit/xpcshell.ini @@ -220,6 +220,8 @@ skip-if = bits != 32 [test_idn_blacklist.js] [test_idn_urls.js] [test_idna2008.js] +# IDNA2008 depends on ICU, not available on android +skip-if = os == "android" [test_invalidport.js] [test_localstreams.js] [test_mismatch_last-modified.js] From 6cdcbe459d1a7fca3cfc5228b4f3cd5c9a6e97f2 Mon Sep 17 00:00:00 2001 From: Chris Peterson Date: Fri, 27 Nov 2015 13:24:56 -0800 Subject: [PATCH 066/153] Bug 1226907 - Part 1: Check _write and strerror_r return values in mozjemalloc. r=njn --- memory/mozjemalloc/jemalloc.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c index 7e64ff5d72b8..f08ef722eef1 100644 --- a/memory/mozjemalloc/jemalloc.c +++ b/memory/mozjemalloc/jemalloc.c @@ -1571,10 +1571,16 @@ wrtmessage(const char *p1, const char *p2, const char *p3, const char *p4) #if defined(MOZ_MEMORY) && !defined(MOZ_MEMORY_WINDOWS) #define _write write #endif - _write(STDERR_FILENO, p1, (unsigned int) strlen(p1)); - _write(STDERR_FILENO, p2, (unsigned int) strlen(p2)); - _write(STDERR_FILENO, p3, (unsigned int) strlen(p3)); - _write(STDERR_FILENO, p4, (unsigned int) strlen(p4)); + // Pretend to check _write() errors to suppress gcc warnings about + // warn_unused_result annotations in some versions of glibc headers. + if (_write(STDERR_FILENO, p1, (unsigned int) strlen(p1)) < 0) + return; + if (_write(STDERR_FILENO, p2, (unsigned int) strlen(p2)) < 0) + return; + if (_write(STDERR_FILENO, p3, (unsigned int) strlen(p3)) < 0) + return; + if (_write(STDERR_FILENO, p4, (unsigned int) strlen(p4)) < 0) + return; } MOZ_JEMALLOC_API @@ -2446,9 +2452,10 @@ pages_map(void *addr, size_t size) if (munmap(ret, size) == -1) { char buf[STRERROR_BUF]; - strerror_r(errno, buf, sizeof(buf)); - _malloc_message(_getprogname(), - ": (malloc) Error in munmap(): ", buf, "\n"); + if (strerror_r(errno, buf, sizeof(buf)) == 0) { + _malloc_message(_getprogname(), + ": (malloc) Error in munmap(): ", buf, "\n"); + } if (opt_abort) abort(); } @@ -2475,9 +2482,10 @@ pages_unmap(void *addr, size_t size) if (munmap(addr, size) == -1) { char buf[STRERROR_BUF]; - strerror_r(errno, buf, sizeof(buf)); - _malloc_message(_getprogname(), - ": (malloc) Error in munmap(): ", buf, "\n"); + if (strerror_r(errno, buf, sizeof(buf)) == 0) { + _malloc_message(_getprogname(), + ": (malloc) Error in munmap(): ", buf, "\n"); + } if (opt_abort) abort(); } From 18028bbae14619e076e31772dc7b5fec5f05effc Mon Sep 17 00:00:00 2001 From: Chris Peterson Date: Sun, 15 Nov 2015 13:21:56 -0800 Subject: [PATCH 067/153] Bug 1226907 - Part 2: Fix warnings in mozjemalloc and remove ALLOW_COMPILER_WARNINGS. r=glandium --- memory/mozjemalloc/jemalloc.c | 10 +++++++++- memory/mozjemalloc/moz.build | 6 +++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c index f08ef722eef1..ee9e28853749 100644 --- a/memory/mozjemalloc/jemalloc.c +++ b/memory/mozjemalloc/jemalloc.c @@ -435,7 +435,9 @@ static const bool isthreaded = true; #define JEMALLOC_USES_MAP_ALIGN /* Required on Solaris 10. Might improve performance elsewhere. */ #endif +#ifndef __DECONST #define __DECONST(type, var) ((type)(uintptr_t)(const void *)(var)) +#endif #ifdef MOZ_MEMORY_WINDOWS /* MSVC++ does not support C99 variable-length arrays. */ @@ -1607,6 +1609,12 @@ void (*_malloc_message)(const char *p1, const char *p2, const char *p3, // Note: MozTaggedAnonymousMmap() could call an LD_PRELOADed mmap // instead of the one defined here; use only MozTagAnonymousMemory(). +#ifdef MOZ_MEMORY_ANDROID +// Android's pthread.h does not declare pthread_atfork() until SDK 21. +extern MOZ_EXPORT +int pthread_atfork(void (*)(void), void (*)(void), void(*)(void)); +#endif + /* RELEASE_ASSERT calls jemalloc_crash() instead of calling MOZ_CRASH() * directly because we want crashing to add a frame to the stack. This makes * it easier to find the failing assertion in crash stacks. */ @@ -4974,7 +4982,7 @@ arena_new(arena_t *arena) bin->runcur = NULL; arena_run_tree_new(&bin->runs); - bin->reg_size = (1U << (TINY_MIN_2POW + i)); + bin->reg_size = (1ULL << (TINY_MIN_2POW + i)); prev_run_size = arena_bin_run_size_calc(bin, prev_run_size); diff --git a/memory/mozjemalloc/moz.build b/memory/mozjemalloc/moz.build index 7aac8328e5fa..b4eddfd8cfd0 100644 --- a/memory/mozjemalloc/moz.build +++ b/memory/mozjemalloc/moz.build @@ -42,8 +42,8 @@ LOCAL_INCLUDES += [ '/memory/build', ] -# XXX: We should fix these warnings. -ALLOW_COMPILER_WARNINGS = True - if CONFIG['GNU_CC']: CFLAGS += ['-Wshadow'] + +if CONFIG['_MSC_VER']: + CFLAGS += ['-wd4273'] # inconsistent dll linkage (bug 558163) From 44d581458a1d2a0ea58a46cf00a3df5aa0f59bc7 Mon Sep 17 00:00:00 2001 From: Chris Peterson Date: Sun, 8 Nov 2015 22:46:00 -0800 Subject: [PATCH 068/153] Bug 1223258 - Fix -Wunreachable-code warnings in widget. r=masayuki widget/tests/TestAppShellSteadyState.cpp:397:5: warning: code will never be executed [-Wunreachable-code] widget\widgetutils.cpp(95) : warning C4702: unreachable code widget\mouseevents.h(97) : warning C4702: unreachable code widget\textevents.h(492) : warning C4702: unreachable code --- widget/MouseEvents.h | 1 - widget/TextEvents.h | 1 - widget/WidgetUtils.cpp | 1 - widget/tests/TestAppShellSteadyState.cpp | 4 ++-- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/widget/MouseEvents.h b/widget/MouseEvents.h index c913af299510..f4056c67010b 100644 --- a/widget/MouseEvents.h +++ b/widget/MouseEvents.h @@ -94,7 +94,6 @@ public: virtual WidgetEvent* Duplicate() const override { MOZ_CRASH("WidgetMouseEventBase must not be most-subclass"); - return nullptr; } /// The possible related target diff --git a/widget/TextEvents.h b/widget/TextEvents.h index 53a4fe1bd5ce..15f112ac3d15 100644 --- a/widget/TextEvents.h +++ b/widget/TextEvents.h @@ -489,7 +489,6 @@ public: NS_ASSERTION(!IsAllowedToDispatchDOMEvent(), "WidgetQueryContentEvent needs to support Duplicate()"); MOZ_CRASH("WidgetQueryContentEvent doesn't support Duplicate()"); - return nullptr; } void InitForQueryTextContent(uint32_t aOffset, uint32_t aLength, diff --git a/widget/WidgetUtils.cpp b/widget/WidgetUtils.cpp index fe15181d0210..95bbb8475f43 100644 --- a/widget/WidgetUtils.cpp +++ b/widget/WidgetUtils.cpp @@ -92,7 +92,6 @@ nsIntRect RotateRect(nsIntRect aRect, aRect.height, aRect.width); default: MOZ_CRASH("Unknown rotation"); - return aRect; } } diff --git a/widget/tests/TestAppShellSteadyState.cpp b/widget/tests/TestAppShellSteadyState.cpp index 8156335c97a9..b7e05a976c00 100644 --- a/widget/tests/TestAppShellSteadyState.cpp +++ b/widget/tests/TestAppShellSteadyState.cpp @@ -391,8 +391,7 @@ Test4Internal(nsIAppShell* aAppShell) #ifndef XP_WIN // Not sure how to test on other platforms. return false; -#endif - +#else nsCOMPtr appService = do_GetService(NS_APPSHELLSERVICE_CONTRACTID); if (!appService) { @@ -437,6 +436,7 @@ Test4Internal(nsIAppShell* aAppShell) } return true; +#endif } void From 5ab3a4ac26565358816adf2ad02e7f5dadca4717 Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Thu, 26 Nov 2015 13:02:00 -0800 Subject: [PATCH 069/153] Bug 1228430 - Move build.gradle out of mobile/android/base. r=me DONTBUILD NPOTB --HG-- rename : mobile/android/base/build.gradle => mobile/android/app/base/build.gradle extra : commitid : EhT7Osnyxex --- mobile/android/{ => app}/base/build.gradle | 8 ++++---- settings.gradle | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) rename mobile/android/{ => app}/base/build.gradle (95%) diff --git a/mobile/android/base/build.gradle b/mobile/android/app/base/build.gradle similarity index 95% rename from mobile/android/base/build.gradle rename to mobile/android/app/base/build.gradle index 492d02e0865f..b8c8b1ca8ee4 100644 --- a/mobile/android/base/build.gradle +++ b/mobile/android/app/base/build.gradle @@ -24,10 +24,10 @@ android { sourceSets { main { - manifest.srcFile 'AndroidManifest.xml' + manifest.srcFile "${topsrcdir}/mobile/android/base/AndroidManifest.xml" + java { srcDir "${topobjdir}/gradle/base/src" - exclude 'org/mozilla/gecko/resources/**' srcDir "${topsrcdir}/mobile/android/search/java" srcDir "${topsrcdir}/mobile/android/javaaddons/java" @@ -64,9 +64,9 @@ android { res { srcDir "${topsrcdir}/${mozconfig.substs.MOZ_BRANDING_DIRECTORY}/res" srcDir "${project.buildDir}/generated/source/preprocessed_resources" // See syncPreprocessedResources. - srcDir 'resources' + srcDir "${topsrcdir}/mobile/android/base/resources" if (mozconfig.substs.MOZ_CRASHREPORTER) { - srcDir 'crashreporter/res' + srcDir "${topsrcdir}/mobile/android/base/crashreporter/res" } } } diff --git a/settings.gradle b/settings.gradle index db0e215ef37c..7e37c23c25e3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -46,7 +46,7 @@ include ':omnijar' include ':thirdparty' project(':app').projectDir = new File("${json.topsrcdir}/mobile/android/app") -project(':base').projectDir = new File("${json.topsrcdir}/mobile/android/base") +project(':base').projectDir = new File("${json.topsrcdir}/mobile/android/app/base") project(':omnijar').projectDir = new File("${json.topsrcdir}/mobile/android/app/omnijar") project(':thirdparty').projectDir = new File("${json.topsrcdir}/mobile/android/thirdparty") From 9eb59dcd5303d875e9de0e527e86916c91a7ce52 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 11:53:30 +0000 Subject: [PATCH 070/153] Bug 1227885 - Improve stubbing of audio requests to avoid intermittent console warnings and also improve caught errors output. r=mikedeboer --- browser/components/loop/test/shared/loop_mocha_utils.js | 6 +++++- .../loop/test/standalone/standaloneRoomViews_test.js | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/browser/components/loop/test/shared/loop_mocha_utils.js b/browser/components/loop/test/shared/loop_mocha_utils.js index 800d9e9cda7b..634660768dd7 100644 --- a/browser/components/loop/test/shared/loop_mocha_utils.js +++ b/browser/components/loop/test/shared/loop_mocha_utils.js @@ -258,7 +258,11 @@ var LoopMochaUtils = (function(global, _) { }; console.error = function() { var args = Array.slice(arguments); - gCaughtIssues.push(args); + try { + throw new Error(); + } catch (e) { + gCaughtIssues.push([args, e.stack]); + } consoleError.apply(console, args); }; } diff --git a/browser/components/loop/test/standalone/standaloneRoomViews_test.js b/browser/components/loop/test/standalone/standaloneRoomViews_test.js index 395a9c34b029..808d411e302e 100644 --- a/browser/components/loop/test/standalone/standaloneRoomViews_test.js +++ b/browser/components/loop/test/standalone/standaloneRoomViews_test.js @@ -20,7 +20,7 @@ describe("loop.standaloneRoomViews", function() { var clock, fakeWindow, view; beforeEach(function() { - sandbox = sinon.sandbox.create(); + sandbox = LoopMochaUtils.createSandbox(); dispatcher = new loop.Dispatcher(); dispatch = sandbox.stub(dispatcher, "dispatch"); activeRoomStore = new loop.store.ActiveRoomStore(dispatcher, { @@ -59,6 +59,11 @@ describe("loop.standaloneRoomViews", function() { // Prevents audio request errors in the test console. sandbox.useFakeXMLHttpRequest(); + sandbox.stub(sharedUtils, "isDesktop").returns(true); + LoopMochaUtils.stubLoopRequest({ + GetDoNotDisturb: sinon.stub().returns(true), + GetLoopPref: sinon.stub() + }); }); afterEach(function() { From 33f113a021c79edb7d95708ba2b9bb6ee01a4f47 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 11 Nov 2015 12:29:07 +0100 Subject: [PATCH 071/153] Bug 1189336 - (Part 1) Rename RestrictedProfiles to Restrictions. r=ally RestrictedProfiles: The name of the class can be confusing because it handles guest profiles and restricted profiles. We might even query it from a normal profile. --HG-- rename : mobile/android/base/RestrictedProfiles.java => mobile/android/base/Restrictions.java extra : commitid : BtjvH8aWSlk extra : rebase_source : 262c9537d7e93658ceea6f94c8481a393ddd3072 --- mobile/android/base/AccountsHelper.java | 2 +- mobile/android/base/BrowserApp.java | 16 ++++++------ mobile/android/base/GeckoApp.java | 2 +- ...trictedProfiles.java => Restrictions.java} | 2 +- mobile/android/base/db/LocalBrowserDB.java | 10 +++---- mobile/android/base/db/SuggestedSites.java | 5 ++-- .../android/base/firstrun/FirstrunPager.java | 4 +-- mobile/android/base/home/HistoryPanel.java | 10 +++---- .../base/home/HomeConfigPrefsBackend.java | 4 +-- mobile/android/base/home/HomeFragment.java | 4 +-- mobile/android/base/home/TopSitesPanel.java | 8 +++--- mobile/android/base/moz.build | 2 +- .../preferences/AndroidImportPreference.java | 4 +-- .../base/preferences/GeckoPreferences.java | 26 +++++++++---------- .../RestrictionConfiguration.java | 2 +- mobile/android/base/tabs/TabsPanel.java | 6 ++--- .../mozilla/gecko/tests/testRestrictions.java | 4 +-- .../nsParentalControlsServiceAndroid.cpp | 4 +-- widget/android/GeneratedJNIWrappers.cpp | 14 +++++----- widget/android/GeneratedJNIWrappers.h | 18 ++++++------- 20 files changed, 70 insertions(+), 77 deletions(-) rename mobile/android/base/{RestrictedProfiles.java => Restrictions.java} (99%) diff --git a/mobile/android/base/AccountsHelper.java b/mobile/android/base/AccountsHelper.java index 5ff4ce0a1ac9..bb3fd907ec08 100644 --- a/mobile/android/base/AccountsHelper.java +++ b/mobile/android/base/AccountsHelper.java @@ -83,7 +83,7 @@ public class AccountsHelper implements NativeEventListener { @Override public void handleMessage(String event, NativeJSObject message, final EventCallback callback) { - if (!RestrictedProfiles.isAllowed(mContext, Restriction.DISALLOW_MODIFY_ACCOUNTS)) { + if (!Restrictions.isAllowed(mContext, Restriction.DISALLOW_MODIFY_ACCOUNTS)) { // We register for messages in all contexts; we drop, with a log and an error to JavaScript, // when the profile is restricted. It's better to return errors than silently ignore messages. Log.e(LOGTAG, "Profile is not allowed to modify accounts! Ignoring event: " + event); diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index 92a0e0142f3d..c02bc0e916ca 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -1793,7 +1793,7 @@ public class BrowserApp extends GeckoApp } } - if (AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED && RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_LOCATION_SERVICE)) { + if (AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED && Restrictions.isAllowed(this, Restriction.DISALLOW_LOCATION_SERVICE)) { // Start (this acts as ping if started already) the stumbler lib; if the stumbler has queued data it will upload it. // Stumbler operates on its own thread, and startup impact is further minimized by delaying work (such as upload) a few seconds. // Avoid any potential startup CPU/thread contention by delaying the pref broadcast. @@ -2497,7 +2497,7 @@ public class BrowserApp extends GeckoApp }); // Don't show the banner in guest mode. - if (!RestrictedProfiles.isUserRestricted()) { + if (!Restrictions.isUserRestricted()) { final ViewStub homeBannerStub = (ViewStub) findViewById(R.id.home_banner_stub); final HomeBanner homeBanner = (HomeBanner) homeBannerStub.inflate(); mHomePager.setBanner(homeBanner); @@ -3084,11 +3084,11 @@ public class BrowserApp extends GeckoApp } // Disable share menuitem for about:, chrome:, file:, and resource: URIs - final boolean shareVisible = RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_SHARE); + final boolean shareVisible = Restrictions.isAllowed(this, Restriction.DISALLOW_SHARE); share.setVisible(shareVisible); final boolean shareEnabled = StringUtils.isShareableUrl(url) && shareVisible; share.setEnabled(shareEnabled); - MenuUtils.safeSetEnabled(aMenu, R.id.downloads, RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_DOWNLOADS)); + MenuUtils.safeSetEnabled(aMenu, R.id.downloads, Restrictions.isAllowed(this, Restriction.DISALLOW_DOWNLOADS)); // NOTE: Use MenuUtils.safeSetEnabled because some actions might // be on the BrowserToolbar context menu. @@ -3151,7 +3151,7 @@ public class BrowserApp extends GeckoApp } } - final boolean privateTabVisible = RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING); + final boolean privateTabVisible = Restrictions.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING); MenuUtils.safeSetVisible(aMenu, R.id.new_private_tab, privateTabVisible); // Disable PDF generation (save and print) for about:home and xul pages. @@ -3173,11 +3173,11 @@ public class BrowserApp extends GeckoApp enterGuestMode.setVisible(true); } - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_GUEST_BROWSING)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_GUEST_BROWSING)) { MenuUtils.safeSetVisible(aMenu, R.id.new_guest_session, false); } - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_INSTALL_EXTENSION)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_INSTALL_EXTENSION)) { MenuUtils.safeSetVisible(aMenu, R.id.addons, false); } @@ -3796,7 +3796,7 @@ public class BrowserApp extends GeckoApp if (inGuestMode) { return StartupAction.GUEST; } - if (RestrictedProfiles.isRestrictedProfile(this)) { + if (Restrictions.isRestrictedProfile(this)) { return StartupAction.RESTRICTED; } return (passedURL == null ? StartupAction.NORMAL : StartupAction.URL); diff --git a/mobile/android/base/GeckoApp.java b/mobile/android/base/GeckoApp.java index 93adfa3e6181..0d5c8bd2ec6a 100644 --- a/mobile/android/base/GeckoApp.java +++ b/mobile/android/base/GeckoApp.java @@ -2081,7 +2081,7 @@ public abstract class GeckoApp } }); - RestrictedProfiles.update(this); + Restrictions.update(this); } @Override diff --git a/mobile/android/base/RestrictedProfiles.java b/mobile/android/base/Restrictions.java similarity index 99% rename from mobile/android/base/RestrictedProfiles.java rename to mobile/android/base/Restrictions.java index d2e0c1007d80..2b5e30fc89f0 100644 --- a/mobile/android/base/RestrictedProfiles.java +++ b/mobile/android/base/Restrictions.java @@ -22,7 +22,7 @@ import android.os.UserManager; import android.util.Log; @RobocopTarget -public class RestrictedProfiles { +public class Restrictions { private static final String LOGTAG = "GeckoRestrictedProfiles"; private static RestrictionConfiguration configuration; diff --git a/mobile/android/base/db/LocalBrowserDB.java b/mobile/android/base/db/LocalBrowserDB.java index d036b8924632..1d6bf309b867 100644 --- a/mobile/android/base/db/LocalBrowserDB.java +++ b/mobile/android/base/db/LocalBrowserDB.java @@ -6,7 +6,6 @@ package org.mozilla.gecko.db; import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.InputStream; import java.lang.IllegalAccessException; import java.lang.NoSuchFieldException; @@ -25,22 +24,19 @@ import org.json.JSONException; import org.json.JSONObject; import org.mozilla.gecko.AboutPages; import org.mozilla.gecko.annotation.RobocopTarget; -import org.mozilla.gecko.AppConstants; import org.mozilla.gecko.R; import org.mozilla.gecko.db.BrowserContract.Bookmarks; import org.mozilla.gecko.db.BrowserContract.Combined; import org.mozilla.gecko.db.BrowserContract.ExpirePriority; import org.mozilla.gecko.db.BrowserContract.Favicons; import org.mozilla.gecko.db.BrowserContract.History; -import org.mozilla.gecko.db.BrowserContract.ReadingListItems; -import org.mozilla.gecko.db.BrowserContract.SearchHistory; import org.mozilla.gecko.db.BrowserContract.SyncColumns; import org.mozilla.gecko.db.BrowserContract.Thumbnails; import org.mozilla.gecko.distribution.Distribution; import org.mozilla.gecko.favicons.decoders.FaviconDecoder; import org.mozilla.gecko.favicons.decoders.LoadFaviconResult; import org.mozilla.gecko.gfx.BitmapUtils; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.util.GeckoJarReader; import org.mozilla.gecko.util.StringUtils; @@ -225,7 +221,7 @@ public class LocalBrowserDB implements BrowserDB { } try { - if (RestrictedProfiles.isRestrictedProfile(context)) { + if (Restrictions.isRestrictedProfile(context)) { // matching on variable name from strings.xml.in final String addons = "bookmarkdefaults_title_addons"; final String regularSumo = "bookmarkdefaults_title_support"; @@ -233,7 +229,7 @@ public class LocalBrowserDB implements BrowserDB { continue; } } - if (!RestrictedProfiles.isRestrictedProfile(context)) { + if (!Restrictions.isRestrictedProfile(context)) { // if we're not in kidfox, skip the kidfox specific bookmark(s) if (name.startsWith("bookmarkdefaults_title_restricted")) { continue; diff --git a/mobile/android/base/db/SuggestedSites.java b/mobile/android/base/db/SuggestedSites.java index 3708435c121e..62eda00579ac 100644 --- a/mobile/android/base/db/SuggestedSites.java +++ b/mobile/android/base/db/SuggestedSites.java @@ -40,8 +40,7 @@ import org.mozilla.gecko.GeckoProfile; import org.mozilla.gecko.Locales; import org.mozilla.gecko.R; import org.mozilla.gecko.distribution.Distribution; -import org.mozilla.gecko.db.BrowserContract; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.preferences.GeckoPreferences; import org.mozilla.gecko.util.RawResource; import org.mozilla.gecko.util.ThreadUtils; @@ -512,7 +511,7 @@ public class SuggestedSites { continue; } - final boolean restrictedProfile = RestrictedProfiles.isRestrictedProfile(context); + final boolean restrictedProfile = Restrictions.isRestrictedProfile(context); if (restrictedProfile == site.restricted) { final RowBuilder row = cursor.newRow(); diff --git a/mobile/android/base/firstrun/FirstrunPager.java b/mobile/android/base/firstrun/FirstrunPager.java index 5fd40e580fce..8ad750761d0e 100644 --- a/mobile/android/base/firstrun/FirstrunPager.java +++ b/mobile/android/base/firstrun/FirstrunPager.java @@ -18,7 +18,7 @@ import com.nineoldandroids.animation.AnimatorSet; import com.nineoldandroids.animation.ObjectAnimator; import com.nineoldandroids.view.ViewHelper; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; import org.mozilla.gecko.animation.TransitionsTracker; @@ -64,7 +64,7 @@ public class FirstrunPager extends ViewPager { public void load(Context appContext, FragmentManager fm, final FirstrunPane.OnFinishListener onFinishListener) { final List panels; - if (RestrictedProfiles.isUserRestricted(context)) { + if (Restrictions.isUserRestricted(context)) { panels = FirstrunPagerConfig.getRestricted(); } else { panels = FirstrunPagerConfig.getDefault(appContext); diff --git a/mobile/android/base/home/HistoryPanel.java b/mobile/android/base/home/HistoryPanel.java index 8c24d564d7c5..a57de82ff587 100644 --- a/mobile/android/base/home/HistoryPanel.java +++ b/mobile/android/base/home/HistoryPanel.java @@ -18,9 +18,8 @@ import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoAppShell; import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.GeckoProfile; -import org.mozilla.gecko.GeckoScreenOrientation; import org.mozilla.gecko.R; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; import org.mozilla.gecko.db.BrowserContract.Combined; @@ -35,7 +34,6 @@ import android.app.AlertDialog; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; -import android.content.res.Configuration; import android.database.Cursor; import android.graphics.Typeface; import android.os.Bundle; @@ -226,7 +224,7 @@ public class HistoryPanel extends HomeFragment { public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); - if (!RestrictedProfiles.isAllowed(getActivity(), Restriction.DISALLOW_CLEAR_HISTORY)) { + if (!Restrictions.isAllowed(getActivity(), Restriction.DISALLOW_CLEAR_HISTORY)) { menu.findItem(R.id.home_remove).setVisible(false); } } @@ -293,7 +291,7 @@ public class HistoryPanel extends HomeFragment { private void updateUiFromCursor(Cursor c) { if (c != null && c.getCount() > 0) { - if (RestrictedProfiles.isAllowed(getActivity(), Restriction.DISALLOW_CLEAR_HISTORY)) { + if (Restrictions.isAllowed(getActivity(), Restriction.DISALLOW_CLEAR_HISTORY)) { mClearHistoryButton.setVisibility(View.VISIBLE); } return; @@ -324,7 +322,7 @@ public class HistoryPanel extends HomeFragment { emptyHint.setVisibility(View.VISIBLE); } - if (!RestrictedProfiles.isAllowed(getActivity(), Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(getActivity(), Restriction.DISALLOW_PRIVATE_BROWSING)) { emptyHint.setVisibility(View.GONE); } diff --git a/mobile/android/base/home/HomeConfigPrefsBackend.java b/mobile/android/base/home/HomeConfigPrefsBackend.java index 7d86566dcf30..d07950abbe34 100644 --- a/mobile/android/base/home/HomeConfigPrefsBackend.java +++ b/mobile/android/base/home/HomeConfigPrefsBackend.java @@ -15,7 +15,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.mozilla.gecko.GeckoSharedPrefs; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.home.HomeConfig.HomeConfigBackend; import org.mozilla.gecko.home.HomeConfig.OnReloadListener; import org.mozilla.gecko.home.HomeConfig.PanelConfig; @@ -77,7 +77,7 @@ class HomeConfigPrefsBackend implements HomeConfigBackend { panelConfigs.add(createBuiltinPanelConfig(mContext, PanelType.HISTORY)); // We disable Synced Tabs for guest mode / restricted profiles. - if (RestrictedProfiles.isAllowed(mContext, Restriction.DISALLOW_MODIFY_ACCOUNTS)) { + if (Restrictions.isAllowed(mContext, Restriction.DISALLOW_MODIFY_ACCOUNTS)) { panelConfigs.add(createBuiltinPanelConfig(mContext, PanelType.REMOTE_TABS)); } diff --git a/mobile/android/base/home/HomeFragment.java b/mobile/android/base/home/HomeFragment.java index 1c9f4c010e70..37f4adc32044 100644 --- a/mobile/android/base/home/HomeFragment.java +++ b/mobile/android/base/home/HomeFragment.java @@ -13,7 +13,7 @@ import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.GeckoProfile; import org.mozilla.gecko.R; import org.mozilla.gecko.ReaderModeUtils; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; import org.mozilla.gecko.db.BrowserDB; @@ -153,7 +153,7 @@ public abstract class HomeFragment extends Fragment { menu.findItem(R.id.home_share).setVisible(false); } - if (!RestrictedProfiles.isAllowed(view.getContext(), Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(view.getContext(), Restriction.DISALLOW_PRIVATE_BROWSING)) { menu.findItem(R.id.home_open_private_tab).setVisible(false); } diff --git a/mobile/android/base/home/TopSitesPanel.java b/mobile/android/base/home/TopSitesPanel.java index d6e7fd847b83..ff55fcf922f4 100644 --- a/mobile/android/base/home/TopSitesPanel.java +++ b/mobile/android/base/home/TopSitesPanel.java @@ -18,7 +18,7 @@ import java.util.Map; import org.mozilla.gecko.GeckoProfile; import org.mozilla.gecko.Locales; import org.mozilla.gecko.R; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.Tab; import org.mozilla.gecko.Tabs; import org.mozilla.gecko.Telemetry; @@ -343,7 +343,7 @@ public class TopSitesPanel extends HomeFragment { // can handle this. super.onCreateContextMenu(menu, view, menuInfo); - if (!RestrictedProfiles.isAllowed(view.getContext(), Restriction.DISALLOW_CLEAR_HISTORY)) { + if (!Restrictions.isAllowed(view.getContext(), Restriction.DISALLOW_CLEAR_HISTORY)) { menu.findItem(R.id.home_remove).setVisible(false); } @@ -359,7 +359,7 @@ public class TopSitesPanel extends HomeFragment { // Hide unused menu items. menu.findItem(R.id.home_edit_bookmark).setVisible(false); - menu.findItem(R.id.home_remove).setVisible(RestrictedProfiles.isAllowed(context, Restriction.DISALLOW_CLEAR_HISTORY)); + menu.findItem(R.id.home_remove).setVisible(Restrictions.isAllowed(context, Restriction.DISALLOW_CLEAR_HISTORY)); TopSitesGridContextMenuInfo info = (TopSitesGridContextMenuInfo) menuInfo; menu.setHeaderTitle(info.getDisplayTitle()); @@ -381,7 +381,7 @@ public class TopSitesPanel extends HomeFragment { menu.findItem(R.id.home_share).setVisible(false); } - if (!RestrictedProfiles.isAllowed(context, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(context, Restriction.DISALLOW_PRIVATE_BROWSING)) { menu.findItem(R.id.home_open_private_tab).setVisible(false); } diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index b1af2262d472..00bd0fd6fd9f 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -478,7 +478,7 @@ gbjar.sources += [ 'RemoteClientsDialogFragment.java', 'RemoteTabsExpandableListAdapter.java', 'Restarter.java', - 'RestrictedProfiles.java', + 'Restrictions.java', 'restrictions/DefaultConfiguration.java', 'restrictions/GuestProfileConfiguration.java', 'restrictions/RestrictedProfileConfiguration.java', diff --git a/mobile/android/base/preferences/AndroidImportPreference.java b/mobile/android/base/preferences/AndroidImportPreference.java index 0c069e98adbc..6320e47c3967 100644 --- a/mobile/android/base/preferences/AndroidImportPreference.java +++ b/mobile/android/base/preferences/AndroidImportPreference.java @@ -8,7 +8,7 @@ package org.mozilla.gecko.preferences; import org.mozilla.gecko.AppConstants.Versions; import org.mozilla.gecko.R; import org.mozilla.gecko.util.ThreadUtils; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.restrictions.Restriction; import java.util.Set; @@ -28,7 +28,7 @@ class AndroidImportPreference extends MultiPrefMultiChoicePreference { public static class Handler implements GeckoPreferences.PrefHandler { public boolean setupPref(Context context, Preference pref) { // Feature disabled on devices running Android M+ (Bug 1183559) - return Versions.preM && RestrictedProfiles.isAllowed(context, Restriction.DISALLOW_IMPORT_SETTINGS); + return Versions.preM && Restrictions.isAllowed(context, Restriction.DISALLOW_IMPORT_SETTINGS); } public void onChange(Context context, Preference pref, Object newValue) { } diff --git a/mobile/android/base/preferences/GeckoPreferences.java b/mobile/android/base/preferences/GeckoPreferences.java index eb9087605bce..a7db9cd7e796 100644 --- a/mobile/android/base/preferences/GeckoPreferences.java +++ b/mobile/android/base/preferences/GeckoPreferences.java @@ -23,7 +23,7 @@ import org.mozilla.gecko.LocaleManager; import org.mozilla.gecko.Locales; import org.mozilla.gecko.PrefsHelper; import org.mozilla.gecko.R; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; import org.mozilla.gecko.TelemetryContract.Method; @@ -463,7 +463,7 @@ OnSharedPreferenceChangeListener while (iterator.hasNext()) { Header header = iterator.next(); - if (header.id == R.id.pref_header_advanced && !RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_ADVANCED_SETTINGS)) { + if (header.id == R.id.pref_header_advanced && !Restrictions.isAllowed(this, Restriction.DISALLOW_ADVANCED_SETTINGS)) { iterator.remove(); } } @@ -678,7 +678,7 @@ OnSharedPreferenceChangeListener continue; } } else if (PREFS_SCREEN_ADVANCED.equals(key) && - !RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_ADVANCED_SETTINGS)) { + !Restrictions.isAllowed(this, Restriction.DISALLOW_ADVANCED_SETTINGS)) { preferences.removePreference(pref); i--; continue; @@ -694,7 +694,7 @@ OnSharedPreferenceChangeListener } } else if (PREFS_OPEN_URLS_IN_PRIVATE.equals(key)) { // Remove UI for opening external links in private browsing on non-Nightly builds. - if (!AppConstants.NIGHTLY_BUILD || !RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!AppConstants.NIGHTLY_BUILD || !Restrictions.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING)) { preferences.removePreference(pref); i--; continue; @@ -734,19 +734,19 @@ OnSharedPreferenceChangeListener } } else if (PREFS_GEO_REPORTING.equals(key) || PREFS_GEO_LEARN_MORE.equals(key)) { - if (!AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED || !RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_LOCATION_SERVICE)) { + if (!AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED || !Restrictions.isAllowed(this, Restriction.DISALLOW_LOCATION_SERVICE)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_DEVTOOLS_REMOTE_USB_ENABLED.equals(key)) { - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_REMOTE_DEBUGGING)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_REMOTE_DEBUGGING)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_DEVTOOLS_REMOTE_WIFI_ENABLED.equals(key)) { - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_REMOTE_DEBUGGING)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_REMOTE_DEBUGGING)) { preferences.removePreference(pref); i--; continue; @@ -759,7 +759,7 @@ OnSharedPreferenceChangeListener } } else if (PREFS_DEVTOOLS_REMOTE_LINK.equals(key)) { // Remove the "Learn more" link if remote debugging is disabled - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_REMOTE_DEBUGGING)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_REMOTE_DEBUGGING)) { preferences.removePreference(pref); i--; continue; @@ -776,7 +776,7 @@ OnSharedPreferenceChangeListener continue; } else if (PREFS_SYNC.equals(key)) { // Don't show sync prefs while in guest mode. - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_MODIFY_ACCOUNTS)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_MODIFY_ACCOUNTS)) { preferences.removePreference(pref); i--; continue; @@ -819,19 +819,19 @@ OnSharedPreferenceChangeListener continue; } } else if (PREFS_TRACKING_PROTECTION_PRIVATE_BROWSING.equals(key)) { - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_TRACKING_PROTECTION_LEARN_MORE.equals(key)) { - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_MP_ENABLED.equals(key)) { - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_MASTER_PASSWORD)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_MASTER_PASSWORD)) { preferences.removePreference(pref); i--; continue; @@ -843,7 +843,7 @@ OnSharedPreferenceChangeListener continue; } } else if (PREFS_CLEAR_PRIVATE_DATA.equals(key) || PREFS_CLEAR_PRIVATE_DATA_EXIT.equals(key)) { - if (!RestrictedProfiles.isAllowed(this, Restriction.DISALLOW_CLEAR_HISTORY)) { + if (!Restrictions.isAllowed(this, Restriction.DISALLOW_CLEAR_HISTORY)) { preferences.removePreference(pref); i--; continue; diff --git a/mobile/android/base/restrictions/RestrictionConfiguration.java b/mobile/android/base/restrictions/RestrictionConfiguration.java index c15f57e56a29..fd9c4bcccb6d 100644 --- a/mobile/android/base/restrictions/RestrictionConfiguration.java +++ b/mobile/android/base/restrictions/RestrictionConfiguration.java @@ -6,7 +6,7 @@ package org.mozilla.gecko.restrictions; /** - * Interface for classes that RestrictedProfiles will delegate to for making decisions. + * Interface for classes that Restrictions will delegate to for making decisions. */ public interface RestrictionConfiguration { /** diff --git a/mobile/android/base/tabs/TabsPanel.java b/mobile/android/base/tabs/TabsPanel.java index 43b14aacd527..a014ec681498 100644 --- a/mobile/android/base/tabs/TabsPanel.java +++ b/mobile/android/base/tabs/TabsPanel.java @@ -9,7 +9,7 @@ import org.mozilla.gecko.AppConstants.Versions; import org.mozilla.gecko.GeckoApp; import org.mozilla.gecko.GeckoApplication; import org.mozilla.gecko.R; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; import org.mozilla.gecko.animation.PropertyAnimator; @@ -144,7 +144,7 @@ public class TabsPanel extends LinearLayout (ThemedImageButton) mTabWidget.addTab(R.drawable.tabs_private, R.string.tabs_private); privateTabsPanel.setPrivateMode(true); - if (!RestrictedProfiles.isAllowed(mContext, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(mContext, Restriction.DISALLOW_PRIVATE_BROWSING)) { mTabWidget.setVisibility(View.GONE); } @@ -173,7 +173,7 @@ public class TabsPanel extends LinearLayout // Each panel has a "+" shortcut button, so don't show it for that panel. menu.findItem(R.id.new_tab).setVisible(mCurrentPanel != Panel.NORMAL_TABS); menu.findItem(R.id.new_private_tab).setVisible(mCurrentPanel != Panel.PRIVATE_TABS - && RestrictedProfiles.isAllowed(mContext, Restriction.DISALLOW_PRIVATE_BROWSING)); + && Restrictions.isAllowed(mContext, Restriction.DISALLOW_PRIVATE_BROWSING)); // Only show "Clear * tabs" for current panel. menu.findItem(R.id.close_all_tabs).setVisible(mCurrentPanel == Panel.NORMAL_TABS); diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testRestrictions.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testRestrictions.java index 63bff4c13862..6b8602222df9 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testRestrictions.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testRestrictions.java @@ -6,7 +6,7 @@ package org.mozilla.gecko.tests; import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertTrue; -import org.mozilla.gecko.RestrictedProfiles; +import org.mozilla.gecko.Restrictions; import org.mozilla.gecko.restrictions.Restriction; import org.mozilla.gecko.tests.helpers.GeckoHelper; @@ -17,7 +17,7 @@ public class testRestrictions extends UITest { // No restrictions should be enforced when using a normal profile for (Restriction restriction : Restriction.values()) { fAssertTrue(String.format("Restriction %s is not enforced", restriction.name), - RestrictedProfiles.isAllowed(getActivity(), restriction) + Restrictions.isAllowed(getActivity(), restriction) ); } } diff --git a/toolkit/components/parentalcontrols/nsParentalControlsServiceAndroid.cpp b/toolkit/components/parentalcontrols/nsParentalControlsServiceAndroid.cpp index 663252b4df4b..653b717b3196 100644 --- a/toolkit/components/parentalcontrols/nsParentalControlsServiceAndroid.cpp +++ b/toolkit/components/parentalcontrols/nsParentalControlsServiceAndroid.cpp @@ -14,7 +14,7 @@ nsParentalControlsService::nsParentalControlsService() : mEnabled(false) { if (mozilla::jni::IsAvailable()) { - mEnabled = mozilla::widget::RestrictedProfiles::IsUserRestricted(); + mEnabled = mozilla::widget::Restrictions::IsUserRestricted(); } } @@ -92,7 +92,7 @@ nsParentalControlsService::IsAllowed(int16_t aAction, NS_ENSURE_SUCCESS(rv, rv); } - *_retval = mozilla::widget::RestrictedProfiles::IsAllowed(aAction, + *_retval = mozilla::widget::Restrictions::IsAllowed(aAction, NS_ConvertUTF8toUTF16(url)); return rv; } diff --git a/widget/android/GeneratedJNIWrappers.cpp b/widget/android/GeneratedJNIWrappers.cpp index 2cf1cfaf4c95..9700ec5acf2c 100644 --- a/widget/android/GeneratedJNIWrappers.cpp +++ b/widget/android/GeneratedJNIWrappers.cpp @@ -1116,20 +1116,20 @@ constexpr char PrefsHelper::GetPrefsById_t::signature[]; constexpr char PrefsHelper::RemovePrefsObserver_t::name[]; constexpr char PrefsHelper::RemovePrefsObserver_t::signature[]; -constexpr char RestrictedProfiles::name[]; +constexpr char Restrictions::name[]; -constexpr char RestrictedProfiles::IsAllowed_t::name[]; -constexpr char RestrictedProfiles::IsAllowed_t::signature[]; +constexpr char Restrictions::IsAllowed_t::name[]; +constexpr char Restrictions::IsAllowed_t::signature[]; -auto RestrictedProfiles::IsAllowed(int32_t a0, mozilla::jni::String::Param a1) -> bool +auto Restrictions::IsAllowed(int32_t a0, mozilla::jni::String::Param a1) -> bool { return mozilla::jni::Method::Call(nullptr, nullptr, a0, a1); } -constexpr char RestrictedProfiles::IsUserRestricted_t::name[]; -constexpr char RestrictedProfiles::IsUserRestricted_t::signature[]; +constexpr char Restrictions::IsUserRestricted_t::name[]; +constexpr char Restrictions::IsUserRestricted_t::signature[]; -auto RestrictedProfiles::IsUserRestricted() -> bool +auto Restrictions::IsUserRestricted() -> bool { return mozilla::jni::Method::Call(nullptr, nullptr); } diff --git a/widget/android/GeneratedJNIWrappers.h b/widget/android/GeneratedJNIWrappers.h index 27a82af2b7a5..3c50f9ca1135 100644 --- a/widget/android/GeneratedJNIWrappers.h +++ b/widget/android/GeneratedJNIWrappers.h @@ -3044,23 +3044,23 @@ public: template class Natives; }; -class RestrictedProfiles : public mozilla::jni::Class +class Restrictions : public mozilla::jni::Class { public: - typedef mozilla::jni::Ref Ref; - typedef mozilla::jni::LocalRef LocalRef; - typedef mozilla::jni::GlobalRef GlobalRef; - typedef const mozilla::jni::Param& Param; + typedef mozilla::jni::Ref Ref; + typedef mozilla::jni::LocalRef LocalRef; + typedef mozilla::jni::GlobalRef GlobalRef; + typedef const mozilla::jni::Param& Param; static constexpr char name[] = - "org/mozilla/gecko/RestrictedProfiles"; + "org/mozilla/gecko/Restrictions"; protected: - RestrictedProfiles(jobject instance) : Class(instance) {} + Restrictions(jobject instance) : Class(instance) {} public: struct IsAllowed_t { - typedef RestrictedProfiles Owner; + typedef Restrictions Owner; typedef bool ReturnType; typedef bool SetterType; typedef mozilla::jni::Args< @@ -3079,7 +3079,7 @@ public: public: struct IsUserRestricted_t { - typedef RestrictedProfiles Owner; + typedef Restrictions Owner; typedef bool ReturnType; typedef bool SetterType; typedef mozilla::jni::Args<> Args; From 2c2544b2a408e58f8621dda6ad7280c35de9d10d Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 11 Nov 2015 16:39:28 +0100 Subject: [PATCH 072/153] Bug 1189336 - (Part 2) Rename Restriction class to Restrictable. r=ally This is the first step to move from a list of DISALLOW_* things to a list of features that can be enabled or disabled for a profile. At a later stage we will check whether a "restrictable" feature is allowed or not. --HG-- rename : mobile/android/base/restrictions/Restriction.java => mobile/android/base/restrictions/Restrictable.java extra : commitid : GlIbP8ITOUJ extra : rebase_source : 6118d676e77285e6ee20b566b4cc39b774b9c8f7 --- mobile/android/base/AccountsHelper.java | 4 +-- mobile/android/base/BrowserApp.java | 14 +++++----- mobile/android/base/Restrictions.java | 19 ++++++------- mobile/android/base/home/HistoryPanel.java | 8 +++--- .../base/home/HomeConfigPrefsBackend.java | 4 +-- mobile/android/base/home/HomeFragment.java | 4 +-- mobile/android/base/home/TopSitesPanel.java | 8 +++--- mobile/android/base/moz.build | 2 +- .../preferences/AndroidImportPreference.java | 4 +-- .../base/preferences/GeckoPreferences.java | 26 ++++++++--------- .../restrictions/DefaultConfiguration.java | 2 +- .../GuestProfileConfiguration.java | 28 +++++++++---------- .../{Restriction.java => Restrictable.java} | 4 +-- .../RestrictedProfileConfiguration.java | 26 ++++++++--------- .../RestrictionConfiguration.java | 2 +- .../restrictions/RestrictionProvider.java | 17 +++++------ mobile/android/base/tabs/TabsPanel.java | 6 ++-- .../mozilla/gecko/tests/testRestrictions.java | 8 +++--- 18 files changed, 91 insertions(+), 95 deletions(-) rename mobile/android/base/restrictions/{Restriction.java => Restrictable.java} (96%) diff --git a/mobile/android/base/AccountsHelper.java b/mobile/android/base/AccountsHelper.java index bb3fd907ec08..5aae9d41cffd 100644 --- a/mobile/android/base/AccountsHelper.java +++ b/mobile/android/base/AccountsHelper.java @@ -22,7 +22,7 @@ import org.mozilla.gecko.fxa.FxAccountConstants; import org.mozilla.gecko.fxa.authenticator.AndroidFxAccount; import org.mozilla.gecko.fxa.login.Engaged; import org.mozilla.gecko.fxa.login.State; -import org.mozilla.gecko.restrictions.Restriction; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.sync.SyncConfiguration; import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.sync.setup.SyncAccounts; @@ -83,7 +83,7 @@ public class AccountsHelper implements NativeEventListener { @Override public void handleMessage(String event, NativeJSObject message, final EventCallback callback) { - if (!Restrictions.isAllowed(mContext, Restriction.DISALLOW_MODIFY_ACCOUNTS)) { + if (!Restrictions.isAllowed(mContext, Restrictable.DISALLOW_MODIFY_ACCOUNTS)) { // We register for messages in all contexts; we drop, with a log and an error to JavaScript, // when the profile is restricted. It's better to return errors than silently ignore messages. Log.e(LOGTAG, "Profile is not allowed to modify accounts! Ignoring event: " + event); diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index c02bc0e916ca..99a216ec0a5c 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -49,7 +49,7 @@ import org.mozilla.gecko.preferences.ClearOnShutdownPref; import org.mozilla.gecko.preferences.GeckoPreferences; import org.mozilla.gecko.prompts.Prompt; import org.mozilla.gecko.prompts.PromptListItem; -import org.mozilla.gecko.restrictions.Restriction; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.sync.repositories.android.FennecTabsRepository; import org.mozilla.gecko.tabqueue.TabQueueHelper; import org.mozilla.gecko.tabqueue.TabQueuePrompt; @@ -1793,7 +1793,7 @@ public class BrowserApp extends GeckoApp } } - if (AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED && Restrictions.isAllowed(this, Restriction.DISALLOW_LOCATION_SERVICE)) { + if (AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED && Restrictions.isAllowed(this, Restrictable.DISALLOW_LOCATION_SERVICE)) { // Start (this acts as ping if started already) the stumbler lib; if the stumbler has queued data it will upload it. // Stumbler operates on its own thread, and startup impact is further minimized by delaying work (such as upload) a few seconds. // Avoid any potential startup CPU/thread contention by delaying the pref broadcast. @@ -3084,11 +3084,11 @@ public class BrowserApp extends GeckoApp } // Disable share menuitem for about:, chrome:, file:, and resource: URIs - final boolean shareVisible = Restrictions.isAllowed(this, Restriction.DISALLOW_SHARE); + final boolean shareVisible = Restrictions.isAllowed(this, Restrictable.DISALLOW_SHARE); share.setVisible(shareVisible); final boolean shareEnabled = StringUtils.isShareableUrl(url) && shareVisible; share.setEnabled(shareEnabled); - MenuUtils.safeSetEnabled(aMenu, R.id.downloads, Restrictions.isAllowed(this, Restriction.DISALLOW_DOWNLOADS)); + MenuUtils.safeSetEnabled(aMenu, R.id.downloads, Restrictions.isAllowed(this, Restrictable.DISALLOW_DOWNLOADS)); // NOTE: Use MenuUtils.safeSetEnabled because some actions might // be on the BrowserToolbar context menu. @@ -3151,7 +3151,7 @@ public class BrowserApp extends GeckoApp } } - final boolean privateTabVisible = Restrictions.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING); + final boolean privateTabVisible = Restrictions.isAllowed(this, Restrictable.DISALLOW_PRIVATE_BROWSING); MenuUtils.safeSetVisible(aMenu, R.id.new_private_tab, privateTabVisible); // Disable PDF generation (save and print) for about:home and xul pages. @@ -3173,11 +3173,11 @@ public class BrowserApp extends GeckoApp enterGuestMode.setVisible(true); } - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_GUEST_BROWSING)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_GUEST_BROWSING)) { MenuUtils.safeSetVisible(aMenu, R.id.new_guest_session, false); } - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_INSTALL_EXTENSION)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_INSTALL_EXTENSION)) { MenuUtils.safeSetVisible(aMenu, R.id.addons, false); } diff --git a/mobile/android/base/Restrictions.java b/mobile/android/base/Restrictions.java index 2b5e30fc89f0..6808ea67fb78 100644 --- a/mobile/android/base/Restrictions.java +++ b/mobile/android/base/Restrictions.java @@ -10,14 +10,13 @@ import org.mozilla.gecko.annotation.WrapForJNI; import org.mozilla.gecko.AppConstants.Versions; import org.mozilla.gecko.restrictions.DefaultConfiguration; import org.mozilla.gecko.restrictions.GuestProfileConfiguration; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.restrictions.RestrictedProfileConfiguration; -import org.mozilla.gecko.restrictions.Restriction; import org.mozilla.gecko.restrictions.RestrictionConfiguration; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; -import android.os.Bundle; import android.os.UserManager; import android.util.Log; @@ -83,8 +82,8 @@ public class Restrictions { getConfiguration(context).update(); } - private static Restriction geckoActionToRestriction(int action) { - for (Restriction rest : Restriction.values()) { + private static Restrictable geckoActionToRestriction(int action) { + for (Restrictable rest : Restrictable.values()) { if (rest.id == action) { return rest; } @@ -106,15 +105,15 @@ public class Restrictions { return getConfiguration(context).isRestricted(); } - public static boolean isAllowed(final Context context, final Restriction restriction) { - return getConfiguration(context).isAllowed(restriction); + public static boolean isAllowed(final Context context, final Restrictable restrictable) { + return getConfiguration(context).isAllowed(restrictable); } @WrapForJNI public static boolean isAllowed(int action, String url) { - final Restriction restriction; + final Restrictable restrictable; try { - restriction = geckoActionToRestriction(action); + restrictable = geckoActionToRestriction(action); } catch (IllegalArgumentException ex) { // Unknown actions represent a coding error, so we // refuse the action and log. @@ -124,10 +123,10 @@ public class Restrictions { final Context context = GeckoAppShell.getApplicationContext(); - if (Restriction.DISALLOW_BROWSE_FILES == restriction) { + if (Restrictable.DISALLOW_BROWSE_FILES == restrictable) { return canLoadUrl(context, url); } else { - return isAllowed(context, restriction); + return isAllowed(context, restrictable); } } } diff --git a/mobile/android/base/home/HistoryPanel.java b/mobile/android/base/home/HistoryPanel.java index a57de82ff587..364b702ce00b 100644 --- a/mobile/android/base/home/HistoryPanel.java +++ b/mobile/android/base/home/HistoryPanel.java @@ -26,7 +26,7 @@ import org.mozilla.gecko.db.BrowserContract.Combined; import org.mozilla.gecko.db.BrowserDB; import org.mozilla.gecko.home.HomeContextMenuInfo.RemoveItemType; import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; -import org.mozilla.gecko.restrictions.Restriction; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.util.ColorUtils; import org.mozilla.gecko.util.HardwareUtils; @@ -224,7 +224,7 @@ public class HistoryPanel extends HomeFragment { public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); - if (!Restrictions.isAllowed(getActivity(), Restriction.DISALLOW_CLEAR_HISTORY)) { + if (!Restrictions.isAllowed(getActivity(), Restrictable.DISALLOW_CLEAR_HISTORY)) { menu.findItem(R.id.home_remove).setVisible(false); } } @@ -291,7 +291,7 @@ public class HistoryPanel extends HomeFragment { private void updateUiFromCursor(Cursor c) { if (c != null && c.getCount() > 0) { - if (Restrictions.isAllowed(getActivity(), Restriction.DISALLOW_CLEAR_HISTORY)) { + if (Restrictions.isAllowed(getActivity(), Restrictable.DISALLOW_CLEAR_HISTORY)) { mClearHistoryButton.setVisibility(View.VISIBLE); } return; @@ -322,7 +322,7 @@ public class HistoryPanel extends HomeFragment { emptyHint.setVisibility(View.VISIBLE); } - if (!Restrictions.isAllowed(getActivity(), Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(getActivity(), Restrictable.DISALLOW_PRIVATE_BROWSING)) { emptyHint.setVisibility(View.GONE); } diff --git a/mobile/android/base/home/HomeConfigPrefsBackend.java b/mobile/android/base/home/HomeConfigPrefsBackend.java index d07950abbe34..b83ca9edf635 100644 --- a/mobile/android/base/home/HomeConfigPrefsBackend.java +++ b/mobile/android/base/home/HomeConfigPrefsBackend.java @@ -21,7 +21,7 @@ import org.mozilla.gecko.home.HomeConfig.OnReloadListener; import org.mozilla.gecko.home.HomeConfig.PanelConfig; import org.mozilla.gecko.home.HomeConfig.PanelType; import org.mozilla.gecko.home.HomeConfig.State; -import org.mozilla.gecko.restrictions.Restriction; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.util.HardwareUtils; import android.content.BroadcastReceiver; @@ -77,7 +77,7 @@ class HomeConfigPrefsBackend implements HomeConfigBackend { panelConfigs.add(createBuiltinPanelConfig(mContext, PanelType.HISTORY)); // We disable Synced Tabs for guest mode / restricted profiles. - if (Restrictions.isAllowed(mContext, Restriction.DISALLOW_MODIFY_ACCOUNTS)) { + if (Restrictions.isAllowed(mContext, Restrictable.DISALLOW_MODIFY_ACCOUNTS)) { panelConfigs.add(createBuiltinPanelConfig(mContext, PanelType.REMOTE_TABS)); } diff --git a/mobile/android/base/home/HomeFragment.java b/mobile/android/base/home/HomeFragment.java index 37f4adc32044..8fd9ecf01bbb 100644 --- a/mobile/android/base/home/HomeFragment.java +++ b/mobile/android/base/home/HomeFragment.java @@ -23,7 +23,7 @@ import org.mozilla.gecko.home.HomeContextMenuInfo.RemoveItemType; import org.mozilla.gecko.home.HomePager.OnUrlOpenInBackgroundListener; import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; import org.mozilla.gecko.home.TopSitesGridView.TopSitesGridContextMenuInfo; -import org.mozilla.gecko.restrictions.Restriction; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.util.Clipboard; import org.mozilla.gecko.util.StringUtils; import org.mozilla.gecko.util.ThreadUtils; @@ -153,7 +153,7 @@ public abstract class HomeFragment extends Fragment { menu.findItem(R.id.home_share).setVisible(false); } - if (!Restrictions.isAllowed(view.getContext(), Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(view.getContext(), Restrictable.DISALLOW_PRIVATE_BROWSING)) { menu.findItem(R.id.home_open_private_tab).setVisible(false); } diff --git a/mobile/android/base/home/TopSitesPanel.java b/mobile/android/base/home/TopSitesPanel.java index ff55fcf922f4..ade2f3caef4d 100644 --- a/mobile/android/base/home/TopSitesPanel.java +++ b/mobile/android/base/home/TopSitesPanel.java @@ -34,7 +34,7 @@ import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; import org.mozilla.gecko.home.PinSiteDialog.OnSiteSelectedListener; import org.mozilla.gecko.home.TopSitesGridView.OnEditPinnedSiteListener; import org.mozilla.gecko.home.TopSitesGridView.TopSitesGridContextMenuInfo; -import org.mozilla.gecko.restrictions.Restriction; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.tiles.TilesRecorder; import org.mozilla.gecko.tiles.Tile; import org.mozilla.gecko.util.StringUtils; @@ -343,7 +343,7 @@ public class TopSitesPanel extends HomeFragment { // can handle this. super.onCreateContextMenu(menu, view, menuInfo); - if (!Restrictions.isAllowed(view.getContext(), Restriction.DISALLOW_CLEAR_HISTORY)) { + if (!Restrictions.isAllowed(view.getContext(), Restrictable.DISALLOW_CLEAR_HISTORY)) { menu.findItem(R.id.home_remove).setVisible(false); } @@ -359,7 +359,7 @@ public class TopSitesPanel extends HomeFragment { // Hide unused menu items. menu.findItem(R.id.home_edit_bookmark).setVisible(false); - menu.findItem(R.id.home_remove).setVisible(Restrictions.isAllowed(context, Restriction.DISALLOW_CLEAR_HISTORY)); + menu.findItem(R.id.home_remove).setVisible(Restrictions.isAllowed(context, Restrictable.DISALLOW_CLEAR_HISTORY)); TopSitesGridContextMenuInfo info = (TopSitesGridContextMenuInfo) menuInfo; menu.setHeaderTitle(info.getDisplayTitle()); @@ -381,7 +381,7 @@ public class TopSitesPanel extends HomeFragment { menu.findItem(R.id.home_share).setVisible(false); } - if (!Restrictions.isAllowed(context, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(context, Restrictable.DISALLOW_PRIVATE_BROWSING)) { menu.findItem(R.id.home_open_private_tab).setVisible(false); } diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index 00bd0fd6fd9f..d1ee7145d58a 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -481,8 +481,8 @@ gbjar.sources += [ 'Restrictions.java', 'restrictions/DefaultConfiguration.java', 'restrictions/GuestProfileConfiguration.java', + 'restrictions/Restrictable.java', 'restrictions/RestrictedProfileConfiguration.java', - 'restrictions/Restriction.java', 'restrictions/RestrictionConfiguration.java', 'restrictions/RestrictionProvider.java', 'ServiceNotificationClient.java', diff --git a/mobile/android/base/preferences/AndroidImportPreference.java b/mobile/android/base/preferences/AndroidImportPreference.java index 6320e47c3967..81172bbd07f9 100644 --- a/mobile/android/base/preferences/AndroidImportPreference.java +++ b/mobile/android/base/preferences/AndroidImportPreference.java @@ -7,9 +7,9 @@ package org.mozilla.gecko.preferences; import org.mozilla.gecko.AppConstants.Versions; import org.mozilla.gecko.R; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.util.ThreadUtils; import org.mozilla.gecko.Restrictions; -import org.mozilla.gecko.restrictions.Restriction; import java.util.Set; @@ -28,7 +28,7 @@ class AndroidImportPreference extends MultiPrefMultiChoicePreference { public static class Handler implements GeckoPreferences.PrefHandler { public boolean setupPref(Context context, Preference pref) { // Feature disabled on devices running Android M+ (Bug 1183559) - return Versions.preM && Restrictions.isAllowed(context, Restriction.DISALLOW_IMPORT_SETTINGS); + return Versions.preM && Restrictions.isAllowed(context, Restrictable.DISALLOW_IMPORT_SETTINGS); } public void onChange(Context context, Preference pref, Object newValue) { } diff --git a/mobile/android/base/preferences/GeckoPreferences.java b/mobile/android/base/preferences/GeckoPreferences.java index a7db9cd7e796..c4c3740a5104 100644 --- a/mobile/android/base/preferences/GeckoPreferences.java +++ b/mobile/android/base/preferences/GeckoPreferences.java @@ -30,7 +30,7 @@ import org.mozilla.gecko.TelemetryContract.Method; import org.mozilla.gecko.background.common.GlobalConstants; import org.mozilla.gecko.background.healthreport.HealthReportConstants; import org.mozilla.gecko.db.BrowserContract.SuggestedSites; -import org.mozilla.gecko.restrictions.Restriction; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.tabqueue.TabQueueHelper; import org.mozilla.gecko.updater.UpdateService; import org.mozilla.gecko.updater.UpdateServiceHelper; @@ -463,7 +463,7 @@ OnSharedPreferenceChangeListener while (iterator.hasNext()) { Header header = iterator.next(); - if (header.id == R.id.pref_header_advanced && !Restrictions.isAllowed(this, Restriction.DISALLOW_ADVANCED_SETTINGS)) { + if (header.id == R.id.pref_header_advanced && !Restrictions.isAllowed(this, Restrictable.DISALLOW_ADVANCED_SETTINGS)) { iterator.remove(); } } @@ -678,7 +678,7 @@ OnSharedPreferenceChangeListener continue; } } else if (PREFS_SCREEN_ADVANCED.equals(key) && - !Restrictions.isAllowed(this, Restriction.DISALLOW_ADVANCED_SETTINGS)) { + !Restrictions.isAllowed(this, Restrictable.DISALLOW_ADVANCED_SETTINGS)) { preferences.removePreference(pref); i--; continue; @@ -694,7 +694,7 @@ OnSharedPreferenceChangeListener } } else if (PREFS_OPEN_URLS_IN_PRIVATE.equals(key)) { // Remove UI for opening external links in private browsing on non-Nightly builds. - if (!AppConstants.NIGHTLY_BUILD || !Restrictions.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!AppConstants.NIGHTLY_BUILD || !Restrictions.isAllowed(this, Restrictable.DISALLOW_PRIVATE_BROWSING)) { preferences.removePreference(pref); i--; continue; @@ -734,19 +734,19 @@ OnSharedPreferenceChangeListener } } else if (PREFS_GEO_REPORTING.equals(key) || PREFS_GEO_LEARN_MORE.equals(key)) { - if (!AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED || !Restrictions.isAllowed(this, Restriction.DISALLOW_LOCATION_SERVICE)) { + if (!AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED || !Restrictions.isAllowed(this, Restrictable.DISALLOW_LOCATION_SERVICE)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_DEVTOOLS_REMOTE_USB_ENABLED.equals(key)) { - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_REMOTE_DEBUGGING)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_REMOTE_DEBUGGING)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_DEVTOOLS_REMOTE_WIFI_ENABLED.equals(key)) { - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_REMOTE_DEBUGGING)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_REMOTE_DEBUGGING)) { preferences.removePreference(pref); i--; continue; @@ -759,7 +759,7 @@ OnSharedPreferenceChangeListener } } else if (PREFS_DEVTOOLS_REMOTE_LINK.equals(key)) { // Remove the "Learn more" link if remote debugging is disabled - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_REMOTE_DEBUGGING)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_REMOTE_DEBUGGING)) { preferences.removePreference(pref); i--; continue; @@ -776,7 +776,7 @@ OnSharedPreferenceChangeListener continue; } else if (PREFS_SYNC.equals(key)) { // Don't show sync prefs while in guest mode. - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_MODIFY_ACCOUNTS)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_MODIFY_ACCOUNTS)) { preferences.removePreference(pref); i--; continue; @@ -819,19 +819,19 @@ OnSharedPreferenceChangeListener continue; } } else if (PREFS_TRACKING_PROTECTION_PRIVATE_BROWSING.equals(key)) { - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_PRIVATE_BROWSING)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_TRACKING_PROTECTION_LEARN_MORE.equals(key)) { - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_PRIVATE_BROWSING)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_MP_ENABLED.equals(key)) { - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_MASTER_PASSWORD)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_MASTER_PASSWORD)) { preferences.removePreference(pref); i--; continue; @@ -843,7 +843,7 @@ OnSharedPreferenceChangeListener continue; } } else if (PREFS_CLEAR_PRIVATE_DATA.equals(key) || PREFS_CLEAR_PRIVATE_DATA_EXIT.equals(key)) { - if (!Restrictions.isAllowed(this, Restriction.DISALLOW_CLEAR_HISTORY)) { + if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_CLEAR_HISTORY)) { preferences.removePreference(pref); i--; continue; diff --git a/mobile/android/base/restrictions/DefaultConfiguration.java b/mobile/android/base/restrictions/DefaultConfiguration.java index 4ad498e1fd58..c9099a6c9763 100644 --- a/mobile/android/base/restrictions/DefaultConfiguration.java +++ b/mobile/android/base/restrictions/DefaultConfiguration.java @@ -11,7 +11,7 @@ package org.mozilla.gecko.restrictions; */ public class DefaultConfiguration implements RestrictionConfiguration { @Override - public boolean isAllowed(Restriction restriction) { + public boolean isAllowed(Restrictable restrictable) { return true; } diff --git a/mobile/android/base/restrictions/GuestProfileConfiguration.java b/mobile/android/base/restrictions/GuestProfileConfiguration.java index a9f859461f3f..7650bbf89789 100644 --- a/mobile/android/base/restrictions/GuestProfileConfiguration.java +++ b/mobile/android/base/restrictions/GuestProfileConfiguration.java @@ -14,18 +14,18 @@ import java.util.List; * RestrictionConfiguration implementation for guest profiles. */ public class GuestProfileConfiguration implements RestrictionConfiguration { - static List DEFAULT_RESTRICTIONS = Arrays.asList( - Restriction.DISALLOW_DOWNLOADS, - Restriction.DISALLOW_INSTALL_EXTENSION, - Restriction.DISALLOW_INSTALL_APPS, - Restriction.DISALLOW_BROWSE_FILES, - Restriction.DISALLOW_SHARE, - Restriction.DISALLOW_BOOKMARK, - Restriction.DISALLOW_ADD_CONTACTS, - Restriction.DISALLOW_SET_IMAGE, - Restriction.DISALLOW_MODIFY_ACCOUNTS, - Restriction.DISALLOW_REMOTE_DEBUGGING, - Restriction.DISALLOW_IMPORT_SETTINGS + static List DEFAULT_RESTRICTIONS = Arrays.asList( + Restrictable.DISALLOW_DOWNLOADS, + Restrictable.DISALLOW_INSTALL_EXTENSION, + Restrictable.DISALLOW_INSTALL_APPS, + Restrictable.DISALLOW_BROWSE_FILES, + Restrictable.DISALLOW_SHARE, + Restrictable.DISALLOW_BOOKMARK, + Restrictable.DISALLOW_ADD_CONTACTS, + Restrictable.DISALLOW_SET_IMAGE, + Restrictable.DISALLOW_MODIFY_ACCOUNTS, + Restrictable.DISALLOW_REMOTE_DEBUGGING, + Restrictable.DISALLOW_IMPORT_SETTINGS ); @SuppressWarnings("serial") @@ -43,8 +43,8 @@ public class GuestProfileConfiguration implements RestrictionConfiguration { ); @Override - public boolean isAllowed(Restriction restriction) { - return !DEFAULT_RESTRICTIONS.contains(restriction); + public boolean isAllowed(Restrictable restrictable) { + return !DEFAULT_RESTRICTIONS.contains(restrictable); } @Override diff --git a/mobile/android/base/restrictions/Restriction.java b/mobile/android/base/restrictions/Restrictable.java similarity index 96% rename from mobile/android/base/restrictions/Restriction.java rename to mobile/android/base/restrictions/Restrictable.java index d667d5a42f13..d17d3e18cba7 100644 --- a/mobile/android/base/restrictions/Restriction.java +++ b/mobile/android/base/restrictions/Restrictable.java @@ -15,7 +15,7 @@ import android.support.annotation.StringRes; * Others are specific to us. * These constants should be in sync with the ones from toolkit/components/parentalcontrols/nsIParentalControlsService.idl */ -public enum Restriction { +public enum Restrictable { DISALLOW_DOWNLOADS(1, "no_download_files", 0), DISALLOW_INSTALL_EXTENSION(2, "no_install_extensions", R.string.restriction_disallow_addons_title), @@ -60,7 +60,7 @@ public enum Restriction { @StringRes public final int title; - Restriction(final int id, final String name, @StringRes int title) { + Restrictable(final int id, final String name, @StringRes int title) { this.id = id; this.name = name; this.title = title; diff --git a/mobile/android/base/restrictions/RestrictedProfileConfiguration.java b/mobile/android/base/restrictions/RestrictedProfileConfiguration.java index 83c76708b8a8..7fb3a17b688c 100644 --- a/mobile/android/base/restrictions/RestrictedProfileConfiguration.java +++ b/mobile/android/base/restrictions/RestrictedProfileConfiguration.java @@ -20,15 +20,15 @@ import java.util.List; @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public class RestrictedProfileConfiguration implements RestrictionConfiguration { - static List DEFAULT_RESTRICTIONS = Arrays.asList( - Restriction.DISALLOW_INSTALL_EXTENSION, - Restriction.DISALLOW_PRIVATE_BROWSING, - Restriction.DISALLOW_LOCATION_SERVICE, - Restriction.DISALLOW_CLEAR_HISTORY, - Restriction.DISALLOW_MASTER_PASSWORD, - Restriction.DISALLOW_GUEST_BROWSING, - Restriction.DISALLOW_ADVANCED_SETTINGS, - Restriction.DISALLOW_CAMERA_MICROPHONE + static List DEFAULT_RESTRICTIONS = Arrays.asList( + Restrictable.DISALLOW_INSTALL_EXTENSION, + Restrictable.DISALLOW_PRIVATE_BROWSING, + Restrictable.DISALLOW_LOCATION_SERVICE, + Restrictable.DISALLOW_CLEAR_HISTORY, + Restrictable.DISALLOW_MASTER_PASSWORD, + Restrictable.DISALLOW_GUEST_BROWSING, + Restrictable.DISALLOW_ADVANCED_SETTINGS, + Restrictable.DISALLOW_CAMERA_MICROPHONE ); private Context context; @@ -40,13 +40,13 @@ public class RestrictedProfileConfiguration implements RestrictionConfiguration } @Override - public synchronized boolean isAllowed(Restriction restriction) { + public synchronized boolean isAllowed(Restrictable restrictable) { if (isCacheInvalid || !ThreadUtils.isOnUiThread()) { cachedRestrictions = readRestrictions(); isCacheInvalid = false; } - return !cachedRestrictions.getBoolean(restriction.name, DEFAULT_RESTRICTIONS.contains(restriction)); + return !cachedRestrictions.getBoolean(restrictable.name, DEFAULT_RESTRICTIONS.contains(restrictable)); } private Bundle readRestrictions() { @@ -66,11 +66,11 @@ public class RestrictedProfileConfiguration implements RestrictionConfiguration @Override public boolean canLoadUrl(String url) { - if (!isAllowed(Restriction.DISALLOW_INSTALL_EXTENSION) && AboutPages.isAboutAddons(url)) { + if (!isAllowed(Restrictable.DISALLOW_INSTALL_EXTENSION) && AboutPages.isAboutAddons(url)) { return false; } - if (!isAllowed(Restriction.DISALLOW_PRIVATE_BROWSING) && AboutPages.isAboutPrivateBrowsing(url)) { + if (!isAllowed(Restrictable.DISALLOW_PRIVATE_BROWSING) && AboutPages.isAboutPrivateBrowsing(url)) { return false; } diff --git a/mobile/android/base/restrictions/RestrictionConfiguration.java b/mobile/android/base/restrictions/RestrictionConfiguration.java index fd9c4bcccb6d..7c40da734bfe 100644 --- a/mobile/android/base/restrictions/RestrictionConfiguration.java +++ b/mobile/android/base/restrictions/RestrictionConfiguration.java @@ -12,7 +12,7 @@ public interface RestrictionConfiguration { /** * Is the user allowed to perform this action? */ - boolean isAllowed(Restriction restriction); + boolean isAllowed(Restrictable restrictable); /** * Is the user allowed to load the given URL? diff --git a/mobile/android/base/restrictions/RestrictionProvider.java b/mobile/android/base/restrictions/RestrictionProvider.java index d69427576e35..985b09fab73b 100644 --- a/mobile/android/base/restrictions/RestrictionProvider.java +++ b/mobile/android/base/restrictions/RestrictionProvider.java @@ -6,9 +6,6 @@ package org.mozilla.gecko.restrictions; import org.mozilla.gecko.AppConstants; -import org.mozilla.gecko.restrictions.RestrictedProfileConfiguration; -import org.mozilla.gecko.restrictions.Restriction; -import org.mozilla.gecko.sync.setup.Constants; import android.annotation.TargetApi; import android.app.Activity; @@ -53,23 +50,23 @@ public class RestrictionProvider extends BroadcastReceiver { private ArrayList initRestrictions(Context context, Bundle oldRestrictions) { ArrayList entries = new ArrayList(); - for (Restriction restriction : RestrictedProfileConfiguration.DEFAULT_RESTRICTIONS) { - if (restriction == Restriction.DISALLOW_LOCATION_SERVICE && !AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED) { + for (Restrictable restrictable : RestrictedProfileConfiguration.DEFAULT_RESTRICTIONS) { + if (restrictable == Restrictable.DISALLOW_LOCATION_SERVICE && !AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED) { continue; } - RestrictionEntry entry = createRestrictionEntryWithDefaultValue(context, restriction, - oldRestrictions.getBoolean(restriction.name, true)); + RestrictionEntry entry = createRestrictionEntryWithDefaultValue(context, restrictable, + oldRestrictions.getBoolean(restrictable.name, true)); entries.add(entry); } return entries; } - private RestrictionEntry createRestrictionEntryWithDefaultValue(Context context, Restriction restriction, boolean defaultValue) { - RestrictionEntry entry = new RestrictionEntry(restriction.name, defaultValue); + private RestrictionEntry createRestrictionEntryWithDefaultValue(Context context, Restrictable restrictable, boolean defaultValue) { + RestrictionEntry entry = new RestrictionEntry(restrictable.name, defaultValue); - entry.setTitle(restriction.getTitle(context)); + entry.setTitle(restrictable.getTitle(context)); return entry; } diff --git a/mobile/android/base/tabs/TabsPanel.java b/mobile/android/base/tabs/TabsPanel.java index a014ec681498..dc4c27b359d0 100644 --- a/mobile/android/base/tabs/TabsPanel.java +++ b/mobile/android/base/tabs/TabsPanel.java @@ -16,7 +16,7 @@ import org.mozilla.gecko.animation.PropertyAnimator; import org.mozilla.gecko.animation.ViewHelper; import org.mozilla.gecko.lwt.LightweightTheme; import org.mozilla.gecko.lwt.LightweightThemeDrawable; -import org.mozilla.gecko.restrictions.Restriction; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.util.ColorUtils; import org.mozilla.gecko.util.HardwareUtils; import org.mozilla.gecko.widget.GeckoPopupMenu; @@ -144,7 +144,7 @@ public class TabsPanel extends LinearLayout (ThemedImageButton) mTabWidget.addTab(R.drawable.tabs_private, R.string.tabs_private); privateTabsPanel.setPrivateMode(true); - if (!Restrictions.isAllowed(mContext, Restriction.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(mContext, Restrictable.DISALLOW_PRIVATE_BROWSING)) { mTabWidget.setVisibility(View.GONE); } @@ -173,7 +173,7 @@ public class TabsPanel extends LinearLayout // Each panel has a "+" shortcut button, so don't show it for that panel. menu.findItem(R.id.new_tab).setVisible(mCurrentPanel != Panel.NORMAL_TABS); menu.findItem(R.id.new_private_tab).setVisible(mCurrentPanel != Panel.PRIVATE_TABS - && Restrictions.isAllowed(mContext, Restriction.DISALLOW_PRIVATE_BROWSING)); + && Restrictions.isAllowed(mContext, Restrictable.DISALLOW_PRIVATE_BROWSING)); // Only show "Clear * tabs" for current panel. menu.findItem(R.id.close_all_tabs).setVisible(mCurrentPanel == Panel.NORMAL_TABS); diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testRestrictions.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testRestrictions.java index 6b8602222df9..b6ed5ba7c583 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testRestrictions.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testRestrictions.java @@ -7,7 +7,7 @@ package org.mozilla.gecko.tests; import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertTrue; import org.mozilla.gecko.Restrictions; -import org.mozilla.gecko.restrictions.Restriction; +import org.mozilla.gecko.restrictions.Restrictable; import org.mozilla.gecko.tests.helpers.GeckoHelper; public class testRestrictions extends UITest { @@ -15,9 +15,9 @@ public class testRestrictions extends UITest { GeckoHelper.blockForReady(); // No restrictions should be enforced when using a normal profile - for (Restriction restriction : Restriction.values()) { - fAssertTrue(String.format("Restriction %s is not enforced", restriction.name), - Restrictions.isAllowed(getActivity(), restriction) + for (Restrictable restrictable : Restrictable.values()) { + fAssertTrue(String.format("Restriction %s is not enforced", restrictable.name), + Restrictions.isAllowed(getActivity(), restrictable) ); } } From db5aae07ef53bae5556810a672cefdc2dd0d5c9b Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 11 Nov 2015 18:17:19 +0100 Subject: [PATCH 073/153] Bug 1189336 - (Part 3) Move from a list of disallowed things to a list of restrictable features. r=ally --HG-- extra : commitid : KSNcNwqDdsf extra : rebase_source : b5a8becbf236df83ed3773a76456f905a29c0cc1 --- mobile/android/base/AccountsHelper.java | 2 +- mobile/android/base/BrowserApp.java | 12 ++--- mobile/android/base/Restrictions.java | 2 +- mobile/android/base/home/HistoryPanel.java | 6 +-- .../base/home/HomeConfigPrefsBackend.java | 2 +- mobile/android/base/home/HomeFragment.java | 2 +- mobile/android/base/home/TopSitesPanel.java | 6 +-- .../base/locales/en-US/android_strings.dtd | 20 ++++---- .../preferences/AndroidImportPreference.java | 2 +- .../base/preferences/GeckoPreferences.java | 24 +++++----- .../GuestProfileConfiguration.java | 26 +++++------ .../base/restrictions/Restrictable.java | 36 +++++++-------- .../RestrictedProfileConfiguration.java | 46 +++++++++++-------- .../restrictions/RestrictionProvider.java | 6 +-- mobile/android/base/strings.xml.in | 18 ++++---- mobile/android/base/tabs/TabsPanel.java | 4 +- mobile/android/chrome/content/browser.js | 4 +- .../chrome/test_restricted_profiles.html | 2 +- .../nsIParentalControlsService.idl | 4 +- 19 files changed, 115 insertions(+), 109 deletions(-) diff --git a/mobile/android/base/AccountsHelper.java b/mobile/android/base/AccountsHelper.java index 5aae9d41cffd..fce925d2c7b4 100644 --- a/mobile/android/base/AccountsHelper.java +++ b/mobile/android/base/AccountsHelper.java @@ -83,7 +83,7 @@ public class AccountsHelper implements NativeEventListener { @Override public void handleMessage(String event, NativeJSObject message, final EventCallback callback) { - if (!Restrictions.isAllowed(mContext, Restrictable.DISALLOW_MODIFY_ACCOUNTS)) { + if (!Restrictions.isAllowed(mContext, Restrictable.MODIFY_ACCOUNTS)) { // We register for messages in all contexts; we drop, with a log and an error to JavaScript, // when the profile is restricted. It's better to return errors than silently ignore messages. Log.e(LOGTAG, "Profile is not allowed to modify accounts! Ignoring event: " + event); diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index 99a216ec0a5c..294c107f1630 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -1793,7 +1793,7 @@ public class BrowserApp extends GeckoApp } } - if (AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED && Restrictions.isAllowed(this, Restrictable.DISALLOW_LOCATION_SERVICE)) { + if (AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED && Restrictions.isAllowed(this, Restrictable.LOCATION_SERVICE)) { // Start (this acts as ping if started already) the stumbler lib; if the stumbler has queued data it will upload it. // Stumbler operates on its own thread, and startup impact is further minimized by delaying work (such as upload) a few seconds. // Avoid any potential startup CPU/thread contention by delaying the pref broadcast. @@ -3084,11 +3084,11 @@ public class BrowserApp extends GeckoApp } // Disable share menuitem for about:, chrome:, file:, and resource: URIs - final boolean shareVisible = Restrictions.isAllowed(this, Restrictable.DISALLOW_SHARE); + final boolean shareVisible = Restrictions.isAllowed(this, Restrictable.SHARE); share.setVisible(shareVisible); final boolean shareEnabled = StringUtils.isShareableUrl(url) && shareVisible; share.setEnabled(shareEnabled); - MenuUtils.safeSetEnabled(aMenu, R.id.downloads, Restrictions.isAllowed(this, Restrictable.DISALLOW_DOWNLOADS)); + MenuUtils.safeSetEnabled(aMenu, R.id.downloads, Restrictions.isAllowed(this, Restrictable.DOWNLOAD)); // NOTE: Use MenuUtils.safeSetEnabled because some actions might // be on the BrowserToolbar context menu. @@ -3151,7 +3151,7 @@ public class BrowserApp extends GeckoApp } } - final boolean privateTabVisible = Restrictions.isAllowed(this, Restrictable.DISALLOW_PRIVATE_BROWSING); + final boolean privateTabVisible = Restrictions.isAllowed(this, Restrictable.PRIVATE_BROWSING); MenuUtils.safeSetVisible(aMenu, R.id.new_private_tab, privateTabVisible); // Disable PDF generation (save and print) for about:home and xul pages. @@ -3173,11 +3173,11 @@ public class BrowserApp extends GeckoApp enterGuestMode.setVisible(true); } - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_GUEST_BROWSING)) { + if (!Restrictions.isAllowed(this, Restrictable.GUEST_BROWSING)) { MenuUtils.safeSetVisible(aMenu, R.id.new_guest_session, false); } - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_INSTALL_EXTENSION)) { + if (!Restrictions.isAllowed(this, Restrictable.INSTALL_EXTENSION)) { MenuUtils.safeSetVisible(aMenu, R.id.addons, false); } diff --git a/mobile/android/base/Restrictions.java b/mobile/android/base/Restrictions.java index 6808ea67fb78..54079a451bdc 100644 --- a/mobile/android/base/Restrictions.java +++ b/mobile/android/base/Restrictions.java @@ -123,7 +123,7 @@ public class Restrictions { final Context context = GeckoAppShell.getApplicationContext(); - if (Restrictable.DISALLOW_BROWSE_FILES == restrictable) { + if (Restrictable.BROWSE == restrictable) { return canLoadUrl(context, url); } else { return isAllowed(context, restrictable); diff --git a/mobile/android/base/home/HistoryPanel.java b/mobile/android/base/home/HistoryPanel.java index 364b702ce00b..7ef071ec2525 100644 --- a/mobile/android/base/home/HistoryPanel.java +++ b/mobile/android/base/home/HistoryPanel.java @@ -224,7 +224,7 @@ public class HistoryPanel extends HomeFragment { public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); - if (!Restrictions.isAllowed(getActivity(), Restrictable.DISALLOW_CLEAR_HISTORY)) { + if (!Restrictions.isAllowed(getActivity(), Restrictable.CLEAR_HISTORY)) { menu.findItem(R.id.home_remove).setVisible(false); } } @@ -291,7 +291,7 @@ public class HistoryPanel extends HomeFragment { private void updateUiFromCursor(Cursor c) { if (c != null && c.getCount() > 0) { - if (Restrictions.isAllowed(getActivity(), Restrictable.DISALLOW_CLEAR_HISTORY)) { + if (Restrictions.isAllowed(getActivity(), Restrictable.CLEAR_HISTORY)) { mClearHistoryButton.setVisibility(View.VISIBLE); } return; @@ -322,7 +322,7 @@ public class HistoryPanel extends HomeFragment { emptyHint.setVisibility(View.VISIBLE); } - if (!Restrictions.isAllowed(getActivity(), Restrictable.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(getActivity(), Restrictable.PRIVATE_BROWSING)) { emptyHint.setVisibility(View.GONE); } diff --git a/mobile/android/base/home/HomeConfigPrefsBackend.java b/mobile/android/base/home/HomeConfigPrefsBackend.java index b83ca9edf635..8621f5734f84 100644 --- a/mobile/android/base/home/HomeConfigPrefsBackend.java +++ b/mobile/android/base/home/HomeConfigPrefsBackend.java @@ -77,7 +77,7 @@ class HomeConfigPrefsBackend implements HomeConfigBackend { panelConfigs.add(createBuiltinPanelConfig(mContext, PanelType.HISTORY)); // We disable Synced Tabs for guest mode / restricted profiles. - if (Restrictions.isAllowed(mContext, Restrictable.DISALLOW_MODIFY_ACCOUNTS)) { + if (Restrictions.isAllowed(mContext, Restrictable.MODIFY_ACCOUNTS)) { panelConfigs.add(createBuiltinPanelConfig(mContext, PanelType.REMOTE_TABS)); } diff --git a/mobile/android/base/home/HomeFragment.java b/mobile/android/base/home/HomeFragment.java index 8fd9ecf01bbb..c98a7afb8897 100644 --- a/mobile/android/base/home/HomeFragment.java +++ b/mobile/android/base/home/HomeFragment.java @@ -153,7 +153,7 @@ public abstract class HomeFragment extends Fragment { menu.findItem(R.id.home_share).setVisible(false); } - if (!Restrictions.isAllowed(view.getContext(), Restrictable.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(view.getContext(), Restrictable.PRIVATE_BROWSING)) { menu.findItem(R.id.home_open_private_tab).setVisible(false); } diff --git a/mobile/android/base/home/TopSitesPanel.java b/mobile/android/base/home/TopSitesPanel.java index ade2f3caef4d..96334333a4ad 100644 --- a/mobile/android/base/home/TopSitesPanel.java +++ b/mobile/android/base/home/TopSitesPanel.java @@ -343,7 +343,7 @@ public class TopSitesPanel extends HomeFragment { // can handle this. super.onCreateContextMenu(menu, view, menuInfo); - if (!Restrictions.isAllowed(view.getContext(), Restrictable.DISALLOW_CLEAR_HISTORY)) { + if (!Restrictions.isAllowed(view.getContext(), Restrictable.CLEAR_HISTORY)) { menu.findItem(R.id.home_remove).setVisible(false); } @@ -359,7 +359,7 @@ public class TopSitesPanel extends HomeFragment { // Hide unused menu items. menu.findItem(R.id.home_edit_bookmark).setVisible(false); - menu.findItem(R.id.home_remove).setVisible(Restrictions.isAllowed(context, Restrictable.DISALLOW_CLEAR_HISTORY)); + menu.findItem(R.id.home_remove).setVisible(Restrictions.isAllowed(context, Restrictable.CLEAR_HISTORY)); TopSitesGridContextMenuInfo info = (TopSitesGridContextMenuInfo) menuInfo; menu.setHeaderTitle(info.getDisplayTitle()); @@ -381,7 +381,7 @@ public class TopSitesPanel extends HomeFragment { menu.findItem(R.id.home_share).setVisible(false); } - if (!Restrictions.isAllowed(context, Restrictable.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(context, Restrictable.PRIVATE_BROWSING)) { menu.findItem(R.id.home_open_private_tab).setVisible(false); } diff --git a/mobile/android/base/locales/en-US/android_strings.dtd b/mobile/android/base/locales/en-US/android_strings.dtd index 3c999eeb4e75..02c8e7f38406 100644 --- a/mobile/android/base/locales/en-US/android_strings.dtd +++ b/mobile/android/base/locales/en-US/android_strings.dtd @@ -713,17 +713,17 @@ just addresses the organization to follow, e.g. "This site is run by " --> code. --> - - + - - - - - - - - + + + + + + + + diff --git a/mobile/android/base/preferences/AndroidImportPreference.java b/mobile/android/base/preferences/AndroidImportPreference.java index 81172bbd07f9..68dd86eef10b 100644 --- a/mobile/android/base/preferences/AndroidImportPreference.java +++ b/mobile/android/base/preferences/AndroidImportPreference.java @@ -28,7 +28,7 @@ class AndroidImportPreference extends MultiPrefMultiChoicePreference { public static class Handler implements GeckoPreferences.PrefHandler { public boolean setupPref(Context context, Preference pref) { // Feature disabled on devices running Android M+ (Bug 1183559) - return Versions.preM && Restrictions.isAllowed(context, Restrictable.DISALLOW_IMPORT_SETTINGS); + return Versions.preM && Restrictions.isAllowed(context, Restrictable.IMPORT_SETTINGS); } public void onChange(Context context, Preference pref, Object newValue) { } diff --git a/mobile/android/base/preferences/GeckoPreferences.java b/mobile/android/base/preferences/GeckoPreferences.java index c4c3740a5104..7177b451103d 100644 --- a/mobile/android/base/preferences/GeckoPreferences.java +++ b/mobile/android/base/preferences/GeckoPreferences.java @@ -463,7 +463,7 @@ OnSharedPreferenceChangeListener while (iterator.hasNext()) { Header header = iterator.next(); - if (header.id == R.id.pref_header_advanced && !Restrictions.isAllowed(this, Restrictable.DISALLOW_ADVANCED_SETTINGS)) { + if (header.id == R.id.pref_header_advanced && !Restrictions.isAllowed(this, Restrictable.ADVANCED_SETTINGS)) { iterator.remove(); } } @@ -678,7 +678,7 @@ OnSharedPreferenceChangeListener continue; } } else if (PREFS_SCREEN_ADVANCED.equals(key) && - !Restrictions.isAllowed(this, Restrictable.DISALLOW_ADVANCED_SETTINGS)) { + !Restrictions.isAllowed(this, Restrictable.ADVANCED_SETTINGS)) { preferences.removePreference(pref); i--; continue; @@ -694,7 +694,7 @@ OnSharedPreferenceChangeListener } } else if (PREFS_OPEN_URLS_IN_PRIVATE.equals(key)) { // Remove UI for opening external links in private browsing on non-Nightly builds. - if (!AppConstants.NIGHTLY_BUILD || !Restrictions.isAllowed(this, Restrictable.DISALLOW_PRIVATE_BROWSING)) { + if (!AppConstants.NIGHTLY_BUILD || !Restrictions.isAllowed(this, Restrictable.PRIVATE_BROWSING)) { preferences.removePreference(pref); i--; continue; @@ -734,19 +734,19 @@ OnSharedPreferenceChangeListener } } else if (PREFS_GEO_REPORTING.equals(key) || PREFS_GEO_LEARN_MORE.equals(key)) { - if (!AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED || !Restrictions.isAllowed(this, Restrictable.DISALLOW_LOCATION_SERVICE)) { + if (!AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED || !Restrictions.isAllowed(this, Restrictable.LOCATION_SERVICE)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_DEVTOOLS_REMOTE_USB_ENABLED.equals(key)) { - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_REMOTE_DEBUGGING)) { + if (!Restrictions.isAllowed(this, Restrictable.REMOTE_DEBUGGING)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_DEVTOOLS_REMOTE_WIFI_ENABLED.equals(key)) { - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_REMOTE_DEBUGGING)) { + if (!Restrictions.isAllowed(this, Restrictable.REMOTE_DEBUGGING)) { preferences.removePreference(pref); i--; continue; @@ -759,7 +759,7 @@ OnSharedPreferenceChangeListener } } else if (PREFS_DEVTOOLS_REMOTE_LINK.equals(key)) { // Remove the "Learn more" link if remote debugging is disabled - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_REMOTE_DEBUGGING)) { + if (!Restrictions.isAllowed(this, Restrictable.REMOTE_DEBUGGING)) { preferences.removePreference(pref); i--; continue; @@ -776,7 +776,7 @@ OnSharedPreferenceChangeListener continue; } else if (PREFS_SYNC.equals(key)) { // Don't show sync prefs while in guest mode. - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_MODIFY_ACCOUNTS)) { + if (!Restrictions.isAllowed(this, Restrictable.MODIFY_ACCOUNTS)) { preferences.removePreference(pref); i--; continue; @@ -819,19 +819,19 @@ OnSharedPreferenceChangeListener continue; } } else if (PREFS_TRACKING_PROTECTION_PRIVATE_BROWSING.equals(key)) { - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(this, Restrictable.PRIVATE_BROWSING)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_TRACKING_PROTECTION_LEARN_MORE.equals(key)) { - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(this, Restrictable.PRIVATE_BROWSING)) { preferences.removePreference(pref); i--; continue; } } else if (PREFS_MP_ENABLED.equals(key)) { - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_MASTER_PASSWORD)) { + if (!Restrictions.isAllowed(this, Restrictable.MASTER_PASSWORD)) { preferences.removePreference(pref); i--; continue; @@ -843,7 +843,7 @@ OnSharedPreferenceChangeListener continue; } } else if (PREFS_CLEAR_PRIVATE_DATA.equals(key) || PREFS_CLEAR_PRIVATE_DATA_EXIT.equals(key)) { - if (!Restrictions.isAllowed(this, Restrictable.DISALLOW_CLEAR_HISTORY)) { + if (!Restrictions.isAllowed(this, Restrictable.CLEAR_HISTORY)) { preferences.removePreference(pref); i--; continue; diff --git a/mobile/android/base/restrictions/GuestProfileConfiguration.java b/mobile/android/base/restrictions/GuestProfileConfiguration.java index 7650bbf89789..aee84ae5f01a 100644 --- a/mobile/android/base/restrictions/GuestProfileConfiguration.java +++ b/mobile/android/base/restrictions/GuestProfileConfiguration.java @@ -14,18 +14,18 @@ import java.util.List; * RestrictionConfiguration implementation for guest profiles. */ public class GuestProfileConfiguration implements RestrictionConfiguration { - static List DEFAULT_RESTRICTIONS = Arrays.asList( - Restrictable.DISALLOW_DOWNLOADS, - Restrictable.DISALLOW_INSTALL_EXTENSION, - Restrictable.DISALLOW_INSTALL_APPS, - Restrictable.DISALLOW_BROWSE_FILES, - Restrictable.DISALLOW_SHARE, - Restrictable.DISALLOW_BOOKMARK, - Restrictable.DISALLOW_ADD_CONTACTS, - Restrictable.DISALLOW_SET_IMAGE, - Restrictable.DISALLOW_MODIFY_ACCOUNTS, - Restrictable.DISALLOW_REMOTE_DEBUGGING, - Restrictable.DISALLOW_IMPORT_SETTINGS + static List DISABLED_FEATURES = Arrays.asList( + Restrictable.DOWNLOAD, + Restrictable.INSTALL_EXTENSION, + Restrictable.INSTALL_APPS, + Restrictable.BROWSE, + Restrictable.SHARE, + Restrictable.BOOKMARK, + Restrictable.ADD_CONTACT, + Restrictable.SET_IMAGE, + Restrictable.MODIFY_ACCOUNTS, + Restrictable.REMOTE_DEBUGGING, + Restrictable.IMPORT_SETTINGS ); @SuppressWarnings("serial") @@ -44,7 +44,7 @@ public class GuestProfileConfiguration implements RestrictionConfiguration { @Override public boolean isAllowed(Restrictable restrictable) { - return !DEFAULT_RESTRICTIONS.contains(restrictable); + return !DISABLED_FEATURES.contains(restrictable); } @Override diff --git a/mobile/android/base/restrictions/Restrictable.java b/mobile/android/base/restrictions/Restrictable.java index d17d3e18cba7..e9a53013b3b2 100644 --- a/mobile/android/base/restrictions/Restrictable.java +++ b/mobile/android/base/restrictions/Restrictable.java @@ -16,43 +16,43 @@ import android.support.annotation.StringRes; * These constants should be in sync with the ones from toolkit/components/parentalcontrols/nsIParentalControlsService.idl */ public enum Restrictable { - DISALLOW_DOWNLOADS(1, "no_download_files", 0), + DOWNLOAD(1, "downloads", 0), - DISALLOW_INSTALL_EXTENSION(2, "no_install_extensions", R.string.restriction_disallow_addons_title), + INSTALL_EXTENSION(2, "no_install_extensions", R.string.restrictable_feature_addons_installation), // UserManager.DISALLOW_INSTALL_APPS - DISALLOW_INSTALL_APPS(3, "no_install_apps", 0), + INSTALL_APPS(3, "no_install_apps", 0), - DISALLOW_BROWSE_FILES(4, "no_browse_files", 0), + BROWSE(4, "browse", 0), - DISALLOW_SHARE(5, "no_share", 0), + SHARE(5, "share", 0), - DISALLOW_BOOKMARK(6, "no_bookmark", 0), + BOOKMARK(6, "bookmark", 0), - DISALLOW_ADD_CONTACTS(7, "no_add_contacts", 0), + ADD_CONTACT(7, "add_contact", 0), - DISALLOW_SET_IMAGE(8, "no_set_image", 0), + SET_IMAGE(8, "set_image", 0), // UserManager.DISALLOW_MODIFY_ACCOUNTS - DISALLOW_MODIFY_ACCOUNTS(9, "no_modify_accounts", 0), + MODIFY_ACCOUNTS(9, "no_modify_accounts", 0), - DISALLOW_REMOTE_DEBUGGING(10, "no_remote_debugging", 0), + REMOTE_DEBUGGING(10, "remote_debugging", 0), - DISALLOW_IMPORT_SETTINGS(11, "no_import_settings", 0), + IMPORT_SETTINGS(11, "import_settings", 0), - DISALLOW_PRIVATE_BROWSING(12, "no_private_browsing", R.string.restriction_disallow_private_browsing_title), + PRIVATE_BROWSING(12, "private_browsing", R.string.restrictable_feature_private_browsing), - DISALLOW_LOCATION_SERVICE(13, "no_location_service", R.string.restriction_disallow_location_services_title), + LOCATION_SERVICE(13, "location_service", R.string.restrictable_feature_location_services), - DISALLOW_CLEAR_HISTORY(14, "no_clear_history", R.string.restriction_disallow_clear_history_title), + CLEAR_HISTORY(14, "clear_history", R.string.restrictable_feature_clear_history), - DISALLOW_MASTER_PASSWORD(15, "no_master_password", R.string.restriction_disallow_master_password_title), + MASTER_PASSWORD(15, "master_password", R.string.restrictable_feature_master_password), - DISALLOW_GUEST_BROWSING(16, "no_guest_browsing", R.string.restriction_disallow_guest_browsing_title), + GUEST_BROWSING(16, "guest_browsing", R.string.restrictable_feature_guest_browsing), - DISALLOW_ADVANCED_SETTINGS(17, "no_advanced_settings", R.string.restriction_disallow_advanced_settings_title), + ADVANCED_SETTINGS(17, "advanced_settings", R.string.restrictable_feature_advanced_settings), - DISALLOW_CAMERA_MICROPHONE(18, "no_camera_microphone", R.string.restriction_disallow_camera_microphone_title); + CAMERA_MICROPHONE(18, "camera_microphone", R.string.restrictable_feature_camera_microphone); public final int id; public final String name; diff --git a/mobile/android/base/restrictions/RestrictedProfileConfiguration.java b/mobile/android/base/restrictions/RestrictedProfileConfiguration.java index 7fb3a17b688c..f7e9d8e99b03 100644 --- a/mobile/android/base/restrictions/RestrictedProfileConfiguration.java +++ b/mobile/android/base/restrictions/RestrictedProfileConfiguration.java @@ -20,19 +20,20 @@ import java.util.List; @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) public class RestrictedProfileConfiguration implements RestrictionConfiguration { - static List DEFAULT_RESTRICTIONS = Arrays.asList( - Restrictable.DISALLOW_INSTALL_EXTENSION, - Restrictable.DISALLOW_PRIVATE_BROWSING, - Restrictable.DISALLOW_LOCATION_SERVICE, - Restrictable.DISALLOW_CLEAR_HISTORY, - Restrictable.DISALLOW_MASTER_PASSWORD, - Restrictable.DISALLOW_GUEST_BROWSING, - Restrictable.DISALLOW_ADVANCED_SETTINGS, - Restrictable.DISALLOW_CAMERA_MICROPHONE + static List DEFAULT_DISABLED_FEATURES = Arrays.asList( + Restrictable.INSTALL_EXTENSION, + Restrictable.PRIVATE_BROWSING, + Restrictable.LOCATION_SERVICE, + Restrictable.CLEAR_HISTORY, + Restrictable.MASTER_PASSWORD, + Restrictable.GUEST_BROWSING, + Restrictable.ADVANCED_SETTINGS, + Restrictable.CAMERA_MICROPHONE ); private Context context; - private Bundle cachedRestrictions; + private Bundle cachedAppRestrictions; + private Bundle cachedUserRestrictions; private boolean isCacheInvalid = true; public RestrictedProfileConfiguration(Context context) { @@ -42,23 +43,28 @@ public class RestrictedProfileConfiguration implements RestrictionConfiguration @Override public synchronized boolean isAllowed(Restrictable restrictable) { if (isCacheInvalid || !ThreadUtils.isOnUiThread()) { - cachedRestrictions = readRestrictions(); + readRestrictions(); isCacheInvalid = false; } - return !cachedRestrictions.getBoolean(restrictable.name, DEFAULT_RESTRICTIONS.contains(restrictable)); + // Special casing system/user restrictions + if (restrictable == Restrictable.INSTALL_APPS || restrictable == Restrictable.MODIFY_ACCOUNTS) { + return !cachedUserRestrictions.getBoolean(restrictable.name); + } + + return cachedAppRestrictions.getBoolean(restrictable.name, !DEFAULT_DISABLED_FEATURES.contains(restrictable)); } - private Bundle readRestrictions() { + private void readRestrictions() { final UserManager mgr = (UserManager) context.getSystemService(Context.USER_SERVICE); StrictMode.ThreadPolicy policy = StrictMode.allowThreadDiskReads(); try { - Bundle restrictions = new Bundle(); - restrictions.putAll(mgr.getApplicationRestrictions(context.getPackageName())); - restrictions.putAll(mgr.getUserRestrictions()); - return restrictions; + cachedAppRestrictions = mgr.getApplicationRestrictions(context.getPackageName()); + cachedUserRestrictions = mgr.getUserRestrictions(); + + } finally { StrictMode.setThreadPolicy(policy); } @@ -66,11 +72,11 @@ public class RestrictedProfileConfiguration implements RestrictionConfiguration @Override public boolean canLoadUrl(String url) { - if (!isAllowed(Restrictable.DISALLOW_INSTALL_EXTENSION) && AboutPages.isAboutAddons(url)) { + if (!isAllowed(Restrictable.INSTALL_EXTENSION) && AboutPages.isAboutAddons(url)) { return false; } - if (!isAllowed(Restrictable.DISALLOW_PRIVATE_BROWSING) && AboutPages.isAboutPrivateBrowsing(url)) { + if (!isAllowed(Restrictable.PRIVATE_BROWSING) && AboutPages.isAboutPrivateBrowsing(url)) { return false; } @@ -91,4 +97,4 @@ public class RestrictedProfileConfiguration implements RestrictionConfiguration public synchronized void update() { isCacheInvalid = true; } -} +} \ No newline at end of file diff --git a/mobile/android/base/restrictions/RestrictionProvider.java b/mobile/android/base/restrictions/RestrictionProvider.java index 985b09fab73b..c41c5a034c6a 100644 --- a/mobile/android/base/restrictions/RestrictionProvider.java +++ b/mobile/android/base/restrictions/RestrictionProvider.java @@ -50,13 +50,13 @@ public class RestrictionProvider extends BroadcastReceiver { private ArrayList initRestrictions(Context context, Bundle oldRestrictions) { ArrayList entries = new ArrayList(); - for (Restrictable restrictable : RestrictedProfileConfiguration.DEFAULT_RESTRICTIONS) { - if (restrictable == Restrictable.DISALLOW_LOCATION_SERVICE && !AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED) { + for (Restrictable restrictable : RestrictedProfileConfiguration.DEFAULT_DISABLED_FEATURES) { + if (restrictable == Restrictable.LOCATION_SERVICE && !AppConstants.MOZ_STUMBLER_BUILD_TIME_ENABLED) { continue; } RestrictionEntry entry = createRestrictionEntryWithDefaultValue(context, restrictable, - oldRestrictions.getBoolean(restrictable.name, true)); + oldRestrictions.getBoolean(restrictable.name, false)); entries.add(entry); } diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in index 0af9fc840384..b75e6fcb3ac4 100644 --- a/mobile/android/base/strings.xml.in +++ b/mobile/android/base/strings.xml.in @@ -564,15 +564,15 @@ &voicesearch_prompt; - - &restriction_disallow_addons_title2; - &restriction_disallow_private_browsing_title2; - &restriction_disallow_location_services_title2; - &restriction_disallow_clear_history_title2; - &restriction_disallow_master_password_title2; - &restriction_disallow_guest_browsing_title2; - &restriction_disallow_advanced_settings_title; - &restriction_disallow_camera_microphone_title; + + &restrictable_feature_addons_installation; + &restrictable_feature_private_browsing; + &restrictable_feature_location_services; + &restrictable_feature_clear_history; + &restrictable_feature_guest_browsing; + &restrictable_feature_master_password; + &restrictable_feature_advanced_settings; + &restrictable_feature_camera_microphone; &ellipsis; diff --git a/mobile/android/base/tabs/TabsPanel.java b/mobile/android/base/tabs/TabsPanel.java index dc4c27b359d0..c9617f5603fc 100644 --- a/mobile/android/base/tabs/TabsPanel.java +++ b/mobile/android/base/tabs/TabsPanel.java @@ -144,7 +144,7 @@ public class TabsPanel extends LinearLayout (ThemedImageButton) mTabWidget.addTab(R.drawable.tabs_private, R.string.tabs_private); privateTabsPanel.setPrivateMode(true); - if (!Restrictions.isAllowed(mContext, Restrictable.DISALLOW_PRIVATE_BROWSING)) { + if (!Restrictions.isAllowed(mContext, Restrictable.PRIVATE_BROWSING)) { mTabWidget.setVisibility(View.GONE); } @@ -173,7 +173,7 @@ public class TabsPanel extends LinearLayout // Each panel has a "+" shortcut button, so don't show it for that panel. menu.findItem(R.id.new_tab).setVisible(mCurrentPanel != Panel.NORMAL_TABS); menu.findItem(R.id.new_private_tab).setVisible(mCurrentPanel != Panel.PRIVATE_TABS - && Restrictions.isAllowed(mContext, Restrictable.DISALLOW_PRIVATE_BROWSING)); + && Restrictions.isAllowed(mContext, Restrictable.PRIVATE_BROWSING)); // Only show "Clear * tabs" for current panel. menu.findItem(R.id.close_all_tabs).setVisible(mCurrentPanel == Panel.NORMAL_TABS); diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 0af3affaf4a1..e2f7a3ad22b6 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -4487,8 +4487,8 @@ Tab.prototype = { fixedURI = URIFixup.createExposableURI(aLocationURI); } catch (ex) { } - // In restricted profiles, we refuse to let you open any file urls. - if (!ParentalControls.isAllowed(ParentalControls.VISIT_FILE_URLS, fixedURI)) { + // In restricted profiles, we refuse to let you open various urls. + if (!ParentalControls.isAllowed(ParentalControls.BROWSE, fixedURI)) { aRequest.cancel(Cr.NS_BINDING_ABORTED); this.browser.docShell.displayLoadError(Cr.NS_ERROR_UNKNOWN_PROTOCOL, fixedURI, null); diff --git a/mobile/android/tests/browser/chrome/test_restricted_profiles.html b/mobile/android/tests/browser/chrome/test_restricted_profiles.html index ad6af326e188..d699176b5f60 100644 --- a/mobile/android/tests/browser/chrome/test_restricted_profiles.html +++ b/mobile/android/tests/browser/chrome/test_restricted_profiles.html @@ -32,7 +32,7 @@ Migrated from Robocop: https://bugzilla.mozilla.org/show_bug.cgi?id=1184186 ok(pc.isAllowed(Ci.nsIParentalControlsService.DOWNLOAD)); ok(pc.isAllowed(Ci.nsIParentalControlsService.INSTALL_EXTENSION)); ok(pc.isAllowed(Ci.nsIParentalControlsService.INSTALL_APP)); - ok(pc.isAllowed(Ci.nsIParentalControlsService.VISIT_FILE_URLS)); + ok(pc.isAllowed(Ci.nsIParentalControlsService.BROWSE)); ok(pc.isAllowed(Ci.nsIParentalControlsService.SHARE)); ok(pc.isAllowed(Ci.nsIParentalControlsService.BOOKMARK)); ok(pc.isAllowed(Ci.nsIParentalControlsService.INSTALL_EXTENSION)); diff --git a/toolkit/components/parentalcontrols/nsIParentalControlsService.idl b/toolkit/components/parentalcontrols/nsIParentalControlsService.idl index 6f7fac6924dc..2a5c47368e98 100644 --- a/toolkit/components/parentalcontrols/nsIParentalControlsService.idl +++ b/toolkit/components/parentalcontrols/nsIParentalControlsService.idl @@ -11,7 +11,7 @@ interface nsIFile; interface nsIInterfaceRequestor; interface nsIArray; -[scriptable, uuid(c7713ad7-0804-4353-91d5-4d7f1376bded)] +[scriptable, uuid(ec6ae96e-e161-481e-bb51-78b11fc1fdbe)] interface nsIParentalControlsService : nsISupports { /** @@ -20,7 +20,7 @@ interface nsIParentalControlsService : nsISupports const short DOWNLOAD = 1; // Downloading files const short INSTALL_EXTENSION = 2; // Installing extensions const short INSTALL_APP = 3; // Installing webapps - const short VISIT_FILE_URLS = 4; // Opening file:/// urls + const short BROWSE = 4; // Opening specific urls const short SHARE = 5; // Sharing const short BOOKMARK = 6; // Creating bookmarks const short ADD_CONTACT = 7; // Add contacts to the system database From 1780a4912dc2a57629b729f78171540488f12693 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Tue, 17 Nov 2015 15:28:40 +0100 Subject: [PATCH 074/153] Bug 1189336 - (Part 4) Migrate old restrictions if needed. r=ally --HG-- extra : commitid : 15Piph0WLl1 extra : rebase_source : 7eb6a1a455a6f3736de1f17181f76fb2d9cd18fc --- .../RestrictedProfileConfiguration.java | 42 +++++++++++++++++-- .../restrictions/RestrictionProvider.java | 2 + 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/mobile/android/base/restrictions/RestrictedProfileConfiguration.java b/mobile/android/base/restrictions/RestrictedProfileConfiguration.java index f7e9d8e99b03..c255b83211da 100644 --- a/mobile/android/base/restrictions/RestrictedProfileConfiguration.java +++ b/mobile/android/base/restrictions/RestrictedProfileConfiguration.java @@ -61,10 +61,11 @@ public class RestrictedProfileConfiguration implements RestrictionConfiguration StrictMode.ThreadPolicy policy = StrictMode.allowThreadDiskReads(); try { - cachedAppRestrictions = mgr.getApplicationRestrictions(context.getPackageName()); + Bundle appRestrictions = mgr.getApplicationRestrictions(context.getPackageName()); + migrateRestrictionsIfNeeded(appRestrictions); + + cachedAppRestrictions = appRestrictions; cachedUserRestrictions = mgr.getUserRestrictions(); - - } finally { StrictMode.setThreadPolicy(policy); } @@ -97,4 +98,37 @@ public class RestrictedProfileConfiguration implements RestrictionConfiguration public synchronized void update() { isCacheInvalid = true; } -} \ No newline at end of file + + /** + * This method migrates the old set of DISALLOW_ restrictions to the new restrictable feature ones (Bug 1189336). + */ + public static void migrateRestrictionsIfNeeded(Bundle bundle) { + if (!bundle.containsKey(Restrictable.INSTALL_EXTENSION.name) && bundle.containsKey("no_install_extensions")) { + bundle.putBoolean(Restrictable.INSTALL_EXTENSION.name, !bundle.getBoolean("no_install_extensions")); + } + + if (!bundle.containsKey(Restrictable.PRIVATE_BROWSING.name) && bundle.containsKey("no_private_browsing")) { + bundle.putBoolean(Restrictable.PRIVATE_BROWSING.name, !bundle.getBoolean("no_private_browsing")); + } + + if (!bundle.containsKey(Restrictable.LOCATION_SERVICE.name) && bundle.containsKey("no_location_service")) { + bundle.putBoolean(Restrictable.LOCATION_SERVICE.name, !bundle.getBoolean("no_location_service")); + } + + if (!bundle.containsKey(Restrictable.CLEAR_HISTORY.name) && bundle.containsKey("no_clear_history")) { + bundle.putBoolean(Restrictable.CLEAR_HISTORY.name, !bundle.getBoolean("no_clear_history")); + } + + if (!bundle.containsKey(Restrictable.MASTER_PASSWORD.name) && bundle.containsKey("no_master_password")) { + bundle.putBoolean(Restrictable.MASTER_PASSWORD.name, !bundle.getBoolean("no_master_password")); + } + + if (!bundle.containsKey(Restrictable.GUEST_BROWSING.name) && bundle.containsKey("no_guest_browsing")) { + bundle.putBoolean(Restrictable.GUEST_BROWSING.name, !bundle.getBoolean("no_guest_browsing")); + } + + if (!bundle.containsKey(Restrictable.ADVANCED_SETTINGS.name) && bundle.containsKey("no_advanced_settings")) { + bundle.putBoolean(Restrictable.ADVANCED_SETTINGS.name, !bundle.getBoolean("no_advanced_settings")); + } + } +} diff --git a/mobile/android/base/restrictions/RestrictionProvider.java b/mobile/android/base/restrictions/RestrictionProvider.java index c41c5a034c6a..4e0ce4d0b2e2 100644 --- a/mobile/android/base/restrictions/RestrictionProvider.java +++ b/mobile/android/base/restrictions/RestrictionProvider.java @@ -36,6 +36,8 @@ public class RestrictionProvider extends BroadcastReceiver { @Override public void run() { final Bundle oldRestrictions = intent.getBundleExtra(Intent.EXTRA_RESTRICTIONS_BUNDLE); + RestrictedProfileConfiguration.migrateRestrictionsIfNeeded(oldRestrictions); + final Bundle extras = new Bundle(); ArrayList entries = initRestrictions(context, oldRestrictions); From 7cc3904463ef89332dafb4b5715b87369fd32229 Mon Sep 17 00:00:00 2001 From: Mike de Boer Date: Fri, 27 Nov 2015 15:00:21 +0100 Subject: [PATCH 075/153] Bug 1225832: fix UITour unit tests for Loop without navigator.mozLoop present. r=Standard8 --- .../loop/content/js/conversation.js | 52 +++++--- .../loop/content/js/conversation.jsx | 52 +++++--- .../loop/content/js/conversationAppStore.js | 22 ++-- browser/components/loop/content/js/panel.js | 120 ++++++++---------- browser/components/loop/content/js/panel.jsx | 120 ++++++++---------- .../components/loop/content/js/roomViews.js | 2 +- .../components/loop/content/js/roomViews.jsx | 2 +- .../loop/content/shared/js/loopapi-client.js | 31 +++++ .../components/loop/modules/MozLoopAPI.jsm | 6 +- browser/components/loop/run-all-loop-tests.sh | 2 + .../conversationAppStore_test.js | 9 +- .../test/desktop-local/conversation_test.js | 3 + .../loop/test/desktop-local/panel_test.js | 49 +++---- .../loop/test/desktop-local/roomViews_test.js | 12 +- .../loop/test/shared/loopapi-client_test.js | 44 +++++++ browser/components/loop/ui/fake-mozLoop.js | 14 +- browser/components/uitour/test/browser.ini | 2 +- .../uitour/test/browser_UITour_loop.js | 90 +++++++++---- 18 files changed, 375 insertions(+), 257 deletions(-) diff --git a/browser/components/loop/content/js/conversation.js b/browser/components/loop/content/js/conversation.js index ba234a64bd59..1e9384068bb5 100644 --- a/browser/components/loop/content/js/conversation.js +++ b/browser/components/loop/content/js/conversation.js @@ -91,7 +91,16 @@ loop.conversation = (function(mozL10n) { * Conversation initialisation. */ function init() { - return loop.requestMulti( + // Obtain the windowId and pass it through + var locationHash = loop.shared.utils.locationData().hash; + var windowId; + + var hash = locationHash.match(/#(.*)/); + if (hash) { + windowId = hash[1]; + } + + var requests = [ ["GetAllConstants"], ["GetAllStrings"], ["GetLocale"], @@ -99,12 +108,20 @@ loop.conversation = (function(mozL10n) { ["GetLoopPref", "textChat.enabled"], ["GetLoopPref", "feedback.periodSec"], ["GetLoopPref", "feedback.dateLastSeenSec"] - ).then(function(results) { - var constants = results[0]; + ]; + var prefetch = [ + ["GetConversationWindowData", windowId] + ]; + + return loop.requestMulti.apply(null, requests.concat(prefetch)).then(function(results) { + // `requestIdx` is keyed off the order of the `requests` and `prefetch` + // arrays. Be careful to update both when making changes. + var requestIdx = 0; + var constants = results[requestIdx]; // Do the initial L10n setup, we do this before anything // else to ensure the L10n environment is setup correctly. - var stringBundle = results[1]; - var locale = results[2]; + var stringBundle = results[++requestIdx]; + var locale = results[++requestIdx]; mozL10n.initialize({ locale: locale, getStrings: function(key) { @@ -119,20 +136,22 @@ loop.conversation = (function(mozL10n) { // Plug in an alternate client ID mechanism, as localStorage and cookies // don't work in the conversation window + var currGuid = results[++requestIdx]; window.OT.overrideGuidStorage({ get: function(callback) { - callback(null, results[3]); + callback(null, currGuid); }, set: function(guid, callback) { // See nsIPrefBranch var PREF_STRING = 32; + currGuid = guid; loop.request("SetLoopPref", "ot.guid", guid, PREF_STRING); callback(null); } }); // We want data channels only if the text chat preference is enabled. - var useDataChannels = results[4]; + var useDataChannels = results[++requestIdx]; var dispatcher = new loop.Dispatcher(); var sdkDriver = new loop.OTSdkDriver({ @@ -154,9 +173,15 @@ loop.conversation = (function(mozL10n) { var conversationAppStore = new loop.store.ConversationAppStore({ activeRoomStore: activeRoomStore, dispatcher: dispatcher, - feedbackPeriod: results[5], - feedbackTimestamp: results[6] + feedbackPeriod: results[++requestIdx], + feedbackTimestamp: results[++requestIdx] }); + + prefetch.forEach(function(req) { + req.shift(); + loop.storeRequest(req, results[++requestIdx]); + }); + var roomStore = new loop.store.RoomStore(dispatcher, { activeRoomStore: activeRoomStore, constants: constants @@ -170,15 +195,6 @@ loop.conversation = (function(mozL10n) { textChatStore: textChatStore }); - // Obtain the windowId and pass it through - var locationHash = loop.shared.utils.locationData().hash; - var windowId; - - var hash = locationHash.match(/#(.*)/); - if (hash) { - windowId = hash[1]; - } - React.render( React.createElement(AppControllerView, { dispatcher: dispatcher, diff --git a/browser/components/loop/content/js/conversation.jsx b/browser/components/loop/content/js/conversation.jsx index 66a43368de17..6f472c965ccc 100644 --- a/browser/components/loop/content/js/conversation.jsx +++ b/browser/components/loop/content/js/conversation.jsx @@ -91,7 +91,16 @@ loop.conversation = (function(mozL10n) { * Conversation initialisation. */ function init() { - return loop.requestMulti( + // Obtain the windowId and pass it through + var locationHash = loop.shared.utils.locationData().hash; + var windowId; + + var hash = locationHash.match(/#(.*)/); + if (hash) { + windowId = hash[1]; + } + + var requests = [ ["GetAllConstants"], ["GetAllStrings"], ["GetLocale"], @@ -99,12 +108,20 @@ loop.conversation = (function(mozL10n) { ["GetLoopPref", "textChat.enabled"], ["GetLoopPref", "feedback.periodSec"], ["GetLoopPref", "feedback.dateLastSeenSec"] - ).then(function(results) { - var constants = results[0]; + ]; + var prefetch = [ + ["GetConversationWindowData", windowId] + ]; + + return loop.requestMulti.apply(null, requests.concat(prefetch)).then(function(results) { + // `requestIdx` is keyed off the order of the `requests` and `prefetch` + // arrays. Be careful to update both when making changes. + var requestIdx = 0; + var constants = results[requestIdx]; // Do the initial L10n setup, we do this before anything // else to ensure the L10n environment is setup correctly. - var stringBundle = results[1]; - var locale = results[2]; + var stringBundle = results[++requestIdx]; + var locale = results[++requestIdx]; mozL10n.initialize({ locale: locale, getStrings: function(key) { @@ -119,20 +136,22 @@ loop.conversation = (function(mozL10n) { // Plug in an alternate client ID mechanism, as localStorage and cookies // don't work in the conversation window + var currGuid = results[++requestIdx]; window.OT.overrideGuidStorage({ get: function(callback) { - callback(null, results[3]); + callback(null, currGuid); }, set: function(guid, callback) { // See nsIPrefBranch var PREF_STRING = 32; + currGuid = guid; loop.request("SetLoopPref", "ot.guid", guid, PREF_STRING); callback(null); } }); // We want data channels only if the text chat preference is enabled. - var useDataChannels = results[4]; + var useDataChannels = results[++requestIdx]; var dispatcher = new loop.Dispatcher(); var sdkDriver = new loop.OTSdkDriver({ @@ -154,9 +173,15 @@ loop.conversation = (function(mozL10n) { var conversationAppStore = new loop.store.ConversationAppStore({ activeRoomStore: activeRoomStore, dispatcher: dispatcher, - feedbackPeriod: results[5], - feedbackTimestamp: results[6] + feedbackPeriod: results[++requestIdx], + feedbackTimestamp: results[++requestIdx] }); + + prefetch.forEach(function(req) { + req.shift(); + loop.storeRequest(req, results[++requestIdx]); + }); + var roomStore = new loop.store.RoomStore(dispatcher, { activeRoomStore: activeRoomStore, constants: constants @@ -170,15 +195,6 @@ loop.conversation = (function(mozL10n) { textChatStore: textChatStore }); - // Obtain the windowId and pass it through - var locationHash = loop.shared.utils.locationData().hash; - var windowId; - - var hash = locationHash.match(/#(.*)/); - if (hash) { - windowId = hash[1]; - } - React.render( { - message.target.sendAsyncMessage(message.name, [seq, result]); + try { + message.target.sendAsyncMessage(message.name, [seq, result]); + } catch (ex) { + MozLoopService.log.error("Failed to send reply back to content:", ex); + } } } diff --git a/browser/components/loop/run-all-loop-tests.sh b/browser/components/loop/run-all-loop-tests.sh index 2628c0b1aed2..7e67e250dc12 100755 --- a/browser/components/loop/run-all-loop-tests.sh +++ b/browser/components/loop/run-all-loop-tests.sh @@ -44,6 +44,7 @@ fi TESTS=" ${LOOPDIR}/test/mochitest + browser/components/uitour/test/browser_UITour_loop.js browser/base/content/test/general/browser_devices_get_user_media_about_urls.js browser/base/content/test/general/browser_parsable_css.js " @@ -55,6 +56,7 @@ do ./mach mochitest $test # UITour & get user media aren't compatible with e10s currenly. if [ "$1" != "--skip-e10s" ] && \ + [ "$test" != "browser/components/uitour/test/browser_UITour_loop.js" ] && \ [ "$test" != "browser/base/content/test/general/browser_devices_get_user_media_about_urls.js" ]; then ./mach mochitest --e10s $test diff --git a/browser/components/loop/test/desktop-local/conversationAppStore_test.js b/browser/components/loop/test/desktop-local/conversationAppStore_test.js index 398e6f5c5074..fdcf34198677 100644 --- a/browser/components/loop/test/desktop-local/conversationAppStore_test.js +++ b/browser/components/loop/test/desktop-local/conversationAppStore_test.js @@ -106,13 +106,10 @@ describe("loop.store.ConversationAppStore", function() { getLoopPrefStub = sandbox.stub(); setLoopPrefStub = sandbox.stub(); + loop.storedRequests = { + "GetConversationWindowData|42": fakeWindowData + }; LoopMochaUtils.stubLoopRequest({ - GetConversationWindowData: function(windowId) { - if (windowId === "42") { - return fakeWindowData; - } - return null; - }, GetLoopPref: getLoopPrefStub, SetLoopPref: setLoopPrefStub }); diff --git a/browser/components/loop/test/desktop-local/conversation_test.js b/browser/components/loop/test/desktop-local/conversation_test.js index 4c0740d38008..6060b62f72c6 100644 --- a/browser/components/loop/test/desktop-local/conversation_test.js +++ b/browser/components/loop/test/desktop-local/conversation_test.js @@ -57,6 +57,9 @@ describe("loop.conversation", function() { }), GetSelectedTabMetadata: function() { return {}; + }, + GetConversationWindowData: function() { + return {}; } }); diff --git a/browser/components/loop/test/desktop-local/panel_test.js b/browser/components/loop/test/desktop-local/panel_test.js index 7f9657cfdb51..40364690ab94 100644 --- a/browser/components/loop/test/desktop-local/panel_test.js +++ b/browser/components/loop/test/desktop-local/panel_test.js @@ -77,6 +77,17 @@ describe("loop.panel", function() { GetUserProfile: function() { return null; } }); + loop.storedRequests = { + GetFxAEnabled: true, + GetHasEncryptionKey: true, + GetUserProfile: null, + GetDoNotDisturb: false, + "GetLoopPref|gettingStarted.seen": "unseen", + "GetLoopPref|legal.ToS_url": "", + "GetLoopPref|legal.privacy_url": "", + IsMultiProcessEnabled: false + }; + roomName = "First Room Name"; roomData = { roomToken: "QzBbvGmIZWU", @@ -255,11 +266,7 @@ describe("loop.panel", function() { }); it("should add ellipsis to text over 24chars", function() { - LoopMochaUtils.stubLoopRequest({ - GetUserProfile: function() { - return { email: "reallyreallylongtext@example.com" }; - } - }); + loop.storedRequests.GetUserProfile = { email: "reallyreallylongtext@example.com" }; var view = createTestPanelView(); var node = view.getDOMNode().querySelector(".user-identity"); @@ -349,9 +356,7 @@ describe("loop.panel", function() { }); it("should show a signout entry when user is authenticated", function() { - LoopMochaUtils.stubLoopRequest({ - GetUserProfile: function() { return { email: "test@example.com" }; } - }); + loop.storedRequests.GetUserProfile = { email: "test@example.com" }; var view = mountTestComponent(); @@ -374,9 +379,7 @@ describe("loop.panel", function() { it("should open the FxA settings when the account entry is clicked", function() { - LoopMochaUtils.stubLoopRequest({ - GetUserProfile: function() { return { email: "test@example.com" }; } - }); + loop.storedRequests.GetUserProfile = { email: "test@example.com" }; var view = mountTestComponent(); @@ -387,9 +390,7 @@ describe("loop.panel", function() { }); it("should sign out the user on click when authenticated", function() { - LoopMochaUtils.stubLoopRequest({ - GetUserProfile: function() { return { email: "test@example.com" }; } - }); + loop.storedRequests.GetUserProfile = { email: "test@example.com" }; var view = mountTestComponent(); TestUtils.Simulate.click(view.getDOMNode() @@ -542,9 +543,7 @@ describe("loop.panel", function() { }); it("should not render a ToSView when gettingStarted.seen is false", function() { - LoopMochaUtils.stubLoopRequest({ - GetLoopPref: function() { return false; } - }); + loop.storedRequests["GetLoopPref|gettingStarted.seen"] = false; var view = createTestPanelView(); expect(function() { @@ -553,18 +552,14 @@ describe("loop.panel", function() { }); it("should render a GettingStarted view", function() { - LoopMochaUtils.stubLoopRequest({ - GetLoopPref: function() { return false; } - }); + loop.storedRequests["GetLoopPref|gettingStarted.seen"] = false; var view = createTestPanelView(); TestUtils.findRenderedComponentWithType(view, loop.panel.GettingStartedView); }); it("should not render a GettingStartedView when the view has been seen", function() { - LoopMochaUtils.stubLoopRequest({ - GetLoopPref: function() { return true; } - }); + loop.storedRequests["GetLoopPref|gettingStarted.seen"] = true; var view = createTestPanelView(); try { @@ -576,9 +571,7 @@ describe("loop.panel", function() { }); it("should render a SignInRequestView when mozLoop.hasEncryptionKey is false", function() { - LoopMochaUtils.stubLoopRequest({ - GetHasEncryptionKey: function() { return false; } - }); + loop.storedRequests.GetHasEncryptionKey = false; var view = createTestPanelView(); @@ -597,9 +590,7 @@ describe("loop.panel", function() { }); it("should render a E10sNotSupported when multiprocess is enabled", function() { - LoopMochaUtils.stubLoopRequest({ - IsMultiProcessEnabled: function() { return true; } - }); + loop.storedRequests.IsMultiProcessEnabled = true; var view = createTestPanelView(); diff --git a/browser/components/loop/test/desktop-local/roomViews_test.js b/browser/components/loop/test/desktop-local/roomViews_test.js index 1de591539c24..a427d1a27e9a 100644 --- a/browser/components/loop/test/desktop-local/roomViews_test.js +++ b/browser/components/loop/test/desktop-local/roomViews_test.js @@ -196,7 +196,7 @@ describe("loop.roomViews", function() { function mountTestComponent(props) { props = _.extend({ dispatcher: dispatcher, - roomData: {}, + roomData: { roomUrl: "http://invalid" }, savingContext: false, show: true, showEditContext: false @@ -208,9 +208,7 @@ describe("loop.roomViews", function() { it("should dispatch an EmailRoomUrl with no description" + " for rooms without context when the email button is pressed", function() { - view = mountTestComponent({ - roomData: { roomUrl: "http://invalid" } - }); + view = mountTestComponent(); var emailBtn = view.getDOMNode().querySelector(".btn-email"); @@ -250,9 +248,7 @@ describe("loop.roomViews", function() { describe("Copy Button", function() { beforeEach(function() { - view = mountTestComponent({ - roomData: { roomUrl: "http://invalid" } - }); + view = mountTestComponent(); }); it("should dispatch a CopyRoomUrl action when the copy button is pressed", function() { @@ -323,6 +319,8 @@ describe("loop.roomViews", function() { } }); onCallTerminatedStub = sandbox.stub(); + + activeRoomStore.setStoreState({ roomUrl: "http://invalid " }); }); function mountTestComponent(props) { diff --git a/browser/components/loop/test/shared/loopapi-client_test.js b/browser/components/loop/test/shared/loopapi-client_test.js index d8a8c91bfe02..8e16f0471d39 100644 --- a/browser/components/loop/test/shared/loopapi-client_test.js +++ b/browser/components/loop/test/shared/loopapi-client_test.js @@ -109,6 +109,50 @@ describe("loopapi-client", function() { }); }); + describe("loop.storeRequest", function() { + afterEach(function() { + loop.storedRequests = {}; + }); + + it("should the result of a request", function() { + loop.storeRequest(["GetLoopPref"], true); + + expect(loop.storedRequests).to.deep.equal({ + "GetLoopPref": true + }); + }); + + it("should the result of a request with multiple params", function() { + loop.storeRequest(["GetLoopPref", "enabled", "or", "not", "well", + "perhaps", true, 2], true); + + expect(loop.storedRequests).to.deep.equal({ + "GetLoopPref|enabled|or|not|well|perhaps|true|2": true + }); + }); + }); + + describe("loop.getStoredRequest", function() { + afterEach(function() { + loop.storedRequests = {}; + }); + + it("should retrieve a result", function() { + loop.storedRequests["GetLoopPref"] = true; + + expect(loop.getStoredRequest(["GetLoopPref"])).to.eql(true); + }); + + it("should return log and return null for invalid requests", function() { + sandbox.stub(console, "error"); + + expect(loop.getStoredRequest(["SomethingNeverStored"])).to.eql(null); + sinon.assert.calledOnce(console.error); + sinon.assert.calledWithExactly(console.error, + "This request has not been stored!", ["SomethingNeverStored"]); + }); + }); + describe("loop.requestMulti", function() { it("should send a batch of messages", function() { var promise = loop.requestMulti( diff --git a/browser/components/loop/ui/fake-mozLoop.js b/browser/components/loop/ui/fake-mozLoop.js index 8d50a74c9787..3edf8829ef75 100644 --- a/browser/components/loop/ui/fake-mozLoop.js +++ b/browser/components/loop/ui/fake-mozLoop.js @@ -153,7 +153,6 @@ var fakeRooms = [ }, GetDoNotDisturb: function() { return true; }, GetErrors: function() {}, - GetHasEncryptionKey: function() { return true; }, GetLoopPref: function(pref) { switch (pref) { // Ensure we skip FTE completely. @@ -179,10 +178,21 @@ var fakeRooms = [ "Rooms:GetAll": function(version) { return [].concat(fakeRooms); }, - GetFxAEnabled: function() { return true; }, StartAlerting: function() {}, StopAlerting: function() {}, GetUserProfile: function() { return null; }, "Rooms:PushSubscription": function() {} }); + + loop.storedRequests = { + GetFxAEnabled: true, + GetHasEncryptionKey: true, + GetUserProfile: null, + GetDoNotDisturb: true, + // Ensure we skip FTE completely. + "GetLoopPref|gettingStarted.seen": true, + "GetLoopPref|legal.ToS_url": null, + "GetLoopPref|legal.privacy_url": null, + IsMultiProcessEnabled: false + }; })(); diff --git a/browser/components/uitour/test/browser.ini b/browser/components/uitour/test/browser.ini index 612e4f4d6627..475bd2928e62 100644 --- a/browser/components/uitour/test/browser.ini +++ b/browser/components/uitour/test/browser.ini @@ -42,7 +42,7 @@ skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly. [browser_UITour_heartbeat.js] skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly. [browser_UITour_loop.js] -skip-if = true # Bug 1225832 - New Loop architecture is not compatible with test. +skip-if = os == "linux" || e10s # Bug 1073247 - UITour.jsm not e10s friendly. [browser_UITour_modalDialog.js] skip-if = os != "mac" || e10s # modal dialog disabling only working on OS X.Bug 1073247 - UITour.jsm not e10s friendly [browser_UITour_observe.js] diff --git a/browser/components/uitour/test/browser_UITour_loop.js b/browser/components/uitour/test/browser_UITour_loop.js index 0f6a6ba38c11..ad5636ef3560 100644 --- a/browser/components/uitour/test/browser_UITour_loop.js +++ b/browser/components/uitour/test/browser_UITour_loop.js @@ -6,10 +6,13 @@ var gTestTab; var gContentAPI; var gContentWindow; +var gMessageHandlers; var loopButton; +var fakeRoom; var loopPanel = document.getElementById("loop-notification-panel"); -const { LoopRooms } = Components.utils.import("resource:///modules/loop/LoopRooms.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopRooms } = Cu.import("resource:///modules/loop/LoopRooms.jsm", {}); const { MozLoopServiceInternal } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); function test() { @@ -50,12 +53,12 @@ var tests = [ ok(gettingStartedButton, "Getting Started button should be found"); let newTabPromise = waitForConditionPromise(() => { - return gBrowser.currentURI.path.contains("utm_source=firefox-browser"); + return gBrowser.currentURI.path.includes("utm_source=firefox-browser"); }, "New tab with utm_content=testPageNewID should have opened"); gettingStartedButton.click(); yield newTabPromise; - ok(gBrowser.currentURI.path.contains("utm_content=hello-tour_OpenPanel_testPage"), + ok(gBrowser.currentURI.path.includes("utm_content=hello-tour_OpenPanel_testPage"), "Expected URL opened (" + gBrowser.currentURI.path + ")"); yield gBrowser.removeCurrentTab(); @@ -66,7 +69,7 @@ var tests = [ // Force a refresh of the loop panel since going from seen -> unseen doesn't trigger // automatic re-rendering. let loopWin = document.getElementById("loop-notification-panel").children[0].contentWindow; - var event = new loopWin.CustomEvent("GettingStartedSeen"); + var event = new loopWin.CustomEvent("GettingStartedSeen", { detail: false }); loopWin.dispatchEvent(event); UITour.pageIDsForSession.clear(); @@ -93,12 +96,12 @@ var tests = [ let newTabPromise = waitForConditionPromise(() => { Services.console.logStringMessage(gBrowser.currentURI.path); - return gBrowser.currentURI.path.contains("utm_source=firefox-browser"); + return gBrowser.currentURI.path.includes("utm_source=firefox-browser"); }, "New tab with utm_content=testPageNewID should have opened"); gettingStartedButton.click(); yield newTabPromise; - ok(!gBrowser.currentURI.path.contains("utm_content=hello-tour_OpenPanel_testPageOldId"), + ok(!gBrowser.currentURI.path.includes("utm_content=hello-tour_OpenPanel_testPageOldId"), "Expected URL opened without the utm_content parameter (" + gBrowser.currentURI.path + ")"); yield gBrowser.removeCurrentTab(); @@ -216,10 +219,14 @@ var tests = [ chat.close(); done(); }); - chat.content.contentDocument.querySelector(".btn-copy").click(); + + let window = chat.content.contentWindow; + waitForConditionPromise( + () => chat.content.contentDocument.querySelector(".btn-copy"), + "Copy button should be there" + ).then(() => chat.content.contentDocument.querySelector(".btn-copy").click()); }); }); - setupFakeRoom(); LoopRooms.open("fakeTourRoom"); }), runOffline(function test_notifyLoopRoomURLEmailed(done) { @@ -241,17 +248,19 @@ var tests = [ done(); }); - let chatWin = chat.content.contentWindow; - let oldComposeEmail = chatWin.navigator.wrappedJSObject.mozLoop.composeEmail; - chatWin.navigator.wrappedJSObject.mozLoop.composeEmail = function(recipient, subject, body) { - ok(recipient, "composeEmail should be invoked with at least a recipient value"); + gMessageHandlers.ComposeEmail = function(message, reply) { + let [subject, body, recipient] = message.data; + ok(subject, "composeEmail should be invoked with at least a subject value"); composeEmailCalled = true; - chatWin.navigator.wrappedJSObject.mozLoop.composeEmail = oldComposeEmail; + reply(); }; - chatWin.document.querySelector(".btn-email").click(); + + waitForConditionPromise( + () => chat.content.contentDocument.querySelector(".btn-email"), + "Email button should be there" + ).then(() => chat.content.contentDocument.querySelector(".btn-email").click()); }); }); - setupFakeRoom(); LoopRooms.open("fakeTourRoom"); }), taskify(function* test_arrow_panel_position() { @@ -323,7 +332,7 @@ var tests = [ Services.prefs.setCharPref("loop.gettingStarted.url", gBrowser.currentURI.prePath); let newTabPromise = waitForConditionPromise(() => { - return gBrowser.currentURI.path.contains("incomingConversation=waiting"); + return gBrowser.currentURI.path.includes("incomingConversation=waiting"); }, "New tab with incomingConversation=waiting should have opened"); // Now open the menu while that non-owner is in the fake room to trigger resuming the tour @@ -346,11 +355,7 @@ function checkLoopPanelIsHidden() { } function setupFakeRoom() { - let room = {}; - for (let prop of ["roomToken", "roomOwner", "roomUrl", "participants"]) - room[prop] = "fakeTourRoom"; - room.decryptedContext = {roomName: "fakeTourRoom"}; - room.participants = []; + let room = Object.create(fakeRoom); let roomsMap = new Map([ [room.roomToken, room] ]); @@ -361,6 +366,45 @@ function setupFakeRoom() { if (Services.prefs.getBoolPref("loop.enabled")) { loopButton = window.LoopUI.toolbarButton.node; + fakeRoom = { + decryptedContext: { roomName: "fakeTourRoom" }, + participants: [], + maxSize: 2, + ctime: Date.now() + }; + for (let prop of ["roomToken", "roomOwner", "roomUrl"]) + fakeRoom[prop] = "fakeTourRoom"; + + LoopAPI.stubMessageHandlers(gMessageHandlers = { + // Stub the rooms object API to fully control the test behavior. + "Rooms:*": function(action, message, reply) { + switch (action.split(":").pop()) { + case "GetAll": + reply([fakeRoom]); + break; + case "Get": + reply(fakeRoom); + break; + case "Join": + reply({ + apiKey: "fakeTourRoom", + sessionToken: "fakeTourRoom", + sessionId: "fakeTourRoom", + expires: Date.now() + 240000 + }); + break; + case "RefreshMembership": + reply({ expires: Date.now() + 240000 }); + default: + reply(); + } + }, + // Stub the metadata retrieval to suppress console warnings and return faster. + GetSelectedTabMetadata: function(message, reply) { + reply({ favicon: null }); + } + }); + registerCleanupFunction(() => { Services.prefs.clearUserPref("loop.gettingStarted.resumeOnFirstJoin"); Services.prefs.clearUserPref("loop.gettingStarted.seen"); @@ -377,8 +421,10 @@ if (Services.prefs.getBoolPref("loop.enabled")) { frame.remove(); } - // Remove the stubbed rooms + // Remove the stubbed rooms. LoopRooms.stubCache(null); + // Restore the stubbed handlers. + LoopAPI.restore(); }); } else { ok(true, "Loop is disabled so skip the UITour Loop tests"); From 1b452f8ac368d8ba90191218aba1555ca97189e6 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Fri, 27 Nov 2015 11:19:20 -0500 Subject: [PATCH 076/153] Bug 1228603 - Update pdf.js to version 1.3.38. r=bdahl --- browser/extensions/pdfjs/README.mozilla | 2 +- browser/extensions/pdfjs/content/PdfJs.jsm | 5 + .../pdfjs/content/PdfjsChromeUtils.jsm | 4 + browser/extensions/pdfjs/content/build/pdf.js | 582 ++++++++++++------ .../pdfjs/content/build/pdf.worker.js | 334 ++++++---- .../extensions/pdfjs/content/web/viewer.js | 34 +- .../locales/en-US/pdfviewer/viewer.properties | 2 +- 7 files changed, 663 insertions(+), 300 deletions(-) diff --git a/browser/extensions/pdfjs/README.mozilla b/browser/extensions/pdfjs/README.mozilla index 760d465ad78f..7bd0bff8d9fe 100644 --- a/browser/extensions/pdfjs/README.mozilla +++ b/browser/extensions/pdfjs/README.mozilla @@ -1,3 +1,3 @@ This is the pdf.js project output, https://github.com/mozilla/pdf.js -Current extension version is: 1.3.14 +Current extension version is: 1.3.38 diff --git a/browser/extensions/pdfjs/content/PdfJs.jsm b/browser/extensions/pdfjs/content/PdfJs.jsm index 4e4a209897bc..f01502c34fb5 100644 --- a/browser/extensions/pdfjs/content/PdfJs.jsm +++ b/browser/extensions/pdfjs/content/PdfJs.jsm @@ -12,6 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/* jshint esnext:true */ +/* globals Components, Services, XPCOMUtils, PdfjsChromeUtils, + PdfjsContentUtils, DEFAULT_PREFERENCES, PdfStreamConverter */ + +'use strict'; var EXPORTED_SYMBOLS = ['PdfJs']; diff --git a/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm b/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm index bb9fbe1b4312..77a02cc3cab7 100644 --- a/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm +++ b/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm @@ -12,6 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/* jshint esnext:true */ +/* globals Components, Services, XPCOMUtils, DEFAULT_PREFERENCES */ + +'use strict'; var EXPORTED_SYMBOLS = ['PdfjsChromeUtils']; diff --git a/browser/extensions/pdfjs/content/build/pdf.js b/browser/extensions/pdfjs/content/build/pdf.js index 61e3a737e85e..71733763742b 100644 --- a/browser/extensions/pdfjs/content/build/pdf.js +++ b/browser/extensions/pdfjs/content/build/pdf.js @@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.3.14'; -PDFJS.build = 'df46b64'; +PDFJS.version = '1.3.38'; +PDFJS.build = '83dbdc1'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -60,6 +60,19 @@ var AnnotationType = { LINK: 3 }; +var AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; + var AnnotationBorderStyleType = { SOLID: 1, DASHED: 2, @@ -1186,26 +1199,20 @@ PDFJS.createObjectURL = (function createObjectURLClosure() { }; })(); -function MessageHandler(name, comObj) { - this.name = name; +function MessageHandler(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; this.comObj = comObj; this.callbackIndex = 1; this.postMessageTransfers = true; var callbacksCapabilities = this.callbacksCapabilities = {}; var ah = this.actionHandler = {}; - ah['console_log'] = [function ahConsoleLog(data) { - console.log.apply(console, data); - }]; - ah['console_error'] = [function ahConsoleError(data) { - console.error.apply(console, data); - }]; - ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) { - UnsupportedManager.notify(data); - }]; - - comObj.onmessage = function messageHandlerComObjOnMessage(event) { + this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { var data = event.data; + if (data.targetName !== this.sourceName) { + return; + } if (data.isReply) { var callbackId = data.callbackId; if (data.callbackId in callbacksCapabilities) { @@ -1222,10 +1229,14 @@ function MessageHandler(name, comObj) { } else if (data.action in ah) { var action = ah[data.action]; if (data.callbackId) { + var sourceName = this.sourceName; + var targetName = data.sourceName; Promise.resolve().then(function () { return action[0].call(action[1], data.data); }).then(function (result) { comObj.postMessage({ + sourceName: sourceName, + targetName: targetName, isReply: true, callbackId: data.callbackId, data: result @@ -1236,6 +1247,8 @@ function MessageHandler(name, comObj) { reason = reason + ''; } comObj.postMessage({ + sourceName: sourceName, + targetName: targetName, isReply: true, callbackId: data.callbackId, error: reason @@ -1247,7 +1260,8 @@ function MessageHandler(name, comObj) { } else { error('Unknown action from worker: ' + data.action); } - }; + }.bind(this); + comObj.addEventListener('message', this._onComObjOnMessage); } MessageHandler.prototype = { @@ -1266,6 +1280,8 @@ MessageHandler.prototype = { */ send: function messageHandlerSend(actionName, data, transfers) { var message = { + sourceName: this.sourceName, + targetName: this.targetName, action: actionName, data: data }; @@ -1283,6 +1299,8 @@ MessageHandler.prototype = { function messageHandlerSendWithPromise(actionName, data, transfers) { var callbackId = this.callbackIndex++; var message = { + sourceName: this.sourceName, + targetName: this.targetName, action: actionName, data: data, callbackId: callbackId @@ -1308,6 +1326,10 @@ MessageHandler.prototype = { } else { this.comObj.postMessage(message); } + }, + + destroy: function () { + this.comObj.removeEventListener('message', this._onComObjOnMessage); } }; @@ -1476,6 +1498,9 @@ PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ? /** * (Deprecated) Opens external links in a new window if enabled. * The default behavior opens external links in the PDF.js window. + * + * NOTE: This property has been deprecated, please use + * `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. * @var {boolean} */ PDFJS.openExternalLinksInNewWindow = ( @@ -1525,6 +1550,8 @@ PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? * @property {number} rangeChunkSize - Optional parameter to specify * maximum number of bytes fetched per range request. The default value is * 2^16 = 65536. + * @property {PDFWorker} worker - The worker that will be used for the loading + * and parsing of the PDF data. */ /** @@ -1587,7 +1614,6 @@ PDFJS.getDocument = function getDocument(src, task.onPassword = passwordCallback || null; task.onProgress = progressCallback || null; - var workerInitializedCapability, transport; var source; if (typeof src === 'string') { source = { url: src }; @@ -1608,12 +1634,18 @@ PDFJS.getDocument = function getDocument(src, } var params = {}; + var rangeTransport = null; + var worker = null; for (var key in source) { if (key === 'url' && typeof window !== 'undefined') { // The full path is required in the 'url' field. params[key] = combineUrl(window.location.href, source[key]); continue; } else if (key === 'range') { + rangeTransport = source[key]; + continue; + } else if (key === 'worker') { + worker = source[key]; continue; } else if (key === 'data' && !(source[key] instanceof Uint8Array)) { // Converting string or array-like data to Uint8Array. @@ -1634,27 +1666,98 @@ PDFJS.getDocument = function getDocument(src, params[key] = source[key]; } - params.rangeChunkSize = source.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; + params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; - workerInitializedCapability = createPromiseCapability(); - transport = new WorkerTransport(workerInitializedCapability, source.range); - workerInitializedCapability.promise.then(function transportInitialized() { - transport.fetchDocument(task, params); - }); - task._transport = transport; + if (!worker) { + // Worker was not provided -- creating and owning our own. + worker = new PDFWorker(); + task._worker = worker; + } + var docId = task.docId; + worker.promise.then(function () { + if (task.destroyed) { + throw new Error('Loading aborted'); + } + return _fetchDocument(worker, params, rangeTransport, docId).then( + function (workerId) { + if (task.destroyed) { + throw new Error('Loading aborted'); + } + var messageHandler = new MessageHandler(docId, workerId, worker.port); + messageHandler.send('Ready', null); + var transport = new WorkerTransport(messageHandler, task, rangeTransport); + task._transport = transport; + }); + }, task._capability.reject); return task; }; +/** + * Starts fetching of specified PDF document/data. + * @param {PDFWorker} worker + * @param {Object} source + * @param {PDFDataRangeTransport} pdfDataRangeTransport + * @param {string} docId Unique document id, used as MessageHandler id. + * @returns {Promise} The promise, which is resolved when worker id of + * MessageHandler is known. + * @private + */ +function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { + if (worker.destroyed) { + return Promise.reject(new Error('Worker was destroyed')); + } + + source.disableAutoFetch = PDFJS.disableAutoFetch; + source.disableStream = PDFJS.disableStream; + source.chunkedViewerLoading = !!pdfDataRangeTransport; + if (pdfDataRangeTransport) { + source.length = pdfDataRangeTransport.length; + source.initialData = pdfDataRangeTransport.initialData; + } + return worker.messageHandler.sendWithPromise('GetDocRequest', { + docId: docId, + source: source, + disableRange: PDFJS.disableRange, + maxImageSize: PDFJS.maxImageSize, + cMapUrl: PDFJS.cMapUrl, + cMapPacked: PDFJS.cMapPacked, + disableFontFace: PDFJS.disableFontFace, + disableCreateObjectURL: PDFJS.disableCreateObjectURL, + verbosity: PDFJS.verbosity + }).then(function (workerId) { + if (worker.destroyed) { + throw new Error('Worker was destroyed'); + } + return workerId; + }); +} + /** * PDF document loading operation. * @class * @alias PDFDocumentLoadingTask */ var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { + var nextDocumentId = 0; + + /** @constructs PDFDocumentLoadingTask */ function PDFDocumentLoadingTask() { this._capability = createPromiseCapability(); this._transport = null; + this._worker = null; + + /** + * Unique document loading task id -- used in MessageHandlers. + * @type {string} + */ + this.docId = 'd' + (nextDocumentId++); + + /** + * Shows if loading task is destroyed. + * @type {boolean} + */ + this.destroyed = false; /** * Callback to request a password if wrong or no password was provided. @@ -1686,7 +1789,17 @@ var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { * is completed. */ destroy: function () { - return this._transport.destroy(); + this.destroyed = true; + + var transportDestroyed = !this._transport ? Promise.resolve() : + this._transport.destroy(); + return transportDestroyed.then(function () { + this._transport = null; + if (this._worker) { + this._worker.destroy(); + this._worker = null; + } + }.bind(this)); }, /** @@ -1915,12 +2028,20 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { * Destroys current document instance and terminates worker. */ destroy: function PDFDocumentProxy_destroy() { - return this.transport.destroy(); + return this.loadingTask.destroy(); } }; return PDFDocumentProxy; })(); +/** + * Page getTextContent parameters. + * + * @typedef {Object} getTextContentParameters + * @param {boolean} normalizeWhitespace - replaces all occurrences of + * whitespace with standard spaces (0x20). The default value is `false`. + */ + /** * Page text content. * @@ -1952,6 +2073,16 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { * @property {string} fontFamily - possible font family */ +/** + * Page annotation parameters. + * + * @typedef {Object} GetAnnotationsParameters + * @param {string} intent - Determines the annotations that will be fetched, + * can be either 'display' (viewable annotations) or 'print' + * (printable annotations). + * If the parameter is omitted, all annotations are fetched. + */ + /** * Page render parameters. * @@ -2040,12 +2171,17 @@ var PDFPageProxy = (function PDFPageProxyClosure() { return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0); }, /** + * @param {GetAnnotationsParameters} params - Annotation parameters. * @return {Promise} A promise that is resolved with an {Array} of the * annotation objects. */ - getAnnotations: function PDFPageProxy_getAnnotations() { - if (!this.annotationsPromise) { - this.annotationsPromise = this.transport.getAnnotations(this.pageIndex); + getAnnotations: function PDFPageProxy_getAnnotations(params) { + var intent = (params && params.intent) || null; + + if (!this.annotationsPromise || this.annotationsIntent !== intent) { + this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, + intent); + this.annotationsIntent = intent; } return this.annotationsPromise; }, @@ -2184,12 +2320,16 @@ var PDFPageProxy = (function PDFPageProxyClosure() { }, /** + * @param {getTextContentParameters} params - getTextContent parameters. * @return {Promise} That is resolved a {@link TextContent} * object that represent the page text content. */ - getTextContent: function PDFPageProxy_getTextContent() { + getTextContent: function PDFPageProxy_getTextContent(params) { + var normalizeWhitespace = (params && params.normalizeWhitespace) || false; + return this.transport.messageHandler.sendWithPromise('GetTextContent', { - pageIndex: this.pageNumber - 1 + pageIndex: this.pageNumber - 1, + normalizeWhitespace: normalizeWhitespace, }); }, @@ -2296,17 +2436,202 @@ var PDFPageProxy = (function PDFPageProxyClosure() { return PDFPageProxy; })(); +/** + * PDF.js web worker abstraction, it controls instantiation of PDF documents and + * WorkerTransport for them. If creation of a web worker is not possible, + * a "fake" worker will be used instead. + * @class + */ +var PDFWorker = (function PDFWorkerClosure() { + var nextFakeWorkerId = 0; + + // Loads worker code into main thread. + function setupFakeWorkerGlobal() { + if (!PDFJS.fakeWorkerFilesLoadedCapability) { + PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability(); + // In the developer build load worker_loader which in turn loads all the + // other files and resolves the promise. In production only the + // pdf.worker.js file is needed. + Util.loadScript(PDFJS.workerSrc, function() { + PDFJS.fakeWorkerFilesLoadedCapability.resolve(); + }); + } + return PDFJS.fakeWorkerFilesLoadedCapability.promise; + } + + function PDFWorker(name) { + this.name = name; + this.destroyed = false; + + this._readyCapability = createPromiseCapability(); + this._port = null; + this._webWorker = null; + this._messageHandler = null; + this._initialize(); + } + + PDFWorker.prototype = /** @lends PDFWorker.prototype */ { + get promise() { + return this._readyCapability.promise; + }, + + get port() { + return this._port; + }, + + get messageHandler() { + return this._messageHandler; + }, + + _initialize: function PDFWorker_initialize() { + // If worker support isn't disabled explicit and the browser has worker + // support, create a new web worker and test if it/the browser fullfills + // all requirements to run parts of pdf.js in a web worker. + // Right now, the requirement is, that an Uint8Array is still an + // Uint8Array as it arrives on the worker. (Chrome added this with v.15.) + if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { + var workerSrc = PDFJS.workerSrc; + if (!workerSrc) { + error('No PDFJS.workerSrc specified'); + } + + try { + // Some versions of FF can't create a worker on localhost, see: + // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 + var worker = new Worker(workerSrc); + var messageHandler = new MessageHandler('main', 'worker', worker); + + messageHandler.on('test', function PDFWorker_test(data) { + if (this.destroyed) { + this._readyCapability.reject(new Error('Worker was destroyed')); + messageHandler.destroy(); + worker.terminate(); + return; // worker was destroyed + } + var supportTypedArray = data && data.supportTypedArray; + if (supportTypedArray) { + this._messageHandler = messageHandler; + this._port = worker; + this._webWorker = worker; + if (!data.supportTransfers) { + PDFJS.postMessageTransfers = false; + } + this._readyCapability.resolve(); + } else { + this._setupFakeWorker(); + messageHandler.destroy(); + worker.terminate(); + } + }.bind(this)); + + messageHandler.on('console_log', function (data) { + console.log.apply(console, data); + }); + messageHandler.on('console_error', function (data) { + console.error.apply(console, data); + }); + messageHandler.on('_unsupported_feature', function (data) { + UnsupportedManager.notify(data); + }); + + var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]); + // Some versions of Opera throw a DATA_CLONE_ERR on serializing the + // typed array. Also, checking if we can use transfers. + try { + messageHandler.send('test', testObj, [testObj.buffer]); + } catch (ex) { + info('Cannot use postMessage transfers'); + testObj[0] = 0; + messageHandler.send('test', testObj); + } + return; + } catch (e) { + info('The worker has been disabled.'); + } + } + // Either workers are disabled, not supported or have thrown an exception. + // Thus, we fallback to a faked worker. + this._setupFakeWorker(); + }, + + _setupFakeWorker: function PDFWorker_setupFakeWorker() { + warn('Setting up fake worker.'); + globalScope.PDFJS.disableWorker = true; + + setupFakeWorkerGlobal().then(function () { + if (this.destroyed) { + this._readyCapability.reject(new Error('Worker was destroyed')); + return; + } + + // If we don't use a worker, just post/sendMessage to the main thread. + var port = { + _listeners: [], + postMessage: function (obj) { + var e = {data: obj}; + this._listeners.forEach(function (listener) { + listener.call(this, e); + }, this); + }, + addEventListener: function (name, listener) { + this._listeners.push(listener); + }, + removeEventListener: function (name, listener) { + var i = this._listeners.indexOf(listener); + this._listeners.splice(i, 1); + }, + terminate: function () {} + }; + this._port = port; + + // All fake workers use the same port, making id unique. + var id = 'fake' + (nextFakeWorkerId++); + + // If the main thread is our worker, setup the handling for the + // messages -- the main thread sends to it self. + var workerHandler = new MessageHandler(id + '_worker', id, port); + PDFJS.WorkerMessageHandler.setup(workerHandler, port); + + var messageHandler = new MessageHandler(id, id + '_worker', port); + this._messageHandler = messageHandler; + this._readyCapability.resolve(); + }.bind(this)); + }, + + /** + * Destroys the worker instance. + */ + destroy: function PDFWorker_destroy() { + this.destroyed = true; + if (this._webWorker) { + // We need to terminate only web worker created resource. + this._webWorker.terminate(); + this._webWorker = null; + } + this._port = null; + if (this._messageHandler) { + this._messageHandler.destroy(); + this._messageHandler = null; + } + } + }; + + return PDFWorker; +})(); +PDFJS.PDFWorker = PDFWorker; + /** * For internal use only. * @ignore */ var WorkerTransport = (function WorkerTransportClosure() { - function WorkerTransport(workerInitializedCapability, pdfDataRangeTransport) { + function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) { + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; this.pdfDataRangeTransport = pdfDataRangeTransport; - this.workerInitializedCapability = workerInitializedCapability; this.commonObjs = new PDFObjects(); + this.fontLoader = new FontLoader(loadingTask.docId); - this.loadingTask = null; this.destroyed = false; this.destroyCapability = null; @@ -2314,56 +2639,7 @@ var WorkerTransport = (function WorkerTransportClosure() { this.pagePromises = []; this.downloadInfoCapability = createPromiseCapability(); - // If worker support isn't disabled explicit and the browser has worker - // support, create a new web worker and test if it/the browser fullfills - // all requirements to run parts of pdf.js in a web worker. - // Right now, the requirement is, that an Uint8Array is still an Uint8Array - // as it arrives on the worker. Chrome added this with version 15. - if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { - var workerSrc = PDFJS.workerSrc; - if (!workerSrc) { - error('No PDFJS.workerSrc specified'); - } - - try { - // Some versions of FF can't create a worker on localhost, see: - // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 - var worker = new Worker(workerSrc); - var messageHandler = new MessageHandler('main', worker); - this.messageHandler = messageHandler; - - messageHandler.on('test', function transportTest(data) { - var supportTypedArray = data && data.supportTypedArray; - if (supportTypedArray) { - this.worker = worker; - if (!data.supportTransfers) { - PDFJS.postMessageTransfers = false; - } - this.setupMessageHandler(messageHandler); - workerInitializedCapability.resolve(); - } else { - this.setupFakeWorker(); - } - }.bind(this)); - - var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]); - // Some versions of Opera throw a DATA_CLONE_ERR on serializing the - // typed array. Also, checking if we can use transfers. - try { - messageHandler.send('test', testObj, [testObj.buffer]); - } catch (ex) { - info('Cannot use postMessage transfers'); - testObj[0] = 0; - messageHandler.send('test', testObj); - } - return; - } catch (e) { - info('The worker has been disabled.'); - } - } - // Either workers are disabled, not supported or have thrown an exception. - // Thus, we fallback to a faked worker. - this.setupFakeWorker(); + this.setupMessageHandler(); } WorkerTransport.prototype = { destroy: function WorkerTransport_destroy() { @@ -2389,56 +2665,23 @@ var WorkerTransport = (function WorkerTransportClosure() { var terminated = this.messageHandler.sendWithPromise('Terminate', null); waitOn.push(terminated); Promise.all(waitOn).then(function () { - FontLoader.clear(); - if (self.worker) { - self.worker.terminate(); - } + self.fontLoader.clear(); if (self.pdfDataRangeTransport) { self.pdfDataRangeTransport.abort(); self.pdfDataRangeTransport = null; } - self.messageHandler = null; + if (self.messageHandler) { + self.messageHandler.destroy(); + self.messageHandler = null; + } self.destroyCapability.resolve(); }, this.destroyCapability.reject); return this.destroyCapability.promise; }, - setupFakeWorker: function WorkerTransport_setupFakeWorker() { - globalScope.PDFJS.disableWorker = true; - - if (!PDFJS.fakeWorkerFilesLoadedCapability) { - PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability(); - // In the developer build load worker_loader which in turn loads all the - // other files and resolves the promise. In production only the - // pdf.worker.js file is needed. - Util.loadScript(PDFJS.workerSrc, function() { - PDFJS.fakeWorkerFilesLoadedCapability.resolve(); - }); - } - PDFJS.fakeWorkerFilesLoadedCapability.promise.then(function () { - warn('Setting up fake worker.'); - // If we don't use a worker, just post/sendMessage to the main thread. - var fakeWorker = { - postMessage: function WorkerTransport_postMessage(obj) { - fakeWorker.onmessage({data: obj}); - }, - terminate: function WorkerTransport_terminate() {} - }; - - var messageHandler = new MessageHandler('main', fakeWorker); - this.setupMessageHandler(messageHandler); - - // If the main thread is our worker, setup the handling for the messages - // the main thread sends to it self. - PDFJS.WorkerMessageHandler.setup(messageHandler); - - this.workerInitializedCapability.resolve(); - }.bind(this)); - }, - setupMessageHandler: - function WorkerTransport_setupMessageHandler(messageHandler) { - this.messageHandler = messageHandler; + function WorkerTransport_setupMessageHandler() { + var messageHandler = this.messageHandler; function updatePassword(password) { messageHandler.send('UpdatePassword', password); @@ -2578,7 +2821,7 @@ var WorkerTransport = (function WorkerTransportClosure() { font = new FontFaceObject(exportedData); } - FontLoader.bind( + this.fontLoader.bind( [font], function fontReady(fontObjs) { this.commonObjs.resolve(id, font); @@ -2703,34 +2946,6 @@ var WorkerTransport = (function WorkerTransportClosure() { }, this); }, - fetchDocument: function WorkerTransport_fetchDocument(loadingTask, source) { - if (this.destroyed) { - loadingTask._capability.reject(new Error('Loading aborted')); - this.destroyCapability.resolve(); - return; - } - - this.loadingTask = loadingTask; - - source.disableAutoFetch = PDFJS.disableAutoFetch; - source.disableStream = PDFJS.disableStream; - source.chunkedViewerLoading = !!this.pdfDataRangeTransport; - if (this.pdfDataRangeTransport) { - source.length = this.pdfDataRangeTransport.length; - source.initialData = this.pdfDataRangeTransport.initialData; - } - this.messageHandler.send('GetDocRequest', { - source: source, - disableRange: PDFJS.disableRange, - maxImageSize: PDFJS.maxImageSize, - cMapUrl: PDFJS.cMapUrl, - cMapPacked: PDFJS.cMapPacked, - disableFontFace: PDFJS.disableFontFace, - disableCreateObjectURL: PDFJS.disableCreateObjectURL, - verbosity: PDFJS.verbosity - }); - }, - getData: function WorkerTransport_getData() { return this.messageHandler.sendWithPromise('GetData', null); }, @@ -2763,9 +2978,11 @@ var WorkerTransport = (function WorkerTransportClosure() { return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }); }, - getAnnotations: function WorkerTransport_getAnnotations(pageIndex) { - return this.messageHandler.sendWithPromise('GetAnnotations', - { pageIndex: pageIndex }); + getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) { + return this.messageHandler.sendWithPromise('GetAnnotations', { + pageIndex: pageIndex, + intent: intent, + }); }, getDestinations: function WorkerTransport_getDestinations() { @@ -2773,7 +2990,7 @@ var WorkerTransport = (function WorkerTransportClosure() { }, getDestination: function WorkerTransport_getDestination(id) { - return this.messageHandler.sendWithPromise('GetDestination', { id: id } ); + return this.messageHandler.sendWithPromise('GetDestination', { id: id }); }, getAttachments: function WorkerTransport_getAttachments() { @@ -2812,7 +3029,7 @@ var WorkerTransport = (function WorkerTransportClosure() { } } this.commonObjs.clear(); - FontLoader.clear(); + this.fontLoader.clear(); }.bind(this)); } }; @@ -6161,12 +6378,16 @@ var TilingPattern = (function TilingPatternClosure() { PDFJS.disableFontFace = false; -var FontLoader = { +function FontLoader(docId) { + this.docId = docId; + this.styleElement = null; +} +FontLoader.prototype = { insertRule: function fontLoaderInsertRule(rule) { - var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG'); + var styleElement = this.styleElement; if (!styleElement) { - styleElement = document.createElement('style'); - styleElement.id = 'PDFJS_FONT_STYLE_TAG'; + styleElement = this.styleElement = document.createElement('style'); + styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId; document.documentElement.getElementsByTagName('head')[0].appendChild( styleElement); } @@ -6176,7 +6397,7 @@ var FontLoader = { }, clear: function fontLoaderClear() { - var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG'); + var styleElement = this.styleElement; if (styleElement) { styleElement.parentNode.removeChild(styleElement); } @@ -6199,20 +6420,31 @@ var FontLoader = { }; var FontFaceObject = (function FontFaceObjectClosure() { - function FontFaceObject(name, file, properties) { + function FontFaceObject(translatedData) { this.compiledGlyphs = {}; - if (arguments.length === 1) { - // importing translated data - var data = arguments[0]; - for (var i in data) { - this[i] = data[i]; - } - return; + // importing translated data + for (var i in translatedData) { + this[i] = translatedData[i]; } } + Object.defineProperty(FontFaceObject, 'isEvalSupported', { + get: function () { + var evalSupport = false; + if (PDFJS.isEvalSupported) { + try { + /* jshint evil: true */ + new Function(''); + evalSupport = true; + } catch (e) {} + } + return shadow(this, 'isEvalSupported', evalSupport); + }, + enumerable: true, + configurable: true + }); FontFaceObject.prototype = { - bindDOM: function FontFaceObject_bindDOM() { + createFontFaceRule: function FontFaceObject_createFontFaceRule() { if (!this.data) { return null; } @@ -6229,7 +6461,6 @@ var FontFaceObject = (function FontFaceObjectClosure() { var url = ('url(data:' + this.mimetype + ';base64,' + window.btoa(data) + ');'); var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; - FontLoader.insertRule(rule); if (PDFJS.pdfBug && 'FontInspector' in globalScope && globalScope['FontInspector'].enabled) { @@ -6239,13 +6470,14 @@ var FontFaceObject = (function FontFaceObjectClosure() { return rule; }, - getPathGenerator: function FontLoader_getPathGenerator(objs, character) { + getPathGenerator: + function FontFaceObject_getPathGenerator(objs, character) { if (!(character in this.compiledGlyphs)) { var cmds = objs.get(this.loadedName + '_path_' + character); var current, i, len; // If we can, compile cmds into JS for MAXIMUM SPEED - if (FontLoader.isEvalSupported) { + if (FontFaceObject.isEvalSupported) { var args, js = ''; for (i = 0, len = cmds.length; i < len; i++) { current = cmds[i]; diff --git a/browser/extensions/pdfjs/content/build/pdf.worker.js b/browser/extensions/pdfjs/content/build/pdf.worker.js index 306febbe93b2..a59c7eed250f 100644 --- a/browser/extensions/pdfjs/content/build/pdf.worker.js +++ b/browser/extensions/pdfjs/content/build/pdf.worker.js @@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.3.14'; -PDFJS.build = 'df46b64'; +PDFJS.version = '1.3.38'; +PDFJS.build = '83dbdc1'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -60,6 +60,19 @@ var AnnotationType = { LINK: 3 }; +var AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; + var AnnotationBorderStyleType = { SOLID: 1, DASHED: 2, @@ -1186,26 +1199,20 @@ PDFJS.createObjectURL = (function createObjectURLClosure() { }; })(); -function MessageHandler(name, comObj) { - this.name = name; +function MessageHandler(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; this.comObj = comObj; this.callbackIndex = 1; this.postMessageTransfers = true; var callbacksCapabilities = this.callbacksCapabilities = {}; var ah = this.actionHandler = {}; - ah['console_log'] = [function ahConsoleLog(data) { - console.log.apply(console, data); - }]; - ah['console_error'] = [function ahConsoleError(data) { - console.error.apply(console, data); - }]; - ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) { - UnsupportedManager.notify(data); - }]; - - comObj.onmessage = function messageHandlerComObjOnMessage(event) { + this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { var data = event.data; + if (data.targetName !== this.sourceName) { + return; + } if (data.isReply) { var callbackId = data.callbackId; if (data.callbackId in callbacksCapabilities) { @@ -1222,10 +1229,14 @@ function MessageHandler(name, comObj) { } else if (data.action in ah) { var action = ah[data.action]; if (data.callbackId) { + var sourceName = this.sourceName; + var targetName = data.sourceName; Promise.resolve().then(function () { return action[0].call(action[1], data.data); }).then(function (result) { comObj.postMessage({ + sourceName: sourceName, + targetName: targetName, isReply: true, callbackId: data.callbackId, data: result @@ -1236,6 +1247,8 @@ function MessageHandler(name, comObj) { reason = reason + ''; } comObj.postMessage({ + sourceName: sourceName, + targetName: targetName, isReply: true, callbackId: data.callbackId, error: reason @@ -1247,7 +1260,8 @@ function MessageHandler(name, comObj) { } else { error('Unknown action from worker: ' + data.action); } - }; + }.bind(this); + comObj.addEventListener('message', this._onComObjOnMessage); } MessageHandler.prototype = { @@ -1266,6 +1280,8 @@ MessageHandler.prototype = { */ send: function messageHandlerSend(actionName, data, transfers) { var message = { + sourceName: this.sourceName, + targetName: this.targetName, action: actionName, data: data }; @@ -1283,6 +1299,8 @@ MessageHandler.prototype = { function messageHandlerSendWithPromise(actionName, data, transfers) { var callbackId = this.callbackIndex++; var message = { + sourceName: this.sourceName, + targetName: this.targetName, action: actionName, data: data, callbackId: callbackId @@ -1308,6 +1326,10 @@ MessageHandler.prototype = { } else { this.comObj.postMessage(message); } + }, + + destroy: function () { + this.comObj.removeEventListener('message', this._onComObjOnMessage); } }; @@ -1861,6 +1883,10 @@ var BasePdfManager = (function BasePdfManagerClosure() { } BasePdfManager.prototype = { + get docId() { + return this._docId; + }, + onLoadedStream: function BasePdfManager_onLoadedStream() { throw new NotImplementedException(); }, @@ -1922,7 +1948,8 @@ var BasePdfManager = (function BasePdfManagerClosure() { })(); var LocalPdfManager = (function LocalPdfManagerClosure() { - function LocalPdfManager(data, password) { + function LocalPdfManager(docId, data, password) { + this._docId = docId; var stream = new Stream(data); this.pdfDocument = new PDFDocument(this, stream, password); this._loadedStreamCapability = createPromiseCapability(); @@ -1973,8 +2000,8 @@ var LocalPdfManager = (function LocalPdfManagerClosure() { })(); var NetworkPdfManager = (function NetworkPdfManagerClosure() { - function NetworkPdfManager(args, msgHandler) { - + function NetworkPdfManager(docId, args, msgHandler) { + this._docId = docId; this.msgHandler = msgHandler; var params = { @@ -2251,7 +2278,8 @@ var Page = (function PageClosure() { }); }, - extractTextContent: function Page_extractTextContent(task) { + extractTextContent: function Page_extractTextContent(task, + normalizeWhitespace) { var handler = { on: function nullHandlerOn() {}, send: function nullHandlerSend() {} @@ -2281,14 +2309,22 @@ var Page = (function PageClosure() { return partialEvaluator.getTextContent(contentStream, task, - self.resources); + self.resources, + /* stateManager = */ null, + normalizeWhitespace); }); }, - getAnnotationsData: function Page_getAnnotationsData() { + getAnnotationsData: function Page_getAnnotationsData(intent) { var annotations = this.annotations; var annotationsData = []; for (var i = 0, n = annotations.length; i < n; ++i) { + if (intent) { + if (!(intent === 'display' && annotations[i].viewable) && + !(intent === 'print' && annotations[i].printable)) { + continue; + } + } annotationsData.push(annotations[i].data); } return annotationsData; @@ -2301,8 +2337,7 @@ var Page = (function PageClosure() { for (var i = 0, n = annotationRefs.length; i < n; ++i) { var annotationRef = annotationRefs[i]; var annotation = annotationFactory.create(this.xref, annotationRef); - if (annotation && - (annotation.isViewable() || annotation.isPrintable())) { + if (annotation) { annotations.push(annotation); } } @@ -4511,7 +4546,9 @@ var Annotation = (function AnnotationClosure() { var data = this.data = {}; data.subtype = dict.get('Subtype').name; - data.annotationFlags = dict.get('F'); + + this.setFlags(dict.get('F')); + data.annotationFlags = this.flags; this.setRectangle(dict.get('Rect')); data.rect = this.rectangle; @@ -4528,6 +4565,64 @@ var Annotation = (function AnnotationClosure() { } Annotation.prototype = { + /** + * @return {boolean} + */ + get viewable() { + if (this.flags) { + return !this.hasFlag(AnnotationFlag.INVISIBLE) && + !this.hasFlag(AnnotationFlag.HIDDEN) && + !this.hasFlag(AnnotationFlag.NOVIEW); + } + return true; + }, + + /** + * @return {boolean} + */ + get printable() { + if (this.flags) { + return this.hasFlag(AnnotationFlag.PRINT) && + !this.hasFlag(AnnotationFlag.INVISIBLE) && + !this.hasFlag(AnnotationFlag.HIDDEN); + } + return false; + }, + + /** + * Set the flags. + * + * @public + * @memberof Annotation + * @param {number} flags - Unsigned 32-bit integer specifying annotation + * characteristics + * @see {@link shared/util.js} + */ + setFlags: function Annotation_setFlags(flags) { + if (isInt(flags)) { + this.flags = flags; + } else { + this.flags = 0; + } + }, + + /** + * Check if a provided flag is set. + * + * @public + * @memberof Annotation + * @param {number} flag - Hexadecimal representation for an annotation + * characteristic + * @return {boolean} + * @see {@link shared/util.js} + */ + hasFlag: function Annotation_hasFlag(flag) { + if (this.flags) { + return (this.flags & flag) > 0; + } + return false; + }, + /** * Set the rectangle. * @@ -4627,32 +4722,6 @@ var Annotation = (function AnnotationClosure() { } }, - isInvisible: function Annotation_isInvisible() { - var data = this.data; - return !!(data && - data.annotationFlags && // Default: not invisible - data.annotationFlags & 0x1); // Invisible - }, - - isViewable: function Annotation_isViewable() { - var data = this.data; - return !!(!this.isInvisible() && - data && - (!data.annotationFlags || - !(data.annotationFlags & 0x22)) && // Hidden or NoView - data.rect); // rectangle is necessary - }, - - isPrintable: function Annotation_isPrintable() { - var data = this.data; - return !!(!this.isInvisible() && - data && - data.annotationFlags && // Default: not printable - data.annotationFlags & 0x4 && // Print - !(data.annotationFlags & 0x2) && // Hidden - data.rect); // rectangle is necessary - }, - loadResources: function Annotation_loadResources(keys) { return new Promise(function (resolve, reject) { this.appearance.dict.getAsync('Resources').then(function (resources) { @@ -4719,8 +4788,8 @@ var Annotation = (function AnnotationClosure() { var annotationPromises = []; for (var i = 0, n = annotations.length; i < n; ++i) { - if (intent === 'display' && annotations[i].isViewable() || - intent === 'print' && annotations[i].isPrintable()) { + if (intent === 'display' && annotations[i].viewable || + intent === 'print' && annotations[i].printable) { annotationPromises.push( annotations[i].getOperatorList(partialEvaluator, task)); } @@ -4896,6 +4965,12 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() { data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0; this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty; + // Hide unsupported Widget signatures. + if (data.fieldType === 'Sig') { + warn('unimplemented annotation type: Widget signature'); + this.setFlags(AnnotationFlag.HIDDEN); + } + // Building the full field name by collecting the field and // its ancestors 'T' data and joining them using '.'. var fieldName = []; @@ -4929,17 +5004,7 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() { data.fullName = fieldName.join('.'); } - var parent = Annotation.prototype; - Util.inherit(WidgetAnnotation, Annotation, { - isViewable: function WidgetAnnotation_isViewable() { - if (this.data.fieldType === 'Sig') { - warn('unimplemented annotation type: Widget signature'); - return false; - } - - return parent.isViewable.call(this); - } - }); + Util.inherit(WidgetAnnotation, Annotation, {}); return WidgetAnnotation; })(); @@ -5038,7 +5103,7 @@ var LinkAnnotation = (function LinkAnnotationClosure() { if (!isValidUrl(url, false)) { url = ''; } - // According to ISO 32000-1:2008, section 12.6.4.7, + // According to ISO 32000-1:2008, section 12.6.4.7, // URI should to be encoded in 7-bit ASCII. // Some bad PDFs may have URIs in UTF-8 encoding, see Bugzilla 1122280. try { @@ -10770,7 +10835,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // Keep track of each font we translated so the caller can // load them asynchronously before calling display on a page. - font.loadedName = 'g_font_' + (fontRefIsDict ? + font.loadedName = 'g_' + this.pdfManager.docId + '_f' + (fontRefIsDict ? fontName.replace(/\W/g, '') : fontID); font.translated = fontCapability.promise; @@ -11149,12 +11214,15 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { }); }, - getTextContent: function PartialEvaluator_getTextContent(stream, task, - resources, - stateManager) { + getTextContent: + function PartialEvaluator_getTextContent(stream, task, resources, + stateManager, + normalizeWhitespace) { stateManager = (stateManager || new StateManager(new TextState())); + var WhitespaceRegexp = /\s/g; + var textContent = { items: [], styles: Object.create(null) @@ -11268,11 +11336,23 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { return textContentItem; } + function replaceWhitespace(str) { + // Replaces all whitespaces with standard spaces (0x20), to avoid + // alignment issues between the textLayer and the canvas if the text + // contains e.g. tabs (fixes issue6612.pdf). + var i = 0, ii = str.length, code; + while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) { + i++; + } + return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str); + } + function runBidiTransform(textChunk) { var str = textChunk.str.join(''); var bidiResult = PDFJS.bidi(str, -1, textChunk.vertical); return { - str: bidiResult.str, + str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) : + bidiResult.str), dir: bidiResult.dir, width: textChunk.width, height: textChunk.height, @@ -11593,8 +11673,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { } return self.getTextContent(xobj, task, - xobj.dict.get('Resources') || resources, stateManager). - then(function (formTextContent) { + xobj.dict.get('Resources') || resources, stateManager, + normalizeWhitespace).then(function (formTextContent) { Util.appendToArray(textContent.items, formTextContent.items); Util.extendObj(textContent.styles, formTextContent.styles); stateManager.restore(); @@ -33837,12 +33917,51 @@ var WorkerTask = (function WorkerTaskClosure() { })(); var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { - setup: function wphSetup(handler) { + setup: function wphSetup(handler, port) { + handler.on('test', function wphSetupTest(data) { + // check if Uint8Array can be sent to worker + if (!(data instanceof Uint8Array)) { + handler.send('test', 'main', false); + return; + } + // making sure postMessage transfers are working + var supportTransfers = data[0] === 255; + handler.postMessageTransfers = supportTransfers; + // check if the response property is supported by xhr + var xhr = new XMLHttpRequest(); + var responseExists = 'response' in xhr; + // check if the property is actually implemented + try { + var dummy = xhr.responseType; + } catch (e) { + responseExists = false; + } + if (!responseExists) { + handler.send('test', false); + return; + } + handler.send('test', { + supportTypedArray: true, + supportTransfers: supportTransfers + }); + }); + + handler.on('GetDocRequest', function wphSetupDoc(data) { + return WorkerMessageHandler.createDocumentHandler(data, port); + }); + }, + createDocumentHandler: function wphCreateDocumentHandler(docParams, port) { + // This context is actually holds references on pdfManager and handler, + // until the latter is destroyed. var pdfManager; var terminated = false; var cancelXHRs = null; var WorkerTasks = []; + var docId = docParams.docId; + var workerHandlerName = docParams.docId + '_worker'; + var handler = new MessageHandler(workerHandlerName, docId, port); + function ensureNotTerminated() { if (terminated) { throw new Error('Worker was terminated'); @@ -33900,7 +34019,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { var disableRange = data.disableRange; if (source.data) { try { - pdfManager = new LocalPdfManager(source.data, source.password); + pdfManager = new LocalPdfManager(docId, source.data, source.password); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); @@ -33908,7 +34027,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { return pdfManagerCapability.promise; } else if (source.chunkedViewerLoading) { try { - pdfManager = new NetworkPdfManager(source, handler); + pdfManager = new NetworkPdfManager(docId, source, handler); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); @@ -33965,7 +34084,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { } try { - pdfManager = new NetworkPdfManager(source, handler); + pdfManager = new NetworkPdfManager(docId, source, handler); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); @@ -34010,7 +34129,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { // the data is array, instantiating directly from it try { - pdfManager = new LocalPdfManager(pdfFile, source.password); + pdfManager = new LocalPdfManager(docId, pdfFile, source.password); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); @@ -34048,35 +34167,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { return pdfManagerCapability.promise; } - handler.on('test', function wphSetupTest(data) { - // check if Uint8Array can be sent to worker - if (!(data instanceof Uint8Array)) { - handler.send('test', false); - return; - } - // making sure postMessage transfers are working - var supportTransfers = data[0] === 255; - handler.postMessageTransfers = supportTransfers; - // check if the response property is supported by xhr - var xhr = new XMLHttpRequest(); - var responseExists = 'response' in xhr; - // check if the property is actually implemented - try { - var dummy = xhr.responseType; - } catch (e) { - responseExists = false; - } - if (!responseExists) { - handler.send('test', false); - return; - } - handler.send('test', { - supportTypedArray: true, - supportTransfers: supportTransfers - }); - }); - - handler.on('GetDocRequest', function wphSetupDoc(data) { + var setupDoc = function(data) { var onSuccess = function(doc) { ensureNotTerminated(); handler.send('GetDoc', { pdfInfo: doc }); @@ -34121,7 +34212,6 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { } pdfManager = newPdfManager; - handler.send('PDFManagerReady', null); pdfManager.onLoadedStream().then(function(stream) { handler.send('DataLoaded', { length: stream.bytes.byteLength }); @@ -34152,7 +34242,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { }); }, onFailure); }, onFailure); - }); + }; handler.on('GetPage', function wphSetupGetPage(data) { return pdfManager.getPage(data.pageIndex).then(function(page) { @@ -34185,7 +34275,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { handler.on('GetDestination', function wphSetupGetDestination(data) { - return pdfManager.ensureCatalog('getDestination', [ data.id ]); + return pdfManager.ensureCatalog('getDestination', [data.id]); } ); @@ -34233,7 +34323,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { return pdfManager.getPage(data.pageIndex).then(function(page) { - return pdfManager.ensure(page, 'getAnnotationsData', []); + return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]); }); }); @@ -34292,12 +34382,14 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { handler.on('GetTextContent', function wphExtractText(data) { var pageIndex = data.pageIndex; + var normalizeWhitespace = data.normalizeWhitespace; return pdfManager.getPage(pageIndex).then(function(page) { var task = new WorkerTask('GetTextContent: page ' + pageIndex); startWorkerTask(task); var pageNum = pageIndex + 1; var start = Date.now(); - return page.extractTextContent(task).then(function(textContent) { + return page.extractTextContent(task, normalizeWhitespace).then( + function(textContent) { finishWorkerTask(task); info('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms'); @@ -34332,8 +34424,19 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { task.terminate(); }); - return Promise.all(waitOn).then(function () {}); + return Promise.all(waitOn).then(function () { + // Notice that even if we destroying handler, resolved response promise + // must be sent back. + handler.destroy(); + handler = null; + }); }); + + handler.on('Ready', function wphReady(data) { + setupDoc(docParams); + docParams = null; // we don't need docParams anymore -- saving memory. + }); + return workerHandlerName; } }; @@ -34343,6 +34446,7 @@ var workerConsole = { log: function log() { var args = Array.prototype.slice.call(arguments); globalScope.postMessage({ + targetName: 'main', action: 'console_log', data: args }); @@ -34351,6 +34455,7 @@ var workerConsole = { error: function error() { var args = Array.prototype.slice.call(arguments); globalScope.postMessage({ + targetName: 'main', action: 'console_error', data: args }); @@ -34380,13 +34485,14 @@ if (typeof window === 'undefined') { // Listen for unsupported features so we can pass them on to the main thread. PDFJS.UnsupportedManager.listen(function (msg) { globalScope.postMessage({ + targetName: 'main', action: '_unsupported_feature', data: msg }); }); - var handler = new MessageHandler('worker_processor', this); - WorkerMessageHandler.setup(handler); + var handler = new MessageHandler('worker', 'main', this); + WorkerMessageHandler.setup(handler, this); } diff --git a/browser/extensions/pdfjs/content/web/viewer.js b/browser/extensions/pdfjs/content/web/viewer.js index 35488967ab73..49934a61142d 100644 --- a/browser/extensions/pdfjs/content/web/viewer.js +++ b/browser/extensions/pdfjs/content/web/viewer.js @@ -12,6 +12,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, ProgressBar, + DownloadManager, getFileName, getPDFFileNameFromURL, + PDFHistory, Preferences, SidebarView, ViewHistory, Stats, + PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar, + PasswordPrompt, PDFPresentationMode, PDFDocumentProperties, HandTool, + Promise, PDFLinkService, PDFOutlineView, PDFAttachmentView, + OverlayManager, PDFFindController, PDFFindBar, PDFViewer, + PDFRenderingQueue, PresentationModeState, parseQueryString, + RenderingStates, UNKNOWN_SCALE, DEFAULT_SCALE_VALUE, + IGNORE_CURRENT_POSITION_ON_ZOOM: true */ + +'use strict'; var DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf'; var DEFAULT_SCALE_DELTA = 1.1; @@ -1027,7 +1039,6 @@ var PDFFindController = (function PDFFindControllerClosure() { '\u00BC': '1/4', // Vulgar fraction one quarter '\u00BD': '1/2', // Vulgar fraction one half '\u00BE': '3/4', // Vulgar fraction three quarters - '\u00A0': ' ' // No-break space }; this.findBar = options.findBar || null; @@ -3675,7 +3686,7 @@ var PDFPageView = (function PDFPageViewClosure() { } if (redrawAnnotations && this.annotationLayer) { - this.annotationLayer.setupAnnotations(this.viewport); + this.annotationLayer.setupAnnotations(this.viewport, 'display'); } }, @@ -3878,7 +3889,7 @@ var PDFPageView = (function PDFPageViewClosure() { function pdfPageRenderCallback() { pageViewDrawCallback(null); if (textLayer) { - self.pdfPage.getTextContent().then( + self.pdfPage.getTextContent({ normalizeWhitespace: true }).then( function textContentResolved(textContent) { textLayer.setTextContent(textContent); textLayer.render(TEXT_LAYER_RENDER_DELAY); @@ -3896,7 +3907,7 @@ var PDFPageView = (function PDFPageViewClosure() { this.annotationLayer = this.annotationsLayerFactory. createAnnotationsLayerBuilder(div, this.pdfPage); } - this.annotationLayer.setupAnnotations(this.viewport); + this.annotationLayer.setupAnnotations(this.viewport, 'display'); } div.setAttribute('data-loaded', true); @@ -4313,9 +4324,10 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() { /** * @param {PageViewport} viewport + * @param {string} intent (default value is 'display') */ setupAnnotations: - function AnnotationsLayerBuilder_setupAnnotations(viewport) { + function AnnotationsLayerBuilder_setupAnnotations(viewport, intent) { function bindLink(link, dest) { link.href = linkService.getDestinationHash(dest); link.onclick = function annotationsLayerBuilderLinksOnclick() { @@ -4341,8 +4353,12 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() { var linkService = this.linkService; var pdfPage = this.pdfPage; var self = this; + var getAnnotationsParams = { + intent: (intent === undefined ? 'display' : intent), + }; - pdfPage.getAnnotations().then(function (annotationsData) { + pdfPage.getAnnotations(getAnnotationsParams).then( + function (annotationsData) { viewport = viewport.clone({ dontFlip: true }); var transform = viewport.transform; var transformStr = 'matrix(' + transform.join(',') + ')'; @@ -4882,7 +4898,7 @@ var PDFViewer = (function pdfViewer() { if (!this.pdfDocument) { return; } - + var pageView = this._pages[pageNumber - 1]; if (this.isInPresentationMode) { @@ -5140,7 +5156,7 @@ var PDFViewer = (function pdfViewer() { getPageTextContent: function (pageIndex) { return this.pdfDocument.getPage(pageIndex + 1).then(function (page) { - return page.getTextContent(); + return page.getTextContent({ normalizeWhitespace: true }); }); }, @@ -7389,7 +7405,7 @@ document.addEventListener('textlayerrendered', function (e) { if (pageView.textLayer && pageView.textLayer.textDivs && pageView.textLayer.textDivs.length > 0 && !PDFViewerApplication.supportsDocumentColors) { - console.error(mozL10n.get('document_colors_disabled', null, + console.error(mozL10n.get('document_colors_not_allowed', null, 'PDF documents are not allowed to use their own colors: ' + '\'Allow pages to choose their own colors\' ' + 'is deactivated in the browser.')); diff --git a/browser/locales/en-US/pdfviewer/viewer.properties b/browser/locales/en-US/pdfviewer/viewer.properties index 5c43b50575e8..20c91956604f 100644 --- a/browser/locales/en-US/pdfviewer/viewer.properties +++ b/browser/locales/en-US/pdfviewer/viewer.properties @@ -170,4 +170,4 @@ password_cancel=Cancel printing_not_supported=Warning: Printing is not fully supported by this browser. printing_not_ready=Warning: The PDF is not fully loaded for printing. web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. -document_colors_disabled=PDF documents are not allowed to use their own colors: \'Allow pages to choose their own colors\' is deactivated in the browser. +document_colors_not_allowed=PDF documents are not allowed to use their own colors: 'Allow pages to choose their own colors' is deactivated in the browser. From 522a846c4aa53b7b63a9e70a2f4a1bab65873caf Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:35:24 +0000 Subject: [PATCH 077/153] Backed out changeset 2f801d6ef064 / Bug 1228603 due to mochitest failures --- browser/extensions/pdfjs/README.mozilla | 2 +- browser/extensions/pdfjs/content/PdfJs.jsm | 5 - .../pdfjs/content/PdfjsChromeUtils.jsm | 4 - browser/extensions/pdfjs/content/build/pdf.js | 582 ++++++------------ .../pdfjs/content/build/pdf.worker.js | 334 ++++------ .../extensions/pdfjs/content/web/viewer.js | 34 +- .../locales/en-US/pdfviewer/viewer.properties | 2 +- 7 files changed, 300 insertions(+), 663 deletions(-) diff --git a/browser/extensions/pdfjs/README.mozilla b/browser/extensions/pdfjs/README.mozilla index 7bd0bff8d9fe..760d465ad78f 100644 --- a/browser/extensions/pdfjs/README.mozilla +++ b/browser/extensions/pdfjs/README.mozilla @@ -1,3 +1,3 @@ This is the pdf.js project output, https://github.com/mozilla/pdf.js -Current extension version is: 1.3.38 +Current extension version is: 1.3.14 diff --git a/browser/extensions/pdfjs/content/PdfJs.jsm b/browser/extensions/pdfjs/content/PdfJs.jsm index f01502c34fb5..4e4a209897bc 100644 --- a/browser/extensions/pdfjs/content/PdfJs.jsm +++ b/browser/extensions/pdfjs/content/PdfJs.jsm @@ -12,11 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* jshint esnext:true */ -/* globals Components, Services, XPCOMUtils, PdfjsChromeUtils, - PdfjsContentUtils, DEFAULT_PREFERENCES, PdfStreamConverter */ - -'use strict'; var EXPORTED_SYMBOLS = ['PdfJs']; diff --git a/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm b/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm index 77a02cc3cab7..bb9fbe1b4312 100644 --- a/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm +++ b/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm @@ -12,10 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* jshint esnext:true */ -/* globals Components, Services, XPCOMUtils, DEFAULT_PREFERENCES */ - -'use strict'; var EXPORTED_SYMBOLS = ['PdfjsChromeUtils']; diff --git a/browser/extensions/pdfjs/content/build/pdf.js b/browser/extensions/pdfjs/content/build/pdf.js index 71733763742b..61e3a737e85e 100644 --- a/browser/extensions/pdfjs/content/build/pdf.js +++ b/browser/extensions/pdfjs/content/build/pdf.js @@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.3.38'; -PDFJS.build = '83dbdc1'; +PDFJS.version = '1.3.14'; +PDFJS.build = 'df46b64'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -60,19 +60,6 @@ var AnnotationType = { LINK: 3 }; -var AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; - var AnnotationBorderStyleType = { SOLID: 1, DASHED: 2, @@ -1199,20 +1186,26 @@ PDFJS.createObjectURL = (function createObjectURLClosure() { }; })(); -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; +function MessageHandler(name, comObj) { + this.name = name; this.comObj = comObj; this.callbackIndex = 1; this.postMessageTransfers = true; var callbacksCapabilities = this.callbacksCapabilities = {}; var ah = this.actionHandler = {}; - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { + ah['console_log'] = [function ahConsoleLog(data) { + console.log.apply(console, data); + }]; + ah['console_error'] = [function ahConsoleError(data) { + console.error.apply(console, data); + }]; + ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) { + UnsupportedManager.notify(data); + }]; + + comObj.onmessage = function messageHandlerComObjOnMessage(event) { var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } if (data.isReply) { var callbackId = data.callbackId; if (data.callbackId in callbacksCapabilities) { @@ -1229,14 +1222,10 @@ function MessageHandler(sourceName, targetName, comObj) { } else if (data.action in ah) { var action = ah[data.action]; if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; Promise.resolve().then(function () { return action[0].call(action[1], data.data); }).then(function (result) { comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, isReply: true, callbackId: data.callbackId, data: result @@ -1247,8 +1236,6 @@ function MessageHandler(sourceName, targetName, comObj) { reason = reason + ''; } comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, isReply: true, callbackId: data.callbackId, error: reason @@ -1260,8 +1247,7 @@ function MessageHandler(sourceName, targetName, comObj) { } else { error('Unknown action from worker: ' + data.action); } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); + }; } MessageHandler.prototype = { @@ -1280,8 +1266,6 @@ MessageHandler.prototype = { */ send: function messageHandlerSend(actionName, data, transfers) { var message = { - sourceName: this.sourceName, - targetName: this.targetName, action: actionName, data: data }; @@ -1299,8 +1283,6 @@ MessageHandler.prototype = { function messageHandlerSendWithPromise(actionName, data, transfers) { var callbackId = this.callbackIndex++; var message = { - sourceName: this.sourceName, - targetName: this.targetName, action: actionName, data: data, callbackId: callbackId @@ -1326,10 +1308,6 @@ MessageHandler.prototype = { } else { this.comObj.postMessage(message); } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); } }; @@ -1498,9 +1476,6 @@ PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ? /** * (Deprecated) Opens external links in a new window if enabled. * The default behavior opens external links in the PDF.js window. - * - * NOTE: This property has been deprecated, please use - * `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. * @var {boolean} */ PDFJS.openExternalLinksInNewWindow = ( @@ -1550,8 +1525,6 @@ PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? * @property {number} rangeChunkSize - Optional parameter to specify * maximum number of bytes fetched per range request. The default value is * 2^16 = 65536. - * @property {PDFWorker} worker - The worker that will be used for the loading - * and parsing of the PDF data. */ /** @@ -1614,6 +1587,7 @@ PDFJS.getDocument = function getDocument(src, task.onPassword = passwordCallback || null; task.onProgress = progressCallback || null; + var workerInitializedCapability, transport; var source; if (typeof src === 'string') { source = { url: src }; @@ -1634,18 +1608,12 @@ PDFJS.getDocument = function getDocument(src, } var params = {}; - var rangeTransport = null; - var worker = null; for (var key in source) { if (key === 'url' && typeof window !== 'undefined') { // The full path is required in the 'url' field. params[key] = combineUrl(window.location.href, source[key]); continue; } else if (key === 'range') { - rangeTransport = source[key]; - continue; - } else if (key === 'worker') { - worker = source[key]; continue; } else if (key === 'data' && !(source[key] instanceof Uint8Array)) { // Converting string or array-like data to Uint8Array. @@ -1666,98 +1634,27 @@ PDFJS.getDocument = function getDocument(src, params[key] = source[key]; } - params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; + params.rangeChunkSize = source.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; - if (!worker) { - // Worker was not provided -- creating and owning our own. - worker = new PDFWorker(); - task._worker = worker; - } - var docId = task.docId; - worker.promise.then(function () { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - return _fetchDocument(worker, params, rangeTransport, docId).then( - function (workerId) { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - var messageHandler = new MessageHandler(docId, workerId, worker.port); - messageHandler.send('Ready', null); - var transport = new WorkerTransport(messageHandler, task, rangeTransport); - task._transport = transport; - }); - }, task._capability.reject); + workerInitializedCapability = createPromiseCapability(); + transport = new WorkerTransport(workerInitializedCapability, source.range); + workerInitializedCapability.promise.then(function transportInitialized() { + transport.fetchDocument(task, params); + }); + task._transport = transport; return task; }; -/** - * Starts fetching of specified PDF document/data. - * @param {PDFWorker} worker - * @param {Object} source - * @param {PDFDataRangeTransport} pdfDataRangeTransport - * @param {string} docId Unique document id, used as MessageHandler id. - * @returns {Promise} The promise, which is resolved when worker id of - * MessageHandler is known. - * @private - */ -function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { - if (worker.destroyed) { - return Promise.reject(new Error('Worker was destroyed')); - } - - source.disableAutoFetch = PDFJS.disableAutoFetch; - source.disableStream = PDFJS.disableStream; - source.chunkedViewerLoading = !!pdfDataRangeTransport; - if (pdfDataRangeTransport) { - source.length = pdfDataRangeTransport.length; - source.initialData = pdfDataRangeTransport.initialData; - } - return worker.messageHandler.sendWithPromise('GetDocRequest', { - docId: docId, - source: source, - disableRange: PDFJS.disableRange, - maxImageSize: PDFJS.maxImageSize, - cMapUrl: PDFJS.cMapUrl, - cMapPacked: PDFJS.cMapPacked, - disableFontFace: PDFJS.disableFontFace, - disableCreateObjectURL: PDFJS.disableCreateObjectURL, - verbosity: PDFJS.verbosity - }).then(function (workerId) { - if (worker.destroyed) { - throw new Error('Worker was destroyed'); - } - return workerId; - }); -} - /** * PDF document loading operation. * @class * @alias PDFDocumentLoadingTask */ var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { - var nextDocumentId = 0; - - /** @constructs PDFDocumentLoadingTask */ function PDFDocumentLoadingTask() { this._capability = createPromiseCapability(); this._transport = null; - this._worker = null; - - /** - * Unique document loading task id -- used in MessageHandlers. - * @type {string} - */ - this.docId = 'd' + (nextDocumentId++); - - /** - * Shows if loading task is destroyed. - * @type {boolean} - */ - this.destroyed = false; /** * Callback to request a password if wrong or no password was provided. @@ -1789,17 +1686,7 @@ var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { * is completed. */ destroy: function () { - this.destroyed = true; - - var transportDestroyed = !this._transport ? Promise.resolve() : - this._transport.destroy(); - return transportDestroyed.then(function () { - this._transport = null; - if (this._worker) { - this._worker.destroy(); - this._worker = null; - } - }.bind(this)); + return this._transport.destroy(); }, /** @@ -2028,20 +1915,12 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { * Destroys current document instance and terminates worker. */ destroy: function PDFDocumentProxy_destroy() { - return this.loadingTask.destroy(); + return this.transport.destroy(); } }; return PDFDocumentProxy; })(); -/** - * Page getTextContent parameters. - * - * @typedef {Object} getTextContentParameters - * @param {boolean} normalizeWhitespace - replaces all occurrences of - * whitespace with standard spaces (0x20). The default value is `false`. - */ - /** * Page text content. * @@ -2073,16 +1952,6 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { * @property {string} fontFamily - possible font family */ -/** - * Page annotation parameters. - * - * @typedef {Object} GetAnnotationsParameters - * @param {string} intent - Determines the annotations that will be fetched, - * can be either 'display' (viewable annotations) or 'print' - * (printable annotations). - * If the parameter is omitted, all annotations are fetched. - */ - /** * Page render parameters. * @@ -2171,17 +2040,12 @@ var PDFPageProxy = (function PDFPageProxyClosure() { return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0); }, /** - * @param {GetAnnotationsParameters} params - Annotation parameters. * @return {Promise} A promise that is resolved with an {Array} of the * annotation objects. */ - getAnnotations: function PDFPageProxy_getAnnotations(params) { - var intent = (params && params.intent) || null; - - if (!this.annotationsPromise || this.annotationsIntent !== intent) { - this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, - intent); - this.annotationsIntent = intent; + getAnnotations: function PDFPageProxy_getAnnotations() { + if (!this.annotationsPromise) { + this.annotationsPromise = this.transport.getAnnotations(this.pageIndex); } return this.annotationsPromise; }, @@ -2320,16 +2184,12 @@ var PDFPageProxy = (function PDFPageProxyClosure() { }, /** - * @param {getTextContentParameters} params - getTextContent parameters. * @return {Promise} That is resolved a {@link TextContent} * object that represent the page text content. */ - getTextContent: function PDFPageProxy_getTextContent(params) { - var normalizeWhitespace = (params && params.normalizeWhitespace) || false; - + getTextContent: function PDFPageProxy_getTextContent() { return this.transport.messageHandler.sendWithPromise('GetTextContent', { - pageIndex: this.pageNumber - 1, - normalizeWhitespace: normalizeWhitespace, + pageIndex: this.pageNumber - 1 }); }, @@ -2436,202 +2296,17 @@ var PDFPageProxy = (function PDFPageProxyClosure() { return PDFPageProxy; })(); -/** - * PDF.js web worker abstraction, it controls instantiation of PDF documents and - * WorkerTransport for them. If creation of a web worker is not possible, - * a "fake" worker will be used instead. - * @class - */ -var PDFWorker = (function PDFWorkerClosure() { - var nextFakeWorkerId = 0; - - // Loads worker code into main thread. - function setupFakeWorkerGlobal() { - if (!PDFJS.fakeWorkerFilesLoadedCapability) { - PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability(); - // In the developer build load worker_loader which in turn loads all the - // other files and resolves the promise. In production only the - // pdf.worker.js file is needed. - Util.loadScript(PDFJS.workerSrc, function() { - PDFJS.fakeWorkerFilesLoadedCapability.resolve(); - }); - } - return PDFJS.fakeWorkerFilesLoadedCapability.promise; - } - - function PDFWorker(name) { - this.name = name; - this.destroyed = false; - - this._readyCapability = createPromiseCapability(); - this._port = null; - this._webWorker = null; - this._messageHandler = null; - this._initialize(); - } - - PDFWorker.prototype = /** @lends PDFWorker.prototype */ { - get promise() { - return this._readyCapability.promise; - }, - - get port() { - return this._port; - }, - - get messageHandler() { - return this._messageHandler; - }, - - _initialize: function PDFWorker_initialize() { - // If worker support isn't disabled explicit and the browser has worker - // support, create a new web worker and test if it/the browser fullfills - // all requirements to run parts of pdf.js in a web worker. - // Right now, the requirement is, that an Uint8Array is still an - // Uint8Array as it arrives on the worker. (Chrome added this with v.15.) - if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { - var workerSrc = PDFJS.workerSrc; - if (!workerSrc) { - error('No PDFJS.workerSrc specified'); - } - - try { - // Some versions of FF can't create a worker on localhost, see: - // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 - var worker = new Worker(workerSrc); - var messageHandler = new MessageHandler('main', 'worker', worker); - - messageHandler.on('test', function PDFWorker_test(data) { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - messageHandler.destroy(); - worker.terminate(); - return; // worker was destroyed - } - var supportTypedArray = data && data.supportTypedArray; - if (supportTypedArray) { - this._messageHandler = messageHandler; - this._port = worker; - this._webWorker = worker; - if (!data.supportTransfers) { - PDFJS.postMessageTransfers = false; - } - this._readyCapability.resolve(); - } else { - this._setupFakeWorker(); - messageHandler.destroy(); - worker.terminate(); - } - }.bind(this)); - - messageHandler.on('console_log', function (data) { - console.log.apply(console, data); - }); - messageHandler.on('console_error', function (data) { - console.error.apply(console, data); - }); - messageHandler.on('_unsupported_feature', function (data) { - UnsupportedManager.notify(data); - }); - - var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]); - // Some versions of Opera throw a DATA_CLONE_ERR on serializing the - // typed array. Also, checking if we can use transfers. - try { - messageHandler.send('test', testObj, [testObj.buffer]); - } catch (ex) { - info('Cannot use postMessage transfers'); - testObj[0] = 0; - messageHandler.send('test', testObj); - } - return; - } catch (e) { - info('The worker has been disabled.'); - } - } - // Either workers are disabled, not supported or have thrown an exception. - // Thus, we fallback to a faked worker. - this._setupFakeWorker(); - }, - - _setupFakeWorker: function PDFWorker_setupFakeWorker() { - warn('Setting up fake worker.'); - globalScope.PDFJS.disableWorker = true; - - setupFakeWorkerGlobal().then(function () { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - return; - } - - // If we don't use a worker, just post/sendMessage to the main thread. - var port = { - _listeners: [], - postMessage: function (obj) { - var e = {data: obj}; - this._listeners.forEach(function (listener) { - listener.call(this, e); - }, this); - }, - addEventListener: function (name, listener) { - this._listeners.push(listener); - }, - removeEventListener: function (name, listener) { - var i = this._listeners.indexOf(listener); - this._listeners.splice(i, 1); - }, - terminate: function () {} - }; - this._port = port; - - // All fake workers use the same port, making id unique. - var id = 'fake' + (nextFakeWorkerId++); - - // If the main thread is our worker, setup the handling for the - // messages -- the main thread sends to it self. - var workerHandler = new MessageHandler(id + '_worker', id, port); - PDFJS.WorkerMessageHandler.setup(workerHandler, port); - - var messageHandler = new MessageHandler(id, id + '_worker', port); - this._messageHandler = messageHandler; - this._readyCapability.resolve(); - }.bind(this)); - }, - - /** - * Destroys the worker instance. - */ - destroy: function PDFWorker_destroy() { - this.destroyed = true; - if (this._webWorker) { - // We need to terminate only web worker created resource. - this._webWorker.terminate(); - this._webWorker = null; - } - this._port = null; - if (this._messageHandler) { - this._messageHandler.destroy(); - this._messageHandler = null; - } - } - }; - - return PDFWorker; -})(); -PDFJS.PDFWorker = PDFWorker; - /** * For internal use only. * @ignore */ var WorkerTransport = (function WorkerTransportClosure() { - function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) { - this.messageHandler = messageHandler; - this.loadingTask = loadingTask; + function WorkerTransport(workerInitializedCapability, pdfDataRangeTransport) { this.pdfDataRangeTransport = pdfDataRangeTransport; + this.workerInitializedCapability = workerInitializedCapability; this.commonObjs = new PDFObjects(); - this.fontLoader = new FontLoader(loadingTask.docId); + this.loadingTask = null; this.destroyed = false; this.destroyCapability = null; @@ -2639,7 +2314,56 @@ var WorkerTransport = (function WorkerTransportClosure() { this.pagePromises = []; this.downloadInfoCapability = createPromiseCapability(); - this.setupMessageHandler(); + // If worker support isn't disabled explicit and the browser has worker + // support, create a new web worker and test if it/the browser fullfills + // all requirements to run parts of pdf.js in a web worker. + // Right now, the requirement is, that an Uint8Array is still an Uint8Array + // as it arrives on the worker. Chrome added this with version 15. + if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { + var workerSrc = PDFJS.workerSrc; + if (!workerSrc) { + error('No PDFJS.workerSrc specified'); + } + + try { + // Some versions of FF can't create a worker on localhost, see: + // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 + var worker = new Worker(workerSrc); + var messageHandler = new MessageHandler('main', worker); + this.messageHandler = messageHandler; + + messageHandler.on('test', function transportTest(data) { + var supportTypedArray = data && data.supportTypedArray; + if (supportTypedArray) { + this.worker = worker; + if (!data.supportTransfers) { + PDFJS.postMessageTransfers = false; + } + this.setupMessageHandler(messageHandler); + workerInitializedCapability.resolve(); + } else { + this.setupFakeWorker(); + } + }.bind(this)); + + var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]); + // Some versions of Opera throw a DATA_CLONE_ERR on serializing the + // typed array. Also, checking if we can use transfers. + try { + messageHandler.send('test', testObj, [testObj.buffer]); + } catch (ex) { + info('Cannot use postMessage transfers'); + testObj[0] = 0; + messageHandler.send('test', testObj); + } + return; + } catch (e) { + info('The worker has been disabled.'); + } + } + // Either workers are disabled, not supported or have thrown an exception. + // Thus, we fallback to a faked worker. + this.setupFakeWorker(); } WorkerTransport.prototype = { destroy: function WorkerTransport_destroy() { @@ -2665,23 +2389,56 @@ var WorkerTransport = (function WorkerTransportClosure() { var terminated = this.messageHandler.sendWithPromise('Terminate', null); waitOn.push(terminated); Promise.all(waitOn).then(function () { - self.fontLoader.clear(); + FontLoader.clear(); + if (self.worker) { + self.worker.terminate(); + } if (self.pdfDataRangeTransport) { self.pdfDataRangeTransport.abort(); self.pdfDataRangeTransport = null; } - if (self.messageHandler) { - self.messageHandler.destroy(); - self.messageHandler = null; - } + self.messageHandler = null; self.destroyCapability.resolve(); }, this.destroyCapability.reject); return this.destroyCapability.promise; }, + setupFakeWorker: function WorkerTransport_setupFakeWorker() { + globalScope.PDFJS.disableWorker = true; + + if (!PDFJS.fakeWorkerFilesLoadedCapability) { + PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability(); + // In the developer build load worker_loader which in turn loads all the + // other files and resolves the promise. In production only the + // pdf.worker.js file is needed. + Util.loadScript(PDFJS.workerSrc, function() { + PDFJS.fakeWorkerFilesLoadedCapability.resolve(); + }); + } + PDFJS.fakeWorkerFilesLoadedCapability.promise.then(function () { + warn('Setting up fake worker.'); + // If we don't use a worker, just post/sendMessage to the main thread. + var fakeWorker = { + postMessage: function WorkerTransport_postMessage(obj) { + fakeWorker.onmessage({data: obj}); + }, + terminate: function WorkerTransport_terminate() {} + }; + + var messageHandler = new MessageHandler('main', fakeWorker); + this.setupMessageHandler(messageHandler); + + // If the main thread is our worker, setup the handling for the messages + // the main thread sends to it self. + PDFJS.WorkerMessageHandler.setup(messageHandler); + + this.workerInitializedCapability.resolve(); + }.bind(this)); + }, + setupMessageHandler: - function WorkerTransport_setupMessageHandler() { - var messageHandler = this.messageHandler; + function WorkerTransport_setupMessageHandler(messageHandler) { + this.messageHandler = messageHandler; function updatePassword(password) { messageHandler.send('UpdatePassword', password); @@ -2821,7 +2578,7 @@ var WorkerTransport = (function WorkerTransportClosure() { font = new FontFaceObject(exportedData); } - this.fontLoader.bind( + FontLoader.bind( [font], function fontReady(fontObjs) { this.commonObjs.resolve(id, font); @@ -2946,6 +2703,34 @@ var WorkerTransport = (function WorkerTransportClosure() { }, this); }, + fetchDocument: function WorkerTransport_fetchDocument(loadingTask, source) { + if (this.destroyed) { + loadingTask._capability.reject(new Error('Loading aborted')); + this.destroyCapability.resolve(); + return; + } + + this.loadingTask = loadingTask; + + source.disableAutoFetch = PDFJS.disableAutoFetch; + source.disableStream = PDFJS.disableStream; + source.chunkedViewerLoading = !!this.pdfDataRangeTransport; + if (this.pdfDataRangeTransport) { + source.length = this.pdfDataRangeTransport.length; + source.initialData = this.pdfDataRangeTransport.initialData; + } + this.messageHandler.send('GetDocRequest', { + source: source, + disableRange: PDFJS.disableRange, + maxImageSize: PDFJS.maxImageSize, + cMapUrl: PDFJS.cMapUrl, + cMapPacked: PDFJS.cMapPacked, + disableFontFace: PDFJS.disableFontFace, + disableCreateObjectURL: PDFJS.disableCreateObjectURL, + verbosity: PDFJS.verbosity + }); + }, + getData: function WorkerTransport_getData() { return this.messageHandler.sendWithPromise('GetData', null); }, @@ -2978,11 +2763,9 @@ var WorkerTransport = (function WorkerTransportClosure() { return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }); }, - getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) { - return this.messageHandler.sendWithPromise('GetAnnotations', { - pageIndex: pageIndex, - intent: intent, - }); + getAnnotations: function WorkerTransport_getAnnotations(pageIndex) { + return this.messageHandler.sendWithPromise('GetAnnotations', + { pageIndex: pageIndex }); }, getDestinations: function WorkerTransport_getDestinations() { @@ -2990,7 +2773,7 @@ var WorkerTransport = (function WorkerTransportClosure() { }, getDestination: function WorkerTransport_getDestination(id) { - return this.messageHandler.sendWithPromise('GetDestination', { id: id }); + return this.messageHandler.sendWithPromise('GetDestination', { id: id } ); }, getAttachments: function WorkerTransport_getAttachments() { @@ -3029,7 +2812,7 @@ var WorkerTransport = (function WorkerTransportClosure() { } } this.commonObjs.clear(); - this.fontLoader.clear(); + FontLoader.clear(); }.bind(this)); } }; @@ -6378,16 +6161,12 @@ var TilingPattern = (function TilingPatternClosure() { PDFJS.disableFontFace = false; -function FontLoader(docId) { - this.docId = docId; - this.styleElement = null; -} -FontLoader.prototype = { +var FontLoader = { insertRule: function fontLoaderInsertRule(rule) { - var styleElement = this.styleElement; + var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG'); if (!styleElement) { - styleElement = this.styleElement = document.createElement('style'); - styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId; + styleElement = document.createElement('style'); + styleElement.id = 'PDFJS_FONT_STYLE_TAG'; document.documentElement.getElementsByTagName('head')[0].appendChild( styleElement); } @@ -6397,7 +6176,7 @@ FontLoader.prototype = { }, clear: function fontLoaderClear() { - var styleElement = this.styleElement; + var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG'); if (styleElement) { styleElement.parentNode.removeChild(styleElement); } @@ -6420,31 +6199,20 @@ FontLoader.prototype = { }; var FontFaceObject = (function FontFaceObjectClosure() { - function FontFaceObject(translatedData) { + function FontFaceObject(name, file, properties) { this.compiledGlyphs = {}; - // importing translated data - for (var i in translatedData) { - this[i] = translatedData[i]; + if (arguments.length === 1) { + // importing translated data + var data = arguments[0]; + for (var i in data) { + this[i] = data[i]; + } + return; } } - Object.defineProperty(FontFaceObject, 'isEvalSupported', { - get: function () { - var evalSupport = false; - if (PDFJS.isEvalSupported) { - try { - /* jshint evil: true */ - new Function(''); - evalSupport = true; - } catch (e) {} - } - return shadow(this, 'isEvalSupported', evalSupport); - }, - enumerable: true, - configurable: true - }); FontFaceObject.prototype = { - createFontFaceRule: function FontFaceObject_createFontFaceRule() { + bindDOM: function FontFaceObject_bindDOM() { if (!this.data) { return null; } @@ -6461,6 +6229,7 @@ var FontFaceObject = (function FontFaceObjectClosure() { var url = ('url(data:' + this.mimetype + ';base64,' + window.btoa(data) + ');'); var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; + FontLoader.insertRule(rule); if (PDFJS.pdfBug && 'FontInspector' in globalScope && globalScope['FontInspector'].enabled) { @@ -6470,14 +6239,13 @@ var FontFaceObject = (function FontFaceObjectClosure() { return rule; }, - getPathGenerator: - function FontFaceObject_getPathGenerator(objs, character) { + getPathGenerator: function FontLoader_getPathGenerator(objs, character) { if (!(character in this.compiledGlyphs)) { var cmds = objs.get(this.loadedName + '_path_' + character); var current, i, len; // If we can, compile cmds into JS for MAXIMUM SPEED - if (FontFaceObject.isEvalSupported) { + if (FontLoader.isEvalSupported) { var args, js = ''; for (i = 0, len = cmds.length; i < len; i++) { current = cmds[i]; diff --git a/browser/extensions/pdfjs/content/build/pdf.worker.js b/browser/extensions/pdfjs/content/build/pdf.worker.js index a59c7eed250f..306febbe93b2 100644 --- a/browser/extensions/pdfjs/content/build/pdf.worker.js +++ b/browser/extensions/pdfjs/content/build/pdf.worker.js @@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.3.38'; -PDFJS.build = '83dbdc1'; +PDFJS.version = '1.3.14'; +PDFJS.build = 'df46b64'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -60,19 +60,6 @@ var AnnotationType = { LINK: 3 }; -var AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; - var AnnotationBorderStyleType = { SOLID: 1, DASHED: 2, @@ -1199,20 +1186,26 @@ PDFJS.createObjectURL = (function createObjectURLClosure() { }; })(); -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; +function MessageHandler(name, comObj) { + this.name = name; this.comObj = comObj; this.callbackIndex = 1; this.postMessageTransfers = true; var callbacksCapabilities = this.callbacksCapabilities = {}; var ah = this.actionHandler = {}; - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { + ah['console_log'] = [function ahConsoleLog(data) { + console.log.apply(console, data); + }]; + ah['console_error'] = [function ahConsoleError(data) { + console.error.apply(console, data); + }]; + ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) { + UnsupportedManager.notify(data); + }]; + + comObj.onmessage = function messageHandlerComObjOnMessage(event) { var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } if (data.isReply) { var callbackId = data.callbackId; if (data.callbackId in callbacksCapabilities) { @@ -1229,14 +1222,10 @@ function MessageHandler(sourceName, targetName, comObj) { } else if (data.action in ah) { var action = ah[data.action]; if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; Promise.resolve().then(function () { return action[0].call(action[1], data.data); }).then(function (result) { comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, isReply: true, callbackId: data.callbackId, data: result @@ -1247,8 +1236,6 @@ function MessageHandler(sourceName, targetName, comObj) { reason = reason + ''; } comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, isReply: true, callbackId: data.callbackId, error: reason @@ -1260,8 +1247,7 @@ function MessageHandler(sourceName, targetName, comObj) { } else { error('Unknown action from worker: ' + data.action); } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); + }; } MessageHandler.prototype = { @@ -1280,8 +1266,6 @@ MessageHandler.prototype = { */ send: function messageHandlerSend(actionName, data, transfers) { var message = { - sourceName: this.sourceName, - targetName: this.targetName, action: actionName, data: data }; @@ -1299,8 +1283,6 @@ MessageHandler.prototype = { function messageHandlerSendWithPromise(actionName, data, transfers) { var callbackId = this.callbackIndex++; var message = { - sourceName: this.sourceName, - targetName: this.targetName, action: actionName, data: data, callbackId: callbackId @@ -1326,10 +1308,6 @@ MessageHandler.prototype = { } else { this.comObj.postMessage(message); } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); } }; @@ -1883,10 +1861,6 @@ var BasePdfManager = (function BasePdfManagerClosure() { } BasePdfManager.prototype = { - get docId() { - return this._docId; - }, - onLoadedStream: function BasePdfManager_onLoadedStream() { throw new NotImplementedException(); }, @@ -1948,8 +1922,7 @@ var BasePdfManager = (function BasePdfManagerClosure() { })(); var LocalPdfManager = (function LocalPdfManagerClosure() { - function LocalPdfManager(docId, data, password) { - this._docId = docId; + function LocalPdfManager(data, password) { var stream = new Stream(data); this.pdfDocument = new PDFDocument(this, stream, password); this._loadedStreamCapability = createPromiseCapability(); @@ -2000,8 +1973,8 @@ var LocalPdfManager = (function LocalPdfManagerClosure() { })(); var NetworkPdfManager = (function NetworkPdfManagerClosure() { - function NetworkPdfManager(docId, args, msgHandler) { - this._docId = docId; + function NetworkPdfManager(args, msgHandler) { + this.msgHandler = msgHandler; var params = { @@ -2278,8 +2251,7 @@ var Page = (function PageClosure() { }); }, - extractTextContent: function Page_extractTextContent(task, - normalizeWhitespace) { + extractTextContent: function Page_extractTextContent(task) { var handler = { on: function nullHandlerOn() {}, send: function nullHandlerSend() {} @@ -2309,22 +2281,14 @@ var Page = (function PageClosure() { return partialEvaluator.getTextContent(contentStream, task, - self.resources, - /* stateManager = */ null, - normalizeWhitespace); + self.resources); }); }, - getAnnotationsData: function Page_getAnnotationsData(intent) { + getAnnotationsData: function Page_getAnnotationsData() { var annotations = this.annotations; var annotationsData = []; for (var i = 0, n = annotations.length; i < n; ++i) { - if (intent) { - if (!(intent === 'display' && annotations[i].viewable) && - !(intent === 'print' && annotations[i].printable)) { - continue; - } - } annotationsData.push(annotations[i].data); } return annotationsData; @@ -2337,7 +2301,8 @@ var Page = (function PageClosure() { for (var i = 0, n = annotationRefs.length; i < n; ++i) { var annotationRef = annotationRefs[i]; var annotation = annotationFactory.create(this.xref, annotationRef); - if (annotation) { + if (annotation && + (annotation.isViewable() || annotation.isPrintable())) { annotations.push(annotation); } } @@ -4546,9 +4511,7 @@ var Annotation = (function AnnotationClosure() { var data = this.data = {}; data.subtype = dict.get('Subtype').name; - - this.setFlags(dict.get('F')); - data.annotationFlags = this.flags; + data.annotationFlags = dict.get('F'); this.setRectangle(dict.get('Rect')); data.rect = this.rectangle; @@ -4565,64 +4528,6 @@ var Annotation = (function AnnotationClosure() { } Annotation.prototype = { - /** - * @return {boolean} - */ - get viewable() { - if (this.flags) { - return !this.hasFlag(AnnotationFlag.INVISIBLE) && - !this.hasFlag(AnnotationFlag.HIDDEN) && - !this.hasFlag(AnnotationFlag.NOVIEW); - } - return true; - }, - - /** - * @return {boolean} - */ - get printable() { - if (this.flags) { - return this.hasFlag(AnnotationFlag.PRINT) && - !this.hasFlag(AnnotationFlag.INVISIBLE) && - !this.hasFlag(AnnotationFlag.HIDDEN); - } - return false; - }, - - /** - * Set the flags. - * - * @public - * @memberof Annotation - * @param {number} flags - Unsigned 32-bit integer specifying annotation - * characteristics - * @see {@link shared/util.js} - */ - setFlags: function Annotation_setFlags(flags) { - if (isInt(flags)) { - this.flags = flags; - } else { - this.flags = 0; - } - }, - - /** - * Check if a provided flag is set. - * - * @public - * @memberof Annotation - * @param {number} flag - Hexadecimal representation for an annotation - * characteristic - * @return {boolean} - * @see {@link shared/util.js} - */ - hasFlag: function Annotation_hasFlag(flag) { - if (this.flags) { - return (this.flags & flag) > 0; - } - return false; - }, - /** * Set the rectangle. * @@ -4722,6 +4627,32 @@ var Annotation = (function AnnotationClosure() { } }, + isInvisible: function Annotation_isInvisible() { + var data = this.data; + return !!(data && + data.annotationFlags && // Default: not invisible + data.annotationFlags & 0x1); // Invisible + }, + + isViewable: function Annotation_isViewable() { + var data = this.data; + return !!(!this.isInvisible() && + data && + (!data.annotationFlags || + !(data.annotationFlags & 0x22)) && // Hidden or NoView + data.rect); // rectangle is necessary + }, + + isPrintable: function Annotation_isPrintable() { + var data = this.data; + return !!(!this.isInvisible() && + data && + data.annotationFlags && // Default: not printable + data.annotationFlags & 0x4 && // Print + !(data.annotationFlags & 0x2) && // Hidden + data.rect); // rectangle is necessary + }, + loadResources: function Annotation_loadResources(keys) { return new Promise(function (resolve, reject) { this.appearance.dict.getAsync('Resources').then(function (resources) { @@ -4788,8 +4719,8 @@ var Annotation = (function AnnotationClosure() { var annotationPromises = []; for (var i = 0, n = annotations.length; i < n; ++i) { - if (intent === 'display' && annotations[i].viewable || - intent === 'print' && annotations[i].printable) { + if (intent === 'display' && annotations[i].isViewable() || + intent === 'print' && annotations[i].isPrintable()) { annotationPromises.push( annotations[i].getOperatorList(partialEvaluator, task)); } @@ -4965,12 +4896,6 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() { data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0; this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty; - // Hide unsupported Widget signatures. - if (data.fieldType === 'Sig') { - warn('unimplemented annotation type: Widget signature'); - this.setFlags(AnnotationFlag.HIDDEN); - } - // Building the full field name by collecting the field and // its ancestors 'T' data and joining them using '.'. var fieldName = []; @@ -5004,7 +4929,17 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() { data.fullName = fieldName.join('.'); } - Util.inherit(WidgetAnnotation, Annotation, {}); + var parent = Annotation.prototype; + Util.inherit(WidgetAnnotation, Annotation, { + isViewable: function WidgetAnnotation_isViewable() { + if (this.data.fieldType === 'Sig') { + warn('unimplemented annotation type: Widget signature'); + return false; + } + + return parent.isViewable.call(this); + } + }); return WidgetAnnotation; })(); @@ -5103,7 +5038,7 @@ var LinkAnnotation = (function LinkAnnotationClosure() { if (!isValidUrl(url, false)) { url = ''; } - // According to ISO 32000-1:2008, section 12.6.4.7, + // According to ISO 32000-1:2008, section 12.6.4.7, // URI should to be encoded in 7-bit ASCII. // Some bad PDFs may have URIs in UTF-8 encoding, see Bugzilla 1122280. try { @@ -10835,7 +10770,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // Keep track of each font we translated so the caller can // load them asynchronously before calling display on a page. - font.loadedName = 'g_' + this.pdfManager.docId + '_f' + (fontRefIsDict ? + font.loadedName = 'g_font_' + (fontRefIsDict ? fontName.replace(/\W/g, '') : fontID); font.translated = fontCapability.promise; @@ -11214,15 +11149,12 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { }); }, - getTextContent: - function PartialEvaluator_getTextContent(stream, task, resources, - stateManager, - normalizeWhitespace) { + getTextContent: function PartialEvaluator_getTextContent(stream, task, + resources, + stateManager) { stateManager = (stateManager || new StateManager(new TextState())); - var WhitespaceRegexp = /\s/g; - var textContent = { items: [], styles: Object.create(null) @@ -11336,23 +11268,11 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { return textContentItem; } - function replaceWhitespace(str) { - // Replaces all whitespaces with standard spaces (0x20), to avoid - // alignment issues between the textLayer and the canvas if the text - // contains e.g. tabs (fixes issue6612.pdf). - var i = 0, ii = str.length, code; - while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) { - i++; - } - return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str); - } - function runBidiTransform(textChunk) { var str = textChunk.str.join(''); var bidiResult = PDFJS.bidi(str, -1, textChunk.vertical); return { - str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) : - bidiResult.str), + str: bidiResult.str, dir: bidiResult.dir, width: textChunk.width, height: textChunk.height, @@ -11673,8 +11593,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { } return self.getTextContent(xobj, task, - xobj.dict.get('Resources') || resources, stateManager, - normalizeWhitespace).then(function (formTextContent) { + xobj.dict.get('Resources') || resources, stateManager). + then(function (formTextContent) { Util.appendToArray(textContent.items, formTextContent.items); Util.extendObj(textContent.styles, formTextContent.styles); stateManager.restore(); @@ -33917,51 +33837,12 @@ var WorkerTask = (function WorkerTaskClosure() { })(); var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { - setup: function wphSetup(handler, port) { - handler.on('test', function wphSetupTest(data) { - // check if Uint8Array can be sent to worker - if (!(data instanceof Uint8Array)) { - handler.send('test', 'main', false); - return; - } - // making sure postMessage transfers are working - var supportTransfers = data[0] === 255; - handler.postMessageTransfers = supportTransfers; - // check if the response property is supported by xhr - var xhr = new XMLHttpRequest(); - var responseExists = 'response' in xhr; - // check if the property is actually implemented - try { - var dummy = xhr.responseType; - } catch (e) { - responseExists = false; - } - if (!responseExists) { - handler.send('test', false); - return; - } - handler.send('test', { - supportTypedArray: true, - supportTransfers: supportTransfers - }); - }); - - handler.on('GetDocRequest', function wphSetupDoc(data) { - return WorkerMessageHandler.createDocumentHandler(data, port); - }); - }, - createDocumentHandler: function wphCreateDocumentHandler(docParams, port) { - // This context is actually holds references on pdfManager and handler, - // until the latter is destroyed. + setup: function wphSetup(handler) { var pdfManager; var terminated = false; var cancelXHRs = null; var WorkerTasks = []; - var docId = docParams.docId; - var workerHandlerName = docParams.docId + '_worker'; - var handler = new MessageHandler(workerHandlerName, docId, port); - function ensureNotTerminated() { if (terminated) { throw new Error('Worker was terminated'); @@ -34019,7 +33900,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { var disableRange = data.disableRange; if (source.data) { try { - pdfManager = new LocalPdfManager(docId, source.data, source.password); + pdfManager = new LocalPdfManager(source.data, source.password); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); @@ -34027,7 +33908,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { return pdfManagerCapability.promise; } else if (source.chunkedViewerLoading) { try { - pdfManager = new NetworkPdfManager(docId, source, handler); + pdfManager = new NetworkPdfManager(source, handler); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); @@ -34084,7 +33965,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { } try { - pdfManager = new NetworkPdfManager(docId, source, handler); + pdfManager = new NetworkPdfManager(source, handler); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); @@ -34129,7 +34010,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { // the data is array, instantiating directly from it try { - pdfManager = new LocalPdfManager(docId, pdfFile, source.password); + pdfManager = new LocalPdfManager(pdfFile, source.password); pdfManagerCapability.resolve(pdfManager); } catch (ex) { pdfManagerCapability.reject(ex); @@ -34167,7 +34048,35 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { return pdfManagerCapability.promise; } - var setupDoc = function(data) { + handler.on('test', function wphSetupTest(data) { + // check if Uint8Array can be sent to worker + if (!(data instanceof Uint8Array)) { + handler.send('test', false); + return; + } + // making sure postMessage transfers are working + var supportTransfers = data[0] === 255; + handler.postMessageTransfers = supportTransfers; + // check if the response property is supported by xhr + var xhr = new XMLHttpRequest(); + var responseExists = 'response' in xhr; + // check if the property is actually implemented + try { + var dummy = xhr.responseType; + } catch (e) { + responseExists = false; + } + if (!responseExists) { + handler.send('test', false); + return; + } + handler.send('test', { + supportTypedArray: true, + supportTransfers: supportTransfers + }); + }); + + handler.on('GetDocRequest', function wphSetupDoc(data) { var onSuccess = function(doc) { ensureNotTerminated(); handler.send('GetDoc', { pdfInfo: doc }); @@ -34212,6 +34121,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { } pdfManager = newPdfManager; + handler.send('PDFManagerReady', null); pdfManager.onLoadedStream().then(function(stream) { handler.send('DataLoaded', { length: stream.bytes.byteLength }); @@ -34242,7 +34152,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { }); }, onFailure); }, onFailure); - }; + }); handler.on('GetPage', function wphSetupGetPage(data) { return pdfManager.getPage(data.pageIndex).then(function(page) { @@ -34275,7 +34185,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { handler.on('GetDestination', function wphSetupGetDestination(data) { - return pdfManager.ensureCatalog('getDestination', [data.id]); + return pdfManager.ensureCatalog('getDestination', [ data.id ]); } ); @@ -34323,7 +34233,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { return pdfManager.getPage(data.pageIndex).then(function(page) { - return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]); + return pdfManager.ensure(page, 'getAnnotationsData', []); }); }); @@ -34382,14 +34292,12 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { handler.on('GetTextContent', function wphExtractText(data) { var pageIndex = data.pageIndex; - var normalizeWhitespace = data.normalizeWhitespace; return pdfManager.getPage(pageIndex).then(function(page) { var task = new WorkerTask('GetTextContent: page ' + pageIndex); startWorkerTask(task); var pageNum = pageIndex + 1; var start = Date.now(); - return page.extractTextContent(task, normalizeWhitespace).then( - function(textContent) { + return page.extractTextContent(task).then(function(textContent) { finishWorkerTask(task); info('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms'); @@ -34424,19 +34332,8 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { task.terminate(); }); - return Promise.all(waitOn).then(function () { - // Notice that even if we destroying handler, resolved response promise - // must be sent back. - handler.destroy(); - handler = null; - }); + return Promise.all(waitOn).then(function () {}); }); - - handler.on('Ready', function wphReady(data) { - setupDoc(docParams); - docParams = null; // we don't need docParams anymore -- saving memory. - }); - return workerHandlerName; } }; @@ -34446,7 +34343,6 @@ var workerConsole = { log: function log() { var args = Array.prototype.slice.call(arguments); globalScope.postMessage({ - targetName: 'main', action: 'console_log', data: args }); @@ -34455,7 +34351,6 @@ var workerConsole = { error: function error() { var args = Array.prototype.slice.call(arguments); globalScope.postMessage({ - targetName: 'main', action: 'console_error', data: args }); @@ -34485,14 +34380,13 @@ if (typeof window === 'undefined') { // Listen for unsupported features so we can pass them on to the main thread. PDFJS.UnsupportedManager.listen(function (msg) { globalScope.postMessage({ - targetName: 'main', action: '_unsupported_feature', data: msg }); }); - var handler = new MessageHandler('worker', 'main', this); - WorkerMessageHandler.setup(handler, this); + var handler = new MessageHandler('worker_processor', this); + WorkerMessageHandler.setup(handler); } diff --git a/browser/extensions/pdfjs/content/web/viewer.js b/browser/extensions/pdfjs/content/web/viewer.js index 49934a61142d..35488967ab73 100644 --- a/browser/extensions/pdfjs/content/web/viewer.js +++ b/browser/extensions/pdfjs/content/web/viewer.js @@ -12,18 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, ProgressBar, - DownloadManager, getFileName, getPDFFileNameFromURL, - PDFHistory, Preferences, SidebarView, ViewHistory, Stats, - PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar, - PasswordPrompt, PDFPresentationMode, PDFDocumentProperties, HandTool, - Promise, PDFLinkService, PDFOutlineView, PDFAttachmentView, - OverlayManager, PDFFindController, PDFFindBar, PDFViewer, - PDFRenderingQueue, PresentationModeState, parseQueryString, - RenderingStates, UNKNOWN_SCALE, DEFAULT_SCALE_VALUE, - IGNORE_CURRENT_POSITION_ON_ZOOM: true */ - -'use strict'; var DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf'; var DEFAULT_SCALE_DELTA = 1.1; @@ -1039,6 +1027,7 @@ var PDFFindController = (function PDFFindControllerClosure() { '\u00BC': '1/4', // Vulgar fraction one quarter '\u00BD': '1/2', // Vulgar fraction one half '\u00BE': '3/4', // Vulgar fraction three quarters + '\u00A0': ' ' // No-break space }; this.findBar = options.findBar || null; @@ -3686,7 +3675,7 @@ var PDFPageView = (function PDFPageViewClosure() { } if (redrawAnnotations && this.annotationLayer) { - this.annotationLayer.setupAnnotations(this.viewport, 'display'); + this.annotationLayer.setupAnnotations(this.viewport); } }, @@ -3889,7 +3878,7 @@ var PDFPageView = (function PDFPageViewClosure() { function pdfPageRenderCallback() { pageViewDrawCallback(null); if (textLayer) { - self.pdfPage.getTextContent({ normalizeWhitespace: true }).then( + self.pdfPage.getTextContent().then( function textContentResolved(textContent) { textLayer.setTextContent(textContent); textLayer.render(TEXT_LAYER_RENDER_DELAY); @@ -3907,7 +3896,7 @@ var PDFPageView = (function PDFPageViewClosure() { this.annotationLayer = this.annotationsLayerFactory. createAnnotationsLayerBuilder(div, this.pdfPage); } - this.annotationLayer.setupAnnotations(this.viewport, 'display'); + this.annotationLayer.setupAnnotations(this.viewport); } div.setAttribute('data-loaded', true); @@ -4324,10 +4313,9 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() { /** * @param {PageViewport} viewport - * @param {string} intent (default value is 'display') */ setupAnnotations: - function AnnotationsLayerBuilder_setupAnnotations(viewport, intent) { + function AnnotationsLayerBuilder_setupAnnotations(viewport) { function bindLink(link, dest) { link.href = linkService.getDestinationHash(dest); link.onclick = function annotationsLayerBuilderLinksOnclick() { @@ -4353,12 +4341,8 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() { var linkService = this.linkService; var pdfPage = this.pdfPage; var self = this; - var getAnnotationsParams = { - intent: (intent === undefined ? 'display' : intent), - }; - pdfPage.getAnnotations(getAnnotationsParams).then( - function (annotationsData) { + pdfPage.getAnnotations().then(function (annotationsData) { viewport = viewport.clone({ dontFlip: true }); var transform = viewport.transform; var transformStr = 'matrix(' + transform.join(',') + ')'; @@ -4898,7 +4882,7 @@ var PDFViewer = (function pdfViewer() { if (!this.pdfDocument) { return; } - + var pageView = this._pages[pageNumber - 1]; if (this.isInPresentationMode) { @@ -5156,7 +5140,7 @@ var PDFViewer = (function pdfViewer() { getPageTextContent: function (pageIndex) { return this.pdfDocument.getPage(pageIndex + 1).then(function (page) { - return page.getTextContent({ normalizeWhitespace: true }); + return page.getTextContent(); }); }, @@ -7405,7 +7389,7 @@ document.addEventListener('textlayerrendered', function (e) { if (pageView.textLayer && pageView.textLayer.textDivs && pageView.textLayer.textDivs.length > 0 && !PDFViewerApplication.supportsDocumentColors) { - console.error(mozL10n.get('document_colors_not_allowed', null, + console.error(mozL10n.get('document_colors_disabled', null, 'PDF documents are not allowed to use their own colors: ' + '\'Allow pages to choose their own colors\' ' + 'is deactivated in the browser.')); diff --git a/browser/locales/en-US/pdfviewer/viewer.properties b/browser/locales/en-US/pdfviewer/viewer.properties index 20c91956604f..5c43b50575e8 100644 --- a/browser/locales/en-US/pdfviewer/viewer.properties +++ b/browser/locales/en-US/pdfviewer/viewer.properties @@ -170,4 +170,4 @@ password_cancel=Cancel printing_not_supported=Warning: Printing is not fully supported by this browser. printing_not_ready=Warning: The PDF is not fully loaded for printing. web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. -document_colors_not_allowed=PDF documents are not allowed to use their own colors: 'Allow pages to choose their own colors' is deactivated in the browser. +document_colors_disabled=PDF documents are not allowed to use their own colors: \'Allow pages to choose their own colors\' is deactivated in the browser. From 2505bac2b72a5bf1626d33810bb50aa21e30c83a Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:36:56 +0000 Subject: [PATCH 078/153] Backout changeset 958669938c10 / bug 1225832 due to frequent mochitest failures on Mac --- .../loop/content/js/conversation.js | 52 +++----- .../loop/content/js/conversation.jsx | 52 +++----- .../loop/content/js/conversationAppStore.js | 22 ++-- browser/components/loop/content/js/panel.js | 120 ++++++++++-------- browser/components/loop/content/js/panel.jsx | 120 ++++++++++-------- .../components/loop/content/js/roomViews.js | 2 +- .../components/loop/content/js/roomViews.jsx | 2 +- .../loop/content/shared/js/loopapi-client.js | 31 ----- .../components/loop/modules/MozLoopAPI.jsm | 6 +- browser/components/loop/run-all-loop-tests.sh | 2 - .../conversationAppStore_test.js | 9 +- .../test/desktop-local/conversation_test.js | 3 - .../loop/test/desktop-local/panel_test.js | 49 ++++--- .../loop/test/desktop-local/roomViews_test.js | 12 +- .../loop/test/shared/loopapi-client_test.js | 44 ------- browser/components/loop/ui/fake-mozLoop.js | 14 +- browser/components/uitour/test/browser.ini | 2 +- .../uitour/test/browser_UITour_loop.js | 90 ++++--------- 18 files changed, 257 insertions(+), 375 deletions(-) diff --git a/browser/components/loop/content/js/conversation.js b/browser/components/loop/content/js/conversation.js index 1e9384068bb5..ba234a64bd59 100644 --- a/browser/components/loop/content/js/conversation.js +++ b/browser/components/loop/content/js/conversation.js @@ -91,16 +91,7 @@ loop.conversation = (function(mozL10n) { * Conversation initialisation. */ function init() { - // Obtain the windowId and pass it through - var locationHash = loop.shared.utils.locationData().hash; - var windowId; - - var hash = locationHash.match(/#(.*)/); - if (hash) { - windowId = hash[1]; - } - - var requests = [ + return loop.requestMulti( ["GetAllConstants"], ["GetAllStrings"], ["GetLocale"], @@ -108,20 +99,12 @@ loop.conversation = (function(mozL10n) { ["GetLoopPref", "textChat.enabled"], ["GetLoopPref", "feedback.periodSec"], ["GetLoopPref", "feedback.dateLastSeenSec"] - ]; - var prefetch = [ - ["GetConversationWindowData", windowId] - ]; - - return loop.requestMulti.apply(null, requests.concat(prefetch)).then(function(results) { - // `requestIdx` is keyed off the order of the `requests` and `prefetch` - // arrays. Be careful to update both when making changes. - var requestIdx = 0; - var constants = results[requestIdx]; + ).then(function(results) { + var constants = results[0]; // Do the initial L10n setup, we do this before anything // else to ensure the L10n environment is setup correctly. - var stringBundle = results[++requestIdx]; - var locale = results[++requestIdx]; + var stringBundle = results[1]; + var locale = results[2]; mozL10n.initialize({ locale: locale, getStrings: function(key) { @@ -136,22 +119,20 @@ loop.conversation = (function(mozL10n) { // Plug in an alternate client ID mechanism, as localStorage and cookies // don't work in the conversation window - var currGuid = results[++requestIdx]; window.OT.overrideGuidStorage({ get: function(callback) { - callback(null, currGuid); + callback(null, results[3]); }, set: function(guid, callback) { // See nsIPrefBranch var PREF_STRING = 32; - currGuid = guid; loop.request("SetLoopPref", "ot.guid", guid, PREF_STRING); callback(null); } }); // We want data channels only if the text chat preference is enabled. - var useDataChannels = results[++requestIdx]; + var useDataChannels = results[4]; var dispatcher = new loop.Dispatcher(); var sdkDriver = new loop.OTSdkDriver({ @@ -173,15 +154,9 @@ loop.conversation = (function(mozL10n) { var conversationAppStore = new loop.store.ConversationAppStore({ activeRoomStore: activeRoomStore, dispatcher: dispatcher, - feedbackPeriod: results[++requestIdx], - feedbackTimestamp: results[++requestIdx] + feedbackPeriod: results[5], + feedbackTimestamp: results[6] }); - - prefetch.forEach(function(req) { - req.shift(); - loop.storeRequest(req, results[++requestIdx]); - }); - var roomStore = new loop.store.RoomStore(dispatcher, { activeRoomStore: activeRoomStore, constants: constants @@ -195,6 +170,15 @@ loop.conversation = (function(mozL10n) { textChatStore: textChatStore }); + // Obtain the windowId and pass it through + var locationHash = loop.shared.utils.locationData().hash; + var windowId; + + var hash = locationHash.match(/#(.*)/); + if (hash) { + windowId = hash[1]; + } + React.render( React.createElement(AppControllerView, { dispatcher: dispatcher, diff --git a/browser/components/loop/content/js/conversation.jsx b/browser/components/loop/content/js/conversation.jsx index 6f472c965ccc..66a43368de17 100644 --- a/browser/components/loop/content/js/conversation.jsx +++ b/browser/components/loop/content/js/conversation.jsx @@ -91,16 +91,7 @@ loop.conversation = (function(mozL10n) { * Conversation initialisation. */ function init() { - // Obtain the windowId and pass it through - var locationHash = loop.shared.utils.locationData().hash; - var windowId; - - var hash = locationHash.match(/#(.*)/); - if (hash) { - windowId = hash[1]; - } - - var requests = [ + return loop.requestMulti( ["GetAllConstants"], ["GetAllStrings"], ["GetLocale"], @@ -108,20 +99,12 @@ loop.conversation = (function(mozL10n) { ["GetLoopPref", "textChat.enabled"], ["GetLoopPref", "feedback.periodSec"], ["GetLoopPref", "feedback.dateLastSeenSec"] - ]; - var prefetch = [ - ["GetConversationWindowData", windowId] - ]; - - return loop.requestMulti.apply(null, requests.concat(prefetch)).then(function(results) { - // `requestIdx` is keyed off the order of the `requests` and `prefetch` - // arrays. Be careful to update both when making changes. - var requestIdx = 0; - var constants = results[requestIdx]; + ).then(function(results) { + var constants = results[0]; // Do the initial L10n setup, we do this before anything // else to ensure the L10n environment is setup correctly. - var stringBundle = results[++requestIdx]; - var locale = results[++requestIdx]; + var stringBundle = results[1]; + var locale = results[2]; mozL10n.initialize({ locale: locale, getStrings: function(key) { @@ -136,22 +119,20 @@ loop.conversation = (function(mozL10n) { // Plug in an alternate client ID mechanism, as localStorage and cookies // don't work in the conversation window - var currGuid = results[++requestIdx]; window.OT.overrideGuidStorage({ get: function(callback) { - callback(null, currGuid); + callback(null, results[3]); }, set: function(guid, callback) { // See nsIPrefBranch var PREF_STRING = 32; - currGuid = guid; loop.request("SetLoopPref", "ot.guid", guid, PREF_STRING); callback(null); } }); // We want data channels only if the text chat preference is enabled. - var useDataChannels = results[++requestIdx]; + var useDataChannels = results[4]; var dispatcher = new loop.Dispatcher(); var sdkDriver = new loop.OTSdkDriver({ @@ -173,15 +154,9 @@ loop.conversation = (function(mozL10n) { var conversationAppStore = new loop.store.ConversationAppStore({ activeRoomStore: activeRoomStore, dispatcher: dispatcher, - feedbackPeriod: results[++requestIdx], - feedbackTimestamp: results[++requestIdx] + feedbackPeriod: results[5], + feedbackTimestamp: results[6] }); - - prefetch.forEach(function(req) { - req.shift(); - loop.storeRequest(req, results[++requestIdx]); - }); - var roomStore = new loop.store.RoomStore(dispatcher, { activeRoomStore: activeRoomStore, constants: constants @@ -195,6 +170,15 @@ loop.conversation = (function(mozL10n) { textChatStore: textChatStore }); + // Obtain the windowId and pass it through + var locationHash = loop.shared.utils.locationData().hash; + var windowId; + + var hash = locationHash.match(/#(.*)/); + if (hash) { + windowId = hash[1]; + } + React.render( { - try { - message.target.sendAsyncMessage(message.name, [seq, result]); - } catch (ex) { - MozLoopService.log.error("Failed to send reply back to content:", ex); - } + message.target.sendAsyncMessage(message.name, [seq, result]); } } diff --git a/browser/components/loop/run-all-loop-tests.sh b/browser/components/loop/run-all-loop-tests.sh index 7e67e250dc12..2628c0b1aed2 100755 --- a/browser/components/loop/run-all-loop-tests.sh +++ b/browser/components/loop/run-all-loop-tests.sh @@ -44,7 +44,6 @@ fi TESTS=" ${LOOPDIR}/test/mochitest - browser/components/uitour/test/browser_UITour_loop.js browser/base/content/test/general/browser_devices_get_user_media_about_urls.js browser/base/content/test/general/browser_parsable_css.js " @@ -56,7 +55,6 @@ do ./mach mochitest $test # UITour & get user media aren't compatible with e10s currenly. if [ "$1" != "--skip-e10s" ] && \ - [ "$test" != "browser/components/uitour/test/browser_UITour_loop.js" ] && \ [ "$test" != "browser/base/content/test/general/browser_devices_get_user_media_about_urls.js" ]; then ./mach mochitest --e10s $test diff --git a/browser/components/loop/test/desktop-local/conversationAppStore_test.js b/browser/components/loop/test/desktop-local/conversationAppStore_test.js index fdcf34198677..398e6f5c5074 100644 --- a/browser/components/loop/test/desktop-local/conversationAppStore_test.js +++ b/browser/components/loop/test/desktop-local/conversationAppStore_test.js @@ -106,10 +106,13 @@ describe("loop.store.ConversationAppStore", function() { getLoopPrefStub = sandbox.stub(); setLoopPrefStub = sandbox.stub(); - loop.storedRequests = { - "GetConversationWindowData|42": fakeWindowData - }; LoopMochaUtils.stubLoopRequest({ + GetConversationWindowData: function(windowId) { + if (windowId === "42") { + return fakeWindowData; + } + return null; + }, GetLoopPref: getLoopPrefStub, SetLoopPref: setLoopPrefStub }); diff --git a/browser/components/loop/test/desktop-local/conversation_test.js b/browser/components/loop/test/desktop-local/conversation_test.js index 6060b62f72c6..4c0740d38008 100644 --- a/browser/components/loop/test/desktop-local/conversation_test.js +++ b/browser/components/loop/test/desktop-local/conversation_test.js @@ -57,9 +57,6 @@ describe("loop.conversation", function() { }), GetSelectedTabMetadata: function() { return {}; - }, - GetConversationWindowData: function() { - return {}; } }); diff --git a/browser/components/loop/test/desktop-local/panel_test.js b/browser/components/loop/test/desktop-local/panel_test.js index 40364690ab94..7f9657cfdb51 100644 --- a/browser/components/loop/test/desktop-local/panel_test.js +++ b/browser/components/loop/test/desktop-local/panel_test.js @@ -77,17 +77,6 @@ describe("loop.panel", function() { GetUserProfile: function() { return null; } }); - loop.storedRequests = { - GetFxAEnabled: true, - GetHasEncryptionKey: true, - GetUserProfile: null, - GetDoNotDisturb: false, - "GetLoopPref|gettingStarted.seen": "unseen", - "GetLoopPref|legal.ToS_url": "", - "GetLoopPref|legal.privacy_url": "", - IsMultiProcessEnabled: false - }; - roomName = "First Room Name"; roomData = { roomToken: "QzBbvGmIZWU", @@ -266,7 +255,11 @@ describe("loop.panel", function() { }); it("should add ellipsis to text over 24chars", function() { - loop.storedRequests.GetUserProfile = { email: "reallyreallylongtext@example.com" }; + LoopMochaUtils.stubLoopRequest({ + GetUserProfile: function() { + return { email: "reallyreallylongtext@example.com" }; + } + }); var view = createTestPanelView(); var node = view.getDOMNode().querySelector(".user-identity"); @@ -356,7 +349,9 @@ describe("loop.panel", function() { }); it("should show a signout entry when user is authenticated", function() { - loop.storedRequests.GetUserProfile = { email: "test@example.com" }; + LoopMochaUtils.stubLoopRequest({ + GetUserProfile: function() { return { email: "test@example.com" }; } + }); var view = mountTestComponent(); @@ -379,7 +374,9 @@ describe("loop.panel", function() { it("should open the FxA settings when the account entry is clicked", function() { - loop.storedRequests.GetUserProfile = { email: "test@example.com" }; + LoopMochaUtils.stubLoopRequest({ + GetUserProfile: function() { return { email: "test@example.com" }; } + }); var view = mountTestComponent(); @@ -390,7 +387,9 @@ describe("loop.panel", function() { }); it("should sign out the user on click when authenticated", function() { - loop.storedRequests.GetUserProfile = { email: "test@example.com" }; + LoopMochaUtils.stubLoopRequest({ + GetUserProfile: function() { return { email: "test@example.com" }; } + }); var view = mountTestComponent(); TestUtils.Simulate.click(view.getDOMNode() @@ -543,7 +542,9 @@ describe("loop.panel", function() { }); it("should not render a ToSView when gettingStarted.seen is false", function() { - loop.storedRequests["GetLoopPref|gettingStarted.seen"] = false; + LoopMochaUtils.stubLoopRequest({ + GetLoopPref: function() { return false; } + }); var view = createTestPanelView(); expect(function() { @@ -552,14 +553,18 @@ describe("loop.panel", function() { }); it("should render a GettingStarted view", function() { - loop.storedRequests["GetLoopPref|gettingStarted.seen"] = false; + LoopMochaUtils.stubLoopRequest({ + GetLoopPref: function() { return false; } + }); var view = createTestPanelView(); TestUtils.findRenderedComponentWithType(view, loop.panel.GettingStartedView); }); it("should not render a GettingStartedView when the view has been seen", function() { - loop.storedRequests["GetLoopPref|gettingStarted.seen"] = true; + LoopMochaUtils.stubLoopRequest({ + GetLoopPref: function() { return true; } + }); var view = createTestPanelView(); try { @@ -571,7 +576,9 @@ describe("loop.panel", function() { }); it("should render a SignInRequestView when mozLoop.hasEncryptionKey is false", function() { - loop.storedRequests.GetHasEncryptionKey = false; + LoopMochaUtils.stubLoopRequest({ + GetHasEncryptionKey: function() { return false; } + }); var view = createTestPanelView(); @@ -590,7 +597,9 @@ describe("loop.panel", function() { }); it("should render a E10sNotSupported when multiprocess is enabled", function() { - loop.storedRequests.IsMultiProcessEnabled = true; + LoopMochaUtils.stubLoopRequest({ + IsMultiProcessEnabled: function() { return true; } + }); var view = createTestPanelView(); diff --git a/browser/components/loop/test/desktop-local/roomViews_test.js b/browser/components/loop/test/desktop-local/roomViews_test.js index a427d1a27e9a..1de591539c24 100644 --- a/browser/components/loop/test/desktop-local/roomViews_test.js +++ b/browser/components/loop/test/desktop-local/roomViews_test.js @@ -196,7 +196,7 @@ describe("loop.roomViews", function() { function mountTestComponent(props) { props = _.extend({ dispatcher: dispatcher, - roomData: { roomUrl: "http://invalid" }, + roomData: {}, savingContext: false, show: true, showEditContext: false @@ -208,7 +208,9 @@ describe("loop.roomViews", function() { it("should dispatch an EmailRoomUrl with no description" + " for rooms without context when the email button is pressed", function() { - view = mountTestComponent(); + view = mountTestComponent({ + roomData: { roomUrl: "http://invalid" } + }); var emailBtn = view.getDOMNode().querySelector(".btn-email"); @@ -248,7 +250,9 @@ describe("loop.roomViews", function() { describe("Copy Button", function() { beforeEach(function() { - view = mountTestComponent(); + view = mountTestComponent({ + roomData: { roomUrl: "http://invalid" } + }); }); it("should dispatch a CopyRoomUrl action when the copy button is pressed", function() { @@ -319,8 +323,6 @@ describe("loop.roomViews", function() { } }); onCallTerminatedStub = sandbox.stub(); - - activeRoomStore.setStoreState({ roomUrl: "http://invalid " }); }); function mountTestComponent(props) { diff --git a/browser/components/loop/test/shared/loopapi-client_test.js b/browser/components/loop/test/shared/loopapi-client_test.js index 8e16f0471d39..d8a8c91bfe02 100644 --- a/browser/components/loop/test/shared/loopapi-client_test.js +++ b/browser/components/loop/test/shared/loopapi-client_test.js @@ -109,50 +109,6 @@ describe("loopapi-client", function() { }); }); - describe("loop.storeRequest", function() { - afterEach(function() { - loop.storedRequests = {}; - }); - - it("should the result of a request", function() { - loop.storeRequest(["GetLoopPref"], true); - - expect(loop.storedRequests).to.deep.equal({ - "GetLoopPref": true - }); - }); - - it("should the result of a request with multiple params", function() { - loop.storeRequest(["GetLoopPref", "enabled", "or", "not", "well", - "perhaps", true, 2], true); - - expect(loop.storedRequests).to.deep.equal({ - "GetLoopPref|enabled|or|not|well|perhaps|true|2": true - }); - }); - }); - - describe("loop.getStoredRequest", function() { - afterEach(function() { - loop.storedRequests = {}; - }); - - it("should retrieve a result", function() { - loop.storedRequests["GetLoopPref"] = true; - - expect(loop.getStoredRequest(["GetLoopPref"])).to.eql(true); - }); - - it("should return log and return null for invalid requests", function() { - sandbox.stub(console, "error"); - - expect(loop.getStoredRequest(["SomethingNeverStored"])).to.eql(null); - sinon.assert.calledOnce(console.error); - sinon.assert.calledWithExactly(console.error, - "This request has not been stored!", ["SomethingNeverStored"]); - }); - }); - describe("loop.requestMulti", function() { it("should send a batch of messages", function() { var promise = loop.requestMulti( diff --git a/browser/components/loop/ui/fake-mozLoop.js b/browser/components/loop/ui/fake-mozLoop.js index 3edf8829ef75..8d50a74c9787 100644 --- a/browser/components/loop/ui/fake-mozLoop.js +++ b/browser/components/loop/ui/fake-mozLoop.js @@ -153,6 +153,7 @@ var fakeRooms = [ }, GetDoNotDisturb: function() { return true; }, GetErrors: function() {}, + GetHasEncryptionKey: function() { return true; }, GetLoopPref: function(pref) { switch (pref) { // Ensure we skip FTE completely. @@ -178,21 +179,10 @@ var fakeRooms = [ "Rooms:GetAll": function(version) { return [].concat(fakeRooms); }, + GetFxAEnabled: function() { return true; }, StartAlerting: function() {}, StopAlerting: function() {}, GetUserProfile: function() { return null; }, "Rooms:PushSubscription": function() {} }); - - loop.storedRequests = { - GetFxAEnabled: true, - GetHasEncryptionKey: true, - GetUserProfile: null, - GetDoNotDisturb: true, - // Ensure we skip FTE completely. - "GetLoopPref|gettingStarted.seen": true, - "GetLoopPref|legal.ToS_url": null, - "GetLoopPref|legal.privacy_url": null, - IsMultiProcessEnabled: false - }; })(); diff --git a/browser/components/uitour/test/browser.ini b/browser/components/uitour/test/browser.ini index 475bd2928e62..612e4f4d6627 100644 --- a/browser/components/uitour/test/browser.ini +++ b/browser/components/uitour/test/browser.ini @@ -42,7 +42,7 @@ skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly. [browser_UITour_heartbeat.js] skip-if = e10s # Bug 1073247 - UITour.jsm not e10s friendly. [browser_UITour_loop.js] -skip-if = os == "linux" || e10s # Bug 1073247 - UITour.jsm not e10s friendly. +skip-if = true # Bug 1225832 - New Loop architecture is not compatible with test. [browser_UITour_modalDialog.js] skip-if = os != "mac" || e10s # modal dialog disabling only working on OS X.Bug 1073247 - UITour.jsm not e10s friendly [browser_UITour_observe.js] diff --git a/browser/components/uitour/test/browser_UITour_loop.js b/browser/components/uitour/test/browser_UITour_loop.js index ad5636ef3560..0f6a6ba38c11 100644 --- a/browser/components/uitour/test/browser_UITour_loop.js +++ b/browser/components/uitour/test/browser_UITour_loop.js @@ -6,13 +6,10 @@ var gTestTab; var gContentAPI; var gContentWindow; -var gMessageHandlers; var loopButton; -var fakeRoom; var loopPanel = document.getElementById("loop-notification-panel"); -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); -const { LoopRooms } = Cu.import("resource:///modules/loop/LoopRooms.jsm", {}); +const { LoopRooms } = Components.utils.import("resource:///modules/loop/LoopRooms.jsm", {}); const { MozLoopServiceInternal } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); function test() { @@ -53,12 +50,12 @@ var tests = [ ok(gettingStartedButton, "Getting Started button should be found"); let newTabPromise = waitForConditionPromise(() => { - return gBrowser.currentURI.path.includes("utm_source=firefox-browser"); + return gBrowser.currentURI.path.contains("utm_source=firefox-browser"); }, "New tab with utm_content=testPageNewID should have opened"); gettingStartedButton.click(); yield newTabPromise; - ok(gBrowser.currentURI.path.includes("utm_content=hello-tour_OpenPanel_testPage"), + ok(gBrowser.currentURI.path.contains("utm_content=hello-tour_OpenPanel_testPage"), "Expected URL opened (" + gBrowser.currentURI.path + ")"); yield gBrowser.removeCurrentTab(); @@ -69,7 +66,7 @@ var tests = [ // Force a refresh of the loop panel since going from seen -> unseen doesn't trigger // automatic re-rendering. let loopWin = document.getElementById("loop-notification-panel").children[0].contentWindow; - var event = new loopWin.CustomEvent("GettingStartedSeen", { detail: false }); + var event = new loopWin.CustomEvent("GettingStartedSeen"); loopWin.dispatchEvent(event); UITour.pageIDsForSession.clear(); @@ -96,12 +93,12 @@ var tests = [ let newTabPromise = waitForConditionPromise(() => { Services.console.logStringMessage(gBrowser.currentURI.path); - return gBrowser.currentURI.path.includes("utm_source=firefox-browser"); + return gBrowser.currentURI.path.contains("utm_source=firefox-browser"); }, "New tab with utm_content=testPageNewID should have opened"); gettingStartedButton.click(); yield newTabPromise; - ok(!gBrowser.currentURI.path.includes("utm_content=hello-tour_OpenPanel_testPageOldId"), + ok(!gBrowser.currentURI.path.contains("utm_content=hello-tour_OpenPanel_testPageOldId"), "Expected URL opened without the utm_content parameter (" + gBrowser.currentURI.path + ")"); yield gBrowser.removeCurrentTab(); @@ -219,14 +216,10 @@ var tests = [ chat.close(); done(); }); - - let window = chat.content.contentWindow; - waitForConditionPromise( - () => chat.content.contentDocument.querySelector(".btn-copy"), - "Copy button should be there" - ).then(() => chat.content.contentDocument.querySelector(".btn-copy").click()); + chat.content.contentDocument.querySelector(".btn-copy").click(); }); }); + setupFakeRoom(); LoopRooms.open("fakeTourRoom"); }), runOffline(function test_notifyLoopRoomURLEmailed(done) { @@ -248,19 +241,17 @@ var tests = [ done(); }); - gMessageHandlers.ComposeEmail = function(message, reply) { - let [subject, body, recipient] = message.data; - ok(subject, "composeEmail should be invoked with at least a subject value"); + let chatWin = chat.content.contentWindow; + let oldComposeEmail = chatWin.navigator.wrappedJSObject.mozLoop.composeEmail; + chatWin.navigator.wrappedJSObject.mozLoop.composeEmail = function(recipient, subject, body) { + ok(recipient, "composeEmail should be invoked with at least a recipient value"); composeEmailCalled = true; - reply(); + chatWin.navigator.wrappedJSObject.mozLoop.composeEmail = oldComposeEmail; }; - - waitForConditionPromise( - () => chat.content.contentDocument.querySelector(".btn-email"), - "Email button should be there" - ).then(() => chat.content.contentDocument.querySelector(".btn-email").click()); + chatWin.document.querySelector(".btn-email").click(); }); }); + setupFakeRoom(); LoopRooms.open("fakeTourRoom"); }), taskify(function* test_arrow_panel_position() { @@ -332,7 +323,7 @@ var tests = [ Services.prefs.setCharPref("loop.gettingStarted.url", gBrowser.currentURI.prePath); let newTabPromise = waitForConditionPromise(() => { - return gBrowser.currentURI.path.includes("incomingConversation=waiting"); + return gBrowser.currentURI.path.contains("incomingConversation=waiting"); }, "New tab with incomingConversation=waiting should have opened"); // Now open the menu while that non-owner is in the fake room to trigger resuming the tour @@ -355,7 +346,11 @@ function checkLoopPanelIsHidden() { } function setupFakeRoom() { - let room = Object.create(fakeRoom); + let room = {}; + for (let prop of ["roomToken", "roomOwner", "roomUrl", "participants"]) + room[prop] = "fakeTourRoom"; + room.decryptedContext = {roomName: "fakeTourRoom"}; + room.participants = []; let roomsMap = new Map([ [room.roomToken, room] ]); @@ -366,45 +361,6 @@ function setupFakeRoom() { if (Services.prefs.getBoolPref("loop.enabled")) { loopButton = window.LoopUI.toolbarButton.node; - fakeRoom = { - decryptedContext: { roomName: "fakeTourRoom" }, - participants: [], - maxSize: 2, - ctime: Date.now() - }; - for (let prop of ["roomToken", "roomOwner", "roomUrl"]) - fakeRoom[prop] = "fakeTourRoom"; - - LoopAPI.stubMessageHandlers(gMessageHandlers = { - // Stub the rooms object API to fully control the test behavior. - "Rooms:*": function(action, message, reply) { - switch (action.split(":").pop()) { - case "GetAll": - reply([fakeRoom]); - break; - case "Get": - reply(fakeRoom); - break; - case "Join": - reply({ - apiKey: "fakeTourRoom", - sessionToken: "fakeTourRoom", - sessionId: "fakeTourRoom", - expires: Date.now() + 240000 - }); - break; - case "RefreshMembership": - reply({ expires: Date.now() + 240000 }); - default: - reply(); - } - }, - // Stub the metadata retrieval to suppress console warnings and return faster. - GetSelectedTabMetadata: function(message, reply) { - reply({ favicon: null }); - } - }); - registerCleanupFunction(() => { Services.prefs.clearUserPref("loop.gettingStarted.resumeOnFirstJoin"); Services.prefs.clearUserPref("loop.gettingStarted.seen"); @@ -421,10 +377,8 @@ if (Services.prefs.getBoolPref("loop.enabled")) { frame.remove(); } - // Remove the stubbed rooms. + // Remove the stubbed rooms LoopRooms.stubCache(null); - // Restore the stubbed handlers. - LoopAPI.restore(); }); } else { ok(true, "Loop is disabled so skip the UITour Loop tests"); From 66a738325c03cc7db50495f3a818faa7f542017d Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Fri, 27 Nov 2015 10:48:01 -0800 Subject: [PATCH 079/153] Bug 1219963 - Try to make test_get_last_visited more robust. r=me This also logs more of the failure details, logs all "link-visited" events, and waits for an un-used "link-visited" event before terminating in the hope of always witnessing all the expected "link-visited" events. --HG-- extra : commitid : 8ZchXGDOOZs extra : rebase_source : 22e8f397e6511131e345e187a25c26e7aece4103 --- .../browser/chrome/test_get_last_visited.html | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/mobile/android/tests/browser/chrome/test_get_last_visited.html b/mobile/android/tests/browser/chrome/test_get_last_visited.html index e7fafc5db778..da8a0fbfbc5e 100644 --- a/mobile/android/tests/browser/chrome/test_get_last_visited.html +++ b/mobile/android/tests/browser/chrome/test_get_last_visited.html @@ -33,8 +33,16 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1214366 var browser = BrowserApp.addTab("about:blank").browser; + // It's useful to see *all* "link-visited" events in the face of intermittent failures. + let observe = function(subject, topic, data) { + var uri = subject.QueryInterface(Ci.nsIURI); + info("Witnessed " + topic + " notification from Gecko with URI " + uri.spec); + } + Services.obs.addObserver(observe, "link-visited", false); + SimpleTest.registerCleanupFunction(function cleanup() { BrowserApp.closeTab(BrowserApp.getTabForBrowser(browser)); + Services.obs.removeObserver(observe, "link-visited"); }); // N.b.: the write to the Fennec DB happens before the Gecko notification @@ -44,35 +52,44 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1214366 return promiseLinkVisit(url); }; - // Be aware that mochi.test:8888 redirects, while example.org does - // not. The redirects can impact this test, since they can write to - // the history database. - const url1 = "http://example.org/chrome/mobile/android/tests/browser/chrome/basic_article.html"; - const url2 = "http://example.org/chrome/mobile/android/tests/browser/chrome/video_discovery.html"; + // Be aware that some paths under mochi.test and example.org redirect. The + // blank robocop pages appear to not. Redirects can impact this test, since + // they can write to the history database. + + // The apparent mis-ordering here just uses simpler pages (01 and 03) for the + // real test, and a more complex page (02) for a final delay. See comment below. + const url1 = "http://example.org/tests/robocop/robocop_blank_01.html"; + const url2 = "http://example.org/tests/robocop/robocop_blank_03.html"; + const url3 = "http://example.org/tests/robocop/robocop_blank_02.html"; add_task(function* test_get_last_visited() { var v = yield get_last_visited("https://random.com/"); - is(v, 0, "Last visited timestamp is 0 for unknown prePath."); + is(v, 0, `Last visited timestamp is 0 for unknown prePath: ${v}`); let prePath = Services.io.newURI(url1, null, null).prePath + "/"; is(prePath, Services.io.newURI(url2, null, null).prePath + "/", "url1 and url2 have the same prePath"); let t0 = Date.now(); yield add_history_visit(url1); - let t1 = Date.now(); v = yield get_last_visited(prePath); - ok(t0 <= v, "Last visited timestamp is after visit."); - ok(v <= t1, "Last visited timestamp is before present"); + let t1 = Date.now(); + ok(t0 <= v, `Last visited timestamp is after visit: ${t0} <= ${v}.`); + ok(v <= t1, `Last visited timestamp is before present ${v} <= ${t1}.`); let t2 = Date.now(); yield add_history_visit(url1); v = yield get_last_visited(prePath); - ok(t2 <= v, "Last visited timestamp is updated after visit."); + ok(t2 <= v, `Last visited timestamp is updated after visit: ${t2} <= ${v}`); let t3 = Date.now(); yield add_history_visit(url2); v = yield get_last_visited(prePath); - ok(t3 <= v, "Last visited timestamp is updated after visit to URL with same prePath."); + ok(t3 <= v, `Last visited timestamp is updated after visit to URL with same prePath: ${t3} <= ${v}`); + + // This whole system is flaky, so we wait for an unrelated visit, so that we + // can witness "link-visited" events a little after the test completes + // while debugging. + yield add_history_visit(url3); }); From f9db420b8b5b3d733da5de53bb15bca5a4a18998 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:57:39 +0000 Subject: [PATCH 080/153] Bug 1223573 - Part 1. Move loop to browser/extensions/loop. r=mikedeboer --HG-- rename : browser/components/loop/.eslintignore => browser/extensions/loop/.eslintignore rename : browser/components/loop/.eslintrc => browser/extensions/loop/.eslintrc rename : browser/components/loop/.eslintrc-gecko => browser/extensions/loop/.eslintrc-gecko rename : browser/components/loop/.gitignore => browser/extensions/loop/.gitignore rename : browser/components/loop/README.txt => browser/extensions/loop/README.txt rename : browser/components/loop/build-jsx => browser/extensions/loop/build-jsx rename : browser/components/loop/modules/.eslintrc => browser/extensions/loop/content/modules/.eslintrc rename : browser/components/loop/modules/LoopRooms.jsm => browser/extensions/loop/content/modules/LoopRooms.jsm rename : browser/components/loop/modules/LoopRoomsCache.jsm => browser/extensions/loop/content/modules/LoopRoomsCache.jsm rename : browser/components/loop/modules/MozLoopAPI.jsm => browser/extensions/loop/content/modules/MozLoopAPI.jsm rename : browser/components/loop/modules/MozLoopPushHandler.jsm => browser/extensions/loop/content/modules/MozLoopPushHandler.jsm rename : browser/components/loop/modules/MozLoopService.jsm => browser/extensions/loop/content/modules/MozLoopService.jsm rename : browser/components/loop/modules/MozLoopWorker.js => browser/extensions/loop/content/modules/MozLoopWorker.js rename : browser/components/loop/content/conversation.html => browser/extensions/loop/content/panels/conversation.html rename : browser/components/loop/content/css/panel.css => browser/extensions/loop/content/panels/css/panel.css rename : browser/components/loop/content/js/.eslintrc => browser/extensions/loop/content/panels/js/.eslintrc rename : browser/components/loop/content/js/conversation.js => browser/extensions/loop/content/panels/js/conversation.js rename : browser/components/loop/content/js/conversation.jsx => browser/extensions/loop/content/panels/js/conversation.jsx rename : browser/components/loop/content/js/conversationAppStore.js => browser/extensions/loop/content/panels/js/conversationAppStore.js rename : browser/components/loop/content/js/feedbackViews.js => browser/extensions/loop/content/panels/js/feedbackViews.js rename : browser/components/loop/content/js/feedbackViews.jsx => browser/extensions/loop/content/panels/js/feedbackViews.jsx rename : browser/components/loop/content/js/otconfig.js => browser/extensions/loop/content/panels/js/otconfig.js rename : browser/components/loop/content/js/panel.js => browser/extensions/loop/content/panels/js/panel.js rename : browser/components/loop/content/js/panel.jsx => browser/extensions/loop/content/panels/js/panel.jsx rename : browser/components/loop/content/js/roomStore.js => browser/extensions/loop/content/panels/js/roomStore.js rename : browser/components/loop/content/js/roomViews.js => browser/extensions/loop/content/panels/js/roomViews.js rename : browser/components/loop/content/js/roomViews.jsx => browser/extensions/loop/content/panels/js/roomViews.jsx rename : browser/components/loop/content/panel.html => browser/extensions/loop/content/panels/panel.html rename : browser/components/loop/content/libs/l10n.js => browser/extensions/loop/content/panels/vendor/l10n.js rename : browser/components/loop/content/shared/README.md => browser/extensions/loop/content/shared/README.md rename : browser/components/loop/content/shared/css/common.css => browser/extensions/loop/content/shared/css/common.css rename : browser/components/loop/content/shared/css/conversation.css => browser/extensions/loop/content/shared/css/conversation.css rename : browser/components/loop/content/shared/css/reset.css => browser/extensions/loop/content/shared/css/reset.css rename : browser/components/loop/content/shared/img/02.png => browser/extensions/loop/content/shared/img/02.png rename : browser/components/loop/content/shared/img/02@2x.png => browser/extensions/loop/content/shared/img/02@2x.png rename : browser/components/loop/content/shared/img/animated-spinner.svg => browser/extensions/loop/content/shared/img/animated-spinner.svg rename : browser/components/loop/content/shared/img/audio-call-avatar.svg => browser/extensions/loop/content/shared/img/audio-call-avatar.svg rename : browser/components/loop/content/shared/img/audio-default-16x16@1.5x.png => browser/extensions/loop/content/shared/img/audio-default-16x16@1.5x.png rename : browser/components/loop/content/shared/img/audio-default-16x16@2x.png => browser/extensions/loop/content/shared/img/audio-default-16x16@2x.png rename : browser/components/loop/content/shared/img/svg/audio-hover.svg => browser/extensions/loop/content/shared/img/audio-hover.svg rename : browser/components/loop/content/shared/img/svg/audio-mute-hover.svg => browser/extensions/loop/content/shared/img/audio-mute-hover.svg rename : browser/components/loop/content/shared/img/svg/audio-mute.svg => browser/extensions/loop/content/shared/img/audio-mute.svg rename : browser/components/loop/content/shared/img/svg/audio.svg => browser/extensions/loop/content/shared/img/audio.svg rename : browser/components/loop/content/shared/img/avatars.svg => browser/extensions/loop/content/shared/img/avatars.svg rename : browser/components/loop/content/shared/img/beta-ribbon.svg => browser/extensions/loop/content/shared/img/beta-ribbon.svg rename : browser/components/loop/content/shared/img/svg/cam_audio-no.svg => browser/extensions/loop/content/shared/img/cam_audio-no.svg rename : browser/components/loop/content/shared/img/svg/cam_audio.svg => browser/extensions/loop/content/shared/img/cam_audio.svg rename : browser/components/loop/content/shared/img/svg/cam_audio_h.svg => browser/extensions/loop/content/shared/img/cam_audio_h.svg rename : browser/components/loop/content/shared/img/chatbubble-arrow-left.svg => browser/extensions/loop/content/shared/img/chatbubble-arrow-left.svg rename : browser/components/loop/content/shared/img/chatbubble-arrow-right.svg => browser/extensions/loop/content/shared/img/chatbubble-arrow-right.svg rename : browser/components/loop/content/shared/img/check.svg => browser/extensions/loop/content/shared/img/check.svg rename : browser/components/loop/content/shared/img/ellipsis-v.svg => browser/extensions/loop/content/shared/img/ellipsis-v.svg rename : browser/components/loop/content/shared/img/empty_conversations.svg => browser/extensions/loop/content/shared/img/empty_conversations.svg rename : browser/components/loop/content/shared/img/empty_search.svg => browser/extensions/loop/content/shared/img/empty_search.svg rename : browser/components/loop/content/shared/img/svg/exit.svg => browser/extensions/loop/content/shared/img/exit.svg rename : browser/components/loop/content/shared/img/facemute-14x14.png => browser/extensions/loop/content/shared/img/facemute-14x14.png rename : browser/components/loop/content/shared/img/facemute-14x14@2x.png => browser/extensions/loop/content/shared/img/facemute-14x14@2x.png rename : browser/components/loop/content/shared/img/firefox-avatar.svg => browser/extensions/loop/content/shared/img/firefox-avatar.svg rename : browser/components/loop/content/shared/img/firefox-logo.png => browser/extensions/loop/content/shared/img/firefox-logo.png rename : browser/components/loop/content/shared/img/svg/glyph-email-16x16.svg => browser/extensions/loop/content/shared/img/glyph-email-16x16.svg rename : browser/components/loop/content/shared/img/svg/glyph-facebook-16x16.svg => browser/extensions/loop/content/shared/img/glyph-facebook-16x16.svg rename : browser/components/loop/content/shared/img/svg/glyph-help-16x16.svg => browser/extensions/loop/content/shared/img/glyph-help-16x16.svg rename : browser/components/loop/content/shared/img/svg/glyph-link-16x16.svg => browser/extensions/loop/content/shared/img/glyph-link-16x16.svg rename : browser/components/loop/content/shared/img/svg/glyph-user-16x16.svg => browser/extensions/loop/content/shared/img/glyph-user-16x16.svg rename : browser/components/loop/content/shared/img/hangup-inverse-14x14.png => browser/extensions/loop/content/shared/img/hangup-inverse-14x14.png rename : browser/components/loop/content/shared/img/hangup-inverse-14x14@2x.png => browser/extensions/loop/content/shared/img/hangup-inverse-14x14@2x.png rename : browser/components/loop/content/shared/img/happy.png => browser/extensions/loop/content/shared/img/happy.png rename : browser/components/loop/content/shared/img/hello_logo.svg => browser/extensions/loop/content/shared/img/hello_logo.svg rename : browser/components/loop/content/shared/img/helloicon.svg => browser/extensions/loop/content/shared/img/helloicon.svg rename : browser/components/loop/content/shared/img/icon_32.png => browser/extensions/loop/content/shared/img/icon_32.png rename : browser/components/loop/content/shared/img/icon_64.png => browser/extensions/loop/content/shared/img/icon_64.png rename : browser/components/loop/content/shared/img/icons-10x10.svg => browser/extensions/loop/content/shared/img/icons-10x10.svg rename : browser/components/loop/content/shared/img/icons-14x14.svg => browser/extensions/loop/content/shared/img/icons-14x14.svg rename : browser/components/loop/content/shared/img/icons-16x16.svg => browser/extensions/loop/content/shared/img/icons-16x16.svg rename : browser/components/loop/content/shared/img/svg/media-group-left-hover.svg => browser/extensions/loop/content/shared/img/media-group-left-hover.svg rename : browser/components/loop/content/shared/img/svg/media-group-right-hover.svg => browser/extensions/loop/content/shared/img/media-group-right-hover.svg rename : browser/components/loop/content/shared/img/svg/media-group.svg => browser/extensions/loop/content/shared/img/media-group.svg rename : browser/components/loop/content/shared/img/movistar.png => browser/extensions/loop/content/shared/img/movistar.png rename : browser/components/loop/content/shared/img/movistar@2x.png => browser/extensions/loop/content/shared/img/movistar@2x.png rename : browser/components/loop/content/shared/img/mute-inverse-14x14.png => browser/extensions/loop/content/shared/img/mute-inverse-14x14.png rename : browser/components/loop/content/shared/img/mute-inverse-14x14@2x.png => browser/extensions/loop/content/shared/img/mute-inverse-14x14@2x.png rename : browser/components/loop/content/shared/img/pause-12x12.svg => browser/extensions/loop/content/shared/img/pause-12x12.svg rename : browser/components/loop/content/shared/img/play-12x12.svg => browser/extensions/loop/content/shared/img/play-12x12.svg rename : browser/components/loop/content/shared/img/sad.png => browser/extensions/loop/content/shared/img/sad.png rename : browser/components/loop/content/shared/img/sad_hello_icon_64x64.svg => browser/extensions/loop/content/shared/img/sad_hello_icon_64x64.svg rename : browser/components/loop/content/shared/img/svg/settings-hover.svg => browser/extensions/loop/content/shared/img/settings-hover.svg rename : browser/components/loop/content/shared/img/svg/settings.svg => browser/extensions/loop/content/shared/img/settings.svg rename : browser/components/loop/content/shared/img/svg/sharing-active.svg => browser/extensions/loop/content/shared/img/sharing-active.svg rename : browser/components/loop/content/shared/img/svg/sharing-hover.svg => browser/extensions/loop/content/shared/img/sharing-hover.svg rename : browser/components/loop/content/shared/img/svg/sharing-pending.svg => browser/extensions/loop/content/shared/img/sharing-pending.svg rename : browser/components/loop/content/shared/img/svg/sharing.svg => browser/extensions/loop/content/shared/img/sharing.svg rename : browser/components/loop/content/shared/img/spinner.png => browser/extensions/loop/content/shared/img/spinner.png rename : browser/components/loop/content/shared/img/spinner.svg => browser/extensions/loop/content/shared/img/spinner.svg rename : browser/components/loop/content/shared/img/spinner@2x.png => browser/extensions/loop/content/shared/img/spinner@2x.png rename : browser/components/loop/content/shared/img/stop-12x12.svg => browser/extensions/loop/content/shared/img/stop-12x12.svg rename : browser/components/loop/content/shared/img/telefonica.png => browser/extensions/loop/content/shared/img/telefonica.png rename : browser/components/loop/content/shared/img/telefonica@2x.png => browser/extensions/loop/content/shared/img/telefonica@2x.png rename : browser/components/loop/content/shared/img/svg/video-hover.svg => browser/extensions/loop/content/shared/img/video-hover.svg rename : browser/components/loop/content/shared/img/svg/video-mute-hover.svg => browser/extensions/loop/content/shared/img/video-mute-hover.svg rename : browser/components/loop/content/shared/img/svg/video-mute.svg => browser/extensions/loop/content/shared/img/video-mute.svg rename : browser/components/loop/content/shared/img/svg/video.svg => browser/extensions/loop/content/shared/img/video.svg rename : browser/components/loop/content/shared/img/vivo.png => browser/extensions/loop/content/shared/img/vivo.png rename : browser/components/loop/content/shared/img/vivo@2x.png => browser/extensions/loop/content/shared/img/vivo@2x.png rename : browser/components/loop/content/shared/js/actions.js => browser/extensions/loop/content/shared/js/actions.js rename : browser/components/loop/content/shared/js/activeRoomStore.js => browser/extensions/loop/content/shared/js/activeRoomStore.js rename : browser/components/loop/content/shared/js/crypto.js => browser/extensions/loop/content/shared/js/crypto.js rename : browser/components/loop/content/shared/js/dispatcher.js => browser/extensions/loop/content/shared/js/dispatcher.js rename : browser/components/loop/content/shared/js/linkifiedTextView.js => browser/extensions/loop/content/shared/js/linkifiedTextView.js rename : browser/components/loop/content/shared/js/linkifiedTextView.jsx => browser/extensions/loop/content/shared/js/linkifiedTextView.jsx rename : browser/components/loop/content/shared/js/loopapi-client.js => browser/extensions/loop/content/shared/js/loopapi-client.js rename : browser/components/loop/content/shared/js/mixins.js => browser/extensions/loop/content/shared/js/mixins.js rename : browser/components/loop/content/shared/js/models.js => browser/extensions/loop/content/shared/js/models.js rename : browser/components/loop/content/shared/js/otSdkDriver.js => browser/extensions/loop/content/shared/js/otSdkDriver.js rename : browser/components/loop/content/shared/js/store.js => browser/extensions/loop/content/shared/js/store.js rename : browser/components/loop/content/shared/js/textChatStore.js => browser/extensions/loop/content/shared/js/textChatStore.js rename : browser/components/loop/content/shared/js/textChatView.js => browser/extensions/loop/content/shared/js/textChatView.js rename : browser/components/loop/content/shared/js/textChatView.jsx => browser/extensions/loop/content/shared/js/textChatView.jsx rename : browser/components/loop/content/shared/js/urlRegExps.js => browser/extensions/loop/content/shared/js/urlRegExps.js rename : browser/components/loop/content/shared/js/utils.js => browser/extensions/loop/content/shared/js/utils.js rename : browser/components/loop/content/shared/js/validate.js => browser/extensions/loop/content/shared/js/validate.js rename : browser/components/loop/content/shared/js/views.js => browser/extensions/loop/content/shared/js/views.js rename : browser/components/loop/content/shared/js/views.jsx => browser/extensions/loop/content/shared/js/views.jsx rename : browser/components/loop/content/shared/sounds/connected.ogg => browser/extensions/loop/content/shared/sounds/connected.ogg rename : browser/components/loop/content/shared/sounds/connecting.ogg => browser/extensions/loop/content/shared/sounds/connecting.ogg rename : browser/components/loop/content/shared/sounds/failure.ogg => browser/extensions/loop/content/shared/sounds/failure.ogg rename : browser/components/loop/content/shared/sounds/message.ogg => browser/extensions/loop/content/shared/sounds/message.ogg rename : browser/components/loop/content/shared/sounds/ringtone.ogg => browser/extensions/loop/content/shared/sounds/ringtone.ogg rename : browser/components/loop/content/shared/sounds/room-joined-in.ogg => browser/extensions/loop/content/shared/sounds/room-joined-in.ogg rename : browser/components/loop/content/shared/sounds/room-joined.ogg => browser/extensions/loop/content/shared/sounds/room-joined.ogg rename : browser/components/loop/content/shared/sounds/room-left.ogg => browser/extensions/loop/content/shared/sounds/room-left.ogg rename : browser/components/loop/content/shared/sounds/terminated.ogg => browser/extensions/loop/content/shared/sounds/terminated.ogg rename : browser/components/loop/content/shared/libs/backbone-1.2.1.js => browser/extensions/loop/content/shared/vendor/backbone-1.2.1.js rename : browser/components/loop/content/shared/libs/classnames-2.2.0.js => browser/extensions/loop/content/shared/vendor/classnames-2.2.0.js rename : browser/components/loop/content/shared/libs/lodash-3.9.3.js => browser/extensions/loop/content/shared/vendor/lodash-3.9.3.js rename : browser/components/loop/content/shared/libs/react-0.13.3-prod.js => browser/extensions/loop/content/shared/vendor/react-0.13.3-prod.js rename : browser/components/loop/content/shared/libs/react-0.13.3.js => browser/extensions/loop/content/shared/vendor/react-0.13.3.js rename : browser/components/loop/content/shared/libs/sdk-content/css/ot.css => browser/extensions/loop/content/shared/vendor/sdk-content/css/ot.css rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-chrome.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-chrome.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-copy-firefox.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-copy-firefox.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-firefox.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-firefox.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-predenied-chrome.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-predenied-chrome.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-prompt-chrome.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-prompt-chrome.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-publisher.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-publisher.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-subscriber.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-subscriber.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/buttons.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/buttons.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/loader.gif => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/loader.gif rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-off.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-off.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-on.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-on.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-off.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-off.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-on.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-on.png rename : browser/components/loop/content/shared/libs/sdk-content/js/dynamic_config.min.js => browser/extensions/loop/content/shared/vendor/sdk-content/js/dynamic_config.min.js rename : browser/components/loop/content/shared/libs/sdk.js => browser/extensions/loop/content/shared/vendor/sdk.js rename : browser/components/loop/jar.mn => browser/extensions/loop/jar.mn rename : browser/components/loop/manifest.ini => browser/extensions/loop/manifest.ini rename : browser/components/loop/moz.build => browser/extensions/loop/moz.build rename : browser/components/loop/run-all-loop-tests.sh => browser/extensions/loop/run-all-loop-tests.sh rename : browser/components/loop/standalone/.gitignore => browser/extensions/loop/standalone/.gitignore rename : browser/components/loop/standalone/Makefile => browser/extensions/loop/standalone/Makefile rename : browser/components/loop/standalone/README.md => browser/extensions/loop/standalone/README.md rename : browser/components/loop/standalone/content/css/webapp.css => browser/extensions/loop/standalone/content/css/webapp.css rename : browser/components/loop/standalone/content/favicon.ico => browser/extensions/loop/standalone/content/favicon.ico rename : browser/components/loop/standalone/content/img/gum-chrome.svg => browser/extensions/loop/standalone/content/img/gum-chrome.svg rename : browser/components/loop/standalone/content/img/gum-firefox.svg => browser/extensions/loop/standalone/content/img/gum-firefox.svg rename : browser/components/loop/standalone/content/img/gum-opera.svg => browser/extensions/loop/standalone/content/img/gum-opera.svg rename : browser/components/loop/standalone/content/img/gum-others.svg => browser/extensions/loop/standalone/content/img/gum-others.svg rename : browser/components/loop/standalone/content/img/hello-logo-text.svg => browser/extensions/loop/standalone/content/img/hello-logo-text.svg rename : browser/components/loop/standalone/content/img/logo.png => browser/extensions/loop/standalone/content/img/logo.png rename : browser/components/loop/standalone/content/img/mozilla-logo.svg => browser/extensions/loop/standalone/content/img/mozilla-logo.svg rename : browser/components/loop/standalone/content/index.html => browser/extensions/loop/standalone/content/index.html rename : browser/components/loop/standalone/content/js/standaloneAppStore.js => browser/extensions/loop/standalone/content/js/standaloneAppStore.js rename : browser/components/loop/standalone/content/js/standaloneMetricsStore.js => browser/extensions/loop/standalone/content/js/standaloneMetricsStore.js rename : browser/components/loop/standalone/content/js/standaloneMozLoop.js => browser/extensions/loop/standalone/content/js/standaloneMozLoop.js rename : browser/components/loop/standalone/content/js/standaloneRoomViews.js => browser/extensions/loop/standalone/content/js/standaloneRoomViews.js rename : browser/components/loop/standalone/content/js/standaloneRoomViews.jsx => browser/extensions/loop/standalone/content/js/standaloneRoomViews.jsx rename : browser/components/loop/standalone/content/js/webapp.js => browser/extensions/loop/standalone/content/js/webapp.js rename : browser/components/loop/standalone/content/js/webapp.jsx => browser/extensions/loop/standalone/content/js/webapp.jsx rename : browser/components/loop/standalone/content/l10n/en-US/loop.properties => browser/extensions/loop/standalone/content/l10n/en-US/loop.properties rename : browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js => browser/extensions/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js rename : browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt => browser/extensions/loop/standalone/content/libs/l10n-gaia-upstream.txt rename : browser/components/loop/standalone/content/robots.txt => browser/extensions/loop/standalone/content/robots.txt rename : browser/components/loop/standalone/content/webappEntryPoint.js => browser/extensions/loop/standalone/content/webappEntryPoint.js rename : browser/components/loop/standalone/package.json => browser/extensions/loop/standalone/package.json rename : browser/components/loop/standalone/server.js => browser/extensions/loop/standalone/server.js rename : browser/components/loop/standalone/webpack.config.js => browser/extensions/loop/standalone/webpack.config.js rename : browser/components/loop/test/.eslintrc => browser/extensions/loop/test/.eslintrc rename : browser/components/loop/test/coverage/index.html => browser/extensions/loop/test/coverage/index.html rename : browser/components/loop/test/desktop-local/.eslintrc => browser/extensions/loop/test/desktop-local/.eslintrc rename : browser/components/loop/test/desktop-local/README.md => browser/extensions/loop/test/desktop-local/README.md rename : browser/components/loop/test/desktop-local/conversationAppStore_test.js => browser/extensions/loop/test/desktop-local/conversationAppStore_test.js rename : browser/components/loop/test/desktop-local/conversation_test.js => browser/extensions/loop/test/desktop-local/conversation_test.js rename : browser/components/loop/test/desktop-local/feedbackViews_test.js => browser/extensions/loop/test/desktop-local/feedbackViews_test.js rename : browser/components/loop/test/desktop-local/index.html => browser/extensions/loop/test/desktop-local/index.html rename : browser/components/loop/test/desktop-local/l10n_test.js => browser/extensions/loop/test/desktop-local/l10n_test.js rename : browser/components/loop/test/desktop-local/panel_test.js => browser/extensions/loop/test/desktop-local/panel_test.js rename : browser/components/loop/test/desktop-local/roomStore_test.js => browser/extensions/loop/test/desktop-local/roomStore_test.js rename : browser/components/loop/test/desktop-local/roomViews_test.js => browser/extensions/loop/test/desktop-local/roomViews_test.js rename : browser/components/loop/test/desktop-local/test_desktop_all.py => browser/extensions/loop/test/desktop-local/test_desktop_all.py rename : browser/components/loop/test/functional/config.py => browser/extensions/loop/test/functional/config.py rename : browser/components/loop/test/functional/hanging_threads.py => browser/extensions/loop/test/functional/hanging_threads.py rename : browser/components/loop/test/functional/manifest.ini => browser/extensions/loop/test/functional/manifest.ini rename : browser/components/loop/test/functional/serversetup.py => browser/extensions/loop/test/functional/serversetup.py rename : browser/components/loop/test/functional/test_1_browser_call.py => browser/extensions/loop/test/functional/test_1_browser_call.py rename : browser/components/loop/test/index.html => browser/extensions/loop/test/index.html rename : browser/components/loop/test/karma/head.js => browser/extensions/loop/test/karma/head.js rename : browser/components/loop/test/karma/karma.conf.base.js => browser/extensions/loop/test/karma/karma.conf.base.js rename : browser/components/loop/test/karma/karma.coverage.desktop.js => browser/extensions/loop/test/karma/karma.coverage.desktop.js rename : browser/components/loop/test/karma/karma.coverage.shared_standalone.js => browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js rename : browser/components/loop/test/mochitest/.eslintrc => browser/extensions/loop/test/mochitest/.eslintrc rename : browser/components/loop/test/mochitest/browser.ini => browser/extensions/loop/test/mochitest/browser.ini rename : browser/components/loop/test/mochitest/browser_LoopRooms_channel.js => browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js rename : browser/components/loop/test/mochitest/browser_fxa_login.js => browser/extensions/loop/test/mochitest/browser_fxa_login.js rename : browser/components/loop/test/mochitest/browser_loop_fxa_server.js => browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js rename : browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js => browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js rename : browser/components/loop/test/mochitest/browser_mozLoop_chat.js => browser/extensions/loop/test/mochitest/browser_mozLoop_chat.js rename : browser/components/loop/test/mochitest/browser_mozLoop_context.js => browser/extensions/loop/test/mochitest/browser_mozLoop_context.js rename : browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js => browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js rename : browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js => browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js rename : browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js => browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js rename : browser/components/loop/test/mochitest/browser_toolbarbutton.js => browser/extensions/loop/test/mochitest/browser_toolbarbutton.js rename : browser/components/loop/test/mochitest/head.js => browser/extensions/loop/test/mochitest/head.js rename : browser/components/loop/test/mochitest/loop_fxa.sjs => browser/extensions/loop/test/mochitest/loop_fxa.sjs rename : browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html => browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html rename : browser/components/loop/test/package.json => browser/extensions/loop/test/package.json rename : browser/components/loop/test/shared/activeRoomStore_test.js => browser/extensions/loop/test/shared/activeRoomStore_test.js rename : browser/components/loop/test/shared/crypto_test.js => browser/extensions/loop/test/shared/crypto_test.js rename : browser/components/loop/test/shared/dispatcher_test.js => browser/extensions/loop/test/shared/dispatcher_test.js rename : browser/components/loop/test/shared/frontend_tester.py => browser/extensions/loop/test/shared/frontend_tester.py rename : browser/components/loop/test/shared/index.html => browser/extensions/loop/test/shared/index.html rename : browser/components/loop/test/shared/linkifiedTextView_test.js => browser/extensions/loop/test/shared/linkifiedTextView_test.js rename : browser/components/loop/test/shared/loop_mocha_utils.js => browser/extensions/loop/test/shared/loop_mocha_utils.js rename : browser/components/loop/test/shared/loopapi-client_test.js => browser/extensions/loop/test/shared/loopapi-client_test.js rename : browser/components/loop/test/shared/mixins_test.js => browser/extensions/loop/test/shared/mixins_test.js rename : browser/components/loop/test/shared/models_test.js => browser/extensions/loop/test/shared/models_test.js rename : browser/components/loop/test/shared/otSdkDriver_test.js => browser/extensions/loop/test/shared/otSdkDriver_test.js rename : browser/components/loop/test/shared/sdk_mock.js => browser/extensions/loop/test/shared/sdk_mock.js rename : browser/components/loop/test/shared/store_test.js => browser/extensions/loop/test/shared/store_test.js rename : browser/components/loop/test/shared/test_shared_all.py => browser/extensions/loop/test/shared/test_shared_all.py rename : browser/components/loop/test/shared/textChatStore_test.js => browser/extensions/loop/test/shared/textChatStore_test.js rename : browser/components/loop/test/shared/textChatView_test.js => browser/extensions/loop/test/shared/textChatView_test.js rename : browser/components/loop/test/shared/utils_test.js => browser/extensions/loop/test/shared/utils_test.js rename : browser/components/loop/test/shared/validate_test.js => browser/extensions/loop/test/shared/validate_test.js rename : browser/components/loop/test/shared/vendor/chai-3.0.0.js => browser/extensions/loop/test/shared/vendor/chai-3.0.0.js rename : browser/components/loop/test/shared/vendor/chai-as-promised-5.1.0.js => browser/extensions/loop/test/shared/vendor/chai-as-promised-5.1.0.js rename : browser/components/loop/test/shared/vendor/mocha-2.2.5.css => browser/extensions/loop/test/shared/vendor/mocha-2.2.5.css rename : browser/components/loop/test/shared/vendor/mocha-2.2.5.js => browser/extensions/loop/test/shared/vendor/mocha-2.2.5.js rename : browser/components/loop/test/shared/vendor/sinon-1.16.1.js => browser/extensions/loop/test/shared/vendor/sinon-1.16.1.js rename : browser/components/loop/test/shared/views_test.js => browser/extensions/loop/test/shared/views_test.js rename : browser/components/loop/test/standalone/index.html => browser/extensions/loop/test/standalone/index.html rename : browser/components/loop/test/standalone/standaloneAppStore_test.js => browser/extensions/loop/test/standalone/standaloneAppStore_test.js rename : browser/components/loop/test/standalone/standaloneMetricsStore_test.js => browser/extensions/loop/test/standalone/standaloneMetricsStore_test.js rename : browser/components/loop/test/standalone/standaloneMozLoop_test.js => browser/extensions/loop/test/standalone/standaloneMozLoop_test.js rename : browser/components/loop/test/standalone/standaloneRoomViews_test.js => browser/extensions/loop/test/standalone/standaloneRoomViews_test.js rename : browser/components/loop/test/standalone/test_standalone_all.py => browser/extensions/loop/test/standalone/test_standalone_all.py rename : browser/components/loop/test/standalone/webapp_test.js => browser/extensions/loop/test/standalone/webapp_test.js rename : browser/components/loop/test/ui-showcase/test_ui-showcase.py => browser/extensions/loop/test/ui-showcase/test_ui-showcase.py rename : browser/components/loop/test/visual-regression/README.md => browser/extensions/loop/test/visual-regression/README.md rename : browser/components/loop/test/visual-regression/screenshot => browser/extensions/loop/test/visual-regression/screenshot rename : browser/components/loop/test/xpcshell/.eslintrc => browser/extensions/loop/test/xpcshell/.eslintrc rename : browser/components/loop/test/xpcshell/head.js => browser/extensions/loop/test/xpcshell/head.js rename : browser/components/loop/test/xpcshell/test_loopapi_doNotDisturb.js => browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js rename : browser/components/loop/test/xpcshell/test_loopapi_internal.js => browser/extensions/loop/test/xpcshell/test_loopapi_internal.js rename : browser/components/loop/test/xpcshell/test_loopapi_prefs.js => browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js rename : browser/components/loop/test/xpcshell/test_looppush_initialize.js => browser/extensions/loop/test/xpcshell/test_looppush_initialize.js rename : browser/components/loop/test/xpcshell/test_looprooms.js => browser/extensions/loop/test/xpcshell/test_looprooms.js rename : browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js => browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js rename : browser/components/loop/test/xpcshell/test_looprooms_first_notification.js => browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js rename : browser/components/loop/test/xpcshell/test_looprooms_getall.js => browser/extensions/loop/test/xpcshell/test_looprooms_getall.js rename : browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js => browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js rename : browser/components/loop/test/xpcshell/test_loopservice_dnd.js => browser/extensions/loop/test/xpcshell/test_loopservice_dnd.js rename : browser/components/loop/test/xpcshell/test_loopservice_encryptionkey.js => browser/extensions/loop/test/xpcshell/test_loopservice_encryptionkey.js rename : browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js => browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js rename : browser/components/loop/test/xpcshell/test_loopservice_hawk_request.js => browser/extensions/loop/test/xpcshell/test_loopservice_hawk_request.js rename : browser/components/loop/test/xpcshell/test_loopservice_initialize.js => browser/extensions/loop/test/xpcshell/test_loopservice_initialize.js rename : browser/components/loop/test/xpcshell/test_loopservice_locales.js => browser/extensions/loop/test/xpcshell/test_loopservice_locales.js rename : browser/components/loop/test/xpcshell/test_loopservice_loop_prefs.js => browser/extensions/loop/test/xpcshell/test_loopservice_loop_prefs.js rename : browser/components/loop/test/xpcshell/test_loopservice_registration.js => browser/extensions/loop/test/xpcshell/test_loopservice_registration.js rename : browser/components/loop/test/xpcshell/test_loopservice_registration_retry.js => browser/extensions/loop/test/xpcshell/test_loopservice_registration_retry.js rename : browser/components/loop/test/xpcshell/test_loopservice_restart.js => browser/extensions/loop/test/xpcshell/test_loopservice_restart.js rename : browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js => browser/extensions/loop/test/xpcshell/test_loopservice_token_invalid.js rename : browser/components/loop/test/xpcshell/test_loopservice_token_save.js => browser/extensions/loop/test/xpcshell/test_loopservice_token_save.js rename : browser/components/loop/test/xpcshell/test_loopservice_token_send.js => browser/extensions/loop/test/xpcshell/test_loopservice_token_send.js rename : browser/components/loop/test/xpcshell/test_loopservice_token_validation.js => browser/extensions/loop/test/xpcshell/test_loopservice_token_validation.js rename : browser/components/loop/test/xpcshell/xpcshell.ini => browser/extensions/loop/test/xpcshell/xpcshell.ini rename : browser/components/loop/ui/README.md => browser/extensions/loop/ui/README.md rename : browser/components/loop/ui/fake-l10n.js => browser/extensions/loop/ui/fake-l10n.js rename : browser/components/loop/ui/fake-mozLoop.js => browser/extensions/loop/ui/fake-mozLoop.js rename : browser/components/loop/ui/index.html => browser/extensions/loop/ui/index.html rename : browser/components/loop/ui/react-frame-component.js => browser/extensions/loop/ui/react-frame-component.js rename : browser/components/loop/ui/sample-img/video-screen-local.png => browser/extensions/loop/ui/sample-img/video-screen-local.png rename : browser/components/loop/ui/sample-img/video-screen-remote.png => browser/extensions/loop/ui/sample-img/video-screen-remote.png rename : browser/components/loop/ui/sample-img/video-screen-terminal.png => browser/extensions/loop/ui/sample-img/video-screen-terminal.png rename : browser/components/loop/ui/ui-showcase.css => browser/extensions/loop/ui/ui-showcase.css rename : browser/components/loop/ui/ui-showcase.js => browser/extensions/loop/ui/ui-showcase.js rename : browser/components/loop/ui/ui-showcase.jsx => browser/extensions/loop/ui/ui-showcase.jsx --- .../{components => extensions}/loop/.eslintignore | 0 browser/{components => extensions}/loop/.eslintrc | 0 .../{components => extensions}/loop/.eslintrc-gecko | 0 browser/{components => extensions}/loop/.gitignore | 0 browser/{components => extensions}/loop/README.txt | 0 browser/{components => extensions}/loop/build-jsx | 0 .../loop/content}/modules/.eslintrc | 0 .../loop/content}/modules/LoopRooms.jsm | 0 .../loop/content}/modules/LoopRoomsCache.jsm | 0 .../loop/content}/modules/MozLoopAPI.jsm | 0 .../loop/content}/modules/MozLoopPushHandler.jsm | 0 .../loop/content}/modules/MozLoopService.jsm | 0 .../loop/content}/modules/MozLoopWorker.js | 0 .../loop/content/panels}/conversation.html | 0 .../loop/content/panels}/css/panel.css | 0 .../loop/content/panels}/js/.eslintrc | 0 .../loop/content/panels}/js/conversation.js | 0 .../loop/content/panels}/js/conversation.jsx | 0 .../loop/content/panels}/js/conversationAppStore.js | 0 .../loop/content/panels}/js/feedbackViews.js | 0 .../loop/content/panels}/js/feedbackViews.jsx | 0 .../loop/content/panels}/js/otconfig.js | 0 .../loop/content/panels}/js/panel.js | 0 .../loop/content/panels}/js/panel.jsx | 0 .../loop/content/panels}/js/roomStore.js | 0 .../loop/content/panels}/js/roomViews.js | 0 .../loop/content/panels}/js/roomViews.jsx | 0 .../loop/content/panels}/panel.html | 0 .../loop/content/panels/vendor}/l10n.js | 0 .../loop/content/shared/README.md | 0 .../loop/content/shared/css/common.css | 0 .../loop/content/shared/css/conversation.css | 0 .../loop/content/shared/css/reset.css | 0 .../loop/content/shared/img/02.png | Bin .../loop/content/shared/img/02@2x.png | Bin .../loop/content/shared/img/animated-spinner.svg | 0 .../loop/content/shared/img/audio-call-avatar.svg | 0 .../content/shared/img/audio-default-16x16@1.5x.png | Bin .../content/shared/img/audio-default-16x16@2x.png | Bin .../loop/content/shared/img}/audio-hover.svg | 0 .../loop/content/shared/img}/audio-mute-hover.svg | 0 .../loop/content/shared/img}/audio-mute.svg | 0 .../loop/content/shared/img}/audio.svg | 0 .../loop/content/shared/img/avatars.svg | 0 .../loop/content/shared/img/beta-ribbon.svg | 0 .../loop/content/shared/img}/cam_audio-no.svg | 0 .../loop/content/shared/img}/cam_audio.svg | 0 .../loop/content/shared/img}/cam_audio_h.svg | 0 .../content/shared/img/chatbubble-arrow-left.svg | 0 .../content/shared/img/chatbubble-arrow-right.svg | 0 .../loop/content/shared/img/check.svg | 0 .../loop/content/shared/img/ellipsis-v.svg | 0 .../loop/content/shared/img/empty_conversations.svg | 0 .../loop/content/shared/img/empty_search.svg | 0 .../loop/content/shared/img}/exit.svg | 0 .../loop/content/shared/img/facemute-14x14.png | Bin .../loop/content/shared/img/facemute-14x14@2x.png | Bin .../loop/content/shared/img/firefox-avatar.svg | 0 .../loop/content/shared/img/firefox-logo.png | Bin .../loop/content/shared/img}/glyph-email-16x16.svg | 0 .../content/shared/img}/glyph-facebook-16x16.svg | 0 .../loop/content/shared/img}/glyph-help-16x16.svg | 0 .../loop/content/shared/img}/glyph-link-16x16.svg | 0 .../loop/content/shared/img}/glyph-user-16x16.svg | 0 .../content/shared/img/hangup-inverse-14x14.png | Bin .../content/shared/img/hangup-inverse-14x14@2x.png | Bin .../loop/content/shared/img/happy.png | Bin .../loop/content/shared/img/hello_logo.svg | 0 .../loop/content/shared/img/helloicon.svg | 0 .../loop/content/shared/img/icon_32.png | Bin .../loop/content/shared/img/icon_64.png | Bin .../loop/content/shared/img/icons-10x10.svg | 0 .../loop/content/shared/img/icons-14x14.svg | 0 .../loop/content/shared/img/icons-16x16.svg | 0 .../content/shared/img}/media-group-left-hover.svg | 0 .../content/shared/img}/media-group-right-hover.svg | 0 .../loop/content/shared/img}/media-group.svg | 0 .../loop/content/shared/img/movistar.png | Bin .../loop/content/shared/img/movistar@2x.png | Bin .../loop/content/shared/img/mute-inverse-14x14.png | Bin .../content/shared/img/mute-inverse-14x14@2x.png | Bin .../loop/content/shared/img/pause-12x12.svg | 0 .../loop/content/shared/img/play-12x12.svg | 0 .../loop/content/shared/img/sad.png | Bin .../content/shared/img/sad_hello_icon_64x64.svg | 0 .../loop/content/shared/img}/settings-hover.svg | 0 .../loop/content/shared/img}/settings.svg | 0 .../loop/content/shared/img}/sharing-active.svg | 0 .../loop/content/shared/img}/sharing-hover.svg | 0 .../loop/content/shared/img}/sharing-pending.svg | 0 .../loop/content/shared/img}/sharing.svg | 0 .../loop/content/shared/img/spinner.png | Bin .../loop/content/shared/img/spinner.svg | 0 .../loop/content/shared/img/spinner@2x.png | Bin .../loop/content/shared/img/stop-12x12.svg | 0 .../loop/content/shared/img/telefonica.png | Bin .../loop/content/shared/img/telefonica@2x.png | Bin .../loop/content/shared/img}/video-hover.svg | 0 .../loop/content/shared/img}/video-mute-hover.svg | 0 .../loop/content/shared/img}/video-mute.svg | 0 .../loop/content/shared/img}/video.svg | 0 .../loop/content/shared/img/vivo.png | Bin .../loop/content/shared/img/vivo@2x.png | Bin .../loop/content/shared/js/actions.js | 0 .../loop/content/shared/js/activeRoomStore.js | 0 .../loop/content/shared/js/crypto.js | 0 .../loop/content/shared/js/dispatcher.js | 0 .../loop/content/shared/js/linkifiedTextView.js | 0 .../loop/content/shared/js/linkifiedTextView.jsx | 0 .../loop/content/shared/js/loopapi-client.js | 0 .../loop/content/shared/js/mixins.js | 0 .../loop/content/shared/js/models.js | 0 .../loop/content/shared/js/otSdkDriver.js | 0 .../loop/content/shared/js/store.js | 0 .../loop/content/shared/js/textChatStore.js | 0 .../loop/content/shared/js/textChatView.js | 0 .../loop/content/shared/js/textChatView.jsx | 0 .../loop/content/shared/js/urlRegExps.js | 0 .../loop/content/shared/js/utils.js | 0 .../loop/content/shared/js/validate.js | 0 .../loop/content/shared/js/views.js | 0 .../loop/content/shared/js/views.jsx | 0 .../loop/content/shared/sounds/connected.ogg | Bin .../loop/content/shared/sounds/connecting.ogg | Bin .../loop/content/shared/sounds/failure.ogg | Bin .../loop/content/shared/sounds/message.ogg | Bin .../loop/content/shared/sounds/ringtone.ogg | Bin .../loop/content/shared/sounds/room-joined-in.ogg | Bin .../loop/content/shared/sounds/room-joined.ogg | Bin .../loop/content/shared/sounds/room-left.ogg | Bin .../loop/content/shared/sounds/terminated.ogg | Bin .../loop/content/shared/vendor}/backbone-1.2.1.js | 0 .../loop/content/shared/vendor}/classnames-2.2.0.js | 0 .../loop/content/shared/vendor}/lodash-3.9.3.js | 0 .../content/shared/vendor}/react-0.13.3-prod.js | 0 .../loop/content/shared/vendor}/react-0.13.3.js | 0 .../content/shared/vendor}/sdk-content/css/ot.css | 0 .../sdk-content/images/rtc/access-denied-chrome.png | Bin .../images/rtc/access-denied-copy-firefox.png | Bin .../images/rtc/access-denied-firefox.png | Bin .../images/rtc/access-predenied-chrome.png | Bin .../sdk-content/images/rtc/access-prompt-chrome.png | Bin .../sdk-content/images/rtc/audioonly-publisher.png | Bin .../sdk-content/images/rtc/audioonly-subscriber.png | Bin .../vendor}/sdk-content/images/rtc/buttons.png | Bin .../vendor}/sdk-content/images/rtc/loader.gif | Bin .../vendor}/sdk-content/images/rtc/mic-off.png | Bin .../vendor}/sdk-content/images/rtc/mic-on.png | Bin .../vendor}/sdk-content/images/rtc/speaker-off.png | Bin .../vendor}/sdk-content/images/rtc/speaker-on.png | Bin .../vendor}/sdk-content/js/dynamic_config.min.js | 0 .../loop/content/shared/vendor}/sdk.js | 0 browser/{components => extensions}/loop/jar.mn | 0 .../{components => extensions}/loop/manifest.ini | 0 browser/{components => extensions}/loop/moz.build | 0 .../loop/run-all-loop-tests.sh | 0 .../loop/standalone/.gitignore | 0 .../loop/standalone/Makefile | 0 .../loop/standalone/README.md | 0 .../loop/standalone/content/css/webapp.css | 0 .../loop/standalone/content/favicon.ico | Bin .../loop/standalone/content/img/gum-chrome.svg | 0 .../loop/standalone/content/img/gum-firefox.svg | 0 .../loop/standalone/content/img/gum-opera.svg | 0 .../loop/standalone/content/img/gum-others.svg | 0 .../loop/standalone/content/img/hello-logo-text.svg | 0 .../loop/standalone/content/img/logo.png | Bin .../loop/standalone/content/img/mozilla-logo.svg | 0 .../loop/standalone/content/index.html | 0 .../standalone/content/js/standaloneAppStore.js | 0 .../standalone/content/js/standaloneMetricsStore.js | 0 .../loop/standalone/content/js/standaloneMozLoop.js | 0 .../standalone/content/js/standaloneRoomViews.js | 0 .../standalone/content/js/standaloneRoomViews.jsx | 0 .../loop/standalone/content/js/webapp.js | 0 .../loop/standalone/content/js/webapp.jsx | 0 .../standalone/content/l10n/en-US/loop.properties | 0 .../content/libs/l10n-gaia-02ca67948fe8.js | 0 .../standalone/content/libs/l10n-gaia-upstream.txt | 0 .../loop/standalone/content/robots.txt | 0 .../loop/standalone/content/webappEntryPoint.js | 0 .../loop/standalone/package.json | 0 .../loop/standalone/server.js | 0 .../loop/standalone/webpack.config.js | 0 .../{components => extensions}/loop/test/.eslintrc | 0 .../loop/test/coverage/index.html | 0 .../loop/test/desktop-local/.eslintrc | 0 .../loop/test/desktop-local/README.md | 0 .../test/desktop-local/conversationAppStore_test.js | 0 .../loop/test/desktop-local/conversation_test.js | 0 .../loop/test/desktop-local/feedbackViews_test.js | 0 .../loop/test/desktop-local/index.html | 0 .../loop/test/desktop-local/l10n_test.js | 0 .../loop/test/desktop-local/panel_test.js | 0 .../loop/test/desktop-local/roomStore_test.js | 0 .../loop/test/desktop-local/roomViews_test.js | 0 .../loop/test/desktop-local/test_desktop_all.py | 0 .../loop/test/functional/config.py | 0 .../loop/test/functional/hanging_threads.py | 0 .../loop/test/functional/manifest.ini | 0 .../loop/test/functional/serversetup.py | 0 .../loop/test/functional/test_1_browser_call.py | 0 .../{components => extensions}/loop/test/index.html | 0 .../loop/test/karma/head.js | 0 .../loop/test/karma/karma.conf.base.js | 0 .../loop/test/karma/karma.coverage.desktop.js | 0 .../test/karma/karma.coverage.shared_standalone.js | 0 .../loop/test/mochitest/.eslintrc | 0 .../loop/test/mochitest/browser.ini | 0 .../test/mochitest/browser_LoopRooms_channel.js | 0 .../loop/test/mochitest/browser_fxa_login.js | 0 .../loop/test/mochitest/browser_loop_fxa_server.js | 0 .../mochitest/browser_mozLoop_appVersionInfo.js | 0 .../loop/test/mochitest/browser_mozLoop_chat.js | 0 .../loop/test/mochitest/browser_mozLoop_context.js | 0 .../mochitest/browser_mozLoop_sharingListeners.js | 0 .../test/mochitest/browser_mozLoop_socialShare.js | 0 .../test/mochitest/browser_mozLoop_telemetry.js | 0 .../loop/test/mochitest/browser_toolbarbutton.js | 0 .../loop/test/mochitest/head.js | 0 .../loop/test/mochitest/loop_fxa.sjs | 0 .../mochitest/test_loopLinkClicker_channel.html | 0 .../loop/test/package.json | 0 .../loop/test/shared/activeRoomStore_test.js | 0 .../loop/test/shared/crypto_test.js | 0 .../loop/test/shared/dispatcher_test.js | 0 .../loop/test/shared/frontend_tester.py | 0 .../loop/test/shared/index.html | 0 .../loop/test/shared/linkifiedTextView_test.js | 0 .../loop/test/shared/loop_mocha_utils.js | 0 .../loop/test/shared/loopapi-client_test.js | 0 .../loop/test/shared/mixins_test.js | 0 .../loop/test/shared/models_test.js | 0 .../loop/test/shared/otSdkDriver_test.js | 0 .../loop/test/shared/sdk_mock.js | 0 .../loop/test/shared/store_test.js | 0 .../loop/test/shared/test_shared_all.py | 0 .../loop/test/shared/textChatStore_test.js | 0 .../loop/test/shared/textChatView_test.js | 0 .../loop/test/shared/utils_test.js | 0 .../loop/test/shared/validate_test.js | 0 .../loop/test/shared/vendor/chai-3.0.0.js | 0 .../test/shared/vendor/chai-as-promised-5.1.0.js | 0 .../loop/test/shared/vendor/mocha-2.2.5.css | 0 .../loop/test/shared/vendor/mocha-2.2.5.js | 0 .../loop/test/shared/vendor/sinon-1.16.1.js | 0 .../loop/test/shared/views_test.js | 0 .../loop/test/standalone/index.html | 0 .../loop/test/standalone/standaloneAppStore_test.js | 0 .../test/standalone/standaloneMetricsStore_test.js | 0 .../loop/test/standalone/standaloneMozLoop_test.js | 0 .../test/standalone/standaloneRoomViews_test.js | 0 .../loop/test/standalone/test_standalone_all.py | 0 .../loop/test/standalone/webapp_test.js | 0 .../loop/test/ui-showcase/test_ui-showcase.py | 0 .../loop/test/visual-regression/README.md | 0 .../loop/test/visual-regression/screenshot | 0 .../loop/test/xpcshell/.eslintrc | 0 .../loop/test/xpcshell/head.js | 0 .../loop/test/xpcshell/test_loopapi_doNotDisturb.js | 0 .../loop/test/xpcshell/test_loopapi_internal.js | 0 .../loop/test/xpcshell/test_loopapi_prefs.js | 0 .../loop/test/xpcshell/test_looppush_initialize.js | 0 .../loop/test/xpcshell/test_looprooms.js | 0 .../xpcshell/test_looprooms_encryption_in_fxa.js | 0 .../xpcshell/test_looprooms_first_notification.js | 0 .../loop/test/xpcshell/test_looprooms_getall.js | 0 .../test_looprooms_upgrade_to_encryption.js | 0 .../loop/test/xpcshell/test_loopservice_dnd.js | 0 .../test/xpcshell/test_loopservice_encryptionkey.js | 0 .../test/xpcshell/test_loopservice_hawk_errors.js | 0 .../test/xpcshell/test_loopservice_hawk_request.js | 0 .../test/xpcshell/test_loopservice_initialize.js | 0 .../loop/test/xpcshell/test_loopservice_locales.js | 0 .../test/xpcshell/test_loopservice_loop_prefs.js | 0 .../test/xpcshell/test_loopservice_registration.js | 0 .../xpcshell/test_loopservice_registration_retry.js | 0 .../loop/test/xpcshell/test_loopservice_restart.js | 0 .../test/xpcshell/test_loopservice_token_invalid.js | 0 .../test/xpcshell/test_loopservice_token_save.js | 0 .../test/xpcshell/test_loopservice_token_send.js | 0 .../xpcshell/test_loopservice_token_validation.js | 0 .../loop/test/xpcshell/xpcshell.ini | 0 .../{components => extensions}/loop/ui/README.md | 0 .../{components => extensions}/loop/ui/fake-l10n.js | 0 .../loop/ui/fake-mozLoop.js | 0 .../{components => extensions}/loop/ui/index.html | 0 .../loop/ui/react-frame-component.js | 0 .../loop/ui/sample-img/video-screen-local.png | Bin .../loop/ui/sample-img/video-screen-remote.png | Bin .../loop/ui/sample-img/video-screen-terminal.png | Bin .../loop/ui/ui-showcase.css | 0 .../loop/ui/ui-showcase.js | 0 .../loop/ui/ui-showcase.jsx | 0 294 files changed, 0 insertions(+), 0 deletions(-) rename browser/{components => extensions}/loop/.eslintignore (100%) rename browser/{components => extensions}/loop/.eslintrc (100%) rename browser/{components => extensions}/loop/.eslintrc-gecko (100%) rename browser/{components => extensions}/loop/.gitignore (100%) rename browser/{components => extensions}/loop/README.txt (100%) rename browser/{components => extensions}/loop/build-jsx (100%) rename browser/{components/loop => extensions/loop/content}/modules/.eslintrc (100%) rename browser/{components/loop => extensions/loop/content}/modules/LoopRooms.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/LoopRoomsCache.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/MozLoopAPI.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/MozLoopPushHandler.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/MozLoopService.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/MozLoopWorker.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/conversation.html (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/css/panel.css (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/.eslintrc (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/conversation.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/conversation.jsx (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/conversationAppStore.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/feedbackViews.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/feedbackViews.jsx (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/otconfig.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/panel.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/panel.jsx (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/roomStore.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/roomViews.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/roomViews.jsx (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/panel.html (100%) rename browser/{components/loop/content/libs => extensions/loop/content/panels/vendor}/l10n.js (100%) rename browser/{components => extensions}/loop/content/shared/README.md (100%) rename browser/{components => extensions}/loop/content/shared/css/common.css (100%) rename browser/{components => extensions}/loop/content/shared/css/conversation.css (100%) rename browser/{components => extensions}/loop/content/shared/css/reset.css (100%) rename browser/{components => extensions}/loop/content/shared/img/02.png (100%) rename browser/{components => extensions}/loop/content/shared/img/02@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/animated-spinner.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/audio-call-avatar.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/audio-default-16x16@1.5x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/audio-default-16x16@2x.png (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/audio-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/audio-mute-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/audio-mute.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/audio.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/avatars.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/beta-ribbon.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/cam_audio-no.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/cam_audio.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/cam_audio_h.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/chatbubble-arrow-left.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/chatbubble-arrow-right.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/check.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/ellipsis-v.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/empty_conversations.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/empty_search.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/exit.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/facemute-14x14.png (100%) rename browser/{components => extensions}/loop/content/shared/img/facemute-14x14@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/firefox-avatar.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/firefox-logo.png (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-email-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-facebook-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-help-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-link-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-user-16x16.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/hangup-inverse-14x14.png (100%) rename browser/{components => extensions}/loop/content/shared/img/hangup-inverse-14x14@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/happy.png (100%) rename browser/{components => extensions}/loop/content/shared/img/hello_logo.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/helloicon.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/icon_32.png (100%) rename browser/{components => extensions}/loop/content/shared/img/icon_64.png (100%) rename browser/{components => extensions}/loop/content/shared/img/icons-10x10.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/icons-14x14.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/icons-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/media-group-left-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/media-group-right-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/media-group.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/movistar.png (100%) rename browser/{components => extensions}/loop/content/shared/img/movistar@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/mute-inverse-14x14.png (100%) rename browser/{components => extensions}/loop/content/shared/img/mute-inverse-14x14@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/pause-12x12.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/play-12x12.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/sad.png (100%) rename browser/{components => extensions}/loop/content/shared/img/sad_hello_icon_64x64.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/settings-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/settings.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/sharing-active.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/sharing-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/sharing-pending.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/sharing.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/spinner.png (100%) rename browser/{components => extensions}/loop/content/shared/img/spinner.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/spinner@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/stop-12x12.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/telefonica.png (100%) rename browser/{components => extensions}/loop/content/shared/img/telefonica@2x.png (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/video-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/video-mute-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/video-mute.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/video.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/vivo.png (100%) rename browser/{components => extensions}/loop/content/shared/img/vivo@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/js/actions.js (100%) rename browser/{components => extensions}/loop/content/shared/js/activeRoomStore.js (100%) rename browser/{components => extensions}/loop/content/shared/js/crypto.js (100%) rename browser/{components => extensions}/loop/content/shared/js/dispatcher.js (100%) rename browser/{components => extensions}/loop/content/shared/js/linkifiedTextView.js (100%) rename browser/{components => extensions}/loop/content/shared/js/linkifiedTextView.jsx (100%) rename browser/{components => extensions}/loop/content/shared/js/loopapi-client.js (100%) rename browser/{components => extensions}/loop/content/shared/js/mixins.js (100%) rename browser/{components => extensions}/loop/content/shared/js/models.js (100%) rename browser/{components => extensions}/loop/content/shared/js/otSdkDriver.js (100%) rename browser/{components => extensions}/loop/content/shared/js/store.js (100%) rename browser/{components => extensions}/loop/content/shared/js/textChatStore.js (100%) rename browser/{components => extensions}/loop/content/shared/js/textChatView.js (100%) rename browser/{components => extensions}/loop/content/shared/js/textChatView.jsx (100%) rename browser/{components => extensions}/loop/content/shared/js/urlRegExps.js (100%) rename browser/{components => extensions}/loop/content/shared/js/utils.js (100%) rename browser/{components => extensions}/loop/content/shared/js/validate.js (100%) rename browser/{components => extensions}/loop/content/shared/js/views.js (100%) rename browser/{components => extensions}/loop/content/shared/js/views.jsx (100%) rename browser/{components => extensions}/loop/content/shared/sounds/connected.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/connecting.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/failure.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/message.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/ringtone.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/room-joined-in.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/room-joined.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/room-left.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/terminated.ogg (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/backbone-1.2.1.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/classnames-2.2.0.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/lodash-3.9.3.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/react-0.13.3-prod.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/react-0.13.3.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/css/ot.css (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-denied-chrome.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-denied-copy-firefox.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-denied-firefox.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-predenied-chrome.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-prompt-chrome.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/audioonly-publisher.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/audioonly-subscriber.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/buttons.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/loader.gif (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/mic-off.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/mic-on.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/speaker-off.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/speaker-on.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/js/dynamic_config.min.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk.js (100%) rename browser/{components => extensions}/loop/jar.mn (100%) rename browser/{components => extensions}/loop/manifest.ini (100%) rename browser/{components => extensions}/loop/moz.build (100%) rename browser/{components => extensions}/loop/run-all-loop-tests.sh (100%) rename browser/{components => extensions}/loop/standalone/.gitignore (100%) rename browser/{components => extensions}/loop/standalone/Makefile (100%) rename browser/{components => extensions}/loop/standalone/README.md (100%) rename browser/{components => extensions}/loop/standalone/content/css/webapp.css (100%) rename browser/{components => extensions}/loop/standalone/content/favicon.ico (100%) rename browser/{components => extensions}/loop/standalone/content/img/gum-chrome.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/gum-firefox.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/gum-opera.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/gum-others.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/hello-logo-text.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/logo.png (100%) rename browser/{components => extensions}/loop/standalone/content/img/mozilla-logo.svg (100%) rename browser/{components => extensions}/loop/standalone/content/index.html (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneAppStore.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneMetricsStore.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneMozLoop.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneRoomViews.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneRoomViews.jsx (100%) rename browser/{components => extensions}/loop/standalone/content/js/webapp.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/webapp.jsx (100%) rename browser/{components => extensions}/loop/standalone/content/l10n/en-US/loop.properties (100%) rename browser/{components => extensions}/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js (100%) rename browser/{components => extensions}/loop/standalone/content/libs/l10n-gaia-upstream.txt (100%) rename browser/{components => extensions}/loop/standalone/content/robots.txt (100%) rename browser/{components => extensions}/loop/standalone/content/webappEntryPoint.js (100%) rename browser/{components => extensions}/loop/standalone/package.json (100%) rename browser/{components => extensions}/loop/standalone/server.js (100%) rename browser/{components => extensions}/loop/standalone/webpack.config.js (100%) rename browser/{components => extensions}/loop/test/.eslintrc (100%) rename browser/{components => extensions}/loop/test/coverage/index.html (100%) rename browser/{components => extensions}/loop/test/desktop-local/.eslintrc (100%) rename browser/{components => extensions}/loop/test/desktop-local/README.md (100%) rename browser/{components => extensions}/loop/test/desktop-local/conversationAppStore_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/conversation_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/feedbackViews_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/index.html (100%) rename browser/{components => extensions}/loop/test/desktop-local/l10n_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/panel_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/roomStore_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/roomViews_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/test_desktop_all.py (100%) rename browser/{components => extensions}/loop/test/functional/config.py (100%) rename browser/{components => extensions}/loop/test/functional/hanging_threads.py (100%) rename browser/{components => extensions}/loop/test/functional/manifest.ini (100%) rename browser/{components => extensions}/loop/test/functional/serversetup.py (100%) rename browser/{components => extensions}/loop/test/functional/test_1_browser_call.py (100%) rename browser/{components => extensions}/loop/test/index.html (100%) rename browser/{components => extensions}/loop/test/karma/head.js (100%) rename browser/{components => extensions}/loop/test/karma/karma.conf.base.js (100%) rename browser/{components => extensions}/loop/test/karma/karma.coverage.desktop.js (100%) rename browser/{components => extensions}/loop/test/karma/karma.coverage.shared_standalone.js (100%) rename browser/{components => extensions}/loop/test/mochitest/.eslintrc (100%) rename browser/{components => extensions}/loop/test/mochitest/browser.ini (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_LoopRooms_channel.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_fxa_login.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_loop_fxa_server.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_appVersionInfo.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_chat.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_context.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_sharingListeners.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_socialShare.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_telemetry.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_toolbarbutton.js (100%) rename browser/{components => extensions}/loop/test/mochitest/head.js (100%) rename browser/{components => extensions}/loop/test/mochitest/loop_fxa.sjs (100%) rename browser/{components => extensions}/loop/test/mochitest/test_loopLinkClicker_channel.html (100%) rename browser/{components => extensions}/loop/test/package.json (100%) rename browser/{components => extensions}/loop/test/shared/activeRoomStore_test.js (100%) rename browser/{components => extensions}/loop/test/shared/crypto_test.js (100%) rename browser/{components => extensions}/loop/test/shared/dispatcher_test.js (100%) rename browser/{components => extensions}/loop/test/shared/frontend_tester.py (100%) rename browser/{components => extensions}/loop/test/shared/index.html (100%) rename browser/{components => extensions}/loop/test/shared/linkifiedTextView_test.js (100%) rename browser/{components => extensions}/loop/test/shared/loop_mocha_utils.js (100%) rename browser/{components => extensions}/loop/test/shared/loopapi-client_test.js (100%) rename browser/{components => extensions}/loop/test/shared/mixins_test.js (100%) rename browser/{components => extensions}/loop/test/shared/models_test.js (100%) rename browser/{components => extensions}/loop/test/shared/otSdkDriver_test.js (100%) rename browser/{components => extensions}/loop/test/shared/sdk_mock.js (100%) rename browser/{components => extensions}/loop/test/shared/store_test.js (100%) rename browser/{components => extensions}/loop/test/shared/test_shared_all.py (100%) rename browser/{components => extensions}/loop/test/shared/textChatStore_test.js (100%) rename browser/{components => extensions}/loop/test/shared/textChatView_test.js (100%) rename browser/{components => extensions}/loop/test/shared/utils_test.js (100%) rename browser/{components => extensions}/loop/test/shared/validate_test.js (100%) rename browser/{components => extensions}/loop/test/shared/vendor/chai-3.0.0.js (100%) rename browser/{components => extensions}/loop/test/shared/vendor/chai-as-promised-5.1.0.js (100%) rename browser/{components => extensions}/loop/test/shared/vendor/mocha-2.2.5.css (100%) rename browser/{components => extensions}/loop/test/shared/vendor/mocha-2.2.5.js (100%) rename browser/{components => extensions}/loop/test/shared/vendor/sinon-1.16.1.js (100%) rename browser/{components => extensions}/loop/test/shared/views_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/index.html (100%) rename browser/{components => extensions}/loop/test/standalone/standaloneAppStore_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/standaloneMetricsStore_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/standaloneMozLoop_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/standaloneRoomViews_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/test_standalone_all.py (100%) rename browser/{components => extensions}/loop/test/standalone/webapp_test.js (100%) rename browser/{components => extensions}/loop/test/ui-showcase/test_ui-showcase.py (100%) rename browser/{components => extensions}/loop/test/visual-regression/README.md (100%) rename browser/{components => extensions}/loop/test/visual-regression/screenshot (100%) rename browser/{components => extensions}/loop/test/xpcshell/.eslintrc (100%) rename browser/{components => extensions}/loop/test/xpcshell/head.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopapi_doNotDisturb.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopapi_internal.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopapi_prefs.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looppush_initialize.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms_first_notification.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms_getall.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_dnd.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_encryptionkey.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_hawk_errors.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_hawk_request.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_initialize.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_locales.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_loop_prefs.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_registration.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_registration_retry.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_restart.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_token_invalid.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_token_save.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_token_send.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_token_validation.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/xpcshell.ini (100%) rename browser/{components => extensions}/loop/ui/README.md (100%) rename browser/{components => extensions}/loop/ui/fake-l10n.js (100%) rename browser/{components => extensions}/loop/ui/fake-mozLoop.js (100%) rename browser/{components => extensions}/loop/ui/index.html (100%) rename browser/{components => extensions}/loop/ui/react-frame-component.js (100%) rename browser/{components => extensions}/loop/ui/sample-img/video-screen-local.png (100%) rename browser/{components => extensions}/loop/ui/sample-img/video-screen-remote.png (100%) rename browser/{components => extensions}/loop/ui/sample-img/video-screen-terminal.png (100%) rename browser/{components => extensions}/loop/ui/ui-showcase.css (100%) rename browser/{components => extensions}/loop/ui/ui-showcase.js (100%) rename browser/{components => extensions}/loop/ui/ui-showcase.jsx (100%) diff --git a/browser/components/loop/.eslintignore b/browser/extensions/loop/.eslintignore similarity index 100% rename from browser/components/loop/.eslintignore rename to browser/extensions/loop/.eslintignore diff --git a/browser/components/loop/.eslintrc b/browser/extensions/loop/.eslintrc similarity index 100% rename from browser/components/loop/.eslintrc rename to browser/extensions/loop/.eslintrc diff --git a/browser/components/loop/.eslintrc-gecko b/browser/extensions/loop/.eslintrc-gecko similarity index 100% rename from browser/components/loop/.eslintrc-gecko rename to browser/extensions/loop/.eslintrc-gecko diff --git a/browser/components/loop/.gitignore b/browser/extensions/loop/.gitignore similarity index 100% rename from browser/components/loop/.gitignore rename to browser/extensions/loop/.gitignore diff --git a/browser/components/loop/README.txt b/browser/extensions/loop/README.txt similarity index 100% rename from browser/components/loop/README.txt rename to browser/extensions/loop/README.txt diff --git a/browser/components/loop/build-jsx b/browser/extensions/loop/build-jsx similarity index 100% rename from browser/components/loop/build-jsx rename to browser/extensions/loop/build-jsx diff --git a/browser/components/loop/modules/.eslintrc b/browser/extensions/loop/content/modules/.eslintrc similarity index 100% rename from browser/components/loop/modules/.eslintrc rename to browser/extensions/loop/content/modules/.eslintrc diff --git a/browser/components/loop/modules/LoopRooms.jsm b/browser/extensions/loop/content/modules/LoopRooms.jsm similarity index 100% rename from browser/components/loop/modules/LoopRooms.jsm rename to browser/extensions/loop/content/modules/LoopRooms.jsm diff --git a/browser/components/loop/modules/LoopRoomsCache.jsm b/browser/extensions/loop/content/modules/LoopRoomsCache.jsm similarity index 100% rename from browser/components/loop/modules/LoopRoomsCache.jsm rename to browser/extensions/loop/content/modules/LoopRoomsCache.jsm diff --git a/browser/components/loop/modules/MozLoopAPI.jsm b/browser/extensions/loop/content/modules/MozLoopAPI.jsm similarity index 100% rename from browser/components/loop/modules/MozLoopAPI.jsm rename to browser/extensions/loop/content/modules/MozLoopAPI.jsm diff --git a/browser/components/loop/modules/MozLoopPushHandler.jsm b/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm similarity index 100% rename from browser/components/loop/modules/MozLoopPushHandler.jsm rename to browser/extensions/loop/content/modules/MozLoopPushHandler.jsm diff --git a/browser/components/loop/modules/MozLoopService.jsm b/browser/extensions/loop/content/modules/MozLoopService.jsm similarity index 100% rename from browser/components/loop/modules/MozLoopService.jsm rename to browser/extensions/loop/content/modules/MozLoopService.jsm diff --git a/browser/components/loop/modules/MozLoopWorker.js b/browser/extensions/loop/content/modules/MozLoopWorker.js similarity index 100% rename from browser/components/loop/modules/MozLoopWorker.js rename to browser/extensions/loop/content/modules/MozLoopWorker.js diff --git a/browser/components/loop/content/conversation.html b/browser/extensions/loop/content/panels/conversation.html similarity index 100% rename from browser/components/loop/content/conversation.html rename to browser/extensions/loop/content/panels/conversation.html diff --git a/browser/components/loop/content/css/panel.css b/browser/extensions/loop/content/panels/css/panel.css similarity index 100% rename from browser/components/loop/content/css/panel.css rename to browser/extensions/loop/content/panels/css/panel.css diff --git a/browser/components/loop/content/js/.eslintrc b/browser/extensions/loop/content/panels/js/.eslintrc similarity index 100% rename from browser/components/loop/content/js/.eslintrc rename to browser/extensions/loop/content/panels/js/.eslintrc diff --git a/browser/components/loop/content/js/conversation.js b/browser/extensions/loop/content/panels/js/conversation.js similarity index 100% rename from browser/components/loop/content/js/conversation.js rename to browser/extensions/loop/content/panels/js/conversation.js diff --git a/browser/components/loop/content/js/conversation.jsx b/browser/extensions/loop/content/panels/js/conversation.jsx similarity index 100% rename from browser/components/loop/content/js/conversation.jsx rename to browser/extensions/loop/content/panels/js/conversation.jsx diff --git a/browser/components/loop/content/js/conversationAppStore.js b/browser/extensions/loop/content/panels/js/conversationAppStore.js similarity index 100% rename from browser/components/loop/content/js/conversationAppStore.js rename to browser/extensions/loop/content/panels/js/conversationAppStore.js diff --git a/browser/components/loop/content/js/feedbackViews.js b/browser/extensions/loop/content/panels/js/feedbackViews.js similarity index 100% rename from browser/components/loop/content/js/feedbackViews.js rename to browser/extensions/loop/content/panels/js/feedbackViews.js diff --git a/browser/components/loop/content/js/feedbackViews.jsx b/browser/extensions/loop/content/panels/js/feedbackViews.jsx similarity index 100% rename from browser/components/loop/content/js/feedbackViews.jsx rename to browser/extensions/loop/content/panels/js/feedbackViews.jsx diff --git a/browser/components/loop/content/js/otconfig.js b/browser/extensions/loop/content/panels/js/otconfig.js similarity index 100% rename from browser/components/loop/content/js/otconfig.js rename to browser/extensions/loop/content/panels/js/otconfig.js diff --git a/browser/components/loop/content/js/panel.js b/browser/extensions/loop/content/panels/js/panel.js similarity index 100% rename from browser/components/loop/content/js/panel.js rename to browser/extensions/loop/content/panels/js/panel.js diff --git a/browser/components/loop/content/js/panel.jsx b/browser/extensions/loop/content/panels/js/panel.jsx similarity index 100% rename from browser/components/loop/content/js/panel.jsx rename to browser/extensions/loop/content/panels/js/panel.jsx diff --git a/browser/components/loop/content/js/roomStore.js b/browser/extensions/loop/content/panels/js/roomStore.js similarity index 100% rename from browser/components/loop/content/js/roomStore.js rename to browser/extensions/loop/content/panels/js/roomStore.js diff --git a/browser/components/loop/content/js/roomViews.js b/browser/extensions/loop/content/panels/js/roomViews.js similarity index 100% rename from browser/components/loop/content/js/roomViews.js rename to browser/extensions/loop/content/panels/js/roomViews.js diff --git a/browser/components/loop/content/js/roomViews.jsx b/browser/extensions/loop/content/panels/js/roomViews.jsx similarity index 100% rename from browser/components/loop/content/js/roomViews.jsx rename to browser/extensions/loop/content/panels/js/roomViews.jsx diff --git a/browser/components/loop/content/panel.html b/browser/extensions/loop/content/panels/panel.html similarity index 100% rename from browser/components/loop/content/panel.html rename to browser/extensions/loop/content/panels/panel.html diff --git a/browser/components/loop/content/libs/l10n.js b/browser/extensions/loop/content/panels/vendor/l10n.js similarity index 100% rename from browser/components/loop/content/libs/l10n.js rename to browser/extensions/loop/content/panels/vendor/l10n.js diff --git a/browser/components/loop/content/shared/README.md b/browser/extensions/loop/content/shared/README.md similarity index 100% rename from browser/components/loop/content/shared/README.md rename to browser/extensions/loop/content/shared/README.md diff --git a/browser/components/loop/content/shared/css/common.css b/browser/extensions/loop/content/shared/css/common.css similarity index 100% rename from browser/components/loop/content/shared/css/common.css rename to browser/extensions/loop/content/shared/css/common.css diff --git a/browser/components/loop/content/shared/css/conversation.css b/browser/extensions/loop/content/shared/css/conversation.css similarity index 100% rename from browser/components/loop/content/shared/css/conversation.css rename to browser/extensions/loop/content/shared/css/conversation.css diff --git a/browser/components/loop/content/shared/css/reset.css b/browser/extensions/loop/content/shared/css/reset.css similarity index 100% rename from browser/components/loop/content/shared/css/reset.css rename to browser/extensions/loop/content/shared/css/reset.css diff --git a/browser/components/loop/content/shared/img/02.png b/browser/extensions/loop/content/shared/img/02.png similarity index 100% rename from browser/components/loop/content/shared/img/02.png rename to browser/extensions/loop/content/shared/img/02.png diff --git a/browser/components/loop/content/shared/img/02@2x.png b/browser/extensions/loop/content/shared/img/02@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/02@2x.png rename to browser/extensions/loop/content/shared/img/02@2x.png diff --git a/browser/components/loop/content/shared/img/animated-spinner.svg b/browser/extensions/loop/content/shared/img/animated-spinner.svg similarity index 100% rename from browser/components/loop/content/shared/img/animated-spinner.svg rename to browser/extensions/loop/content/shared/img/animated-spinner.svg diff --git a/browser/components/loop/content/shared/img/audio-call-avatar.svg b/browser/extensions/loop/content/shared/img/audio-call-avatar.svg similarity index 100% rename from browser/components/loop/content/shared/img/audio-call-avatar.svg rename to browser/extensions/loop/content/shared/img/audio-call-avatar.svg diff --git a/browser/components/loop/content/shared/img/audio-default-16x16@1.5x.png b/browser/extensions/loop/content/shared/img/audio-default-16x16@1.5x.png similarity index 100% rename from browser/components/loop/content/shared/img/audio-default-16x16@1.5x.png rename to browser/extensions/loop/content/shared/img/audio-default-16x16@1.5x.png diff --git a/browser/components/loop/content/shared/img/audio-default-16x16@2x.png b/browser/extensions/loop/content/shared/img/audio-default-16x16@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/audio-default-16x16@2x.png rename to browser/extensions/loop/content/shared/img/audio-default-16x16@2x.png diff --git a/browser/components/loop/content/shared/img/svg/audio-hover.svg b/browser/extensions/loop/content/shared/img/audio-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/audio-hover.svg rename to browser/extensions/loop/content/shared/img/audio-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/audio-mute-hover.svg b/browser/extensions/loop/content/shared/img/audio-mute-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/audio-mute-hover.svg rename to browser/extensions/loop/content/shared/img/audio-mute-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/audio-mute.svg b/browser/extensions/loop/content/shared/img/audio-mute.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/audio-mute.svg rename to browser/extensions/loop/content/shared/img/audio-mute.svg diff --git a/browser/components/loop/content/shared/img/svg/audio.svg b/browser/extensions/loop/content/shared/img/audio.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/audio.svg rename to browser/extensions/loop/content/shared/img/audio.svg diff --git a/browser/components/loop/content/shared/img/avatars.svg b/browser/extensions/loop/content/shared/img/avatars.svg similarity index 100% rename from browser/components/loop/content/shared/img/avatars.svg rename to browser/extensions/loop/content/shared/img/avatars.svg diff --git a/browser/components/loop/content/shared/img/beta-ribbon.svg b/browser/extensions/loop/content/shared/img/beta-ribbon.svg similarity index 100% rename from browser/components/loop/content/shared/img/beta-ribbon.svg rename to browser/extensions/loop/content/shared/img/beta-ribbon.svg diff --git a/browser/components/loop/content/shared/img/svg/cam_audio-no.svg b/browser/extensions/loop/content/shared/img/cam_audio-no.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/cam_audio-no.svg rename to browser/extensions/loop/content/shared/img/cam_audio-no.svg diff --git a/browser/components/loop/content/shared/img/svg/cam_audio.svg b/browser/extensions/loop/content/shared/img/cam_audio.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/cam_audio.svg rename to browser/extensions/loop/content/shared/img/cam_audio.svg diff --git a/browser/components/loop/content/shared/img/svg/cam_audio_h.svg b/browser/extensions/loop/content/shared/img/cam_audio_h.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/cam_audio_h.svg rename to browser/extensions/loop/content/shared/img/cam_audio_h.svg diff --git a/browser/components/loop/content/shared/img/chatbubble-arrow-left.svg b/browser/extensions/loop/content/shared/img/chatbubble-arrow-left.svg similarity index 100% rename from browser/components/loop/content/shared/img/chatbubble-arrow-left.svg rename to browser/extensions/loop/content/shared/img/chatbubble-arrow-left.svg diff --git a/browser/components/loop/content/shared/img/chatbubble-arrow-right.svg b/browser/extensions/loop/content/shared/img/chatbubble-arrow-right.svg similarity index 100% rename from browser/components/loop/content/shared/img/chatbubble-arrow-right.svg rename to browser/extensions/loop/content/shared/img/chatbubble-arrow-right.svg diff --git a/browser/components/loop/content/shared/img/check.svg b/browser/extensions/loop/content/shared/img/check.svg similarity index 100% rename from browser/components/loop/content/shared/img/check.svg rename to browser/extensions/loop/content/shared/img/check.svg diff --git a/browser/components/loop/content/shared/img/ellipsis-v.svg b/browser/extensions/loop/content/shared/img/ellipsis-v.svg similarity index 100% rename from browser/components/loop/content/shared/img/ellipsis-v.svg rename to browser/extensions/loop/content/shared/img/ellipsis-v.svg diff --git a/browser/components/loop/content/shared/img/empty_conversations.svg b/browser/extensions/loop/content/shared/img/empty_conversations.svg similarity index 100% rename from browser/components/loop/content/shared/img/empty_conversations.svg rename to browser/extensions/loop/content/shared/img/empty_conversations.svg diff --git a/browser/components/loop/content/shared/img/empty_search.svg b/browser/extensions/loop/content/shared/img/empty_search.svg similarity index 100% rename from browser/components/loop/content/shared/img/empty_search.svg rename to browser/extensions/loop/content/shared/img/empty_search.svg diff --git a/browser/components/loop/content/shared/img/svg/exit.svg b/browser/extensions/loop/content/shared/img/exit.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/exit.svg rename to browser/extensions/loop/content/shared/img/exit.svg diff --git a/browser/components/loop/content/shared/img/facemute-14x14.png b/browser/extensions/loop/content/shared/img/facemute-14x14.png similarity index 100% rename from browser/components/loop/content/shared/img/facemute-14x14.png rename to browser/extensions/loop/content/shared/img/facemute-14x14.png diff --git a/browser/components/loop/content/shared/img/facemute-14x14@2x.png b/browser/extensions/loop/content/shared/img/facemute-14x14@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/facemute-14x14@2x.png rename to browser/extensions/loop/content/shared/img/facemute-14x14@2x.png diff --git a/browser/components/loop/content/shared/img/firefox-avatar.svg b/browser/extensions/loop/content/shared/img/firefox-avatar.svg similarity index 100% rename from browser/components/loop/content/shared/img/firefox-avatar.svg rename to browser/extensions/loop/content/shared/img/firefox-avatar.svg diff --git a/browser/components/loop/content/shared/img/firefox-logo.png b/browser/extensions/loop/content/shared/img/firefox-logo.png similarity index 100% rename from browser/components/loop/content/shared/img/firefox-logo.png rename to browser/extensions/loop/content/shared/img/firefox-logo.png diff --git a/browser/components/loop/content/shared/img/svg/glyph-email-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-email-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-email-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-email-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/glyph-facebook-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-facebook-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-facebook-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-facebook-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/glyph-help-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-help-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-help-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-help-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/glyph-link-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-link-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-link-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-link-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/glyph-user-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-user-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-user-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-user-16x16.svg diff --git a/browser/components/loop/content/shared/img/hangup-inverse-14x14.png b/browser/extensions/loop/content/shared/img/hangup-inverse-14x14.png similarity index 100% rename from browser/components/loop/content/shared/img/hangup-inverse-14x14.png rename to browser/extensions/loop/content/shared/img/hangup-inverse-14x14.png diff --git a/browser/components/loop/content/shared/img/hangup-inverse-14x14@2x.png b/browser/extensions/loop/content/shared/img/hangup-inverse-14x14@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/hangup-inverse-14x14@2x.png rename to browser/extensions/loop/content/shared/img/hangup-inverse-14x14@2x.png diff --git a/browser/components/loop/content/shared/img/happy.png b/browser/extensions/loop/content/shared/img/happy.png similarity index 100% rename from browser/components/loop/content/shared/img/happy.png rename to browser/extensions/loop/content/shared/img/happy.png diff --git a/browser/components/loop/content/shared/img/hello_logo.svg b/browser/extensions/loop/content/shared/img/hello_logo.svg similarity index 100% rename from browser/components/loop/content/shared/img/hello_logo.svg rename to browser/extensions/loop/content/shared/img/hello_logo.svg diff --git a/browser/components/loop/content/shared/img/helloicon.svg b/browser/extensions/loop/content/shared/img/helloicon.svg similarity index 100% rename from browser/components/loop/content/shared/img/helloicon.svg rename to browser/extensions/loop/content/shared/img/helloicon.svg diff --git a/browser/components/loop/content/shared/img/icon_32.png b/browser/extensions/loop/content/shared/img/icon_32.png similarity index 100% rename from browser/components/loop/content/shared/img/icon_32.png rename to browser/extensions/loop/content/shared/img/icon_32.png diff --git a/browser/components/loop/content/shared/img/icon_64.png b/browser/extensions/loop/content/shared/img/icon_64.png similarity index 100% rename from browser/components/loop/content/shared/img/icon_64.png rename to browser/extensions/loop/content/shared/img/icon_64.png diff --git a/browser/components/loop/content/shared/img/icons-10x10.svg b/browser/extensions/loop/content/shared/img/icons-10x10.svg similarity index 100% rename from browser/components/loop/content/shared/img/icons-10x10.svg rename to browser/extensions/loop/content/shared/img/icons-10x10.svg diff --git a/browser/components/loop/content/shared/img/icons-14x14.svg b/browser/extensions/loop/content/shared/img/icons-14x14.svg similarity index 100% rename from browser/components/loop/content/shared/img/icons-14x14.svg rename to browser/extensions/loop/content/shared/img/icons-14x14.svg diff --git a/browser/components/loop/content/shared/img/icons-16x16.svg b/browser/extensions/loop/content/shared/img/icons-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/icons-16x16.svg rename to browser/extensions/loop/content/shared/img/icons-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/media-group-left-hover.svg b/browser/extensions/loop/content/shared/img/media-group-left-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/media-group-left-hover.svg rename to browser/extensions/loop/content/shared/img/media-group-left-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/media-group-right-hover.svg b/browser/extensions/loop/content/shared/img/media-group-right-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/media-group-right-hover.svg rename to browser/extensions/loop/content/shared/img/media-group-right-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/media-group.svg b/browser/extensions/loop/content/shared/img/media-group.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/media-group.svg rename to browser/extensions/loop/content/shared/img/media-group.svg diff --git a/browser/components/loop/content/shared/img/movistar.png b/browser/extensions/loop/content/shared/img/movistar.png similarity index 100% rename from browser/components/loop/content/shared/img/movistar.png rename to browser/extensions/loop/content/shared/img/movistar.png diff --git a/browser/components/loop/content/shared/img/movistar@2x.png b/browser/extensions/loop/content/shared/img/movistar@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/movistar@2x.png rename to browser/extensions/loop/content/shared/img/movistar@2x.png diff --git a/browser/components/loop/content/shared/img/mute-inverse-14x14.png b/browser/extensions/loop/content/shared/img/mute-inverse-14x14.png similarity index 100% rename from browser/components/loop/content/shared/img/mute-inverse-14x14.png rename to browser/extensions/loop/content/shared/img/mute-inverse-14x14.png diff --git a/browser/components/loop/content/shared/img/mute-inverse-14x14@2x.png b/browser/extensions/loop/content/shared/img/mute-inverse-14x14@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/mute-inverse-14x14@2x.png rename to browser/extensions/loop/content/shared/img/mute-inverse-14x14@2x.png diff --git a/browser/components/loop/content/shared/img/pause-12x12.svg b/browser/extensions/loop/content/shared/img/pause-12x12.svg similarity index 100% rename from browser/components/loop/content/shared/img/pause-12x12.svg rename to browser/extensions/loop/content/shared/img/pause-12x12.svg diff --git a/browser/components/loop/content/shared/img/play-12x12.svg b/browser/extensions/loop/content/shared/img/play-12x12.svg similarity index 100% rename from browser/components/loop/content/shared/img/play-12x12.svg rename to browser/extensions/loop/content/shared/img/play-12x12.svg diff --git a/browser/components/loop/content/shared/img/sad.png b/browser/extensions/loop/content/shared/img/sad.png similarity index 100% rename from browser/components/loop/content/shared/img/sad.png rename to browser/extensions/loop/content/shared/img/sad.png diff --git a/browser/components/loop/content/shared/img/sad_hello_icon_64x64.svg b/browser/extensions/loop/content/shared/img/sad_hello_icon_64x64.svg similarity index 100% rename from browser/components/loop/content/shared/img/sad_hello_icon_64x64.svg rename to browser/extensions/loop/content/shared/img/sad_hello_icon_64x64.svg diff --git a/browser/components/loop/content/shared/img/svg/settings-hover.svg b/browser/extensions/loop/content/shared/img/settings-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/settings-hover.svg rename to browser/extensions/loop/content/shared/img/settings-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/settings.svg b/browser/extensions/loop/content/shared/img/settings.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/settings.svg rename to browser/extensions/loop/content/shared/img/settings.svg diff --git a/browser/components/loop/content/shared/img/svg/sharing-active.svg b/browser/extensions/loop/content/shared/img/sharing-active.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/sharing-active.svg rename to browser/extensions/loop/content/shared/img/sharing-active.svg diff --git a/browser/components/loop/content/shared/img/svg/sharing-hover.svg b/browser/extensions/loop/content/shared/img/sharing-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/sharing-hover.svg rename to browser/extensions/loop/content/shared/img/sharing-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/sharing-pending.svg b/browser/extensions/loop/content/shared/img/sharing-pending.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/sharing-pending.svg rename to browser/extensions/loop/content/shared/img/sharing-pending.svg diff --git a/browser/components/loop/content/shared/img/svg/sharing.svg b/browser/extensions/loop/content/shared/img/sharing.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/sharing.svg rename to browser/extensions/loop/content/shared/img/sharing.svg diff --git a/browser/components/loop/content/shared/img/spinner.png b/browser/extensions/loop/content/shared/img/spinner.png similarity index 100% rename from browser/components/loop/content/shared/img/spinner.png rename to browser/extensions/loop/content/shared/img/spinner.png diff --git a/browser/components/loop/content/shared/img/spinner.svg b/browser/extensions/loop/content/shared/img/spinner.svg similarity index 100% rename from browser/components/loop/content/shared/img/spinner.svg rename to browser/extensions/loop/content/shared/img/spinner.svg diff --git a/browser/components/loop/content/shared/img/spinner@2x.png b/browser/extensions/loop/content/shared/img/spinner@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/spinner@2x.png rename to browser/extensions/loop/content/shared/img/spinner@2x.png diff --git a/browser/components/loop/content/shared/img/stop-12x12.svg b/browser/extensions/loop/content/shared/img/stop-12x12.svg similarity index 100% rename from browser/components/loop/content/shared/img/stop-12x12.svg rename to browser/extensions/loop/content/shared/img/stop-12x12.svg diff --git a/browser/components/loop/content/shared/img/telefonica.png b/browser/extensions/loop/content/shared/img/telefonica.png similarity index 100% rename from browser/components/loop/content/shared/img/telefonica.png rename to browser/extensions/loop/content/shared/img/telefonica.png diff --git a/browser/components/loop/content/shared/img/telefonica@2x.png b/browser/extensions/loop/content/shared/img/telefonica@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/telefonica@2x.png rename to browser/extensions/loop/content/shared/img/telefonica@2x.png diff --git a/browser/components/loop/content/shared/img/svg/video-hover.svg b/browser/extensions/loop/content/shared/img/video-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/video-hover.svg rename to browser/extensions/loop/content/shared/img/video-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/video-mute-hover.svg b/browser/extensions/loop/content/shared/img/video-mute-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/video-mute-hover.svg rename to browser/extensions/loop/content/shared/img/video-mute-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/video-mute.svg b/browser/extensions/loop/content/shared/img/video-mute.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/video-mute.svg rename to browser/extensions/loop/content/shared/img/video-mute.svg diff --git a/browser/components/loop/content/shared/img/svg/video.svg b/browser/extensions/loop/content/shared/img/video.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/video.svg rename to browser/extensions/loop/content/shared/img/video.svg diff --git a/browser/components/loop/content/shared/img/vivo.png b/browser/extensions/loop/content/shared/img/vivo.png similarity index 100% rename from browser/components/loop/content/shared/img/vivo.png rename to browser/extensions/loop/content/shared/img/vivo.png diff --git a/browser/components/loop/content/shared/img/vivo@2x.png b/browser/extensions/loop/content/shared/img/vivo@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/vivo@2x.png rename to browser/extensions/loop/content/shared/img/vivo@2x.png diff --git a/browser/components/loop/content/shared/js/actions.js b/browser/extensions/loop/content/shared/js/actions.js similarity index 100% rename from browser/components/loop/content/shared/js/actions.js rename to browser/extensions/loop/content/shared/js/actions.js diff --git a/browser/components/loop/content/shared/js/activeRoomStore.js b/browser/extensions/loop/content/shared/js/activeRoomStore.js similarity index 100% rename from browser/components/loop/content/shared/js/activeRoomStore.js rename to browser/extensions/loop/content/shared/js/activeRoomStore.js diff --git a/browser/components/loop/content/shared/js/crypto.js b/browser/extensions/loop/content/shared/js/crypto.js similarity index 100% rename from browser/components/loop/content/shared/js/crypto.js rename to browser/extensions/loop/content/shared/js/crypto.js diff --git a/browser/components/loop/content/shared/js/dispatcher.js b/browser/extensions/loop/content/shared/js/dispatcher.js similarity index 100% rename from browser/components/loop/content/shared/js/dispatcher.js rename to browser/extensions/loop/content/shared/js/dispatcher.js diff --git a/browser/components/loop/content/shared/js/linkifiedTextView.js b/browser/extensions/loop/content/shared/js/linkifiedTextView.js similarity index 100% rename from browser/components/loop/content/shared/js/linkifiedTextView.js rename to browser/extensions/loop/content/shared/js/linkifiedTextView.js diff --git a/browser/components/loop/content/shared/js/linkifiedTextView.jsx b/browser/extensions/loop/content/shared/js/linkifiedTextView.jsx similarity index 100% rename from browser/components/loop/content/shared/js/linkifiedTextView.jsx rename to browser/extensions/loop/content/shared/js/linkifiedTextView.jsx diff --git a/browser/components/loop/content/shared/js/loopapi-client.js b/browser/extensions/loop/content/shared/js/loopapi-client.js similarity index 100% rename from browser/components/loop/content/shared/js/loopapi-client.js rename to browser/extensions/loop/content/shared/js/loopapi-client.js diff --git a/browser/components/loop/content/shared/js/mixins.js b/browser/extensions/loop/content/shared/js/mixins.js similarity index 100% rename from browser/components/loop/content/shared/js/mixins.js rename to browser/extensions/loop/content/shared/js/mixins.js diff --git a/browser/components/loop/content/shared/js/models.js b/browser/extensions/loop/content/shared/js/models.js similarity index 100% rename from browser/components/loop/content/shared/js/models.js rename to browser/extensions/loop/content/shared/js/models.js diff --git a/browser/components/loop/content/shared/js/otSdkDriver.js b/browser/extensions/loop/content/shared/js/otSdkDriver.js similarity index 100% rename from browser/components/loop/content/shared/js/otSdkDriver.js rename to browser/extensions/loop/content/shared/js/otSdkDriver.js diff --git a/browser/components/loop/content/shared/js/store.js b/browser/extensions/loop/content/shared/js/store.js similarity index 100% rename from browser/components/loop/content/shared/js/store.js rename to browser/extensions/loop/content/shared/js/store.js diff --git a/browser/components/loop/content/shared/js/textChatStore.js b/browser/extensions/loop/content/shared/js/textChatStore.js similarity index 100% rename from browser/components/loop/content/shared/js/textChatStore.js rename to browser/extensions/loop/content/shared/js/textChatStore.js diff --git a/browser/components/loop/content/shared/js/textChatView.js b/browser/extensions/loop/content/shared/js/textChatView.js similarity index 100% rename from browser/components/loop/content/shared/js/textChatView.js rename to browser/extensions/loop/content/shared/js/textChatView.js diff --git a/browser/components/loop/content/shared/js/textChatView.jsx b/browser/extensions/loop/content/shared/js/textChatView.jsx similarity index 100% rename from browser/components/loop/content/shared/js/textChatView.jsx rename to browser/extensions/loop/content/shared/js/textChatView.jsx diff --git a/browser/components/loop/content/shared/js/urlRegExps.js b/browser/extensions/loop/content/shared/js/urlRegExps.js similarity index 100% rename from browser/components/loop/content/shared/js/urlRegExps.js rename to browser/extensions/loop/content/shared/js/urlRegExps.js diff --git a/browser/components/loop/content/shared/js/utils.js b/browser/extensions/loop/content/shared/js/utils.js similarity index 100% rename from browser/components/loop/content/shared/js/utils.js rename to browser/extensions/loop/content/shared/js/utils.js diff --git a/browser/components/loop/content/shared/js/validate.js b/browser/extensions/loop/content/shared/js/validate.js similarity index 100% rename from browser/components/loop/content/shared/js/validate.js rename to browser/extensions/loop/content/shared/js/validate.js diff --git a/browser/components/loop/content/shared/js/views.js b/browser/extensions/loop/content/shared/js/views.js similarity index 100% rename from browser/components/loop/content/shared/js/views.js rename to browser/extensions/loop/content/shared/js/views.js diff --git a/browser/components/loop/content/shared/js/views.jsx b/browser/extensions/loop/content/shared/js/views.jsx similarity index 100% rename from browser/components/loop/content/shared/js/views.jsx rename to browser/extensions/loop/content/shared/js/views.jsx diff --git a/browser/components/loop/content/shared/sounds/connected.ogg b/browser/extensions/loop/content/shared/sounds/connected.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/connected.ogg rename to browser/extensions/loop/content/shared/sounds/connected.ogg diff --git a/browser/components/loop/content/shared/sounds/connecting.ogg b/browser/extensions/loop/content/shared/sounds/connecting.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/connecting.ogg rename to browser/extensions/loop/content/shared/sounds/connecting.ogg diff --git a/browser/components/loop/content/shared/sounds/failure.ogg b/browser/extensions/loop/content/shared/sounds/failure.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/failure.ogg rename to browser/extensions/loop/content/shared/sounds/failure.ogg diff --git a/browser/components/loop/content/shared/sounds/message.ogg b/browser/extensions/loop/content/shared/sounds/message.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/message.ogg rename to browser/extensions/loop/content/shared/sounds/message.ogg diff --git a/browser/components/loop/content/shared/sounds/ringtone.ogg b/browser/extensions/loop/content/shared/sounds/ringtone.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/ringtone.ogg rename to browser/extensions/loop/content/shared/sounds/ringtone.ogg diff --git a/browser/components/loop/content/shared/sounds/room-joined-in.ogg b/browser/extensions/loop/content/shared/sounds/room-joined-in.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/room-joined-in.ogg rename to browser/extensions/loop/content/shared/sounds/room-joined-in.ogg diff --git a/browser/components/loop/content/shared/sounds/room-joined.ogg b/browser/extensions/loop/content/shared/sounds/room-joined.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/room-joined.ogg rename to browser/extensions/loop/content/shared/sounds/room-joined.ogg diff --git a/browser/components/loop/content/shared/sounds/room-left.ogg b/browser/extensions/loop/content/shared/sounds/room-left.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/room-left.ogg rename to browser/extensions/loop/content/shared/sounds/room-left.ogg diff --git a/browser/components/loop/content/shared/sounds/terminated.ogg b/browser/extensions/loop/content/shared/sounds/terminated.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/terminated.ogg rename to browser/extensions/loop/content/shared/sounds/terminated.ogg diff --git a/browser/components/loop/content/shared/libs/backbone-1.2.1.js b/browser/extensions/loop/content/shared/vendor/backbone-1.2.1.js similarity index 100% rename from browser/components/loop/content/shared/libs/backbone-1.2.1.js rename to browser/extensions/loop/content/shared/vendor/backbone-1.2.1.js diff --git a/browser/components/loop/content/shared/libs/classnames-2.2.0.js b/browser/extensions/loop/content/shared/vendor/classnames-2.2.0.js similarity index 100% rename from browser/components/loop/content/shared/libs/classnames-2.2.0.js rename to browser/extensions/loop/content/shared/vendor/classnames-2.2.0.js diff --git a/browser/components/loop/content/shared/libs/lodash-3.9.3.js b/browser/extensions/loop/content/shared/vendor/lodash-3.9.3.js similarity index 100% rename from browser/components/loop/content/shared/libs/lodash-3.9.3.js rename to browser/extensions/loop/content/shared/vendor/lodash-3.9.3.js diff --git a/browser/components/loop/content/shared/libs/react-0.13.3-prod.js b/browser/extensions/loop/content/shared/vendor/react-0.13.3-prod.js similarity index 100% rename from browser/components/loop/content/shared/libs/react-0.13.3-prod.js rename to browser/extensions/loop/content/shared/vendor/react-0.13.3-prod.js diff --git a/browser/components/loop/content/shared/libs/react-0.13.3.js b/browser/extensions/loop/content/shared/vendor/react-0.13.3.js similarity index 100% rename from browser/components/loop/content/shared/libs/react-0.13.3.js rename to browser/extensions/loop/content/shared/vendor/react-0.13.3.js diff --git a/browser/components/loop/content/shared/libs/sdk-content/css/ot.css b/browser/extensions/loop/content/shared/vendor/sdk-content/css/ot.css similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/css/ot.css rename to browser/extensions/loop/content/shared/vendor/sdk-content/css/ot.css diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-chrome.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-chrome.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-chrome.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-chrome.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-copy-firefox.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-copy-firefox.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-copy-firefox.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-copy-firefox.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-firefox.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-firefox.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-firefox.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-firefox.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-predenied-chrome.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-predenied-chrome.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-predenied-chrome.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-predenied-chrome.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-prompt-chrome.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-prompt-chrome.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-prompt-chrome.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-prompt-chrome.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-publisher.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-publisher.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-publisher.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-publisher.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-subscriber.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-subscriber.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-subscriber.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-subscriber.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/buttons.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/buttons.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/buttons.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/buttons.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/loader.gif b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/loader.gif similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/loader.gif rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/loader.gif diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-off.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-off.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-off.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-off.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-on.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-on.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-on.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-on.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-off.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-off.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-off.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-off.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-on.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-on.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-on.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-on.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/js/dynamic_config.min.js b/browser/extensions/loop/content/shared/vendor/sdk-content/js/dynamic_config.min.js similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/js/dynamic_config.min.js rename to browser/extensions/loop/content/shared/vendor/sdk-content/js/dynamic_config.min.js diff --git a/browser/components/loop/content/shared/libs/sdk.js b/browser/extensions/loop/content/shared/vendor/sdk.js similarity index 100% rename from browser/components/loop/content/shared/libs/sdk.js rename to browser/extensions/loop/content/shared/vendor/sdk.js diff --git a/browser/components/loop/jar.mn b/browser/extensions/loop/jar.mn similarity index 100% rename from browser/components/loop/jar.mn rename to browser/extensions/loop/jar.mn diff --git a/browser/components/loop/manifest.ini b/browser/extensions/loop/manifest.ini similarity index 100% rename from browser/components/loop/manifest.ini rename to browser/extensions/loop/manifest.ini diff --git a/browser/components/loop/moz.build b/browser/extensions/loop/moz.build similarity index 100% rename from browser/components/loop/moz.build rename to browser/extensions/loop/moz.build diff --git a/browser/components/loop/run-all-loop-tests.sh b/browser/extensions/loop/run-all-loop-tests.sh similarity index 100% rename from browser/components/loop/run-all-loop-tests.sh rename to browser/extensions/loop/run-all-loop-tests.sh diff --git a/browser/components/loop/standalone/.gitignore b/browser/extensions/loop/standalone/.gitignore similarity index 100% rename from browser/components/loop/standalone/.gitignore rename to browser/extensions/loop/standalone/.gitignore diff --git a/browser/components/loop/standalone/Makefile b/browser/extensions/loop/standalone/Makefile similarity index 100% rename from browser/components/loop/standalone/Makefile rename to browser/extensions/loop/standalone/Makefile diff --git a/browser/components/loop/standalone/README.md b/browser/extensions/loop/standalone/README.md similarity index 100% rename from browser/components/loop/standalone/README.md rename to browser/extensions/loop/standalone/README.md diff --git a/browser/components/loop/standalone/content/css/webapp.css b/browser/extensions/loop/standalone/content/css/webapp.css similarity index 100% rename from browser/components/loop/standalone/content/css/webapp.css rename to browser/extensions/loop/standalone/content/css/webapp.css diff --git a/browser/components/loop/standalone/content/favicon.ico b/browser/extensions/loop/standalone/content/favicon.ico similarity index 100% rename from browser/components/loop/standalone/content/favicon.ico rename to browser/extensions/loop/standalone/content/favicon.ico diff --git a/browser/components/loop/standalone/content/img/gum-chrome.svg b/browser/extensions/loop/standalone/content/img/gum-chrome.svg similarity index 100% rename from browser/components/loop/standalone/content/img/gum-chrome.svg rename to browser/extensions/loop/standalone/content/img/gum-chrome.svg diff --git a/browser/components/loop/standalone/content/img/gum-firefox.svg b/browser/extensions/loop/standalone/content/img/gum-firefox.svg similarity index 100% rename from browser/components/loop/standalone/content/img/gum-firefox.svg rename to browser/extensions/loop/standalone/content/img/gum-firefox.svg diff --git a/browser/components/loop/standalone/content/img/gum-opera.svg b/browser/extensions/loop/standalone/content/img/gum-opera.svg similarity index 100% rename from browser/components/loop/standalone/content/img/gum-opera.svg rename to browser/extensions/loop/standalone/content/img/gum-opera.svg diff --git a/browser/components/loop/standalone/content/img/gum-others.svg b/browser/extensions/loop/standalone/content/img/gum-others.svg similarity index 100% rename from browser/components/loop/standalone/content/img/gum-others.svg rename to browser/extensions/loop/standalone/content/img/gum-others.svg diff --git a/browser/components/loop/standalone/content/img/hello-logo-text.svg b/browser/extensions/loop/standalone/content/img/hello-logo-text.svg similarity index 100% rename from browser/components/loop/standalone/content/img/hello-logo-text.svg rename to browser/extensions/loop/standalone/content/img/hello-logo-text.svg diff --git a/browser/components/loop/standalone/content/img/logo.png b/browser/extensions/loop/standalone/content/img/logo.png similarity index 100% rename from browser/components/loop/standalone/content/img/logo.png rename to browser/extensions/loop/standalone/content/img/logo.png diff --git a/browser/components/loop/standalone/content/img/mozilla-logo.svg b/browser/extensions/loop/standalone/content/img/mozilla-logo.svg similarity index 100% rename from browser/components/loop/standalone/content/img/mozilla-logo.svg rename to browser/extensions/loop/standalone/content/img/mozilla-logo.svg diff --git a/browser/components/loop/standalone/content/index.html b/browser/extensions/loop/standalone/content/index.html similarity index 100% rename from browser/components/loop/standalone/content/index.html rename to browser/extensions/loop/standalone/content/index.html diff --git a/browser/components/loop/standalone/content/js/standaloneAppStore.js b/browser/extensions/loop/standalone/content/js/standaloneAppStore.js similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneAppStore.js rename to browser/extensions/loop/standalone/content/js/standaloneAppStore.js diff --git a/browser/components/loop/standalone/content/js/standaloneMetricsStore.js b/browser/extensions/loop/standalone/content/js/standaloneMetricsStore.js similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneMetricsStore.js rename to browser/extensions/loop/standalone/content/js/standaloneMetricsStore.js diff --git a/browser/components/loop/standalone/content/js/standaloneMozLoop.js b/browser/extensions/loop/standalone/content/js/standaloneMozLoop.js similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneMozLoop.js rename to browser/extensions/loop/standalone/content/js/standaloneMozLoop.js diff --git a/browser/components/loop/standalone/content/js/standaloneRoomViews.js b/browser/extensions/loop/standalone/content/js/standaloneRoomViews.js similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneRoomViews.js rename to browser/extensions/loop/standalone/content/js/standaloneRoomViews.js diff --git a/browser/components/loop/standalone/content/js/standaloneRoomViews.jsx b/browser/extensions/loop/standalone/content/js/standaloneRoomViews.jsx similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneRoomViews.jsx rename to browser/extensions/loop/standalone/content/js/standaloneRoomViews.jsx diff --git a/browser/components/loop/standalone/content/js/webapp.js b/browser/extensions/loop/standalone/content/js/webapp.js similarity index 100% rename from browser/components/loop/standalone/content/js/webapp.js rename to browser/extensions/loop/standalone/content/js/webapp.js diff --git a/browser/components/loop/standalone/content/js/webapp.jsx b/browser/extensions/loop/standalone/content/js/webapp.jsx similarity index 100% rename from browser/components/loop/standalone/content/js/webapp.jsx rename to browser/extensions/loop/standalone/content/js/webapp.jsx diff --git a/browser/components/loop/standalone/content/l10n/en-US/loop.properties b/browser/extensions/loop/standalone/content/l10n/en-US/loop.properties similarity index 100% rename from browser/components/loop/standalone/content/l10n/en-US/loop.properties rename to browser/extensions/loop/standalone/content/l10n/en-US/loop.properties diff --git a/browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js b/browser/extensions/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js similarity index 100% rename from browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js rename to browser/extensions/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js diff --git a/browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt b/browser/extensions/loop/standalone/content/libs/l10n-gaia-upstream.txt similarity index 100% rename from browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt rename to browser/extensions/loop/standalone/content/libs/l10n-gaia-upstream.txt diff --git a/browser/components/loop/standalone/content/robots.txt b/browser/extensions/loop/standalone/content/robots.txt similarity index 100% rename from browser/components/loop/standalone/content/robots.txt rename to browser/extensions/loop/standalone/content/robots.txt diff --git a/browser/components/loop/standalone/content/webappEntryPoint.js b/browser/extensions/loop/standalone/content/webappEntryPoint.js similarity index 100% rename from browser/components/loop/standalone/content/webappEntryPoint.js rename to browser/extensions/loop/standalone/content/webappEntryPoint.js diff --git a/browser/components/loop/standalone/package.json b/browser/extensions/loop/standalone/package.json similarity index 100% rename from browser/components/loop/standalone/package.json rename to browser/extensions/loop/standalone/package.json diff --git a/browser/components/loop/standalone/server.js b/browser/extensions/loop/standalone/server.js similarity index 100% rename from browser/components/loop/standalone/server.js rename to browser/extensions/loop/standalone/server.js diff --git a/browser/components/loop/standalone/webpack.config.js b/browser/extensions/loop/standalone/webpack.config.js similarity index 100% rename from browser/components/loop/standalone/webpack.config.js rename to browser/extensions/loop/standalone/webpack.config.js diff --git a/browser/components/loop/test/.eslintrc b/browser/extensions/loop/test/.eslintrc similarity index 100% rename from browser/components/loop/test/.eslintrc rename to browser/extensions/loop/test/.eslintrc diff --git a/browser/components/loop/test/coverage/index.html b/browser/extensions/loop/test/coverage/index.html similarity index 100% rename from browser/components/loop/test/coverage/index.html rename to browser/extensions/loop/test/coverage/index.html diff --git a/browser/components/loop/test/desktop-local/.eslintrc b/browser/extensions/loop/test/desktop-local/.eslintrc similarity index 100% rename from browser/components/loop/test/desktop-local/.eslintrc rename to browser/extensions/loop/test/desktop-local/.eslintrc diff --git a/browser/components/loop/test/desktop-local/README.md b/browser/extensions/loop/test/desktop-local/README.md similarity index 100% rename from browser/components/loop/test/desktop-local/README.md rename to browser/extensions/loop/test/desktop-local/README.md diff --git a/browser/components/loop/test/desktop-local/conversationAppStore_test.js b/browser/extensions/loop/test/desktop-local/conversationAppStore_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/conversationAppStore_test.js rename to browser/extensions/loop/test/desktop-local/conversationAppStore_test.js diff --git a/browser/components/loop/test/desktop-local/conversation_test.js b/browser/extensions/loop/test/desktop-local/conversation_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/conversation_test.js rename to browser/extensions/loop/test/desktop-local/conversation_test.js diff --git a/browser/components/loop/test/desktop-local/feedbackViews_test.js b/browser/extensions/loop/test/desktop-local/feedbackViews_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/feedbackViews_test.js rename to browser/extensions/loop/test/desktop-local/feedbackViews_test.js diff --git a/browser/components/loop/test/desktop-local/index.html b/browser/extensions/loop/test/desktop-local/index.html similarity index 100% rename from browser/components/loop/test/desktop-local/index.html rename to browser/extensions/loop/test/desktop-local/index.html diff --git a/browser/components/loop/test/desktop-local/l10n_test.js b/browser/extensions/loop/test/desktop-local/l10n_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/l10n_test.js rename to browser/extensions/loop/test/desktop-local/l10n_test.js diff --git a/browser/components/loop/test/desktop-local/panel_test.js b/browser/extensions/loop/test/desktop-local/panel_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/panel_test.js rename to browser/extensions/loop/test/desktop-local/panel_test.js diff --git a/browser/components/loop/test/desktop-local/roomStore_test.js b/browser/extensions/loop/test/desktop-local/roomStore_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/roomStore_test.js rename to browser/extensions/loop/test/desktop-local/roomStore_test.js diff --git a/browser/components/loop/test/desktop-local/roomViews_test.js b/browser/extensions/loop/test/desktop-local/roomViews_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/roomViews_test.js rename to browser/extensions/loop/test/desktop-local/roomViews_test.js diff --git a/browser/components/loop/test/desktop-local/test_desktop_all.py b/browser/extensions/loop/test/desktop-local/test_desktop_all.py similarity index 100% rename from browser/components/loop/test/desktop-local/test_desktop_all.py rename to browser/extensions/loop/test/desktop-local/test_desktop_all.py diff --git a/browser/components/loop/test/functional/config.py b/browser/extensions/loop/test/functional/config.py similarity index 100% rename from browser/components/loop/test/functional/config.py rename to browser/extensions/loop/test/functional/config.py diff --git a/browser/components/loop/test/functional/hanging_threads.py b/browser/extensions/loop/test/functional/hanging_threads.py similarity index 100% rename from browser/components/loop/test/functional/hanging_threads.py rename to browser/extensions/loop/test/functional/hanging_threads.py diff --git a/browser/components/loop/test/functional/manifest.ini b/browser/extensions/loop/test/functional/manifest.ini similarity index 100% rename from browser/components/loop/test/functional/manifest.ini rename to browser/extensions/loop/test/functional/manifest.ini diff --git a/browser/components/loop/test/functional/serversetup.py b/browser/extensions/loop/test/functional/serversetup.py similarity index 100% rename from browser/components/loop/test/functional/serversetup.py rename to browser/extensions/loop/test/functional/serversetup.py diff --git a/browser/components/loop/test/functional/test_1_browser_call.py b/browser/extensions/loop/test/functional/test_1_browser_call.py similarity index 100% rename from browser/components/loop/test/functional/test_1_browser_call.py rename to browser/extensions/loop/test/functional/test_1_browser_call.py diff --git a/browser/components/loop/test/index.html b/browser/extensions/loop/test/index.html similarity index 100% rename from browser/components/loop/test/index.html rename to browser/extensions/loop/test/index.html diff --git a/browser/components/loop/test/karma/head.js b/browser/extensions/loop/test/karma/head.js similarity index 100% rename from browser/components/loop/test/karma/head.js rename to browser/extensions/loop/test/karma/head.js diff --git a/browser/components/loop/test/karma/karma.conf.base.js b/browser/extensions/loop/test/karma/karma.conf.base.js similarity index 100% rename from browser/components/loop/test/karma/karma.conf.base.js rename to browser/extensions/loop/test/karma/karma.conf.base.js diff --git a/browser/components/loop/test/karma/karma.coverage.desktop.js b/browser/extensions/loop/test/karma/karma.coverage.desktop.js similarity index 100% rename from browser/components/loop/test/karma/karma.coverage.desktop.js rename to browser/extensions/loop/test/karma/karma.coverage.desktop.js diff --git a/browser/components/loop/test/karma/karma.coverage.shared_standalone.js b/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js similarity index 100% rename from browser/components/loop/test/karma/karma.coverage.shared_standalone.js rename to browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js diff --git a/browser/components/loop/test/mochitest/.eslintrc b/browser/extensions/loop/test/mochitest/.eslintrc similarity index 100% rename from browser/components/loop/test/mochitest/.eslintrc rename to browser/extensions/loop/test/mochitest/.eslintrc diff --git a/browser/components/loop/test/mochitest/browser.ini b/browser/extensions/loop/test/mochitest/browser.ini similarity index 100% rename from browser/components/loop/test/mochitest/browser.ini rename to browser/extensions/loop/test/mochitest/browser.ini diff --git a/browser/components/loop/test/mochitest/browser_LoopRooms_channel.js b/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_LoopRooms_channel.js rename to browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js diff --git a/browser/components/loop/test/mochitest/browser_fxa_login.js b/browser/extensions/loop/test/mochitest/browser_fxa_login.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_fxa_login.js rename to browser/extensions/loop/test/mochitest/browser_fxa_login.js diff --git a/browser/components/loop/test/mochitest/browser_loop_fxa_server.js b/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_loop_fxa_server.js rename to browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_chat.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_chat.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_chat.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_chat.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_context.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_context.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_context.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js diff --git a/browser/components/loop/test/mochitest/browser_toolbarbutton.js b/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_toolbarbutton.js rename to browser/extensions/loop/test/mochitest/browser_toolbarbutton.js diff --git a/browser/components/loop/test/mochitest/head.js b/browser/extensions/loop/test/mochitest/head.js similarity index 100% rename from browser/components/loop/test/mochitest/head.js rename to browser/extensions/loop/test/mochitest/head.js diff --git a/browser/components/loop/test/mochitest/loop_fxa.sjs b/browser/extensions/loop/test/mochitest/loop_fxa.sjs similarity index 100% rename from browser/components/loop/test/mochitest/loop_fxa.sjs rename to browser/extensions/loop/test/mochitest/loop_fxa.sjs diff --git a/browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html b/browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html similarity index 100% rename from browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html rename to browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html diff --git a/browser/components/loop/test/package.json b/browser/extensions/loop/test/package.json similarity index 100% rename from browser/components/loop/test/package.json rename to browser/extensions/loop/test/package.json diff --git a/browser/components/loop/test/shared/activeRoomStore_test.js b/browser/extensions/loop/test/shared/activeRoomStore_test.js similarity index 100% rename from browser/components/loop/test/shared/activeRoomStore_test.js rename to browser/extensions/loop/test/shared/activeRoomStore_test.js diff --git a/browser/components/loop/test/shared/crypto_test.js b/browser/extensions/loop/test/shared/crypto_test.js similarity index 100% rename from browser/components/loop/test/shared/crypto_test.js rename to browser/extensions/loop/test/shared/crypto_test.js diff --git a/browser/components/loop/test/shared/dispatcher_test.js b/browser/extensions/loop/test/shared/dispatcher_test.js similarity index 100% rename from browser/components/loop/test/shared/dispatcher_test.js rename to browser/extensions/loop/test/shared/dispatcher_test.js diff --git a/browser/components/loop/test/shared/frontend_tester.py b/browser/extensions/loop/test/shared/frontend_tester.py similarity index 100% rename from browser/components/loop/test/shared/frontend_tester.py rename to browser/extensions/loop/test/shared/frontend_tester.py diff --git a/browser/components/loop/test/shared/index.html b/browser/extensions/loop/test/shared/index.html similarity index 100% rename from browser/components/loop/test/shared/index.html rename to browser/extensions/loop/test/shared/index.html diff --git a/browser/components/loop/test/shared/linkifiedTextView_test.js b/browser/extensions/loop/test/shared/linkifiedTextView_test.js similarity index 100% rename from browser/components/loop/test/shared/linkifiedTextView_test.js rename to browser/extensions/loop/test/shared/linkifiedTextView_test.js diff --git a/browser/components/loop/test/shared/loop_mocha_utils.js b/browser/extensions/loop/test/shared/loop_mocha_utils.js similarity index 100% rename from browser/components/loop/test/shared/loop_mocha_utils.js rename to browser/extensions/loop/test/shared/loop_mocha_utils.js diff --git a/browser/components/loop/test/shared/loopapi-client_test.js b/browser/extensions/loop/test/shared/loopapi-client_test.js similarity index 100% rename from browser/components/loop/test/shared/loopapi-client_test.js rename to browser/extensions/loop/test/shared/loopapi-client_test.js diff --git a/browser/components/loop/test/shared/mixins_test.js b/browser/extensions/loop/test/shared/mixins_test.js similarity index 100% rename from browser/components/loop/test/shared/mixins_test.js rename to browser/extensions/loop/test/shared/mixins_test.js diff --git a/browser/components/loop/test/shared/models_test.js b/browser/extensions/loop/test/shared/models_test.js similarity index 100% rename from browser/components/loop/test/shared/models_test.js rename to browser/extensions/loop/test/shared/models_test.js diff --git a/browser/components/loop/test/shared/otSdkDriver_test.js b/browser/extensions/loop/test/shared/otSdkDriver_test.js similarity index 100% rename from browser/components/loop/test/shared/otSdkDriver_test.js rename to browser/extensions/loop/test/shared/otSdkDriver_test.js diff --git a/browser/components/loop/test/shared/sdk_mock.js b/browser/extensions/loop/test/shared/sdk_mock.js similarity index 100% rename from browser/components/loop/test/shared/sdk_mock.js rename to browser/extensions/loop/test/shared/sdk_mock.js diff --git a/browser/components/loop/test/shared/store_test.js b/browser/extensions/loop/test/shared/store_test.js similarity index 100% rename from browser/components/loop/test/shared/store_test.js rename to browser/extensions/loop/test/shared/store_test.js diff --git a/browser/components/loop/test/shared/test_shared_all.py b/browser/extensions/loop/test/shared/test_shared_all.py similarity index 100% rename from browser/components/loop/test/shared/test_shared_all.py rename to browser/extensions/loop/test/shared/test_shared_all.py diff --git a/browser/components/loop/test/shared/textChatStore_test.js b/browser/extensions/loop/test/shared/textChatStore_test.js similarity index 100% rename from browser/components/loop/test/shared/textChatStore_test.js rename to browser/extensions/loop/test/shared/textChatStore_test.js diff --git a/browser/components/loop/test/shared/textChatView_test.js b/browser/extensions/loop/test/shared/textChatView_test.js similarity index 100% rename from browser/components/loop/test/shared/textChatView_test.js rename to browser/extensions/loop/test/shared/textChatView_test.js diff --git a/browser/components/loop/test/shared/utils_test.js b/browser/extensions/loop/test/shared/utils_test.js similarity index 100% rename from browser/components/loop/test/shared/utils_test.js rename to browser/extensions/loop/test/shared/utils_test.js diff --git a/browser/components/loop/test/shared/validate_test.js b/browser/extensions/loop/test/shared/validate_test.js similarity index 100% rename from browser/components/loop/test/shared/validate_test.js rename to browser/extensions/loop/test/shared/validate_test.js diff --git a/browser/components/loop/test/shared/vendor/chai-3.0.0.js b/browser/extensions/loop/test/shared/vendor/chai-3.0.0.js similarity index 100% rename from browser/components/loop/test/shared/vendor/chai-3.0.0.js rename to browser/extensions/loop/test/shared/vendor/chai-3.0.0.js diff --git a/browser/components/loop/test/shared/vendor/chai-as-promised-5.1.0.js b/browser/extensions/loop/test/shared/vendor/chai-as-promised-5.1.0.js similarity index 100% rename from browser/components/loop/test/shared/vendor/chai-as-promised-5.1.0.js rename to browser/extensions/loop/test/shared/vendor/chai-as-promised-5.1.0.js diff --git a/browser/components/loop/test/shared/vendor/mocha-2.2.5.css b/browser/extensions/loop/test/shared/vendor/mocha-2.2.5.css similarity index 100% rename from browser/components/loop/test/shared/vendor/mocha-2.2.5.css rename to browser/extensions/loop/test/shared/vendor/mocha-2.2.5.css diff --git a/browser/components/loop/test/shared/vendor/mocha-2.2.5.js b/browser/extensions/loop/test/shared/vendor/mocha-2.2.5.js similarity index 100% rename from browser/components/loop/test/shared/vendor/mocha-2.2.5.js rename to browser/extensions/loop/test/shared/vendor/mocha-2.2.5.js diff --git a/browser/components/loop/test/shared/vendor/sinon-1.16.1.js b/browser/extensions/loop/test/shared/vendor/sinon-1.16.1.js similarity index 100% rename from browser/components/loop/test/shared/vendor/sinon-1.16.1.js rename to browser/extensions/loop/test/shared/vendor/sinon-1.16.1.js diff --git a/browser/components/loop/test/shared/views_test.js b/browser/extensions/loop/test/shared/views_test.js similarity index 100% rename from browser/components/loop/test/shared/views_test.js rename to browser/extensions/loop/test/shared/views_test.js diff --git a/browser/components/loop/test/standalone/index.html b/browser/extensions/loop/test/standalone/index.html similarity index 100% rename from browser/components/loop/test/standalone/index.html rename to browser/extensions/loop/test/standalone/index.html diff --git a/browser/components/loop/test/standalone/standaloneAppStore_test.js b/browser/extensions/loop/test/standalone/standaloneAppStore_test.js similarity index 100% rename from browser/components/loop/test/standalone/standaloneAppStore_test.js rename to browser/extensions/loop/test/standalone/standaloneAppStore_test.js diff --git a/browser/components/loop/test/standalone/standaloneMetricsStore_test.js b/browser/extensions/loop/test/standalone/standaloneMetricsStore_test.js similarity index 100% rename from browser/components/loop/test/standalone/standaloneMetricsStore_test.js rename to browser/extensions/loop/test/standalone/standaloneMetricsStore_test.js diff --git a/browser/components/loop/test/standalone/standaloneMozLoop_test.js b/browser/extensions/loop/test/standalone/standaloneMozLoop_test.js similarity index 100% rename from browser/components/loop/test/standalone/standaloneMozLoop_test.js rename to browser/extensions/loop/test/standalone/standaloneMozLoop_test.js diff --git a/browser/components/loop/test/standalone/standaloneRoomViews_test.js b/browser/extensions/loop/test/standalone/standaloneRoomViews_test.js similarity index 100% rename from browser/components/loop/test/standalone/standaloneRoomViews_test.js rename to browser/extensions/loop/test/standalone/standaloneRoomViews_test.js diff --git a/browser/components/loop/test/standalone/test_standalone_all.py b/browser/extensions/loop/test/standalone/test_standalone_all.py similarity index 100% rename from browser/components/loop/test/standalone/test_standalone_all.py rename to browser/extensions/loop/test/standalone/test_standalone_all.py diff --git a/browser/components/loop/test/standalone/webapp_test.js b/browser/extensions/loop/test/standalone/webapp_test.js similarity index 100% rename from browser/components/loop/test/standalone/webapp_test.js rename to browser/extensions/loop/test/standalone/webapp_test.js diff --git a/browser/components/loop/test/ui-showcase/test_ui-showcase.py b/browser/extensions/loop/test/ui-showcase/test_ui-showcase.py similarity index 100% rename from browser/components/loop/test/ui-showcase/test_ui-showcase.py rename to browser/extensions/loop/test/ui-showcase/test_ui-showcase.py diff --git a/browser/components/loop/test/visual-regression/README.md b/browser/extensions/loop/test/visual-regression/README.md similarity index 100% rename from browser/components/loop/test/visual-regression/README.md rename to browser/extensions/loop/test/visual-regression/README.md diff --git a/browser/components/loop/test/visual-regression/screenshot b/browser/extensions/loop/test/visual-regression/screenshot similarity index 100% rename from browser/components/loop/test/visual-regression/screenshot rename to browser/extensions/loop/test/visual-regression/screenshot diff --git a/browser/components/loop/test/xpcshell/.eslintrc b/browser/extensions/loop/test/xpcshell/.eslintrc similarity index 100% rename from browser/components/loop/test/xpcshell/.eslintrc rename to browser/extensions/loop/test/xpcshell/.eslintrc diff --git a/browser/components/loop/test/xpcshell/head.js b/browser/extensions/loop/test/xpcshell/head.js similarity index 100% rename from browser/components/loop/test/xpcshell/head.js rename to browser/extensions/loop/test/xpcshell/head.js diff --git a/browser/components/loop/test/xpcshell/test_loopapi_doNotDisturb.js b/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopapi_doNotDisturb.js rename to browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js diff --git a/browser/components/loop/test/xpcshell/test_loopapi_internal.js b/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopapi_internal.js rename to browser/extensions/loop/test/xpcshell/test_loopapi_internal.js diff --git a/browser/components/loop/test/xpcshell/test_loopapi_prefs.js b/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopapi_prefs.js rename to browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js diff --git a/browser/components/loop/test/xpcshell/test_looppush_initialize.js b/browser/extensions/loop/test/xpcshell/test_looppush_initialize.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looppush_initialize.js rename to browser/extensions/loop/test/xpcshell/test_looppush_initialize.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms.js b/browser/extensions/loop/test/xpcshell/test_looprooms.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms.js rename to browser/extensions/loop/test/xpcshell/test_looprooms.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js b/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js rename to browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms_first_notification.js b/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms_first_notification.js rename to browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms_getall.js b/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms_getall.js rename to browser/extensions/loop/test/xpcshell/test_looprooms_getall.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js b/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js rename to browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_dnd.js b/browser/extensions/loop/test/xpcshell/test_loopservice_dnd.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_dnd.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_dnd.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_encryptionkey.js b/browser/extensions/loop/test/xpcshell/test_loopservice_encryptionkey.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_encryptionkey.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_encryptionkey.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js b/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_hawk_request.js b/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_request.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_hawk_request.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_hawk_request.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_initialize.js b/browser/extensions/loop/test/xpcshell/test_loopservice_initialize.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_initialize.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_initialize.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_locales.js b/browser/extensions/loop/test/xpcshell/test_loopservice_locales.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_locales.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_locales.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_loop_prefs.js b/browser/extensions/loop/test/xpcshell/test_loopservice_loop_prefs.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_loop_prefs.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_loop_prefs.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_registration.js b/browser/extensions/loop/test/xpcshell/test_loopservice_registration.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_registration.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_registration.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_registration_retry.js b/browser/extensions/loop/test/xpcshell/test_loopservice_registration_retry.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_registration_retry.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_registration_retry.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_restart.js b/browser/extensions/loop/test/xpcshell/test_loopservice_restart.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_restart.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_restart.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js b/browser/extensions/loop/test/xpcshell/test_loopservice_token_invalid.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_token_invalid.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_save.js b/browser/extensions/loop/test/xpcshell/test_loopservice_token_save.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_token_save.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_token_save.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_send.js b/browser/extensions/loop/test/xpcshell/test_loopservice_token_send.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_token_send.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_token_send.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_validation.js b/browser/extensions/loop/test/xpcshell/test_loopservice_token_validation.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_token_validation.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_token_validation.js diff --git a/browser/components/loop/test/xpcshell/xpcshell.ini b/browser/extensions/loop/test/xpcshell/xpcshell.ini similarity index 100% rename from browser/components/loop/test/xpcshell/xpcshell.ini rename to browser/extensions/loop/test/xpcshell/xpcshell.ini diff --git a/browser/components/loop/ui/README.md b/browser/extensions/loop/ui/README.md similarity index 100% rename from browser/components/loop/ui/README.md rename to browser/extensions/loop/ui/README.md diff --git a/browser/components/loop/ui/fake-l10n.js b/browser/extensions/loop/ui/fake-l10n.js similarity index 100% rename from browser/components/loop/ui/fake-l10n.js rename to browser/extensions/loop/ui/fake-l10n.js diff --git a/browser/components/loop/ui/fake-mozLoop.js b/browser/extensions/loop/ui/fake-mozLoop.js similarity index 100% rename from browser/components/loop/ui/fake-mozLoop.js rename to browser/extensions/loop/ui/fake-mozLoop.js diff --git a/browser/components/loop/ui/index.html b/browser/extensions/loop/ui/index.html similarity index 100% rename from browser/components/loop/ui/index.html rename to browser/extensions/loop/ui/index.html diff --git a/browser/components/loop/ui/react-frame-component.js b/browser/extensions/loop/ui/react-frame-component.js similarity index 100% rename from browser/components/loop/ui/react-frame-component.js rename to browser/extensions/loop/ui/react-frame-component.js diff --git a/browser/components/loop/ui/sample-img/video-screen-local.png b/browser/extensions/loop/ui/sample-img/video-screen-local.png similarity index 100% rename from browser/components/loop/ui/sample-img/video-screen-local.png rename to browser/extensions/loop/ui/sample-img/video-screen-local.png diff --git a/browser/components/loop/ui/sample-img/video-screen-remote.png b/browser/extensions/loop/ui/sample-img/video-screen-remote.png similarity index 100% rename from browser/components/loop/ui/sample-img/video-screen-remote.png rename to browser/extensions/loop/ui/sample-img/video-screen-remote.png diff --git a/browser/components/loop/ui/sample-img/video-screen-terminal.png b/browser/extensions/loop/ui/sample-img/video-screen-terminal.png similarity index 100% rename from browser/components/loop/ui/sample-img/video-screen-terminal.png rename to browser/extensions/loop/ui/sample-img/video-screen-terminal.png diff --git a/browser/components/loop/ui/ui-showcase.css b/browser/extensions/loop/ui/ui-showcase.css similarity index 100% rename from browser/components/loop/ui/ui-showcase.css rename to browser/extensions/loop/ui/ui-showcase.css diff --git a/browser/components/loop/ui/ui-showcase.js b/browser/extensions/loop/ui/ui-showcase.js similarity index 100% rename from browser/components/loop/ui/ui-showcase.js rename to browser/extensions/loop/ui/ui-showcase.js diff --git a/browser/components/loop/ui/ui-showcase.jsx b/browser/extensions/loop/ui/ui-showcase.jsx similarity index 100% rename from browser/components/loop/ui/ui-showcase.jsx rename to browser/extensions/loop/ui/ui-showcase.jsx From 8f667d31b466bceaaa5e38cb9829c64d55557162 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:57:39 +0000 Subject: [PATCH 081/153] Bug 1223573 - Part 2. Move prefs and css into the new Loop system add-on. r=mikedeboer --HG-- rename : browser/themes/windows/loop/menuPanel.png => browser/extensions/loop/skin/linux/menuPanel.png rename : browser/themes/windows/loop/menuPanel@2x.png => browser/extensions/loop/skin/linux/menuPanel@2x.png rename : browser/themes/windows/loop/toolbar-inverted.png => browser/extensions/loop/skin/linux/toolbar-inverted.png rename : browser/themes/windows/loop/toolbar-inverted@2x.png => browser/extensions/loop/skin/linux/toolbar-inverted@2x.png rename : browser/themes/linux/loop/toolbar.png => browser/extensions/loop/skin/linux/toolbar.png rename : browser/themes/linux/loop/toolbar@2x.png => browser/extensions/loop/skin/linux/toolbar@2x.png rename : browser/themes/osx/loop/menuPanel-yosemite.png => browser/extensions/loop/skin/osx/menuPanel-yosemite.png rename : browser/themes/osx/loop/menuPanel-yosemite@2x.png => browser/extensions/loop/skin/osx/menuPanel-yosemite@2x.png rename : browser/themes/osx/loop/menuPanel.png => browser/extensions/loop/skin/osx/menuPanel.png rename : browser/themes/osx/loop/menuPanel@2x.png => browser/extensions/loop/skin/osx/menuPanel@2x.png rename : browser/themes/osx/loop/toolbar-inverted.png => browser/extensions/loop/skin/osx/toolbar-inverted.png rename : browser/themes/osx/loop/toolbar-inverted@2x.png => browser/extensions/loop/skin/osx/toolbar-inverted@2x.png rename : browser/themes/osx/loop/toolbar-yosemite.png => browser/extensions/loop/skin/osx/toolbar-yosemite.png rename : browser/themes/osx/loop/toolbar-yosemite@2x.png => browser/extensions/loop/skin/osx/toolbar-yosemite@2x.png rename : browser/themes/osx/loop/toolbar.png => browser/extensions/loop/skin/osx/toolbar.png rename : browser/themes/osx/loop/toolbar@2x.png => browser/extensions/loop/skin/osx/toolbar@2x.png rename : browser/themes/windows/loop/menuPanel-aero.png => browser/extensions/loop/skin/windows/menuPanel-aero.png rename : browser/themes/windows/loop/menuPanel-aero@2x.png => browser/extensions/loop/skin/windows/menuPanel-aero@2x.png rename : browser/themes/linux/loop/menuPanel.png => browser/extensions/loop/skin/windows/menuPanel.png rename : browser/themes/linux/loop/menuPanel@2x.png => browser/extensions/loop/skin/windows/menuPanel@2x.png rename : browser/themes/windows/loop/toolbar-XP.png => browser/extensions/loop/skin/windows/toolbar-XP.png rename : browser/themes/windows/loop/toolbar-XP@2x.png => browser/extensions/loop/skin/windows/toolbar-XP@2x.png rename : browser/themes/windows/loop/toolbar-aero.png => browser/extensions/loop/skin/windows/toolbar-aero.png rename : browser/themes/windows/loop/toolbar-aero@2x.png => browser/extensions/loop/skin/windows/toolbar-aero@2x.png rename : browser/themes/linux/loop/toolbar-inverted.png => browser/extensions/loop/skin/windows/toolbar-inverted.png rename : browser/themes/linux/loop/toolbar-inverted@2x.png => browser/extensions/loop/skin/windows/toolbar-inverted@2x.png rename : browser/themes/windows/loop/toolbar-lunaSilver.png => browser/extensions/loop/skin/windows/toolbar-lunaSilver.png rename : browser/themes/windows/loop/toolbar-lunaSilver@2x.png => browser/extensions/loop/skin/windows/toolbar-lunaSilver@2x.png rename : browser/themes/windows/loop/toolbar-win8.png => browser/extensions/loop/skin/windows/toolbar-win8.png rename : browser/themes/windows/loop/toolbar-win8@2x.png => browser/extensions/loop/skin/windows/toolbar-win8@2x.png rename : browser/themes/windows/loop/toolbar.png => browser/extensions/loop/skin/windows/toolbar.png rename : browser/themes/windows/loop/toolbar@2x.png => browser/extensions/loop/skin/windows/toolbar@2x.png --- browser/app/profile/firefox.js | 36 --- browser/base/content/browser.css | 5 - .../loop/content/preferences/prefs.js | 33 +++ .../loop/skin/linux}/menuPanel.png | Bin .../loop/skin/linux}/menuPanel@2x.png | Bin .../loop/skin/linux}/toolbar-inverted.png | Bin .../loop/skin/linux}/toolbar-inverted@2x.png | Bin .../loop/skin/linux}/toolbar.png | Bin .../loop/skin/linux}/toolbar@2x.png | Bin .../loop/skin/osx}/menuPanel-yosemite.png | Bin .../loop/skin/osx}/menuPanel-yosemite@2x.png | Bin .../loop/skin/osx}/menuPanel.png | Bin .../loop/skin/osx}/menuPanel@2x.png | Bin browser/extensions/loop/skin/osx/platform.css | 39 +++ .../loop/skin/osx}/toolbar-inverted.png | Bin .../loop/skin/osx}/toolbar-inverted@2x.png | Bin .../loop/skin/osx}/toolbar-yosemite.png | Bin .../loop/skin/osx}/toolbar-yosemite@2x.png | Bin .../loop/skin/osx}/toolbar.png | Bin .../loop/skin/osx}/toolbar@2x.png | Bin browser/extensions/loop/skin/shared/loop.css | 280 ++++++++++++++++++ .../loop/skin/windows}/menuPanel-aero.png | Bin .../loop/skin/windows}/menuPanel-aero@2x.png | Bin .../loop/skin/windows}/menuPanel.png | Bin .../loop/skin/windows}/menuPanel@2x.png | Bin .../extensions/loop/skin/windows/platform.css | 18 ++ .../loop/skin/windows}/toolbar-XP.png | Bin .../loop/skin/windows}/toolbar-XP@2x.png | Bin .../loop/skin/windows}/toolbar-aero.png | Bin .../loop/skin/windows}/toolbar-aero@2x.png | Bin .../loop/skin/windows}/toolbar-inverted.png | Bin .../skin/windows}/toolbar-inverted@2x.png | Bin .../loop/skin/windows}/toolbar-lunaSilver.png | Bin .../skin/windows}/toolbar-lunaSilver@2x.png | Bin .../loop/skin/windows}/toolbar-win8.png | Bin .../loop/skin/windows}/toolbar-win8@2x.png | Bin .../loop/skin/windows}/toolbar.png | Bin .../loop/skin/windows}/toolbar@2x.png | Bin browser/themes/osx/browser.css | 34 --- browser/themes/shared/browser.inc | 2 +- browser/themes/shared/menupanel.inc.css | 72 ----- .../themes/shared/notification-icons.inc.css | 80 ----- browser/themes/shared/social/chat.inc.css | 35 --- browser/themes/shared/toolbarbuttons.inc.css | 68 ----- browser/themes/windows/browser.css | 10 - 45 files changed, 371 insertions(+), 341 deletions(-) create mode 100644 browser/extensions/loop/content/preferences/prefs.js rename browser/{themes/linux/loop => extensions/loop/skin/linux}/menuPanel.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/menuPanel@2x.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/toolbar-inverted.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/toolbar-inverted@2x.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/toolbar.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/toolbar@2x.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/menuPanel-yosemite.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/menuPanel-yosemite@2x.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/menuPanel.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/menuPanel@2x.png (100%) create mode 100644 browser/extensions/loop/skin/osx/platform.css rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar-inverted.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar-inverted@2x.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar-yosemite.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar-yosemite@2x.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar@2x.png (100%) create mode 100644 browser/extensions/loop/skin/shared/loop.css rename browser/{themes/windows/loop => extensions/loop/skin/windows}/menuPanel-aero.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/menuPanel-aero@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/menuPanel.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/menuPanel@2x.png (100%) create mode 100644 browser/extensions/loop/skin/windows/platform.css rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-XP.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-XP@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-aero.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-aero@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-inverted.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-inverted@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-lunaSilver.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-lunaSilver@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-win8.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-win8@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar@2x.png (100%) diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index a2136ae41269..fbdfe7bba396 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1376,42 +1376,6 @@ pref("shumway.disabled", true); // (This is intentionally on the high side; see bug 746055.) pref("image.mem.max_decoded_image_kb", 256000); -pref("loop.enabled", true); -pref("loop.textChat.enabled", true); -pref("loop.server", "https://loop.services.mozilla.com/v0"); -pref("loop.linkClicker.url", "https://hello.firefox.com/"); -pref("loop.gettingStarted.seen", false); -pref("loop.gettingStarted.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/hello/start/"); -pref("loop.gettingStarted.resumeOnFirstJoin", false); -pref("loop.learnMoreUrl", "https://www.firefox.com/hello/"); -pref("loop.legal.ToS_url", "https://www.mozilla.org/about/legal/terms/firefox-hello/"); -pref("loop.legal.privacy_url", "https://www.mozilla.org/privacy/firefox-hello/"); -pref("loop.do_not_disturb", false); -pref("loop.ringtone", "chrome://browser/content/loop/shared/sounds/ringtone.ogg"); -pref("loop.retry_delay.start", 60000); -pref("loop.retry_delay.limit", 300000); -pref("loop.ping.interval", 1800000); -pref("loop.ping.timeout", 10000); -pref("loop.feedback.baseUrl", "https://input.mozilla.org/api/v1/feedback"); -pref("loop.feedback.product", "Loop"); -pref("loop.debug.loglevel", "Error"); -pref("loop.debug.dispatcher", false); -pref("loop.debug.sdk", false); -pref("loop.debug.twoWayMediaTelemetry", false); -pref("loop.feedback.dateLastSeenSec", 0); -pref("loop.feedback.periodSec", 15770000); // 6 months. -pref("loop.feedback.formURL", "https://www.mozilla.org/firefox/hello/npssurvey/"); -pref("loop.feedback.manualFormURL", "https://www.mozilla.org/firefox/hello/feedbacksurvey/"); -#ifdef DEBUG -pref("loop.CSP", "default-src 'self' about: file: chrome: http://localhost:*; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net http://localhost:* ws://localhost:*; media-src blob:"); -#else -pref("loop.CSP", "default-src 'self' about: file: chrome:; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net; media-src blob:"); -#endif -pref("loop.fxa_oauth.tokendata", ""); -pref("loop.fxa_oauth.profile", ""); -pref("loop.support_url", "https://support.mozilla.org/kb/group-conversations-firefox-hello-webrtc"); -pref("loop.browserSharing.showInfoBar", true); - pref("social.sidebar.unload_timeout_ms", 10000); // Activation from inside of share panel is possible if activationPanelEnabled diff --git a/browser/base/content/browser.css b/browser/base/content/browser.css index 58b764277e91..876f117ae152 100644 --- a/browser/base/content/browser.css +++ b/browser/base/content/browser.css @@ -902,11 +902,6 @@ notification[value="translation"] { -moz-binding: url("chrome://browser/content/translation-infobar.xml#translationbar"); } -/* Loop/ Hello */ -notification[value="loop-sharing-notification"] .close-icon { - display: none; -} - /* Social */ /* Note the chatbox 'width' values are duplicated in socialchat.xml */ chatbox { diff --git a/browser/extensions/loop/content/preferences/prefs.js b/browser/extensions/loop/content/preferences/prefs.js new file mode 100644 index 000000000000..67ff6255c705 --- /dev/null +++ b/browser/extensions/loop/content/preferences/prefs.js @@ -0,0 +1,33 @@ +pref("loop.enabled", true); +pref("loop.textChat.enabled", true); +pref("loop.server", "https://loop.services.mozilla.com/v0"); +pref("loop.linkClicker.url", "https://hello.firefox.com/"); +pref("loop.gettingStarted.seen", false); +pref("loop.gettingStarted.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/hello/start/"); +pref("loop.gettingStarted.resumeOnFirstJoin", false); +pref("loop.learnMoreUrl", "https://www.firefox.com/hello/"); +pref("loop.legal.ToS_url", "https://www.mozilla.org/about/legal/terms/firefox-hello/"); +pref("loop.legal.privacy_url", "https://www.mozilla.org/privacy/firefox-hello/"); +pref("loop.do_not_disturb", false); +pref("loop.ringtone", "chrome://browser/content/loop/shared/sounds/ringtone.ogg"); +pref("loop.retry_delay.start", 60000); +pref("loop.retry_delay.limit", 300000); +pref("loop.ping.interval", 1800000); +pref("loop.ping.timeout", 10000); +pref("loop.debug.loglevel", "Error"); +pref("loop.debug.dispatcher", false); +pref("loop.debug.sdk", false); +pref("loop.debug.twoWayMediaTelemetry", false); +pref("loop.feedback.dateLastSeenSec", 0); +pref("loop.feedback.periodSec", 15770000); // 6 months. +pref("loop.feedback.formURL", "https://www.mozilla.org/firefox/hello/npssurvey/"); +pref("loop.feedback.manualFormURL", "https://www.mozilla.org/firefox/hello/feedbacksurvey/"); +#ifdef DEBUG +pref("loop.CSP", "default-src 'self' about: file: chrome: http://localhost:*; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net http://localhost:* ws://localhost:*; media-src blob:"); +#else +pref("loop.CSP", "default-src 'self' about: file: chrome:; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net; media-src blob:"); +#endif +pref("loop.fxa_oauth.tokendata", ""); +pref("loop.fxa_oauth.profile", ""); +pref("loop.support_url", "https://support.mozilla.org/kb/group-conversations-firefox-hello-webrtc"); +pref("loop.browserSharing.showInfoBar", true); diff --git a/browser/themes/linux/loop/menuPanel.png b/browser/extensions/loop/skin/linux/menuPanel.png similarity index 100% rename from browser/themes/linux/loop/menuPanel.png rename to browser/extensions/loop/skin/linux/menuPanel.png diff --git a/browser/themes/linux/loop/menuPanel@2x.png b/browser/extensions/loop/skin/linux/menuPanel@2x.png similarity index 100% rename from browser/themes/linux/loop/menuPanel@2x.png rename to browser/extensions/loop/skin/linux/menuPanel@2x.png diff --git a/browser/themes/linux/loop/toolbar-inverted.png b/browser/extensions/loop/skin/linux/toolbar-inverted.png similarity index 100% rename from browser/themes/linux/loop/toolbar-inverted.png rename to browser/extensions/loop/skin/linux/toolbar-inverted.png diff --git a/browser/themes/linux/loop/toolbar-inverted@2x.png b/browser/extensions/loop/skin/linux/toolbar-inverted@2x.png similarity index 100% rename from browser/themes/linux/loop/toolbar-inverted@2x.png rename to browser/extensions/loop/skin/linux/toolbar-inverted@2x.png diff --git a/browser/themes/linux/loop/toolbar.png b/browser/extensions/loop/skin/linux/toolbar.png similarity index 100% rename from browser/themes/linux/loop/toolbar.png rename to browser/extensions/loop/skin/linux/toolbar.png diff --git a/browser/themes/linux/loop/toolbar@2x.png b/browser/extensions/loop/skin/linux/toolbar@2x.png similarity index 100% rename from browser/themes/linux/loop/toolbar@2x.png rename to browser/extensions/loop/skin/linux/toolbar@2x.png diff --git a/browser/themes/osx/loop/menuPanel-yosemite.png b/browser/extensions/loop/skin/osx/menuPanel-yosemite.png similarity index 100% rename from browser/themes/osx/loop/menuPanel-yosemite.png rename to browser/extensions/loop/skin/osx/menuPanel-yosemite.png diff --git a/browser/themes/osx/loop/menuPanel-yosemite@2x.png b/browser/extensions/loop/skin/osx/menuPanel-yosemite@2x.png similarity index 100% rename from browser/themes/osx/loop/menuPanel-yosemite@2x.png rename to browser/extensions/loop/skin/osx/menuPanel-yosemite@2x.png diff --git a/browser/themes/osx/loop/menuPanel.png b/browser/extensions/loop/skin/osx/menuPanel.png similarity index 100% rename from browser/themes/osx/loop/menuPanel.png rename to browser/extensions/loop/skin/osx/menuPanel.png diff --git a/browser/themes/osx/loop/menuPanel@2x.png b/browser/extensions/loop/skin/osx/menuPanel@2x.png similarity index 100% rename from browser/themes/osx/loop/menuPanel@2x.png rename to browser/extensions/loop/skin/osx/menuPanel@2x.png diff --git a/browser/extensions/loop/skin/osx/platform.css b/browser/extensions/loop/skin/osx/platform.css new file mode 100644 index 000000000000..49691b879c38 --- /dev/null +++ b/browser/extensions/loop/skin/osx/platform.css @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); + +notification[value="loop-sharing-notification"] { + background: #00a9dc; + padding: 0; + border: 0; +} + +notification[value="loop-sharing-notification"].paused { + background: #ebebeb; +} + +notification[value="loop-sharing-notification"] .notification-button { + background: #fff; + border-radius: 0; +} + +notification[value="loop-sharing-notification"].paused .notification-button { + background: #57bd35; +} + +notification[value="loop-sharing-notification"].paused .notification-button:hover { + background: #39a017; +} + +notification[value="loop-sharing-notification"] .notification-button:hover, +notification[value="loop-sharing-notification"].paused .notification-button-default:hover { + background: #ebebeb; +} + +notification[value="loop-sharing-notification"] .notification-button-default, +notification[value="loop-sharing-notification"].paused .notification-button-default { + background: #fff; +} + diff --git a/browser/themes/osx/loop/toolbar-inverted.png b/browser/extensions/loop/skin/osx/toolbar-inverted.png similarity index 100% rename from browser/themes/osx/loop/toolbar-inverted.png rename to browser/extensions/loop/skin/osx/toolbar-inverted.png diff --git a/browser/themes/osx/loop/toolbar-inverted@2x.png b/browser/extensions/loop/skin/osx/toolbar-inverted@2x.png similarity index 100% rename from browser/themes/osx/loop/toolbar-inverted@2x.png rename to browser/extensions/loop/skin/osx/toolbar-inverted@2x.png diff --git a/browser/themes/osx/loop/toolbar-yosemite.png b/browser/extensions/loop/skin/osx/toolbar-yosemite.png similarity index 100% rename from browser/themes/osx/loop/toolbar-yosemite.png rename to browser/extensions/loop/skin/osx/toolbar-yosemite.png diff --git a/browser/themes/osx/loop/toolbar-yosemite@2x.png b/browser/extensions/loop/skin/osx/toolbar-yosemite@2x.png similarity index 100% rename from browser/themes/osx/loop/toolbar-yosemite@2x.png rename to browser/extensions/loop/skin/osx/toolbar-yosemite@2x.png diff --git a/browser/themes/osx/loop/toolbar.png b/browser/extensions/loop/skin/osx/toolbar.png similarity index 100% rename from browser/themes/osx/loop/toolbar.png rename to browser/extensions/loop/skin/osx/toolbar.png diff --git a/browser/themes/osx/loop/toolbar@2x.png b/browser/extensions/loop/skin/osx/toolbar@2x.png similarity index 100% rename from browser/themes/osx/loop/toolbar@2x.png rename to browser/extensions/loop/skin/osx/toolbar@2x.png diff --git a/browser/extensions/loop/skin/shared/loop.css b/browser/extensions/loop/skin/shared/loop.css new file mode 100644 index 000000000000..3a81e96a6fc4 --- /dev/null +++ b/browser/extensions/loop/skin/shared/loop.css @@ -0,0 +1,280 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); + +/* Only apply to browser.xul documents */ +@-moz-document url("chrome://browser/content/browser.xul") { + /* + XXX Copied from browser/themes//browser.css. Should really be + changing the sizes of icons in files to 16px x 16px and no borders. + */ + :-moz-any(toolbar, .widget-overflow-list) #loop-button > .toolbarbutton-icon, + :-moz-any(toolbar, .widget-overflow-list) #loop-button > :-moz-any(.toolbarbutton-menubutton-button, .toolbarbutton-badge-stack) > .toolbarbutton-icon { + max-width: 18px; + margin: 0; + } + + #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar.png); + -moz-image-region: rect(0, 18px, 18px, 0); + } + + toolbar[brighttext] #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar-inverted.png); + } + + #loop-button[state="disabled"], + #loop-button[disabled="true"] { + -moz-image-region: rect(0, 36px, 18px, 18px); + } + + #loop-button:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 54px, 18px, 36px); + } + + #loop-button:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 72px, 18px, 54px); + } + + #loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 90px, 18px, 72px); + } + + #loop-button:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 108px, 18px, 90px); + } + + #loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 126px, 18px, 108px); + } + + @media (min-resolution: 1.1dppx) { + #loop-button { + list-style-image: url("chrome://browser/skin/loop/toolbar@2x.png"); + -moz-image-region: rect(0, 36px, 36px, 0); + } + + toolbar[brighttext] #loop-button { + list-style-image: url("chrome://browser/skin/loop/toolbar-inverted@2x.png"); + } + + #loop-button[state="disabled"], + #loop-button[disabled="true"] { + -moz-image-region: rect(0, 72px, 36px, 36px); + } + + #loop-button:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 108px, 36px, 72px); + } + + #loop-button:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 144px, 36px, 108px); + } + + #loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 180px, 36px, 144px); + } + + #loop-button:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 216px, 36px, 180px); + } + + #loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 252px, 36px, 216px); + } + + #loop-button[cui-areatype="menu-panel"], + toolbarpaletteitem[place="palette"] > #loop-button { + list-style-image: url(chrome://browser/skin/loop/menuPanel@2x.png); + -moz-image-region: rect(0, 64px, 64px, 0); + } + + /* Make sure that the state icons are not shown in the customization palette. */ + toolbarpaletteitem[place="palette"] > #loop-button { + -moz-image-region: rect(0, 64px, 64px, 0) !important; + } + + #loop-button[cui-areatype="menu-panel"][state="disabled"], + #loop-button[cui-areatype="menu-panel"][disabled="true"] { + -moz-image-region: rect(0, 128px, 64px, 64px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 192px, 64px, 128px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 256px, 64px, 192px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 320px, 64px, 256px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 384px, 64px, 320px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 448px, 64px, 384px); + } + } + + @media not all and (min-resolution: 1.1dppx) { + #loop-button[cui-areatype="menu-panel"], + toolbarpaletteitem[place="palette"] > #loop-button { + list-style-image: url(chrome://browser/skin/loop/menuPanel.png); + -moz-image-region: rect(0, 32px, 32px, 0); + } + + /* Make sure that the state icons are not shown in the customization palette. */ + toolbarpaletteitem[place="palette"] > #loop-button { + -moz-image-region: rect(0, 32px, 32px, 0) !important; + } + + #loop-button[cui-areatype="menu-panel"][state="disabled"], + #loop-button[cui-areatype="menu-panel"][disabled="true"] { + -moz-image-region: rect(0, 64px, 32px, 32px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 96px, 32px, 64px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 128px, 32px, 96px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 160px, 32px, 128px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 192px, 32px, 160px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 224px, 32px, 192px); + } + } + + notification[value="loop-sharing-notification"] { + -moz-appearance: none; + height: 40px; + background-color: #00a9dc; + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; + } + + notification[value="loop-sharing-notification"].paused { + background-color: #ebebeb; + } + + notification[value="loop-sharing-notification"] .notification-inner { + color: #fff; + padding: 0; + } + + notification[value="loop-sharing-notification"].paused .notification-inner { + color: #00a9dc; + } + + notification[value="loop-sharing-notification"] .notification-button { + -moz-appearance: none; + background-color: #fff; + border: 0; + border-right: solid 1px #ebebeb; + width: 100px; + height: 40px; + margin: 0; + list-style-image: url(chrome://browser/content/loop/shared/img/pause-12x12.svg); + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; + text-shadow: none; + } + + notification[value="loop-sharing-notification"] .notification-button:-moz-locale-dir(rtl) { + border-right: 0; + border-left: solid 1px #ebebeb; + } + + notification[value="loop-sharing-notification"].paused .notification-button { + background-color: #57bd35; + color: #fff; + list-style-image: url(chrome://browser/content/loop/shared/img/play-12x12.svg); + } + + notification[value="loop-sharing-notification"].paused .notification-button:hover { + background-color: #39a017; + } + + notification[value="loop-sharing-notification"] .notification-button:hover, + notification[value="loop-sharing-notification"].paused .notification-button-default:hover { + background-color: #ebebeb; + } + + notification[value="loop-sharing-notification"] .notification-button-default, + notification[value="loop-sharing-notification"].paused .notification-button-default { + color: #d92215; + background-color: #fff; + border-right: 0; + list-style-image: url(chrome://browser/content/loop/shared/img/stop-12x12.svg); + } + + notification[value="loop-sharing-notification"] .notification-button .button-icon { + display: block; + -moz-margin-end: 6px; + } + + notification[value="loop-sharing-notification"] .button-menubutton-button { + min-width: 0; + } + + notification[value="loop-sharing-notification"] .messageImage { + list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-white); + margin-inline-start: 14px; + } + + notification[value="loop-sharing-notification"].paused .messageImage { + list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-still); + } + + notification[value="loop-sharing-notification"] .close-icon { + display: none; + } + + chatbox[src^="about:loopconversation#"] > .chat-titlebar { + background-color: #00a9dc; + border-color: #00a9dc; + } + + chatbox[src^="about:loopconversation#"] .chat-title { + color: white; + } + + chatbox[src^="about:loopconversation#"] .chat-minimize-button { + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white"); + } + + chatbox[src^="about:loopconversation#"] .chat-swap-button { + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white"); + } + + .chat-loop-hangup { + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white"); + background-color: #d13f1a; + border: 1px solid #d13f1a; + border-top-right-radius: 4px; + width: 32px; + height: 26px; + margin-top: -6px; + margin-bottom: -5px; + -moz-margin-start: 6px; + -moz-margin-end: -5px; + } + + .chat-toolbarbutton.chat-loop-hangup:-moz-any(:hover,:hover:active) { + background-color: #ef6745; + border-color: #ef6745; + } +} diff --git a/browser/themes/windows/loop/menuPanel-aero.png b/browser/extensions/loop/skin/windows/menuPanel-aero.png similarity index 100% rename from browser/themes/windows/loop/menuPanel-aero.png rename to browser/extensions/loop/skin/windows/menuPanel-aero.png diff --git a/browser/themes/windows/loop/menuPanel-aero@2x.png b/browser/extensions/loop/skin/windows/menuPanel-aero@2x.png similarity index 100% rename from browser/themes/windows/loop/menuPanel-aero@2x.png rename to browser/extensions/loop/skin/windows/menuPanel-aero@2x.png diff --git a/browser/themes/windows/loop/menuPanel.png b/browser/extensions/loop/skin/windows/menuPanel.png similarity index 100% rename from browser/themes/windows/loop/menuPanel.png rename to browser/extensions/loop/skin/windows/menuPanel.png diff --git a/browser/themes/windows/loop/menuPanel@2x.png b/browser/extensions/loop/skin/windows/menuPanel@2x.png similarity index 100% rename from browser/themes/windows/loop/menuPanel@2x.png rename to browser/extensions/loop/skin/windows/menuPanel@2x.png diff --git a/browser/extensions/loop/skin/windows/platform.css b/browser/extensions/loop/skin/windows/platform.css new file mode 100644 index 000000000000..e90639bbd434 --- /dev/null +++ b/browser/extensions/loop/skin/windows/platform.css @@ -0,0 +1,18 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); + +@media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) { + #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver.png) + } +} + +@media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { + #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver@2x.png) + } +} + diff --git a/browser/themes/windows/loop/toolbar-XP.png b/browser/extensions/loop/skin/windows/toolbar-XP.png similarity index 100% rename from browser/themes/windows/loop/toolbar-XP.png rename to browser/extensions/loop/skin/windows/toolbar-XP.png diff --git a/browser/themes/windows/loop/toolbar-XP@2x.png b/browser/extensions/loop/skin/windows/toolbar-XP@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-XP@2x.png rename to browser/extensions/loop/skin/windows/toolbar-XP@2x.png diff --git a/browser/themes/windows/loop/toolbar-aero.png b/browser/extensions/loop/skin/windows/toolbar-aero.png similarity index 100% rename from browser/themes/windows/loop/toolbar-aero.png rename to browser/extensions/loop/skin/windows/toolbar-aero.png diff --git a/browser/themes/windows/loop/toolbar-aero@2x.png b/browser/extensions/loop/skin/windows/toolbar-aero@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-aero@2x.png rename to browser/extensions/loop/skin/windows/toolbar-aero@2x.png diff --git a/browser/themes/windows/loop/toolbar-inverted.png b/browser/extensions/loop/skin/windows/toolbar-inverted.png similarity index 100% rename from browser/themes/windows/loop/toolbar-inverted.png rename to browser/extensions/loop/skin/windows/toolbar-inverted.png diff --git a/browser/themes/windows/loop/toolbar-inverted@2x.png b/browser/extensions/loop/skin/windows/toolbar-inverted@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-inverted@2x.png rename to browser/extensions/loop/skin/windows/toolbar-inverted@2x.png diff --git a/browser/themes/windows/loop/toolbar-lunaSilver.png b/browser/extensions/loop/skin/windows/toolbar-lunaSilver.png similarity index 100% rename from browser/themes/windows/loop/toolbar-lunaSilver.png rename to browser/extensions/loop/skin/windows/toolbar-lunaSilver.png diff --git a/browser/themes/windows/loop/toolbar-lunaSilver@2x.png b/browser/extensions/loop/skin/windows/toolbar-lunaSilver@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-lunaSilver@2x.png rename to browser/extensions/loop/skin/windows/toolbar-lunaSilver@2x.png diff --git a/browser/themes/windows/loop/toolbar-win8.png b/browser/extensions/loop/skin/windows/toolbar-win8.png similarity index 100% rename from browser/themes/windows/loop/toolbar-win8.png rename to browser/extensions/loop/skin/windows/toolbar-win8.png diff --git a/browser/themes/windows/loop/toolbar-win8@2x.png b/browser/extensions/loop/skin/windows/toolbar-win8@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-win8@2x.png rename to browser/extensions/loop/skin/windows/toolbar-win8@2x.png diff --git a/browser/themes/windows/loop/toolbar.png b/browser/extensions/loop/skin/windows/toolbar.png similarity index 100% rename from browser/themes/windows/loop/toolbar.png rename to browser/extensions/loop/skin/windows/toolbar.png diff --git a/browser/themes/windows/loop/toolbar@2x.png b/browser/extensions/loop/skin/windows/toolbar@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar@2x.png rename to browser/extensions/loop/skin/windows/toolbar@2x.png diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css index 8ab1b90fa505..9fd2f5435881 100644 --- a/browser/themes/osx/browser.css +++ b/browser/themes/osx/browser.css @@ -3211,40 +3211,6 @@ menulist.translate-infobar-element > .menulist-dropmarker { } } -/* Loop/ Hello browser styles */ -notification[value="loop-sharing-notification"] { - background: #00a9dc; - padding: 0; - border: 0; -} - -notification[value="loop-sharing-notification"].paused { - background: #ebebeb; -} - -notification[value="loop-sharing-notification"] .notification-button { - background: #fff; - border-radius: 0; -} - -notification[value="loop-sharing-notification"].paused .notification-button { - background: #57bd35; -} - -notification[value="loop-sharing-notification"].paused .notification-button:hover { - background: #39a017; -} - -notification[value="loop-sharing-notification"] .notification-button:hover, -notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background: #ebebeb; -} - -notification[value="loop-sharing-notification"] .notification-button-default, -notification[value="loop-sharing-notification"].paused .notification-button-default { - background: #fff; -} - .popup-notification-body[popupid="addon-progress"], .popup-notification-body[popupid="addon-install-confirmation"] { width: 28em; diff --git a/browser/themes/shared/browser.inc b/browser/themes/shared/browser.inc index 52bf968c13f7..904488a75030 100644 --- a/browser/themes/shared/browser.inc +++ b/browser/themes/shared/browser.inc @@ -2,7 +2,7 @@ % Note that zoom-reset-button is a bit different since it doesn't use an image and thus has the image with display: none. %define nestedButtons #zoom-out-button, #zoom-reset-button, #zoom-in-button, #cut-button, #copy-button, #paste-button -%define primaryToolbarButtons #back-button, #forward-button, #home-button, #print-button, #downloads-button, #bookmarks-menu-button, #new-tab-button, #new-window-button, #fullscreen-button, #sync-button, #feed-button, #tabview-button, #social-share-button, #open-file-button, #find-button, #developer-button, #preferences-button, #privatebrowsing-button, #save-page-button, #add-ons-button, #history-panelmenu, #nav-bar-overflow-button, #PanelUI-menu-button, #characterencoding-button, #email-link-button, #sidebar-button, @nestedButtons@, #e10s-button, #panic-button, #web-apps-button, #webide-button, #loop-button, #pocket-button +%define primaryToolbarButtons #back-button, #forward-button, #home-button, #print-button, #downloads-button, #bookmarks-menu-button, #new-tab-button, #new-window-button, #fullscreen-button, #sync-button, #feed-button, #tabview-button, #social-share-button, #open-file-button, #find-button, #developer-button, #preferences-button, #privatebrowsing-button, #save-page-button, #add-ons-button, #history-panelmenu, #nav-bar-overflow-button, #PanelUI-menu-button, #characterencoding-button, #email-link-button, #sidebar-button, @nestedButtons@, #e10s-button, #panic-button, #web-apps-button, #webide-button, #pocket-button %ifdef XP_MACOSX % Prior to 10.7 there wasn't a native fullscreen button so we use #restore-button to exit fullscreen diff --git a/browser/themes/shared/menupanel.inc.css b/browser/themes/shared/menupanel.inc.css index 785d0fac2d84..c47973560d4a 100644 --- a/browser/themes/shared/menupanel.inc.css +++ b/browser/themes/shared/menupanel.inc.css @@ -191,42 +191,6 @@ -moz-image-region: rect(0, 832px, 32px, 800px); } - #loop-button[cui-areatype="menu-panel"], - toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://browser/skin/loop/menuPanel.png); - -moz-image-region: rect(0, 32px, 32px, 0); - } - - /* Make sure that the state icons are not shown in the customization palette. */ - toolbarpaletteitem[place="palette"] > #loop-button { - -moz-image-region: rect(0, 32px, 32px, 0) !important; - } - - #loop-button[cui-areatype="menu-panel"][state="disabled"], - #loop-button[cui-areatype="menu-panel"][disabled="true"] { - -moz-image-region: rect(0, 64px, 32px, 32px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 96px, 32px, 64px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 128px, 32px, 96px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 160px, 32px, 128px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 192px, 32px, 160px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 224px, 32px, 192px); - } - /* Wide panel control icons */ #edit-controls@inAnyPanel@ > toolbarbutton, @@ -375,42 +339,6 @@ -moz-image-region: rect(64px, 1984px, 128px, 1920px); } - #loop-button[cui-areatype="menu-panel"], - toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://browser/skin/loop/menuPanel@2x.png); - -moz-image-region: rect(0, 64px, 64px, 0); - } - - /* Make sure that the state icons are not shown in the customization palette. */ - toolbarpaletteitem[place="palette"] > #loop-button { - -moz-image-region: rect(0, 64px, 64px, 0) !important; - } - - #loop-button[cui-areatype="menu-panel"][state="disabled"], - #loop-button[cui-areatype="menu-panel"][disabled="true"] { - -moz-image-region: rect(0, 128px, 64px, 64px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 192px, 64px, 128px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 256px, 64px, 192px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 320px, 64px, 256px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 384px, 64px, 320px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 448px, 64px, 384px); - } - #new-tab-button[cui-areatype="menu-panel"], toolbarpaletteitem[place="palette"] > #new-tab-button { -moz-image-region: rect(0px, 1088px, 64px, 1024px); diff --git a/browser/themes/shared/notification-icons.inc.css b/browser/themes/shared/notification-icons.inc.css index 09e74f8829d7..adfc829618a2 100644 --- a/browser/themes/shared/notification-icons.inc.css +++ b/browser/themes/shared/notification-icons.inc.css @@ -445,83 +445,3 @@ } %endif } - -/* Loop notification */ -notification[value="loop-sharing-notification"] { - -moz-appearance: none; - height: 40px; - background-color: #00a9dc; - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; -} - -notification[value="loop-sharing-notification"].paused { - background-color: #ebebeb; -} - -notification[value="loop-sharing-notification"] .notification-inner { - color: #fff; - padding: 0; -} - -notification[value="loop-sharing-notification"].paused .notification-inner { - color: #00a9dc; -} - -notification[value="loop-sharing-notification"] .notification-button { - -moz-appearance: none; - background-color: #fff; - border: 0; - border-right: solid 1px #ebebeb; - width: 100px; - height: 40px; - margin: 0; - list-style-image: url(chrome://browser/content/loop/shared/img/pause-12x12.svg); - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; - text-shadow: none; -} - -notification[value="loop-sharing-notification"] .notification-button:-moz-locale-dir(rtl) { - border-right: 0; - border-left: solid 1px #ebebeb; -} - -notification[value="loop-sharing-notification"].paused .notification-button { - background-color: #57bd35; - color: #fff; - list-style-image: url(chrome://browser/content/loop/shared/img/play-12x12.svg); -} - -notification[value="loop-sharing-notification"].paused .notification-button:hover { - background-color: #39a017; -} - -notification[value="loop-sharing-notification"] .notification-button:hover, -notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background-color: #ebebeb; -} - -notification[value="loop-sharing-notification"] .notification-button-default, -notification[value="loop-sharing-notification"].paused .notification-button-default { - color: #d92215; - background-color: #fff; - border-right: 0; - list-style-image: url(chrome://browser/content/loop/shared/img/stop-12x12.svg); -} - -notification[value="loop-sharing-notification"] .notification-button .button-icon { - display: block; - -moz-margin-end: 6px; -} - -notification[value="loop-sharing-notification"] .button-menubutton-button { - min-width: 0; -} - -notification[value="loop-sharing-notification"] .messageImage { - list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-white); - margin-inline-start: 14px; -} - -notification[value="loop-sharing-notification"].paused .messageImage { - list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-still); -} \ No newline at end of file diff --git a/browser/themes/shared/social/chat.inc.css b/browser/themes/shared/social/chat.inc.css index 2d32b8ed54a3..b7fe906cd284 100644 --- a/browser/themes/shared/social/chat.inc.css +++ b/browser/themes/shared/social/chat.inc.css @@ -105,42 +105,12 @@ chatbar > chatbox > .chat-titlebar > .chat-swap-button { transform: none; } -chatbox[src^="about:loopconversation#"] .chat-minimize-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white"); -} - -chatbox[src^="about:loopconversation#"] .chat-swap-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white"); -} - -.chat-loop-hangup { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white"); - background-color: #d13f1a; - border: 1px solid #d13f1a; - border-top-right-radius: 4px; - width: 32px; - height: 26px; - margin-top: -6px; - margin-bottom: -5px; - -moz-margin-start: 6px; - -moz-margin-end: -5px; -} - -.chat-toolbarbutton.chat-loop-hangup:-moz-any(:hover,:hover:active) { - background-color: #ef6745; - border-color: #ef6745; -} - .chat-title { color: #666; text-shadow: none; cursor: inherit; } -chatbox[src^="about:loopconversation#"] .chat-title { - color: white; -} - .chat-titlebar { height: 26px; min-height: 26px; @@ -159,11 +129,6 @@ chatbox[src^="about:loopconversation#"] .chat-title { background-color: #f0f0f0; } -chatbox[src^="about:loopconversation#"] > .chat-titlebar { - background-color: #00a9dc; - border-color: #00a9dc; -} - .chat-titlebar > .notification-anchor-icon { margin-left: 2px; margin-right: 2px; diff --git a/browser/themes/shared/toolbarbuttons.inc.css b/browser/themes/shared/toolbarbuttons.inc.css index 4cafa3d117d3..a899571fda43 100644 --- a/browser/themes/shared/toolbarbuttons.inc.css +++ b/browser/themes/shared/toolbarbuttons.inc.css @@ -184,40 +184,6 @@ toolbar[brighttext] #sync-button[status="active"] { -moz-image-region: rect(0, 720px, 18px, 702px); } -#loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar.png); - -moz-image-region: rect(0, 18px, 18px, 0); -} - -toolbar[brighttext] #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-inverted.png); -} - -#loop-button[state="disabled"], -#loop-button[disabled="true"] { - -moz-image-region: rect(0, 36px, 18px, 18px); -} - -#loop-button:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 54px, 18px, 36px); -} - -#loop-button:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 72px, 18px, 54px); -} - -#loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 90px, 18px, 72px); -} - -#loop-button:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 108px, 18px, 90px); -} - -#loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 126px, 18px, 108px); -} - #webide-button[cui-areatype="toolbar"] { -moz-image-region: rect(0, 738px, 18px, 720px); } @@ -429,39 +395,5 @@ toolbar[brighttext] #loop-button { -moz-image-region: rect(36px, 1548px, 72px, 1512px); %endif } - - #loop-button { - list-style-image: url("chrome://browser/skin/loop/toolbar@2x.png"); - -moz-image-region: rect(0, 36px, 36px, 0); - } - - toolbar[brighttext] #loop-button { - list-style-image: url("chrome://browser/skin/loop/toolbar-inverted@2x.png"); - } - - #loop-button[state="disabled"], - #loop-button[disabled="true"] { - -moz-image-region: rect(0, 72px, 36px, 36px); - } - - #loop-button:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 108px, 36px, 72px); - } - - #loop-button:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 144px, 36px, 108px); - } - - #loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 180px, 36px, 144px); - } - - #loop-button:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 216px, 36px, 180px); - } - - #loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 252px, 36px, 216px); - } } %endif diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css index 2e1066f3bd84..ddf756c7ebeb 100644 --- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css @@ -652,16 +652,6 @@ menuitem.bookmark-item { #bookmarks-menu-button.toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon { list-style-image: url("chrome://browser/skin/Toolbar-lunaSilver.png"); } - - #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver.png) - } -} - -@media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { - #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver@2x.png) - } } #main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-icon, From e3d52002a455153fba8612f6221397cac8fd7f69 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:57:40 +0000 Subject: [PATCH 082/153] Bug 1223573 - Part 3. Move browser-loop.js to begin forming bootstrap.js. r=mikedeboer --- browser/base/content/browser-loop.js | 613 -------------------------- browser/base/content/browser.js | 4 - browser/extensions/loop/bootstrap.js | 619 +++++++++++++++++++++++++++ 3 files changed, 619 insertions(+), 617 deletions(-) delete mode 100644 browser/base/content/browser-loop.js create mode 100644 browser/extensions/loop/bootstrap.js diff --git a/browser/base/content/browser-loop.js b/browser/base/content/browser-loop.js deleted file mode 100644 index 40e48eccc4b0..000000000000 --- a/browser/base/content/browser-loop.js +++ /dev/null @@ -1,613 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// the "exported" symbols -var LoopUI; - -(function() { - const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - const kBrowserSharingNotificationId = "loop-sharing-notification"; - const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar"; - - LoopUI = { - /** - * @var {XULWidgetSingleWrapper} toolbarButton Getter for the Loop toolbarbutton - * instance for this window. - */ - get toolbarButton() { - delete this.toolbarButton; - return this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window); - }, - - /** - * @var {XULElement} panel Getter for the Loop panel element. - */ - get panel() { - delete this.panel; - return this.panel = document.getElementById("loop-notification-panel"); - }, - - /** - * @var {XULElement|null} browser Getter for the Loop panel browser element. - * Will be NULL if the panel hasn't loaded yet. - */ - get browser() { - let browser = document.querySelector("#loop-notification-panel > #loop-panel-iframe"); - if (browser) { - delete this.browser; - this.browser = browser; - } - return browser; - }, - - /** - * @var {String|null} selectedTab Getter for the name of the currently selected - * tab inside the Loop panel. Will be NULL if - * the panel hasn't loaded yet. - */ - get selectedTab() { - if (!this.browser) { - return null; - } - - let selectedTab = this.browser.contentDocument.querySelector(".tab-view > .selected"); - return selectedTab && selectedTab.getAttribute("data-tab-name"); - }, - - /** - * @return {Promise} - */ - promiseDocumentVisible(aDocument) { - if (!aDocument.hidden) { - return Promise.resolve(aDocument); - } - - return new Promise((resolve) => { - aDocument.addEventListener("visibilitychange", function onVisibilityChanged() { - aDocument.removeEventListener("visibilitychange", onVisibilityChanged); - resolve(aDocument); - }); - }); - }, - - /** - * Toggle between opening or hiding the Loop panel. - * - * @param {DOMEvent} [event] Optional event that triggered the call to this - * function. - * @param {String} [tabId] Optional name of the tab to select after the panel - * has opened. Does nothing when the panel is hidden. - * @return {Promise} - */ - togglePanel: function(event, tabId = null) { - if (!this.panel) { - // We're on the hidden window! What fun! - let obs = win => { - Services.obs.removeObserver(obs, "browser-delayed-startup-finished"); - win.LoopUI.togglePanel(event, tabId); - }; - Services.obs.addObserver(obs, "browser-delayed-startup-finished", false); - return OpenBrowserWindow(); - } - if (this.panel.state == "open") { - return new Promise(resolve => { - this.panel.hidePopup(); - resolve(); - }); - } - - return this.openCallPanel(event, tabId).then(doc => { - let fm = Services.focus; - fm.moveFocus(doc.defaultView, null, fm.MOVEFOCUS_FIRST, fm.FLAG_NOSCROLL); - }).catch(err => { - Cu.reportError(x); - }); - }, - - /** - * Opens the panel for Loop and sizes it appropriately. - * - * @param {event} event The event opening the panel, used to anchor - * the panel to the button which triggers it. - * @param {String} [tabId] Identifier of the tab to select when the panel is - * opened. Example: 'rooms', 'contacts', etc. - * @return {Promise} - */ - openCallPanel: function(event, tabId = null) { - return new Promise((resolve) => { - let callback = iframe => { - // Helper function to show a specific tab view in the panel. - function showTab() { - if (!tabId) { - resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); - return; - } - - let win = iframe.contentWindow; - let ev = new win.CustomEvent("UIAction", Cu.cloneInto({ - detail: { - action: "selectTab", - tab: tabId - } - }, win)); - win.dispatchEvent(ev); - resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); - } - - // If the panel has been opened and initialized before, we can skip waiting - // for the content to load - because it's already there. - if (("contentWindow" in iframe) && iframe.contentWindow.document.readyState == "complete") { - showTab(); - return; - } - - let documentDOMLoaded = () => { - iframe.removeEventListener("DOMContentLoaded", documentDOMLoaded, true); - // Handle window.close correctly on the panel. - this.hookWindowCloseForPanelClose(iframe.contentWindow); - iframe.contentWindow.addEventListener("loopPanelInitialized", function loopPanelInitialized() { - iframe.contentWindow.removeEventListener("loopPanelInitialized", - loopPanelInitialized); - showTab(); - }); - }; - iframe.addEventListener("DOMContentLoaded", documentDOMLoaded, true); - }; - - // Used to clear the temporary "login" state from the button. - Services.obs.notifyObservers(null, "loop-status-changed", null); - - this.shouldResumeTour().then((resume) => { - if (resume) { - // Assume the conversation with the visitor wasn't open since we would - // have resumed the tour as soon as the visitor joined if it was (and - // the pref would have been set to false already. - this.MozLoopService.resumeTour("waiting"); - resolve(); - return; - } - - this.LoopAPI.initialize(); - - let anchor = event ? event.target : this.toolbarButton.anchor; - let setHeight = 410; - if (gBrowser.selectedBrowser.getAttribute("remote") === "true") { - setHeight = 262; - } - this.PanelFrame.showPopup(window, anchor, - "loop", null, "about:looppanel", - // Loop wants a fixed size for the panel. This also stops it dynamically resizing. - { width: 330, height: setHeight }, - callback); - }); - }); - }, - - /** - * Method to know whether actions to open the panel should instead resume the tour. - * - * We need the panel to be opened via UITour so that it gets @noautohide. - * - * @return {Promise} resolving with a {Boolean} of whether the tour should be resumed instead of - * opening the panel. - */ - shouldResumeTour: Task.async(function* () { - // Resume the FTU tour if this is the first time a room was joined by - // someone else since the tour. - if (!Services.prefs.getBoolPref("loop.gettingStarted.resumeOnFirstJoin")) { - return false; - } - - if (!this.LoopRooms.participantsCount) { - // Nobody is in the rooms - return false; - } - - let roomsWithNonOwners = yield this.roomsWithNonOwners(); - if (!roomsWithNonOwners.length) { - // We were the only one in a room but we want to know about someone else joining. - return false; - } - - return true; - }), - - /** - * @return {Promise} resolved with an array of Rooms with participants (excluding owners) - */ - roomsWithNonOwners: function() { - return new Promise(resolve => { - this.LoopRooms.getAll((error, rooms) => { - let roomsWithNonOwners = []; - for (let room of rooms) { - if (!("participants" in room)) { - continue; - } - let numNonOwners = room.participants.filter(participant => !participant.owner).length; - if (!numNonOwners) { - continue; - } - roomsWithNonOwners.push(room); - } - resolve(roomsWithNonOwners); - }); - }); - }, - - /** - * Triggers the initialization of the loop service. Called by - * delayedStartup. - */ - init: function() { - // Add observer notifications before the service is initialized - Services.obs.addObserver(this, "loop-status-changed", false); - - // This is a promise for test purposes, but we don't want to be logging - // expected errors to the console, so we catch them here. - this.MozLoopService.initialize().catch(ex => { - if (!ex.message || - (!ex.message.contains("not enabled") && - !ex.message.contains("not needed"))) { - console.error(ex); - } - }); - this.updateToolbarState(); - }, - - uninit: function() { - Services.obs.removeObserver(this, "loop-status-changed"); - }, - - // Implements nsIObserver - observe: function(subject, topic, data) { - if (topic != "loop-status-changed") { - return; - } - this.updateToolbarState(data); - }, - - /** - * Updates the toolbar/menu-button state to reflect Loop status. - * - * @param {string} [aReason] Some states are only shown if - * a related reason is provided. - * - * aReason="login": Used after a login is completed - * successfully. This is used so the state can be - * temporarily shown until the next state change. - */ - updateToolbarState: function(aReason = null) { - if (!this.toolbarButton.node) { - return; - } - let state = ""; - let mozL10nId = "loop-call-button3"; - let suffix = ".tooltiptext"; - if (this.MozLoopService.errors.size) { - state = "error"; - mozL10nId += "-error"; - } else if (this.MozLoopService.screenShareActive) { - state = "action"; - mozL10nId += "-screensharing"; - } else if (aReason == "login" && this.MozLoopService.userProfile) { - state = "active"; - mozL10nId += "-active"; - suffix += "2"; - } else if (this.MozLoopService.doNotDisturb) { - state = "disabled"; - mozL10nId += "-donotdisturb"; - } else if (this.MozLoopService.roomsParticipantsCount > 0) { - state = "active"; - this.roomsWithNonOwners().then(roomsWithNonOwners => { - if (roomsWithNonOwners.length > 0) { - mozL10nId += "-participantswaiting"; - } else { - mozL10nId += "-active"; - } - - suffix += "2"; - this.updateTooltiptext(mozL10nId + suffix); - this.toolbarButton.node.setAttribute("state", state); - }); - return; - } else { - suffix += "2"; - } - - this.toolbarButton.node.setAttribute("state", state); - this.updateTooltiptext(mozL10nId + suffix); - }, - - /** - * Updates the tootltiptext to reflect Loop status. - * - * @param {string} [mozL10nId] l10n ID that refelct the current - * Loop status. - */ - updateTooltiptext: function(mozL10nId) { - this.toolbarButton.node.setAttribute("tooltiptext", mozL10nId); - var tooltiptext = CustomizableUI.getLocalizedProperty(this.toolbarButton, "tooltiptext"); - this.toolbarButton.node.setAttribute("tooltiptext", tooltiptext); - }, - - /** - * Show a desktop notification when 'do not disturb' isn't enabled. - * - * @param {Object} options Set of options that may tweak the appearance and - * behavior of the notification. - * Option params: - * - {String} title Notification title message - * - {String} [message] Notification body text - * - {String} [icon] Notification icon - * - {String} [sound] Sound to play - * - {String} [selectTab] Tab to select when the panel - * opens - * - {Function} [onclick] Callback to invoke when - * the notification is clicked. - * Opens the panel by default. - */ - showNotification: function(options) { - if (this.MozLoopService.doNotDisturb) { - return; - } - - if (!options.title) { - throw new Error("Missing title, can not display notification"); - } - - let notificationOptions = { - body: options.message || "" - }; - if (options.icon) { - notificationOptions.icon = options.icon; - } - if (options.sound) { - // This will not do anything, until bug bug 1105222 is resolved. - notificationOptions.mozbehavior = { - soundFile: "" - }; - this.playSound(options.sound); - } - - let notification = new window.Notification(options.title, notificationOptions); - notification.addEventListener("click", e => { - if (window.closed) { - return; - } - - try { - window.focus(); - } catch (ex) {} - - // We need a setTimeout here, otherwise the panel won't show after the - // window received focus. - window.setTimeout(() => { - if (typeof options.onclick == "function") { - options.onclick(); - } else { - // Open the Loop panel as a default action. - this.openCallPanel(null, options.selectTab || null); - } - }, 0); - }); - }, - - /** - * Play a sound in this window IF there's no sound playing yet. - * - * @param {String} name Name of the sound, like 'ringtone' or 'room-joined' - */ - playSound: function(name) { - if (this.ActiveSound || this.MozLoopService.doNotDisturb) { - return; - } - - this.activeSound = new window.Audio(); - this.activeSound.src = `chrome://browser/content/loop/shared/sounds/${name}.ogg`; - this.activeSound.load(); - this.activeSound.play(); - - this.activeSound.addEventListener("ended", () => this.activeSound = undefined, false); - }, - - /** - * Start listening to selected tab changes and notify any content page that's - * listening to 'BrowserSwitch' push messages. - * - * Push message parameters: - * - {Integer} windowId The new windowId for the browser. - */ - startBrowserSharing: function() { - if (!this._listeningToTabSelect) { - gBrowser.tabContainer.addEventListener("TabSelect", this); - this._listeningToTabSelect = true; - } - - this._maybeShowBrowserSharingInfoBar(); - - // Get the first window Id for the listener. - this.LoopAPI.broadcastPushMessage("BrowserSwitch", - gBrowser.selectedBrowser.outerWindowID); - }, - - /** - * Stop listening to selected tab changes. - */ - stopBrowserSharing: function() { - if (!this._listeningToTabSelect) { - return; - } - - this._hideBrowserSharingInfoBar(); - gBrowser.tabContainer.removeEventListener("TabSelect", this); - this._listeningToTabSelect = false; - }, - - /** - * Helper function to fetch a localized string via the MozLoopService API. - * It's currently inconveniently wrapped inside a string of stringified JSON. - * - * @param {String} key The element id to get strings for. - * @return {String} - */ - _getString: function(key) { - let str = this.MozLoopService.getStrings(key); - if (str) { - str = JSON.parse(str).textContent; - } - return str; - }, - - /** - * Shows an infobar notification at the top of the browser window that warns - * the user that their browser tabs are being broadcasted through the current - * conversation. - */ - _maybeShowBrowserSharingInfoBar: function() { - this._hideBrowserSharingInfoBar(); - - // Don't show the infobar if it's been permanently disabled from the menu. - if (!this.MozLoopService.getLoopPref(kPrefBrowserSharingInfoBar)) { - return; - } - - let box = gBrowser.getNotificationBox(); - let paused = false; - let bar = box.appendNotification( - this._getString("infobar_screenshare_browser_message"), - kBrowserSharingNotificationId, - // Icon is defined in browser theme CSS. - null, - box.PRIORITY_WARNING_LOW, - [{ - label: this._getString("infobar_button_pause_label"), - accessKey: this._getString("infobar_button_pause_accesskey"), - isDefault: false, - callback: (event, buttonInfo, buttonNode) => { - paused = !paused; - bar.label = paused ? this._getString("infobar_screenshare_paused_browser_message") : - this._getString("infobar_screenshare_browser_message"); - bar.classList.toggle("paused", paused); - buttonNode.label = paused ? this._getString("infobar_button_resume_label") : - this._getString("infobar_button_pause_label"); - buttonNode.accessKey = paused ? this._getString("infobar_button_resume_accesskey") : - this._getString("infobar_button_pause_accesskey"); - return true; - } - }, - { - label: this._getString("infobar_button_stop_label"), - accessKey: this._getString("infobar_button_stop_accesskey"), - isDefault: true, - callback: () => { - this._hideBrowserSharingInfoBar(); - LoopUI.MozLoopService.hangupAllChatWindows(); - } - }] - ); - - // Keep showing the notification bar until the user explicitly closes it. - bar.persistence = -1; - }, - - /** - * Hides the infobar, permanantly if requested. - * - * @param {Boolean} permanently Flag that determines if the infobar will never - * been shown again. Defaults to `false`. - * @return {Boolean} |true| if the infobar was hidden here. - */ - _hideBrowserSharingInfoBar: function(permanently = false, browser) { - browser = browser || gBrowser.selectedBrowser; - let box = gBrowser.getNotificationBox(browser); - let notification = box.getNotificationWithValue(kBrowserSharingNotificationId); - let removed = false; - if (notification) { - box.removeNotification(notification); - removed = true; - } - - if (permanently) { - this.MozLoopService.setLoopPref(kPrefBrowserSharingInfoBar, false); - } - - return removed; - }, - - /** - * Handles events from gBrowser. - */ - handleEvent: function(event) { - // We only should get "select" events. - if (event.type != "TabSelect") { - return; - } - - let wasVisible = false; - // Hide the infobar from the previous tab. - if (event.detail.previousTab) { - wasVisible = this._hideBrowserSharingInfoBar(false, - event.detail.previousTab.linkedBrowser); - } - - // We've changed the tab, so get the new window id. - this.LoopAPI.broadcastPushMessage("BrowserSwitch", - gBrowser.selectedBrowser.outerWindowID); - - if (wasVisible) { - // If the infobar was visible before, we should show it again after the - // switch. - this._maybeShowBrowserSharingInfoBar(); - } - }, - - /** - * Fetch the favicon of the currently selected tab in the format of a data-uri. - * - * @param {Function} callback Function to be invoked with an error object as - * its first argument when an error occurred or - * a string as second argument when the favicon - * has been fetched. - */ - getFavicon: function(callback) { - let pageURI = gBrowser.selectedTab.linkedBrowser.currentURI.spec; - // If the tab page’s url starts with http(s), fetch icon. - if (!/^https?:/.test(pageURI)) { - callback(); - return; - } - - this.PlacesUtils.promiseFaviconLinkUrl(pageURI).then(uri => { - // We XHR the favicon to get a File object, which we can pass to the FileReader - // object. The FileReader turns the File object into a data-uri. - let xhr = new XMLHttpRequest(); - xhr.open("get", uri.spec, true); - xhr.responseType = "blob"; - xhr.overrideMimeType("image/x-icon"); - xhr.onload = () => { - if (xhr.status != 200) { - callback(new Error("Invalid status code received for favicon XHR: " + xhr.status)); - return; - } - - let reader = new FileReader(); - reader.onload = reader.onload = () => callback(null, reader.result); - reader.onerror = callback; - reader.readAsDataURL(xhr.response); - }; - xhr.onerror = callback; - xhr.send(); - }).catch(err => { - callback(err || new Error("No favicon found")); - }); - } - }; -})(); - -XPCOMUtils.defineLazyModuleGetter(LoopUI, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopAPI", "resource:///modules/loop/MozLoopAPI.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopRooms", "resource:///modules/loop/LoopRooms.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "resource:///modules/loop/MozLoopService.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 61df291af60d..6174a0baf893 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -274,7 +274,6 @@ var gInitialPages = [ #include browser-fullScreen.js #include browser-fullZoom.js #include browser-gestureSupport.js -#include browser-loop.js #include browser-places.js #include browser-plugins.js #include browser-safebrowsing.js @@ -1357,8 +1356,6 @@ var gBrowserInit = { gDataNotificationInfoBar.init(); #endif - LoopUI.init(); - gBrowserThumbnails.init(); // Add Devtools menuitems and listeners @@ -1540,7 +1537,6 @@ var gBrowserInit = { TabView.uninit(); SocialUI.uninit(); gBrowserThumbnails.uninit(); - LoopUI.uninit(); FullZoom.destroy(); Services.obs.removeObserver(gSessionHistoryObserver, "browser:purge-session-history"); diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js new file mode 100644 index 000000000000..90be7de3e68a --- /dev/null +++ b/browser/extensions/loop/bootstrap.js @@ -0,0 +1,619 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var WindowListener = { + + setupBrowserUI: function(window) { + const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; + const kBrowserSharingNotificationId = "loop-sharing-notification"; + const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar"; + + let document = window.document; + let gBrowser = window.gBrowser; + let xhrClass = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]; + let FileReader = window.FileReader; + + // the "exported" symbols + var LoopUI = { + /** + * @var {XULWidgetSingleWrapper} toolbarButton Getter for the Loop toolbarbutton + * instance for this window. + */ + get toolbarButton() { + delete this.toolbarButton; + return this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window); + }, + + /** + * @var {XULElement} panel Getter for the Loop panel element. + */ + get panel() { + delete this.panel; + return this.panel = document.getElementById("loop-notification-panel"); + }, + + /** + * @var {XULElement|null} browser Getter for the Loop panel browser element. + * Will be NULL if the panel hasn't loaded yet. + */ + get browser() { + let browser = document.querySelector("#loop-notification-panel > #loop-panel-iframe"); + if (browser) { + delete this.browser; + this.browser = browser; + } + return browser; + }, + + /** + * @var {String|null} selectedTab Getter for the name of the currently selected + * tab inside the Loop panel. Will be NULL if + * the panel hasn't loaded yet. + */ + get selectedTab() { + if (!this.browser) { + return null; + } + + let selectedTab = this.browser.contentDocument.querySelector(".tab-view > .selected"); + return selectedTab && selectedTab.getAttribute("data-tab-name"); + }, + + /** + * @return {Promise} + */ + promiseDocumentVisible(aDocument) { + if (!aDocument.hidden) { + return Promise.resolve(aDocument); + } + + return new Promise((resolve) => { + aDocument.addEventListener("visibilitychange", function onVisibilityChanged() { + aDocument.removeEventListener("visibilitychange", onVisibilityChanged); + resolve(aDocument); + }); + }); + }, + + /** + * Toggle between opening or hiding the Loop panel. + * + * @param {DOMEvent} [event] Optional event that triggered the call to this + * function. + * @param {String} [tabId] Optional name of the tab to select after the panel + * has opened. Does nothing when the panel is hidden. + * @return {Promise} + */ + togglePanel: function(event, tabId = null) { + if (!this.panel) { + // We're on the hidden window! What fun! + let obs = win => { + Services.obs.removeObserver(obs, "browser-delayed-startup-finished"); + win.LoopUI.togglePanel(event, tabId); + }; + Services.obs.addObserver(obs, "browser-delayed-startup-finished", false); + return OpenBrowserWindow(); + } + if (this.panel.state == "open") { + return new Promise(resolve => { + this.panel.hidePopup(); + resolve(); + }); + } + + return this.openCallPanel(event, tabId).then(doc => { + let fm = Services.focus; + fm.moveFocus(doc.defaultView, null, fm.MOVEFOCUS_FIRST, fm.FLAG_NOSCROLL); + }).catch(err => { + Cu.reportError(x); + }); + }, + + /** + * Opens the panel for Loop and sizes it appropriately. + * + * @param {event} event The event opening the panel, used to anchor + * the panel to the button which triggers it. + * @param {String} [tabId] Identifier of the tab to select when the panel is + * opened. Example: 'rooms', 'contacts', etc. + * @return {Promise} + */ + openCallPanel: function(event, tabId = null) { + return new Promise((resolve) => { + let callback = iframe => { + // Helper function to show a specific tab view in the panel. + function showTab() { + if (!tabId) { + resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); + return; + } + + let win = iframe.contentWindow; + let ev = new win.CustomEvent("UIAction", Cu.cloneInto({ + detail: { + action: "selectTab", + tab: tabId + } + }, win)); + win.dispatchEvent(ev); + resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); + } + + // If the panel has been opened and initialized before, we can skip waiting + // for the content to load - because it's already there. + if (("contentWindow" in iframe) && iframe.contentWindow.document.readyState == "complete") { + showTab(); + return; + } + + let documentDOMLoaded = () => { + iframe.removeEventListener("DOMContentLoaded", documentDOMLoaded, true); + // Handle window.close correctly on the panel. + this.hookWindowCloseForPanelClose(iframe.contentWindow); + iframe.contentWindow.addEventListener("loopPanelInitialized", function loopPanelInitialized() { + iframe.contentWindow.removeEventListener("loopPanelInitialized", + loopPanelInitialized); + showTab(); + }); + }; + iframe.addEventListener("DOMContentLoaded", documentDOMLoaded, true); + }; + + // Used to clear the temporary "login" state from the button. + Services.obs.notifyObservers(null, "loop-status-changed", null); + + this.shouldResumeTour().then((resume) => { + if (resume) { + // Assume the conversation with the visitor wasn't open since we would + // have resumed the tour as soon as the visitor joined if it was (and + // the pref would have been set to false already. + this.MozLoopService.resumeTour("waiting"); + resolve(); + return; + } + + this.LoopAPI.initialize(); + + let anchor = event ? event.target : this.toolbarButton.anchor; + let setHeight = 410; + if (gBrowser.selectedBrowser.getAttribute("remote") === "true") { + setHeight = 262; + } + this.PanelFrame.showPopup(window, anchor, + "loop", null, "about:looppanel", + // Loop wants a fixed size for the panel. This also stops it dynamically resizing. + { width: 330, height: setHeight }, + callback); + }); + }); + }, + + /** + * Method to know whether actions to open the panel should instead resume the tour. + * + * We need the panel to be opened via UITour so that it gets @noautohide. + * + * @return {Promise} resolving with a {Boolean} of whether the tour should be resumed instead of + * opening the panel. + */ + shouldResumeTour: Task.async(function* () { + // Resume the FTU tour if this is the first time a room was joined by + // someone else since the tour. + if (!Services.prefs.getBoolPref("loop.gettingStarted.resumeOnFirstJoin")) { + return false; + } + + if (!this.LoopRooms.participantsCount) { + // Nobody is in the rooms + return false; + } + + let roomsWithNonOwners = yield this.roomsWithNonOwners(); + if (!roomsWithNonOwners.length) { + // We were the only one in a room but we want to know about someone else joining. + return false; + } + + return true; + }), + + /** + * @return {Promise} resolved with an array of Rooms with participants (excluding owners) + */ + roomsWithNonOwners: function() { + return new Promise(resolve => { + this.LoopRooms.getAll((error, rooms) => { + let roomsWithNonOwners = []; + for (let room of rooms) { + if (!("participants" in room)) { + continue; + } + let numNonOwners = room.participants.filter(participant => !participant.owner).length; + if (!numNonOwners) { + continue; + } + roomsWithNonOwners.push(room); + } + resolve(roomsWithNonOwners); + }); + }); + }, + + /** + * Triggers the initialization of the loop service. Called by + * delayedStartup. + */ + init: function() { + // Add observer notifications before the service is initialized + Services.obs.addObserver(this, "loop-status-changed", false); + + // This is a promise for test purposes, but we don't want to be logging + // expected errors to the console, so we catch them here. + this.MozLoopService.initialize().catch(ex => { + if (!ex.message || + (!ex.message.contains("not enabled") && + !ex.message.contains("not needed"))) { + console.error(ex); + } + }); + this.updateToolbarState(); + }, + + uninit: function() { + Services.obs.removeObserver(this, "loop-status-changed"); + }, + + // Implements nsIObserver + observe: function(subject, topic, data) { + if (topic != "loop-status-changed") { + return; + } + this.updateToolbarState(data); + }, + + /** + * Updates the toolbar/menu-button state to reflect Loop status. + * + * @param {string} [aReason] Some states are only shown if + * a related reason is provided. + * + * aReason="login": Used after a login is completed + * successfully. This is used so the state can be + * temporarily shown until the next state change. + */ + updateToolbarState: function(aReason = null) { + if (!this.toolbarButton.node) { + return; + } + let state = ""; + let mozL10nId = "loop-call-button3"; + let suffix = ".tooltiptext"; + if (this.MozLoopService.errors.size) { + state = "error"; + mozL10nId += "-error"; + } else if (this.MozLoopService.screenShareActive) { + state = "action"; + mozL10nId += "-screensharing"; + } else if (aReason == "login" && this.MozLoopService.userProfile) { + state = "active"; + mozL10nId += "-active"; + suffix += "2"; + } else if (this.MozLoopService.doNotDisturb) { + state = "disabled"; + mozL10nId += "-donotdisturb"; + } else if (this.MozLoopService.roomsParticipantsCount > 0) { + state = "active"; + this.roomsWithNonOwners().then(roomsWithNonOwners => { + if (roomsWithNonOwners.length > 0) { + mozL10nId += "-participantswaiting"; + } else { + mozL10nId += "-active"; + } + + suffix += "2"; + this.updateTooltiptext(mozL10nId + suffix); + this.toolbarButton.node.setAttribute("state", state); + }); + return; + } else { + suffix += "2"; + } + + this.toolbarButton.node.setAttribute("state", state); + this.updateTooltiptext(mozL10nId + suffix); + }, + + /** + * Updates the tootltiptext to reflect Loop status. + * + * @param {string} [mozL10nId] l10n ID that refelct the current + * Loop status. + */ + updateTooltiptext: function(mozL10nId) { + this.toolbarButton.node.setAttribute("tooltiptext", mozL10nId); + var tooltiptext = CustomizableUI.getLocalizedProperty(this.toolbarButton, "tooltiptext"); + this.toolbarButton.node.setAttribute("tooltiptext", tooltiptext); + }, + + /** + * Show a desktop notification when 'do not disturb' isn't enabled. + * + * @param {Object} options Set of options that may tweak the appearance and + * behavior of the notification. + * Option params: + * - {String} title Notification title message + * - {String} [message] Notification body text + * - {String} [icon] Notification icon + * - {String} [sound] Sound to play + * - {String} [selectTab] Tab to select when the panel + * opens + * - {Function} [onclick] Callback to invoke when + * the notification is clicked. + * Opens the panel by default. + */ + showNotification: function(options) { + if (this.MozLoopService.doNotDisturb) { + return; + } + + if (!options.title) { + throw new Error("Missing title, can not display notification"); + } + + let notificationOptions = { + body: options.message || "" + }; + if (options.icon) { + notificationOptions.icon = options.icon; + } + if (options.sound) { + // This will not do anything, until bug bug 1105222 is resolved. + notificationOptions.mozbehavior = { + soundFile: "" + }; + this.playSound(options.sound); + } + + let notification = new window.Notification(options.title, notificationOptions); + notification.addEventListener("click", e => { + if (window.closed) { + return; + } + + try { + window.focus(); + } catch (ex) {} + + // We need a setTimeout here, otherwise the panel won't show after the + // window received focus. + window.setTimeout(() => { + if (typeof options.onclick == "function") { + options.onclick(); + } else { + // Open the Loop panel as a default action. + this.openCallPanel(null, options.selectTab || null); + } + }, 0); + }); + }, + + /** + * Play a sound in this window IF there's no sound playing yet. + * + * @param {String} name Name of the sound, like 'ringtone' or 'room-joined' + */ + playSound: function(name) { + if (this.ActiveSound || this.MozLoopService.doNotDisturb) { + return; + } + + this.activeSound = new window.Audio(); + this.activeSound.src = `chrome://browser/content/loop/shared/sounds/${name}.ogg`; + this.activeSound.load(); + this.activeSound.play(); + + this.activeSound.addEventListener("ended", () => this.activeSound = undefined, false); + }, + + /** + * Start listening to selected tab changes and notify any content page that's + * listening to 'BrowserSwitch' push messages. + * + * Push message parameters: + * - {Integer} windowId The new windowId for the browser. + */ + startBrowserSharing: function() { + if (!this._listeningToTabSelect) { + gBrowser.tabContainer.addEventListener("TabSelect", this); + this._listeningToTabSelect = true; + } + + this._maybeShowBrowserSharingInfoBar(); + + // Get the first window Id for the listener. + this.LoopAPI.broadcastPushMessage("BrowserSwitch", + gBrowser.selectedBrowser.outerWindowID); + }, + + /** + * Stop listening to selected tab changes. + */ + stopBrowserSharing: function() { + if (!this._listeningToTabSelect) { + return; + } + + this._hideBrowserSharingInfoBar(); + gBrowser.tabContainer.removeEventListener("TabSelect", this); + this._listeningToTabSelect = false; + }, + + /** + * Helper function to fetch a localized string via the MozLoopService API. + * It's currently inconveniently wrapped inside a string of stringified JSON. + * + * @param {String} key The element id to get strings for. + * @return {String} + */ + _getString: function(key) { + let str = this.MozLoopService.getStrings(key); + if (str) { + str = JSON.parse(str).textContent; + } + return str; + }, + + /** + * Shows an infobar notification at the top of the browser window that warns + * the user that their browser tabs are being broadcasted through the current + * conversation. + */ + _maybeShowBrowserSharingInfoBar: function() { + this._hideBrowserSharingInfoBar(); + + // Don't show the infobar if it's been permanently disabled from the menu. + if (!this.MozLoopService.getLoopPref(kPrefBrowserSharingInfoBar)) { + return; + } + + let box = gBrowser.getNotificationBox(); + let paused = false; + let bar = box.appendNotification( + this._getString("infobar_screenshare_browser_message"), + kBrowserSharingNotificationId, + // Icon is defined in browser theme CSS. + null, + box.PRIORITY_WARNING_LOW, + [{ + label: this._getString("infobar_button_pause_label"), + accessKey: this._getString("infobar_button_pause_accesskey"), + isDefault: false, + callback: (event, buttonInfo, buttonNode) => { + paused = !paused; + bar.label = paused ? this._getString("infobar_screenshare_paused_browser_message") : + this._getString("infobar_screenshare_browser_message"); + bar.classList.toggle("paused", paused); + buttonNode.label = paused ? this._getString("infobar_button_resume_label") : + this._getString("infobar_button_pause_label"); + buttonNode.accessKey = paused ? this._getString("infobar_button_resume_accesskey") : + this._getString("infobar_button_pause_accesskey"); + return true; + } + }, + { + label: this._getString("infobar_button_stop_label"), + accessKey: this._getString("infobar_button_stop_accesskey"), + isDefault: true, + callback: () => { + this._hideBrowserSharingInfoBar(); + LoopUI.MozLoopService.hangupAllChatWindows(); + } + }] + ); + + // Keep showing the notification bar until the user explicitly closes it. + bar.persistence = -1; + }, + + /** + * Hides the infobar, permanantly if requested. + * + * @param {Boolean} permanently Flag that determines if the infobar will never + * been shown again. Defaults to `false`. + * @return {Boolean} |true| if the infobar was hidden here. + */ + _hideBrowserSharingInfoBar: function(permanently = false, browser) { + browser = browser || gBrowser.selectedBrowser; + let box = gBrowser.getNotificationBox(browser); + let notification = box.getNotificationWithValue(kBrowserSharingNotificationId); + let removed = false; + if (notification) { + box.removeNotification(notification); + removed = true; + } + + if (permanently) { + this.MozLoopService.setLoopPref(kPrefBrowserSharingInfoBar, false); + } + + return removed; + }, + + /** + * Handles events from gBrowser. + */ + handleEvent: function(event) { + // We only should get "select" events. + if (event.type != "TabSelect") { + return; + } + + let wasVisible = false; + // Hide the infobar from the previous tab. + if (event.detail.previousTab) { + wasVisible = this._hideBrowserSharingInfoBar(false, + event.detail.previousTab.linkedBrowser); + } + + // We've changed the tab, so get the new window id. + this.LoopAPI.broadcastPushMessage("BrowserSwitch", + gBrowser.selectedBrowser.outerWindowID); + + if (wasVisible) { + // If the infobar was visible before, we should show it again after the + // switch. + this._maybeShowBrowserSharingInfoBar(); + } + }, + + /** + * Fetch the favicon of the currently selected tab in the format of a data-uri. + * + * @param {Function} callback Function to be invoked with an error object as + * its first argument when an error occurred or + * a string as second argument when the favicon + * has been fetched. + */ + getFavicon: function(callback) { + let pageURI = gBrowser.selectedTab.linkedBrowser.currentURI.spec; + // If the tab page’s url starts with http(s), fetch icon. + if (!/^https?:/.test(pageURI)) { + callback(); + return; + } + + this.PlacesUtils.promiseFaviconLinkUrl(pageURI).then(uri => { + // We XHR the favicon to get a File object, which we can pass to the FileReader + // object. The FileReader turns the File object into a data-uri. + let xhr = new XMLHttpRequest(); + xhr.open("get", uri.spec, true); + xhr.responseType = "blob"; + xhr.overrideMimeType("image/x-icon"); + xhr.onload = () => { + if (xhr.status != 200) { + callback(new Error("Invalid status code received for favicon XHR: " + xhr.status)); + return; + } + + let reader = new FileReader(); + reader.onload = reader.onload = () => callback(null, reader.result); + reader.onerror = callback; + reader.readAsDataURL(xhr.response); + }; + xhr.onerror = callback; + xhr.send(); + }).catch(err => { + callback(err || new Error("No favicon found")); + }); + } + }; + + XPCOMUtils.defineLazyModuleGetter(LoopUI, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopAPI", "resource:///modules/loop/MozLoopAPI.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopRooms", "resource:///modules/loop/LoopRooms.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "resource:///modules/loop/MozLoopService.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); + } +} From 5cd2d8d94d057f1acaaeff15b083c402f10b0013 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:57:40 +0000 Subject: [PATCH 083/153] Bug 1223573 - Part 4. Build system changes for Loop as a system add-on. r=mikedeboer,r=glandium --- .hgignore | 10 +- browser/components/moz.build | 1 - browser/extensions/loop/.eslintignore | 22 +- browser/extensions/loop/.eslintrc-gecko | 3 +- .../extensions/loop/content/modules/.eslintrc | 2 +- browser/extensions/loop/install.rdf.in | 39 +++ browser/extensions/loop/jar.mn | 248 ++++++++++-------- browser/extensions/loop/moz.build | 21 +- browser/extensions/loop/run-all-loop-tests.sh | 4 +- browser/extensions/moz.build | 1 + browser/installer/package-manifest.in | 1 + browser/themes/linux/jar.mn | 6 - browser/themes/osx/jar.mn | 14 - browser/themes/windows/jar.mn | 31 --- .../client/marionette/tests/unit-tests.ini | 2 +- 15 files changed, 216 insertions(+), 189 deletions(-) create mode 100644 browser/extensions/loop/install.rdf.in diff --git a/.hgignore b/.hgignore index 28f5bf8b43cc..0682c531c12e 100644 --- a/.hgignore +++ b/.hgignore @@ -80,9 +80,15 @@ GRTAGS GSYMS GPATH -# Unit tests for Loop +# Various items for Loop ^browser/components/loop/standalone/content/config\.js$ -^browser/components/loop/standalone/node_modules/ +^browser/extensions/loop/.*/node_modules/ +^browser/extensions/loop/.*\.module-cache +^browser/extensions/loop/test/coverage/desktop +^browser/extensions/loop/test/coverage/shared_standalone +^browser/extensions/loop/test/visual-regression/diff +^browser/extensions/loop/test/visual-regression/new +^browser/extensions/loop/test/visual-regression/refs # Git clone directory for updating web-platform-tests ^testing/web-platform/sync/ diff --git a/browser/components/moz.build b/browser/components/moz.build index 8e0d3cbd0c3f..74461650a938 100644 --- a/browser/components/moz.build +++ b/browser/components/moz.build @@ -11,7 +11,6 @@ DIRS += [ 'downloads', 'extensions', 'feeds', - 'loop', 'migration', 'newtab', 'places', diff --git a/browser/extensions/loop/.eslintignore b/browser/extensions/loop/.eslintignore index 64397d1db3d2..b5c8be673540 100644 --- a/browser/extensions/loop/.eslintignore +++ b/browser/extensions/loop/.eslintignore @@ -1,12 +1,16 @@ # This file currently uses a non-standard (and not on a standards track) # if statement within catch. -modules/MozLoopWorker.js +content/modules/MozLoopWorker.js # This file currently uses es7 features eslint issue: # https://github.com/eslint/espree/issues/125 -modules/MozLoopAPI.jsm +content/modules/MozLoopAPI.jsm +# Need to fix the configuration for this. +bootstrap.js +# Need to drop the preprocessing (bug 1212428) +content/preferences/prefs.js # Libs we don't need to check -content/libs -content/shared/libs +content/panels/vendor +content/shared/vendor standalone/content/libs standalone/node_modules # Libs we don't need to check @@ -15,11 +19,11 @@ test/shared/vendor test/coverage test/node_modules # These are generated react files that we don't need to check -content/js/conversation.js -content/js/conversationViews.js -content/js/panel.js -content/js/roomViews.js -content/js/feedbackViews.js +content/panels/js/conversation.js +content/panels/js/conversationViews.js +content/panels/js/panel.js +content/panels/js/roomViews.js +content/panels/js/feedbackViews.js content/shared/js/textChatView.js content/shared/js/linkifiedTextView.js content/shared/js/views.js diff --git a/browser/extensions/loop/.eslintrc-gecko b/browser/extensions/loop/.eslintrc-gecko index e4f17cb773cf..3fda68491412 100644 --- a/browser/extensions/loop/.eslintrc-gecko +++ b/browser/extensions/loop/.eslintrc-gecko @@ -7,9 +7,10 @@ "blockBindings": true, "destructuring": true, "generators": true, + "objectLiteralShorthandMethods": true, "restParams": true, "spread": true, - "objectLiteralShorthandMethods": true, + "templateStrings": true, }, "globals": { // Gecko + Loop Globals. diff --git a/browser/extensions/loop/content/modules/.eslintrc b/browser/extensions/loop/content/modules/.eslintrc index de960d6e5eec..5c7868e56d0f 100644 --- a/browser/extensions/loop/content/modules/.eslintrc +++ b/browser/extensions/loop/content/modules/.eslintrc @@ -1,3 +1,3 @@ { - "extends": "../.eslintrc-gecko" + "extends": "../../.eslintrc-gecko" } diff --git a/browser/extensions/loop/install.rdf.in b/browser/extensions/loop/install.rdf.in new file mode 100644 index 000000000000..2b09874541e4 --- /dev/null +++ b/browser/extensions/loop/install.rdf.in @@ -0,0 +1,39 @@ + + + +#filter substitution + + + + loop@mozilla.org + true + 0.1 + 2 + + + + + {ec8030f7-c20a-464f-9b0e-13a3a9e97384} + 45.0a1 + @FIREFOX_VERSION@ + + + + + + + xpcshell@tests.mozilla.org + 0 + 10 + + + + + Firefox Hello + Web sharing for Firefox + Mozilla + + diff --git a/browser/extensions/loop/jar.mn b/browser/extensions/loop/jar.mn index 3532277924e4..e7ebe3d4ea9b 100644 --- a/browser/extensions/loop/jar.mn +++ b/browser/extensions/loop/jar.mn @@ -2,135 +2,163 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -browser.jar: - # Desktop html files - content/browser/loop/conversation.html (content/conversation.html) - content/browser/loop/panel.html (content/panel.html) +[.] chrome.jar: +% content loop %content/ contentaccessible=yes +% skin loop classic/1.0 %skin/linux/ os=Linux +% skin loop classic/1.0 %skin/osx/ os=Darwin +% skin loop classic/1.0 %skin/windows/ os=WINNT +% skin loop-shared classic/1.0 %skin/shared/ +% override chrome://loop/skin/menuPanel.png chrome://loop/skin/menuPanel-yosemite.png os=Darwin osversion>=10.10 +% override chrome://loop/skin/menuPanel@2x.png chrome://loop/skin/menuPanel-yosemite@2x.png os=Darwin osversion>=10.10 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-yosemite.png os=Darwin osversion>=10.10 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-yosemite@2x.png os=Darwin osversion>=10.10 +% override chrome://loop/skin/menuPanel.png chrome://loop/skin/menuPanel-aero.png os=WINNT osversion=6 +% override chrome://loop/skin/menuPanel.png chrome://loop/skin/menuPanel-aero.png os=WINNT osversion=6.1 +% override chrome://loop/skin/menuPanel@2x.png chrome://loop/skin/menuPanel-aero@2x.png os=WINNT osversion=6 +% override chrome://loop/skin/menuPanel@2x.png chrome://loop/skin/menuPanel-aero@2x.png os=WINNT osversion=6.1 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-XP.png os=WINNT osversion<6 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-aero.png os=WINNT osversion=6 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-aero.png os=WINNT osversion=6.1 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-win8.png os=WINNT osversion=6.2 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-win8.png os=WINNT osversion=6.3 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-XP@2x.png os=WINNT osversion<6 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-aero@2x.png os=WINNT osversion=6 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-aero@2x.png os=WINNT osversion=6.1 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-win8@2x.png os=WINNT osversion=6.2 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-win8@2x.png os=WINNT osversion=6.3 + skin/ (skin/*) + content/modules/ (content/modules/*) +* content/preferences/prefs.js (content/preferences/prefs.js) - # Desktop libs (see bottom of this file for TokBox sdk assets) - content/browser/loop/libs/l10n.js (content/libs/l10n.js) + # Desktop html files + content/panels/conversation.html (content/panels/conversation.html) + content/panels/panel.html (content/panels/panel.html) + + # Desktop vendor (see bottom of this file for TokBox sdk assets) + content/panels/vendor/l10n.js (content/panels/vendor/l10n.js) # Desktop script - content/browser/loop/js/conversation.js (content/js/conversation.js) - content/browser/loop/js/conversationAppStore.js (content/js/conversationAppStore.js) - content/browser/loop/js/otconfig.js (content/js/otconfig.js) - content/browser/loop/js/panel.js (content/js/panel.js) - content/browser/loop/js/roomStore.js (content/js/roomStore.js) - content/browser/loop/js/roomViews.js (content/js/roomViews.js) - content/browser/loop/js/feedbackViews.js (content/js/feedbackViews.js) + content/panels/js/conversation.js (content/panels/js/conversation.js) + content/panels/js/conversationAppStore.js (content/panels/js/conversationAppStore.js) + content/panels/js/otconfig.js (content/panels/js/otconfig.js) + content/panels/js/panel.js (content/panels/js/panel.js) + content/panels/js/roomStore.js (content/panels/js/roomStore.js) + content/panels/js/roomViews.js (content/panels/js/roomViews.js) + content/panels/js/feedbackViews.js (content/panels/js/feedbackViews.js) # Desktop styles - content/browser/loop/css/panel.css (content/css/panel.css) + content/panels/css/panel.css (content/panels/css/panel.css) # Shared styles - content/browser/loop/shared/css/reset.css (content/shared/css/reset.css) - content/browser/loop/shared/css/common.css (content/shared/css/common.css) - content/browser/loop/shared/css/conversation.css (content/shared/css/conversation.css) + content/shared/css/reset.css (content/shared/css/reset.css) + content/shared/css/common.css (content/shared/css/common.css) + content/shared/css/conversation.css (content/shared/css/conversation.css) # Shared images - content/browser/loop/shared/img/helloicon.svg (content/shared/img/helloicon.svg) - content/browser/loop/shared/img/icon_32.png (content/shared/img/icon_32.png) - content/browser/loop/shared/img/icon_64.png (content/shared/img/icon_64.png) - content/browser/loop/shared/img/spinner.svg (content/shared/img/spinner.svg) + content/shared/img/helloicon.svg (content/shared/img/helloicon.svg) + content/shared/img/icon_32.png (content/shared/img/icon_32.png) + content/shared/img/icon_64.png (content/shared/img/icon_64.png) + content/shared/img/spinner.svg (content/shared/img/spinner.svg) # XXX could get rid of the png spinner usages and replace them with the svg # one? - content/browser/loop/shared/img/spinner.png (content/shared/img/spinner.png) - content/browser/loop/shared/img/spinner@2x.png (content/shared/img/spinner@2x.png) - content/browser/loop/shared/img/sad_hello_icon_64x64.svg (content/shared/img/sad_hello_icon_64x64.svg) - content/browser/loop/shared/img/chatbubble-arrow-left.svg (content/shared/img/chatbubble-arrow-left.svg) - content/browser/loop/shared/img/chatbubble-arrow-right.svg (content/shared/img/chatbubble-arrow-right.svg) - content/browser/loop/shared/img/facemute-14x14.png (content/shared/img/facemute-14x14.png) - content/browser/loop/shared/img/facemute-14x14@2x.png (content/shared/img/facemute-14x14@2x.png) - content/browser/loop/shared/img/hangup-inverse-14x14.png (content/shared/img/hangup-inverse-14x14.png) - content/browser/loop/shared/img/hangup-inverse-14x14@2x.png (content/shared/img/hangup-inverse-14x14@2x.png) - content/browser/loop/shared/img/mute-inverse-14x14.png (content/shared/img/mute-inverse-14x14.png) - content/browser/loop/shared/img/mute-inverse-14x14@2x.png (content/shared/img/mute-inverse-14x14@2x.png) - content/browser/loop/shared/img/svg/glyph-email-16x16.svg (content/shared/img/svg/glyph-email-16x16.svg) - content/browser/loop/shared/img/svg/glyph-facebook-16x16.svg (content/shared/img/svg/glyph-facebook-16x16.svg) - content/browser/loop/shared/img/svg/glyph-help-16x16.svg (content/shared/img/svg/glyph-help-16x16.svg) - content/browser/loop/shared/img/svg/glyph-link-16x16.svg (content/shared/img/svg/glyph-link-16x16.svg) - content/browser/loop/shared/img/svg/glyph-user-16x16.svg (content/shared/img/svg/glyph-user-16x16.svg) - content/browser/loop/shared/img/svg/exit.svg (content/shared/img/svg/exit.svg) - content/browser/loop/shared/img/svg/audio.svg (content/shared/img/svg/audio.svg) - content/browser/loop/shared/img/svg/audio-hover.svg (content/shared/img/svg/audio-hover.svg) - content/browser/loop/shared/img/svg/audio-mute.svg (content/shared/img/svg/audio-mute.svg) - content/browser/loop/shared/img/svg/audio-mute-hover.svg (content/shared/img/svg/audio-mute-hover.svg) - content/browser/loop/shared/img/svg/video.svg (content/shared/img/svg/video.svg) - content/browser/loop/shared/img/svg/video-hover.svg (content/shared/img/svg/video-hover.svg) - content/browser/loop/shared/img/svg/video-mute.svg (content/shared/img/svg/video-mute.svg) - content/browser/loop/shared/img/svg/video-mute-hover.svg (content/shared/img/svg/video-mute-hover.svg) - content/browser/loop/shared/img/svg/settings.svg (content/shared/img/svg/settings.svg) - content/browser/loop/shared/img/svg/settings-hover.svg (content/shared/img/svg/settings-hover.svg) - content/browser/loop/shared/img/svg/sharing.svg (content/shared/img/svg/sharing.svg) - content/browser/loop/shared/img/svg/sharing-active.svg (content/shared/img/svg/sharing-active.svg) - content/browser/loop/shared/img/svg/sharing-pending.svg (content/shared/img/svg/sharing-pending.svg) - content/browser/loop/shared/img/svg/sharing-hover.svg (content/shared/img/svg/sharing-hover.svg) - content/browser/loop/shared/img/svg/media-group.svg (content/shared/img/svg/media-group.svg) - content/browser/loop/shared/img/svg/media-group-left-hover.svg (content/shared/img/svg/media-group-left-hover.svg) - content/browser/loop/shared/img/svg/media-group-right-hover.svg (content/shared/img/svg/media-group-right-hover.svg) - content/browser/loop/shared/img/audio-call-avatar.svg (content/shared/img/audio-call-avatar.svg) - content/browser/loop/shared/img/beta-ribbon.svg (content/shared/img/beta-ribbon.svg) - content/browser/loop/shared/img/check.svg (content/shared/img/check.svg) - content/browser/loop/shared/img/icons-10x10.svg (content/shared/img/icons-10x10.svg) - content/browser/loop/shared/img/icons-14x14.svg (content/shared/img/icons-14x14.svg) - content/browser/loop/shared/img/icons-16x16.svg (content/shared/img/icons-16x16.svg) - content/browser/loop/shared/img/movistar.png (content/shared/img/movistar.png) - content/browser/loop/shared/img/movistar@2x.png (content/shared/img/movistar@2x.png) - content/browser/loop/shared/img/vivo.png (content/shared/img/vivo.png) - content/browser/loop/shared/img/vivo@2x.png (content/shared/img/vivo@2x.png) - content/browser/loop/shared/img/02.png (content/shared/img/02.png) - content/browser/loop/shared/img/02@2x.png (content/shared/img/02@2x.png) - content/browser/loop/shared/img/telefonica.png (content/shared/img/telefonica.png) - content/browser/loop/shared/img/hello_logo.svg (content/shared/img/hello_logo.svg) - content/browser/loop/shared/img/telefonica@2x.png (content/shared/img/telefonica@2x.png) - content/browser/loop/shared/img/ellipsis-v.svg (content/shared/img/ellipsis-v.svg) - content/browser/loop/shared/img/empty_conversations.svg (content/shared/img/empty_conversations.svg) - content/browser/loop/shared/img/empty_search.svg (content/shared/img/empty_search.svg) - content/browser/loop/shared/img/animated-spinner.svg (content/shared/img/animated-spinner.svg) - content/browser/loop/shared/img/avatars.svg (content/shared/img/avatars.svg) - content/browser/loop/shared/img/firefox-avatar.svg (content/shared/img/firefox-avatar.svg) - content/browser/loop/shared/img/pause-12x12.svg (content/shared/img/pause-12x12.svg) - content/browser/loop/shared/img/play-12x12.svg (content/shared/img/play-12x12.svg) - content/browser/loop/shared/img/stop-12x12.svg (content/shared/img/stop-12x12.svg) + content/shared/img/spinner.png (content/shared/img/spinner.png) + content/shared/img/spinner@2x.png (content/shared/img/spinner@2x.png) + content/shared/img/sad_hello_icon_64x64.svg (content/shared/img/sad_hello_icon_64x64.svg) + content/shared/img/chatbubble-arrow-left.svg (content/shared/img/chatbubble-arrow-left.svg) + content/shared/img/chatbubble-arrow-right.svg (content/shared/img/chatbubble-arrow-right.svg) + content/shared/img/facemute-14x14.png (content/shared/img/facemute-14x14.png) + content/shared/img/facemute-14x14@2x.png (content/shared/img/facemute-14x14@2x.png) + content/shared/img/hangup-inverse-14x14.png (content/shared/img/hangup-inverse-14x14.png) + content/shared/img/hangup-inverse-14x14@2x.png (content/shared/img/hangup-inverse-14x14@2x.png) + content/shared/img/mute-inverse-14x14.png (content/shared/img/mute-inverse-14x14.png) + content/shared/img/mute-inverse-14x14@2x.png (content/shared/img/mute-inverse-14x14@2x.png) + content/shared/img/glyph-email-16x16.svg (content/shared/img/glyph-email-16x16.svg) + content/shared/img/glyph-facebook-16x16.svg (content/shared/img/glyph-facebook-16x16.svg) + content/shared/img/glyph-help-16x16.svg (content/shared/img/glyph-help-16x16.svg) + content/shared/img/glyph-link-16x16.svg (content/shared/img/glyph-link-16x16.svg) + content/shared/img/glyph-user-16x16.svg (content/shared/img/glyph-user-16x16.svg) + content/shared/img/exit.svg (content/shared/img/exit.svg) + content/shared/img/audio.svg (content/shared/img/audio.svg) + content/shared/img/audio-hover.svg (content/shared/img/audio-hover.svg) + content/shared/img/audio-mute.svg (content/shared/img/audio-mute.svg) + content/shared/img/audio-mute-hover.svg (content/shared/img/audio-mute-hover.svg) + content/shared/img/video.svg (content/shared/img/video.svg) + content/shared/img/video-hover.svg (content/shared/img/video-hover.svg) + content/shared/img/video-mute.svg (content/shared/img/video-mute.svg) + content/shared/img/video-mute-hover.svg (content/shared/img/video-mute-hover.svg) + content/shared/img/settings.svg (content/shared/img/settings.svg) + content/shared/img/settings-hover.svg (content/shared/img/settings-hover.svg) + content/shared/img/sharing.svg (content/shared/img/sharing.svg) + content/shared/img/sharing-active.svg (content/shared/img/sharing-active.svg) + content/shared/img/sharing-pending.svg (content/shared/img/sharing-pending.svg) + content/shared/img/sharing-hover.svg (content/shared/img/sharing-hover.svg) + content/shared/img/media-group.svg (content/shared/img/media-group.svg) + content/shared/img/media-group-left-hover.svg (content/shared/img/media-group-left-hover.svg) + content/shared/img/media-group-right-hover.svg (content/shared/img/media-group-right-hover.svg) + content/shared/img/audio-call-avatar.svg (content/shared/img/audio-call-avatar.svg) + content/shared/img/beta-ribbon.svg (content/shared/img/beta-ribbon.svg) + content/shared/img/check.svg (content/shared/img/check.svg) + content/shared/img/icons-10x10.svg (content/shared/img/icons-10x10.svg) + content/shared/img/icons-14x14.svg (content/shared/img/icons-14x14.svg) + content/shared/img/icons-16x16.svg (content/shared/img/icons-16x16.svg) + content/shared/img/movistar.png (content/shared/img/movistar.png) + content/shared/img/movistar@2x.png (content/shared/img/movistar@2x.png) + content/shared/img/vivo.png (content/shared/img/vivo.png) + content/shared/img/vivo@2x.png (content/shared/img/vivo@2x.png) + content/shared/img/02.png (content/shared/img/02.png) + content/shared/img/02@2x.png (content/shared/img/02@2x.png) + content/shared/img/telefonica.png (content/shared/img/telefonica.png) + content/shared/img/hello_logo.svg (content/shared/img/hello_logo.svg) + content/shared/img/telefonica@2x.png (content/shared/img/telefonica@2x.png) + content/shared/img/ellipsis-v.svg (content/shared/img/ellipsis-v.svg) + content/shared/img/empty_conversations.svg (content/shared/img/empty_conversations.svg) + content/shared/img/empty_search.svg (content/shared/img/empty_search.svg) + content/shared/img/animated-spinner.svg (content/shared/img/animated-spinner.svg) + content/shared/img/avatars.svg (content/shared/img/avatars.svg) + content/shared/img/firefox-avatar.svg (content/shared/img/firefox-avatar.svg) + content/shared/img/pause-12x12.svg (content/shared/img/pause-12x12.svg) + content/shared/img/play-12x12.svg (content/shared/img/play-12x12.svg) + content/shared/img/stop-12x12.svg (content/shared/img/stop-12x12.svg) # Shared scripts - content/browser/loop/shared/js/actions.js (content/shared/js/actions.js) - content/browser/loop/shared/js/store.js (content/shared/js/store.js) - content/browser/loop/shared/js/activeRoomStore.js (content/shared/js/activeRoomStore.js) - content/browser/loop/shared/js/dispatcher.js (content/shared/js/dispatcher.js) - content/browser/loop/shared/js/linkifiedTextView.js (content/shared/js/linkifiedTextView.js) - content/browser/loop/shared/js/loopapi-client.js (content/shared/js/loopapi-client.js) - content/browser/loop/shared/js/models.js (content/shared/js/models.js) - content/browser/loop/shared/js/mixins.js (content/shared/js/mixins.js) - content/browser/loop/shared/js/otSdkDriver.js (content/shared/js/otSdkDriver.js) - content/browser/loop/shared/js/views.js (content/shared/js/views.js) - content/browser/loop/shared/js/textChatStore.js (content/shared/js/textChatStore.js) - content/browser/loop/shared/js/textChatView.js (content/shared/js/textChatView.js) - content/browser/loop/shared/js/urlRegExps.js (content/shared/js/urlRegExps.js) - content/browser/loop/shared/js/utils.js (content/shared/js/utils.js) - content/browser/loop/shared/js/validate.js (content/shared/js/validate.js) + content/shared/js/actions.js (content/shared/js/actions.js) + content/shared/js/crypto.js (content/shared/js/crypto.js) + content/shared/js/store.js (content/shared/js/store.js) + content/shared/js/activeRoomStore.js (content/shared/js/activeRoomStore.js) + content/shared/js/dispatcher.js (content/shared/js/dispatcher.js) + content/shared/js/linkifiedTextView.js (content/shared/js/linkifiedTextView.js) + content/shared/js/loopapi-client.js (content/shared/js/loopapi-client.js) + content/shared/js/models.js (content/shared/js/models.js) + content/shared/js/mixins.js (content/shared/js/mixins.js) + content/shared/js/otSdkDriver.js (content/shared/js/otSdkDriver.js) + content/shared/js/views.js (content/shared/js/views.js) + content/shared/js/textChatStore.js (content/shared/js/textChatStore.js) + content/shared/js/textChatView.js (content/shared/js/textChatView.js) + content/shared/js/urlRegExps.js (content/shared/js/urlRegExps.js) + content/shared/js/utils.js (content/shared/js/utils.js) + content/shared/js/validate.js (content/shared/js/validate.js) # Shared libs #ifdef DEBUG - content/browser/loop/shared/libs/react-0.13.3.js (content/shared/libs/react-0.13.3.js) + content/shared/vendor/react-0.13.3.js (content/shared/vendor/react-0.13.3.js) #else - content/browser/loop/shared/libs/react-0.13.3.js (content/shared/libs/react-0.13.3-prod.js) + content/shared/vendor/react-0.13.3.js (content/shared/vendor/react-0.13.3-prod.js) #endif - content/browser/loop/shared/libs/lodash-3.9.3.js (content/shared/libs/lodash-3.9.3.js) - content/browser/loop/shared/libs/backbone-1.2.1.js (content/shared/libs/backbone-1.2.1.js) - content/browser/loop/shared/libs/classnames-2.2.0.js (content/shared/libs/classnames-2.2.0.js) + content/shared/vendor/lodash-3.9.3.js (content/shared/vendor/lodash-3.9.3.js) + content/shared/vendor/backbone-1.2.1.js (content/shared/vendor/backbone-1.2.1.js) + content/shared/vendor/classnames-2.2.0.js (content/shared/vendor/classnames-2.2.0.js) # Shared sounds - content/browser/loop/shared/sounds/ringtone.ogg (content/shared/sounds/ringtone.ogg) - content/browser/loop/shared/sounds/connecting.ogg (content/shared/sounds/connecting.ogg) - content/browser/loop/shared/sounds/connected.ogg (content/shared/sounds/connected.ogg) - content/browser/loop/shared/sounds/terminated.ogg (content/shared/sounds/terminated.ogg) - content/browser/loop/shared/sounds/room-joined.ogg (content/shared/sounds/room-joined.ogg) - content/browser/loop/shared/sounds/room-joined-in.ogg (content/shared/sounds/room-joined-in.ogg) - content/browser/loop/shared/sounds/room-left.ogg (content/shared/sounds/room-left.ogg) - content/browser/loop/shared/sounds/failure.ogg (content/shared/sounds/failure.ogg) - content/browser/loop/shared/sounds/message.ogg (content/shared/sounds/message.ogg) + content/shared/sounds/ringtone.ogg (content/shared/sounds/ringtone.ogg) + content/shared/sounds/connecting.ogg (content/shared/sounds/connecting.ogg) + content/shared/sounds/connected.ogg (content/shared/sounds/connected.ogg) + content/shared/sounds/terminated.ogg (content/shared/sounds/terminated.ogg) + content/shared/sounds/room-joined.ogg (content/shared/sounds/room-joined.ogg) + content/shared/sounds/room-joined-in.ogg (content/shared/sounds/room-joined-in.ogg) + content/shared/sounds/room-left.ogg (content/shared/sounds/room-left.ogg) + content/shared/sounds/failure.ogg (content/shared/sounds/failure.ogg) + content/shared/sounds/message.ogg (content/shared/sounds/message.ogg) # Partner SDK assets - content/browser/loop/libs/sdk.js (content/shared/libs/sdk.js) - content/browser/loop/sdk-content/js/dynamic_config.min.js (content/shared/libs/sdk-content/js/dynamic_config.min.js) + content/shared/vendor/sdk.js (content/shared/vendor/sdk.js) + content/sdk-content/js/dynamic_config.min.js (content/shared/vendor/sdk-content/js/dynamic_config.min.js) diff --git a/browser/extensions/loop/moz.build b/browser/extensions/loop/moz.build index b76d562ec638..f9124ef2fe21 100644 --- a/browser/extensions/loop/moz.build +++ b/browser/extensions/loop/moz.build @@ -4,6 +4,16 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +FINAL_TARGET = 'dist/bin/browser/features/loop@test.mozilla.org' + +FINAL_TARGET_FILES += [ + 'bootstrap.js' +] + +DIST_FILES += [ + 'install.rdf.in' +] + JAR_MANIFESTS += ['jar.mn'] XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell/xpcshell.ini'] @@ -12,16 +22,5 @@ BROWSER_CHROME_MANIFESTS += [ 'test/mochitest/browser.ini', ] -EXTRA_JS_MODULES.loop += [ - 'content/shared/js/crypto.js', - 'content/shared/js/utils.js', - 'modules/LoopRooms.jsm', - 'modules/LoopRoomsCache.jsm', - 'modules/MozLoopAPI.jsm', - 'modules/MozLoopPushHandler.jsm', - 'modules/MozLoopService.jsm', - 'modules/MozLoopWorker.js', -] - with Files('**'): BUG_COMPONENT = ('Loop', 'Client') diff --git a/browser/extensions/loop/run-all-loop-tests.sh b/browser/extensions/loop/run-all-loop-tests.sh index 2628c0b1aed2..dee165708fc5 100755 --- a/browser/extensions/loop/run-all-loop-tests.sh +++ b/browser/extensions/loop/run-all-loop-tests.sh @@ -12,7 +12,7 @@ set -e # Main tests -LOOPDIR=browser/components/loop +LOOPDIR=browser/extensions/loop ESLINT=standalone/node_modules/.bin/eslint if [ -x "${LOOPDIR}/${ESLINT}" ]; then echo 'running eslint; see http://eslint.org/docs/rules/ for error info' @@ -25,7 +25,7 @@ fi # Build tests coverage. MISSINGDEPSMSG="\nMake sure all dependencies are up to date by running -'npm install' inside the 'browser/components/loop/test/' directory.\n" +'npm install' inside the 'browser/extensions/loop/test/' directory.\n" ( cd ${LOOPDIR}/test if ! npm run-script build-coverage ; then diff --git a/browser/extensions/moz.build b/browser/extensions/moz.build index cf19e7519aae..7d54e6e2f045 100644 --- a/browser/extensions/moz.build +++ b/browser/extensions/moz.build @@ -5,6 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. DIRS += [ + 'loop', 'pdfjs', 'shumway', ] diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index 0e3771f7872e..35bccc54d340 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -676,6 +676,7 @@ @RESPATH@/browser/chrome/icons/default/default32.png @RESPATH@/browser/chrome/icons/default/default48.png #endif +@RESPATH@/browser/features/* ; [Webide Files] @RESPATH@/browser/chrome/webide@JAREXT@ diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn index 6e70af6af79e..bb09979e74d1 100644 --- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -47,12 +47,6 @@ browser.jar: skin/classic/browser/Toolbar-inverted.png skin/classic/browser/Toolbar-small.png skin/classic/browser/webRTC-indicator.css - skin/classic/browser/loop/menuPanel.png (loop/menuPanel.png) - skin/classic/browser/loop/menuPanel@2x.png (loop/menuPanel@2x.png) - skin/classic/browser/loop/toolbar.png (loop/toolbar.png) - skin/classic/browser/loop/toolbar@2x.png (loop/toolbar@2x.png) - skin/classic/browser/loop/toolbar-inverted.png (loop/toolbar-inverted.png) - skin/classic/browser/loop/toolbar-inverted@2x.png (loop/toolbar-inverted@2x.png) * skin/classic/browser/controlcenter/panel.css (controlcenter/panel.css) skin/classic/browser/customizableui/background-noise-toolbar.png (customizableui/background-noise-toolbar.png) skin/classic/browser/customizableui/customizeMode-gridTexture.png (customizableui/customizeMode-gridTexture.png) diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn index 067270e3d4ca..48911ec4ac93 100644 --- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -73,16 +73,6 @@ browser.jar: skin/classic/browser/webRTC-sharingScreen-menubar.png skin/classic/browser/webRTC-sharingScreen-menubar@2x.png skin/classic/browser/webRTC-indicator.css - skin/classic/browser/loop/menuPanel.png (loop/menuPanel.png) - skin/classic/browser/loop/menuPanel@2x.png (loop/menuPanel@2x.png) - skin/classic/browser/loop/toolbar.png (loop/toolbar.png) - skin/classic/browser/loop/toolbar@2x.png (loop/toolbar@2x.png) - skin/classic/browser/loop/toolbar-inverted.png (loop/toolbar-inverted.png) - skin/classic/browser/loop/toolbar-inverted@2x.png (loop/toolbar-inverted@2x.png) - skin/classic/browser/yosemite/loop/menuPanel.png (loop/menuPanel-yosemite.png) - skin/classic/browser/yosemite/loop/menuPanel@2x.png (loop/menuPanel-yosemite@2x.png) - skin/classic/browser/yosemite/loop/toolbar.png (loop/toolbar-yosemite.png) - skin/classic/browser/yosemite/loop/toolbar@2x.png (loop/toolbar-yosemite@2x.png) * skin/classic/browser/controlcenter/panel.css (controlcenter/panel.css) skin/classic/browser/customizableui/background-noise-toolbar.png (customizableui/background-noise-toolbar.png) skin/classic/browser/customizableui/customize-titleBar-toggle.png (customizableui/customize-titleBar-toggle.png) @@ -280,10 +270,6 @@ browser.jar: % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/yosemite/Toolbar@2x.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel.png chrome://browser/skin/yosemite/menuPanel.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel@2x.png chrome://browser/skin/yosemite/menuPanel@2x.png os=Darwin osversion>=10.10 -% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/yosemite/loop/menuPanel.png os=Darwin osversion>=10.10 -% override chrome://browser/skin/loop/menuPanel@2x.png chrome://browser/skin/yosemite/loop/menuPanel@2x.png os=Darwin osversion>=10.10 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/yosemite/loop/toolbar.png os=Darwin osversion>=10.10 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/yosemite/loop/toolbar@2x.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel-customize.png chrome://browser/skin/yosemite/menuPanel-customize.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel-customize@2x.png chrome://browser/skin/yosemite/menuPanel-customize@2x.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel-exit.png chrome://browser/skin/yosemite/menuPanel-exit.png os=Darwin osversion>=10.10 diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn index 6006c67bfb2c..43cc06470123 100644 --- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -83,22 +83,6 @@ browser.jar: skin/classic/browser/urlbar-history-dropmarker-XPVista7.png skin/classic/browser/urlbar-history-dropmarker-XPVista7@2x.png skin/classic/browser/webRTC-indicator.css - skin/classic/browser/loop/menuPanel.png (loop/menuPanel.png) - skin/classic/browser/loop/menuPanel@2x.png (loop/menuPanel@2x.png) - skin/classic/browser/loop/menuPanel-aero.png (loop/menuPanel-aero.png) - skin/classic/browser/loop/menuPanel-aero@2x.png (loop/menuPanel-aero@2x.png) - skin/classic/browser/loop/toolbar.png (loop/toolbar.png) - skin/classic/browser/loop/toolbar@2x.png (loop/toolbar@2x.png) - skin/classic/browser/loop/toolbar-aero.png (loop/toolbar-aero.png) - skin/classic/browser/loop/toolbar-aero@2x.png (loop/toolbar-aero@2x.png) - skin/classic/browser/loop/toolbar-inverted.png (loop/toolbar-inverted.png) - skin/classic/browser/loop/toolbar-inverted@2x.png (loop/toolbar-inverted@2x.png) - skin/classic/browser/loop/toolbar-lunaSilver.png (loop/toolbar-lunaSilver.png) - skin/classic/browser/loop/toolbar-lunaSilver@2x.png (loop/toolbar-lunaSilver@2x.png) - skin/classic/browser/loop/toolbar-win8.png (loop/toolbar-win8.png) - skin/classic/browser/loop/toolbar-win8@2x.png (loop/toolbar-win8@2x.png) - skin/classic/browser/loop/toolbar-XP.png (loop/toolbar-XP.png) - skin/classic/browser/loop/toolbar-XP@2x.png (loop/toolbar-XP@2x.png) * skin/classic/browser/controlcenter/panel.css (controlcenter/panel.css) skin/classic/browser/customizableui/background-noise-toolbar.png (customizableui/background-noise-toolbar.png) skin/classic/browser/customizableui/customize-titleBar-toggle.png (customizableui/customize-titleBar-toggle.png) @@ -325,26 +309,11 @@ browser.jar: % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/Toolbar-aero@2x.png os=WINNT osversion=6.1 % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/Toolbar-win8@2x.png os=WINNT osversion=6.2 % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/Toolbar-win8@2x.png os=WINNT osversion=6.3 -% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/loop/menuPanel-aero.png os=WINNT osversion=6 -% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/loop/menuPanel-aero.png os=WINNT osversion=6.1 -% override chrome://browser/skin/loop/menuPanel@2x.png chrome://browser/skin/loop/menuPanel-aero@2x.png os=WINNT osversion=6 -% override chrome://browser/skin/loop/menuPanel@2x.png chrome://browser/skin/loop/menuPanel-aero@2x.png os=WINNT osversion=6.1 - % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-XP.png os=WINNT osversion<6 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-aero.png os=WINNT osversion=6 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-aero.png os=WINNT osversion=6.1 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-win8.png os=WINNT osversion=6.2 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-win8.png os=WINNT osversion=6.3 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-XP.png os=WINNT osversion<6 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-aero.png os=WINNT osversion=6 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-aero.png os=WINNT osversion=6.1 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-win8.png os=WINNT osversion=6.2 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-win8.png os=WINNT osversion=6.3 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-XP@2x.png os=WINNT osversion<6 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-aero@2x.png os=WINNT osversion=6 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-aero@2x.png os=WINNT osversion=6.1 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-win8@2x.png os=WINNT osversion=6.2 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-win8@2x.png os=WINNT osversion=6.3 % override chrome://browser/skin/preferences/checkbox.png chrome://browser/skin/preferences/checkbox-aero.png os=WINNT osversion=6 % override chrome://browser/skin/preferences/checkbox.png chrome://browser/skin/preferences/checkbox-aero.png os=WINNT osversion=6.1 % override chrome://browser/skin/preferences/checkbox.png chrome://browser/skin/preferences/checkbox-xp.png os=WINNT osversion<6 diff --git a/testing/marionette/client/marionette/tests/unit-tests.ini b/testing/marionette/client/marionette/tests/unit-tests.ini index aa9e73058eda..5786ad6835f5 100644 --- a/testing/marionette/client/marionette/tests/unit-tests.ini +++ b/testing/marionette/client/marionette/tests/unit-tests.ini @@ -19,4 +19,4 @@ test_container = true [include:../../../../../layout/base/tests/marionette/manifest.ini] ; loop tests -[include:../../../../../browser/components/loop/manifest.ini] +[include:../../../../../browser/extensions/loop/manifest.ini] From a11482cde7adb04333502b56360cee5e7324bfb3 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:57:40 +0000 Subject: [PATCH 084/153] Bug 1223573 - Part 5. Update uris and paths for files in Loop's system add-on. r=mikedeboer --- .../uitour/test/browser_UITour_loop.js | 4 +- browser/extensions/loop/README.txt | 10 ++-- browser/extensions/loop/bootstrap.js | 8 +-- browser/extensions/loop/build-jsx | 4 +- .../loop/content/modules/LoopRooms.jsm | 8 +-- .../loop/content/modules/LoopRoomsCache.jsm | 2 +- .../loop/content/modules/MozLoopAPI.jsm | 4 +- .../content/modules/MozLoopPushHandler.jsm | 2 +- .../loop/content/modules/MozLoopService.jsm | 12 ++-- .../loop/content/panels/conversation.html | 59 ++++++++++--------- .../loop/content/panels/css/panel.css | 36 +++++------ .../loop/content/panels/js/panel.js | 10 ++-- .../loop/content/panels/js/panel.jsx | 10 ++-- .../loop/content/panels/js/roomViews.js | 6 +- .../loop/content/panels/js/roomViews.jsx | 6 +- .../extensions/loop/content/panels/panel.html | 41 ++++++------- .../loop/content/shared/css/conversation.css | 40 ++++++------- .../loop/content/shared/js/crypto.js | 2 +- .../loop/content/shared/js/views.js | 2 +- .../loop/content/shared/js/views.jsx | 2 +- browser/extensions/loop/moz.build | 2 +- browser/extensions/loop/skin/shared/loop.css | 12 ++-- .../extensions/loop/skin/windows/platform.css | 4 +- .../loop/standalone/content/css/webapp.css | 4 +- .../standalone/content/webappEntryPoint.js | 10 ++-- browser/extensions/loop/standalone/server.js | 4 ++ .../loop/test/desktop-local/README.md | 2 +- .../loop/test/desktop-local/index.html | 22 +++---- .../loop/test/karma/karma.coverage.desktop.js | 22 +++---- .../karma/karma.coverage.shared_standalone.js | 10 ++-- .../mochitest/browser_LoopRooms_channel.js | 2 +- .../loop/test/mochitest/browser_fxa_login.js | 2 +- .../test/mochitest/browser_loop_fxa_server.js | 2 +- .../browser_mozLoop_appVersionInfo.js | 2 +- .../test/mochitest/browser_mozLoop_context.js | 2 +- .../browser_mozLoop_sharingListeners.js | 2 +- .../mochitest/browser_mozLoop_socialShare.js | 2 +- .../mochitest/browser_mozLoop_telemetry.js | 2 +- .../test/mochitest/browser_toolbarbutton.js | 2 +- .../extensions/loop/test/mochitest/head.js | 8 +-- .../extensions/loop/test/shared/index.html | 8 +-- .../extensions/loop/test/shared/views_test.js | 2 +- .../loop/test/standalone/index.html | 8 +-- .../extensions/loop/test/xpcshell/.eslintrc | 4 +- browser/extensions/loop/test/xpcshell/head.js | 10 ++-- .../xpcshell/test_loopapi_doNotDisturb.js | 2 +- .../test/xpcshell/test_loopapi_internal.js | 2 +- .../loop/test/xpcshell/test_loopapi_prefs.js | 2 +- .../loop/test/xpcshell/test_looprooms.js | 2 +- .../test_looprooms_encryption_in_fxa.js | 2 +- .../test_looprooms_first_notification.js | 2 +- .../test/xpcshell/test_looprooms_getall.js | 1 - .../test_looprooms_upgrade_to_encryption.js | 4 +- .../xpcshell/test_loopservice_hawk_errors.js | 2 +- browser/extensions/loop/ui/README.md | 2 +- browser/extensions/loop/ui/index.html | 20 +++---- 56 files changed, 233 insertions(+), 226 deletions(-) diff --git a/browser/components/uitour/test/browser_UITour_loop.js b/browser/components/uitour/test/browser_UITour_loop.js index 0f6a6ba38c11..97b4093a4e89 100644 --- a/browser/components/uitour/test/browser_UITour_loop.js +++ b/browser/components/uitour/test/browser_UITour_loop.js @@ -9,8 +9,8 @@ var gContentWindow; var loopButton; var loopPanel = document.getElementById("loop-notification-panel"); -const { LoopRooms } = Components.utils.import("resource:///modules/loop/LoopRooms.jsm", {}); -const { MozLoopServiceInternal } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); +const { LoopRooms } = Components.utils.import("chrome://loop/content/modules/LoopRooms.jsm", {}); +const { MozLoopServiceInternal } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); function test() { UITourTest(); diff --git a/browser/extensions/loop/README.txt b/browser/extensions/loop/README.txt index 4903e0866a1d..7b23f46e2e20 100644 --- a/browser/extensions/loop/README.txt +++ b/browser/extensions/loop/README.txt @@ -22,9 +22,9 @@ using npm in order to compile the .jsx files into regular .js ones: npm install -g react-tools@0.12.2 Once installed, run build-jsx with the --watch option from -browser/components/loop, eg.: +browser/extensions/loop, eg.: - cd browser/components/loop + cd browser/extensions/loop ./build-jsx --watch build-jsx can also be do a one-time compile pass instead of watching if @@ -36,7 +36,7 @@ Hacking ======= Please be sure to execute - browser/components/loop/run-all-loop-tests.sh + browser/extensions/loop/run-all-loop-tests.sh from the top level before requesting review on a patch. @@ -52,7 +52,7 @@ If you install eslint and the react plugin globally: npm install -g eslint npm install -g eslint-plugin-react -You can also run it by hand in the browser/components/loop directory: +You can also run it by hand in the browser/extensions/loop directory: eslint --ext .js --ext .jsx --ext .jsm . @@ -88,7 +88,7 @@ install that is properly configured. From the top-level gecko directory, execute: export LOOP_SERVER=/Users/larry/src/loop-server - ./mach marionette-test browser/components/loop/test/functional/manifest.ini + ./mach marionette-test browser/extensions/loop/test/functional/manifest.ini Once the automation is complete, we'll include this in run-all-loop-tests.sh as well. diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js index 90be7de3e68a..3626102d6a29 100644 --- a/browser/extensions/loop/bootstrap.js +++ b/browser/extensions/loop/bootstrap.js @@ -409,7 +409,7 @@ var WindowListener = { } this.activeSound = new window.Audio(); - this.activeSound.src = `chrome://browser/content/loop/shared/sounds/${name}.ogg`; + this.activeSound.src = `chrome://loop/content/shared/sounds/${name}.ogg`; this.activeSound.load(); this.activeSound.play(); @@ -610,9 +610,9 @@ var WindowListener = { }; XPCOMUtils.defineLazyModuleGetter(LoopUI, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopAPI", "resource:///modules/loop/MozLoopAPI.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopRooms", "resource:///modules/loop/LoopRooms.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "resource:///modules/loop/MozLoopService.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopAPI", "chrome://loop/content/modules/MozLoopAPI.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopRooms", "chrome://loop/content/modules/LoopRooms.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "chrome://loop/content/modules/MozLoopService.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); } diff --git a/browser/extensions/loop/build-jsx b/browser/extensions/loop/build-jsx index be95fd1a06bb..e8bc48012297 100755 --- a/browser/extensions/loop/build-jsx +++ b/browser/extensions/loop/build-jsx @@ -74,7 +74,7 @@ def find_react_command(): return [node, jsx_path] -SHARED_LIBS_DIR=os.path.join(os.path.dirname(__file__), "content", "shared", "libs") +SHARED_LIBS_DIR=os.path.join(os.path.dirname(__file__), "content", "shared", "vendor") REACT_VERSION=find_react_version(SHARED_LIBS_DIR) src_files = [] # files to be compiled @@ -99,7 +99,7 @@ else: # parse the CLI arguments description = 'Loop build tool for JSX files. ' + \ 'Will scan entire loop directory and compile them in place. ' + \ - 'Must be executed from browser/components/loop directory.' + 'Must be executed from browser/extensions/loop directory.' parser = argparse.ArgumentParser(description=description) parser.add_argument('--watch', '-w', action='store_true', help='continuous' + diff --git a/browser/extensions/loop/content/modules/LoopRooms.jsm b/browser/extensions/loop/content/modules/LoopRooms.jsm index 22b5541e270f..7665ef5e9616 100644 --- a/browser/extensions/loop/content/modules/LoopRooms.jsm +++ b/browser/extensions/loop/content/modules/LoopRooms.jsm @@ -10,7 +10,7 @@ Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Task.jsm"); Cu.import("resource://gre/modules/Timer.jsm"); -const { MozLoopService, LOOP_SESSION_TYPE } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); +const { MozLoopService, LOOP_SESSION_TYPE } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); XPCOMUtils.defineLazyModuleGetter(this, "Promise", "resource://gre/modules/Promise.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "CommonUtils", @@ -27,11 +27,11 @@ XPCOMUtils.defineLazyGetter(this, "gLoopBundle", function() { }); XPCOMUtils.defineLazyModuleGetter(this, "LoopRoomsCache", - "resource:///modules/loop/LoopRoomsCache.jsm"); + "chrome://loop/content/modules/LoopRoomsCache.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "loopUtils", - "resource:///modules/loop/utils.js", "utils"); + "chrome://loop/content/modules/utils.js", "utils"); XPCOMUtils.defineLazyModuleGetter(this, "loopCrypto", - "resource:///modules/loop/crypto.js", "LoopCrypto"); + "chrome://loop/content/shared/js/crypto.js", "LoopCrypto"); XPCOMUtils.defineLazyModuleGetter(this, "ObjectUtils", "resource://gre/modules/ObjectUtils.jsm"); diff --git a/browser/extensions/loop/content/modules/LoopRoomsCache.jsm b/browser/extensions/loop/content/modules/LoopRoomsCache.jsm index f1265a6611b6..de123d2e3d6b 100644 --- a/browser/extensions/loop/content/modules/LoopRoomsCache.jsm +++ b/browser/extensions/loop/content/modules/LoopRoomsCache.jsm @@ -9,7 +9,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Task.jsm"); const { MozLoopService, LOOP_SESSION_TYPE } = - Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); + Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); XPCOMUtils.defineLazyModuleGetter(this, "CommonUtils", "resource://services-common/utils.js"); XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm"); diff --git a/browser/extensions/loop/content/modules/MozLoopAPI.jsm b/browser/extensions/loop/content/modules/MozLoopAPI.jsm index 70638ee9fe3e..49f4a30b2604 100644 --- a/browser/extensions/loop/content/modules/MozLoopAPI.jsm +++ b/browser/extensions/loop/content/modules/MozLoopAPI.jsm @@ -9,8 +9,8 @@ const { classes: Cc, interfaces: Ci, utils: Cu } = Components; Cu.import("resource://services-common/utils.js"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource:///modules/loop/MozLoopService.jsm"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); +Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); +Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); Cu.importGlobalProperties(["Blob"]); XPCOMUtils.defineLazyModuleGetter(this, "PageMetadata", diff --git a/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm b/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm index 8be93ff80f7c..cb10cea3f6ad 100644 --- a/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm +++ b/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm @@ -10,7 +10,7 @@ Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Timer.jsm"); -const { MozLoopService } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); +const { MozLoopService } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); const consoleLog = MozLoopService.log; this.EXPORTED_SYMBOLS = ["MozLoopPushHandler"]; diff --git a/browser/extensions/loop/content/modules/MozLoopService.jsm b/browser/extensions/loop/content/modules/MozLoopService.jsm index 15c8bae30773..43e3c5609370 100644 --- a/browser/extensions/loop/content/modules/MozLoopService.jsm +++ b/browser/extensions/loop/content/modules/MozLoopService.jsm @@ -121,14 +121,14 @@ XPCOMUtils.defineConstant(this, "ROOM_DELETE", ROOM_DELETE); XPCOMUtils.defineConstant(this, "ROOM_CONTEXT_ADD", ROOM_CONTEXT_ADD); XPCOMUtils.defineLazyModuleGetter(this, "LoopAPI", - "resource:///modules/loop/MozLoopAPI.jsm"); + "chrome://loop/content/modules/MozLoopAPI.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "convertToRTCStatsReport", "resource://gre/modules/media/RTCStatsReport.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "loopUtils", - "resource:///modules/loop/utils.js", "utils"); + "chrome://loop/content/modules/utils.js", "utils"); XPCOMUtils.defineLazyModuleGetter(this, "loopCrypto", - "resource:///modules/loop/crypto.js", "LoopCrypto"); + "chrome://loop/content/shared/js/crypto.js", "LoopCrypto"); XPCOMUtils.defineLazyModuleGetter(this, "Chat", "resource:///modules/Chat.jsm"); @@ -151,13 +151,13 @@ XPCOMUtils.defineLazyModuleGetter(this, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "LoopRooms", - "resource:///modules/loop/LoopRooms.jsm"); + "chrome://loop/content/modules/LoopRooms.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "roomsPushNotification", - "resource:///modules/loop/LoopRooms.jsm"); + "chrome://loop/content/modules/LoopRooms.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "MozLoopPushHandler", - "resource:///modules/loop/MozLoopPushHandler.jsm"); + "chrome://loop/content/modules/MozLoopPushHandler.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "UITour", "resource:///modules/UITour.jsm"); diff --git a/browser/extensions/loop/content/panels/conversation.html b/browser/extensions/loop/content/panels/conversation.html index dfc2c8715f9d..7cbb81835f2c 100644 --- a/browser/extensions/loop/content/panels/conversation.html +++ b/browser/extensions/loop/content/panels/conversation.html @@ -7,9 +7,10 @@ - - - + + + + @@ -17,32 +18,32 @@
- - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/browser/extensions/loop/content/panels/css/panel.css b/browser/extensions/loop/content/panels/css/panel.css index 374d86543028..f875d502bae5 100644 --- a/browser/extensions/loop/content/panels/css/panel.css +++ b/browser/extensions/loop/content/panels/css/panel.css @@ -12,7 +12,7 @@ body { /* Beta Ribbon */ .beta-ribbon { - background: url("../shared/img/beta-ribbon.svg") no-repeat; + background: url("../../shared/img/beta-ribbon.svg") no-repeat; background-size: 30px; width: 30px; height: 30px; @@ -158,7 +158,7 @@ body { transform: translateY(-50%); padding-top: 11rem; padding-bottom: 1rem; - background-image: url("../shared/img/empty_conversations.svg"); + background-image: url("../../shared/img/empty_conversations.svg"); background-repeat: no-repeat; background-position: top center; } @@ -324,11 +324,11 @@ body { } .room-list > .room-entry:hover > h2 > .copy-link { - background-image: url(../shared/img/icons-16x16.svg#copy); + background-image: url(../../shared/img/icons-16x16.svg#copy); } .room-list > .room-entry:hover > h2 > .delete-link { - background-image: url(../shared/img/icons-16x16.svg#trash); + background-image: url(../../shared/img/icons-16x16.svg#trash); } /* scale this up to 1.1x and then back to the original size */ @@ -338,7 +338,7 @@ body { } .room-list > .room-entry > h2 > .copy-link.checked { - background: transparent url(../shared/img/icons-16x16.svg#checkmark); + background: transparent url(../../shared/img/icons-16x16.svg#checkmark); animation: pulse .150s; animation-timing-function: ease-in-out; top: 0; @@ -362,7 +362,7 @@ body { /* Room entry edit button */ .room-entry-context-edit-btn { - background-image: url("../shared/img/icons-10x10.svg#edit-darkgrey"); + background-image: url("../../shared/img/icons-10x10.svg#edit-darkgrey"); background-position: center; background-repeat: no-repeat; background-size: 12px; @@ -399,7 +399,7 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu { .button-close { background-color: transparent; - background-image: url(../shared/img/icons-10x10.svg#close); + background-image: url(../../shared/img/icons-10x10.svg#close); background-repeat: no-repeat; background-size: 8px 8px; border: none; @@ -428,7 +428,7 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu { } .spinner.busy { - background-image: url(../shared/img/spinner.png); + background-image: url(../../shared/img/spinner.png); animation-name: spinnerRotate; animation-duration: 1s; animation-timing-function: linear; @@ -437,7 +437,7 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu { @media (min-resolution: 2dppx) { .spinner.busy { - background-image: url(../shared/img/spinner@2x.png); + background-image: url(../../shared/img/spinner@2x.png); } } @@ -502,7 +502,7 @@ html[dir="rtl"] .generate-url-spinner { margin-left: 10px; margin-right: 10px; vertical-align: middle; - background-image: url("../shared/img/telefonica.png"); + background-image: url("../../shared/img/telefonica.png"); background-size: 72px 20px; width: 72px; height: 20px; @@ -510,21 +510,21 @@ html[dir="rtl"] .generate-url-spinner { #powered-by-logo.en-GB, #powered-by-logo.de { - background-image: url("../shared/img/02.png"); + background-image: url("../../shared/img/02.png"); background-size: 21px 20px; width: 21px; height: 20px; } #powered-by-logo.pt-BR { - background-image: url("../shared/img/vivo.png"); + background-image: url("../../shared/img/vivo.png"); background-size: 53px 26px; width: 53px; height: 26px; } #powered-by-logo[class^="es-"] { - background-image: url("../shared/img/movistar.png"); + background-image: url("../../shared/img/movistar.png"); background-size: 92px 20px; width: 92px; height: 20px; @@ -532,20 +532,20 @@ html[dir="rtl"] .generate-url-spinner { @media (min-resolution: 2dppx) { #powered-by-logo { - background-image: url("../shared/img/telefonica@2x.png"); + background-image: url("../../shared/img/telefonica@2x.png"); } #powered-by-logo.en-GB, #powered-by-logo.de { - background-image: url("../shared/img/02@2x.png"); + background-image: url("../../shared/img/02@2x.png"); } #powered-by-logo.pt-BR { - background-image: url("../shared/img/vivo@2x.png"); + background-image: url("../../shared/img/vivo@2x.png"); } #powered-by-logo[class^="es-"] { - background-image: url("../shared/img/movistar@2x.png"); + background-image: url("../../shared/img/movistar@2x.png"); } } @@ -594,7 +594,7 @@ html[dir="rtl"] .generate-url-spinner { border: none; cursor: pointer; vertical-align: middle; - background: transparent url("../shared/img/icons-10x10.svg#settings-cog"); + background: transparent url("../../shared/img/icons-10x10.svg#settings-cog"); background-position: center; background-repeat: no-repeat; background-size: cover; diff --git a/browser/extensions/loop/content/panels/js/panel.js b/browser/extensions/loop/content/panels/js/panel.js index ff4ca198eb3a..e5c41a08ceb6 100644 --- a/browser/extensions/loop/content/panels/js/panel.js +++ b/browser/extensions/loop/content/panels/js/panel.js @@ -29,7 +29,7 @@ loop.panel = (function(_, mozL10n) { return ( React.createElement("div", {className: "fte-get-started-content"}, React.createElement("header", {className: "fte-title"}, - React.createElement("img", {src: "loop/shared/img/hello_logo.svg"}), + React.createElement("img", {src: "shared/img/hello_logo.svg"}), React.createElement("div", {className: "fte-subheader"}, mozL10n.get("first_time_experience_subheading") ) @@ -379,7 +379,7 @@ loop.panel = (function(_, mozL10n) { _renderDefaultIcon: function() { return ( React.createElement("div", {className: "room-entry-context-item"}, - React.createElement("img", {src: "loop/shared/img/icons-16x16.svg#globe"}) + React.createElement("img", {src: "shared/img/icons-16x16.svg#globe"}) ) ); }, @@ -390,7 +390,7 @@ loop.panel = (function(_, mozL10n) { React.createElement("a", {href: roomUrl.location, onClick: this.handleClick, title: roomUrl.description}, - React.createElement("img", {src: roomUrl.thumbnail || "loop/shared/img/icons-16x16.svg#globe"}) + React.createElement("img", {src: roomUrl.thumbnail || "shared/img/icons-16x16.svg#globe"}) ) ) ); @@ -717,7 +717,7 @@ loop.panel = (function(_, mozL10n) { React.createElement("div", {className: "room-list"}, this._renderNewRoomButton(), React.createElement("div", {className: "room-list-loading"}, - React.createElement("img", {src: "loop/shared/img/animated-spinner.svg"}) + React.createElement("img", {src: "shared/img/animated-spinner.svg"}) ) ) ); @@ -884,7 +884,7 @@ loop.panel = (function(_, mozL10n) { return ( React.createElement("div", {className: "error-content"}, React.createElement("header", {className: "error-title"}, - React.createElement("img", {src: "loop/shared/img/sad_hello_icon_64x64.svg"}), + React.createElement("img", {src: "shared/img/sad_hello_icon_64x64.svg"}), React.createElement("p", {className: "error-subheader"}, mozL10n.get("e10s_not_supported_subheading", { brandShortname: mozL10n.get("clientShortname2") diff --git a/browser/extensions/loop/content/panels/js/panel.jsx b/browser/extensions/loop/content/panels/js/panel.jsx index fb14776745f8..d2c11eca60a5 100644 --- a/browser/extensions/loop/content/panels/js/panel.jsx +++ b/browser/extensions/loop/content/panels/js/panel.jsx @@ -29,7 +29,7 @@ loop.panel = (function(_, mozL10n) { return (
- +
{mozL10n.get("first_time_experience_subheading")}
@@ -379,7 +379,7 @@ loop.panel = (function(_, mozL10n) { _renderDefaultIcon: function() { return (
- +
); }, @@ -390,7 +390,7 @@ loop.panel = (function(_, mozL10n) { - +
); @@ -717,7 +717,7 @@ loop.panel = (function(_, mozL10n) {
{this._renderNewRoomButton()}
- +
); @@ -884,7 +884,7 @@ loop.panel = (function(_, mozL10n) { return (
- +

{mozL10n.get("e10s_not_supported_subheading", { brandShortname: mozL10n.get("clientShortname2") diff --git a/browser/extensions/loop/content/panels/js/roomViews.js b/browser/extensions/loop/content/panels/js/roomViews.js index 5f49fdbf1f61..67e02207c999 100644 --- a/browser/extensions/loop/content/panels/js/roomViews.js +++ b/browser/extensions/loop/content/panels/js/roomViews.js @@ -346,14 +346,14 @@ loop.roomViews = (function(mozL10n) { "triggered": this.state.copiedUrl }), onClick: this.handleCopyButtonClick}, - React.createElement("img", {src: "loop/shared/img/svg/glyph-link-16x16.svg"}), + React.createElement("img", {src: "shared/img/glyph-link-16x16.svg"}), React.createElement("p", null, mozL10n.get(this.state.copiedUrl ? "invite_copied_link_button" : "invite_copy_link_button")) ), React.createElement("div", {className: "btn-email invite-button", onClick: this.handleEmailButtonClick, onMouseOver: this.resetTriggeredButtons}, - React.createElement("img", {src: "loop/shared/img/svg/glyph-email-16x16.svg"}), + React.createElement("img", {src: "shared/img/glyph-email-16x16.svg"}), React.createElement("p", null, mozL10n.get("invite_email_link_button")) ) ), @@ -536,7 +536,7 @@ loop.roomViews = (function(mozL10n) { } var url = this._getURL(); - var thumbnail = url && url.thumbnail || "loop/shared/img/icons-16x16.svg#globe"; + var thumbnail = url && url.thumbnail || "shared/img/icons-16x16.svg#globe"; var urlDescription = url && url.description || ""; var location = url && url.location || ""; diff --git a/browser/extensions/loop/content/panels/js/roomViews.jsx b/browser/extensions/loop/content/panels/js/roomViews.jsx index 7f5d66f7a6dc..5bbbd0fb2765 100644 --- a/browser/extensions/loop/content/panels/js/roomViews.jsx +++ b/browser/extensions/loop/content/panels/js/roomViews.jsx @@ -346,14 +346,14 @@ loop.roomViews = (function(mozL10n) { "triggered": this.state.copiedUrl })} onClick={this.handleCopyButtonClick}> - +

{mozL10n.get(this.state.copiedUrl ? "invite_copied_link_button" : "invite_copy_link_button")}

- +

{mozL10n.get("invite_email_link_button")}

@@ -536,7 +536,7 @@ loop.roomViews = (function(mozL10n) { } var url = this._getURL(); - var thumbnail = url && url.thumbnail || "loop/shared/img/icons-16x16.svg#globe"; + var thumbnail = url && url.thumbnail || "shared/img/icons-16x16.svg#globe"; var urlDescription = url && url.description || ""; var location = url && url.location || ""; diff --git a/browser/extensions/loop/content/panels/panel.html b/browser/extensions/loop/content/panels/panel.html index 87fb62711b2c..982006f70846 100644 --- a/browser/extensions/loop/content/panels/panel.html +++ b/browser/extensions/loop/content/panels/panel.html @@ -5,31 +5,32 @@ - - - + + + +
- - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/browser/extensions/loop/content/shared/css/conversation.css b/browser/extensions/loop/content/shared/css/conversation.css index b56876429489..aacca74062f4 100644 --- a/browser/extensions/loop/content/shared/css/conversation.css +++ b/browser/extensions/loop/content/shared/css/conversation.css @@ -65,7 +65,7 @@ html[dir="rtl"] .conversation-toolbar > li { background-position: center; background-repeat: no-repeat; background-color: transparent; - background-image: url("../img/svg/media-group.svg"); + background-image: url("../img/media-group.svg"); background-size: cover; height: 28px; width: 67px; @@ -73,25 +73,25 @@ html[dir="rtl"] .conversation-toolbar > li { .conversation-toolbar-media-btn-group-box > button:last-child:active, .conversation-toolbar-media-btn-group-box > button:last-child:hover { - background-image: url("../img/svg/media-group-right-hover.svg"); + background-image: url("../img/media-group-right-hover.svg"); background-size: cover; } html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:last-child:active, html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:last-child:hover { - background-image: url("../img/svg/media-group-left-hover.svg"); + background-image: url("../img/media-group-left-hover.svg"); background-size: cover; } .conversation-toolbar-media-btn-group-box > button:first-child:active, .conversation-toolbar-media-btn-group-box > button:first-child:hover { - background-image: url("../img/svg/media-group-left-hover.svg"); + background-image: url("../img/media-group-left-hover.svg"); background-size: cover; } html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:first-child:active, html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:first-child:hover { - background-image: url("../img/svg/media-group-right-hover.svg"); + background-image: url("../img/media-group-right-hover.svg"); background-size: cover; } @@ -106,76 +106,76 @@ html[dir="rtl"] .conversation-toolbar-btn-box.btn-edit-entry { /* conversationViews.jsx */ .conversation-toolbar .btn-hangup { - background-image: url("../img/svg/exit.svg"); + background-image: url("../img/exit.svg"); border: 0; } /* Audio mute button */ .btn-mute-audio:after { - content: url("../img/svg/audio.svg"); + content: url("../img/audio.svg"); } .btn-mute-audio.muted:after { - content: url("../img/svg/audio-mute.svg"); + content: url("../img/audio-mute.svg"); } .btn-mute-audio:hover:after, .btn-mute-audio:active:after { - content: url("../img/svg/audio-hover.svg"); + content: url("../img/audio-hover.svg"); } .btn-mute-audio.muted:hover:after, .btn-mute-audio.muted:active:after { - content: url("../img/svg/audio-mute-hover.svg"); + content: url("../img/audio-mute-hover.svg"); } /* Video mute button */ .btn-mute-video:after { - content: url("../img/svg/video.svg"); + content: url("../img/video.svg"); } .btn-mute-video:active:after, .btn-mute-video:hover:after { - content: url("../img/svg/video-hover.svg"); + content: url("../img/video-hover.svg"); } .btn-mute-video.muted:after { - content: url("../img/svg/video-mute.svg"); + content: url("../img/video-mute.svg"); } .btn-mute-video.muted:hover:after, .btn-mute-video.muted:active:after { - content: url("../img/svg/video-mute-hover.svg"); + content: url("../img/video-mute-hover.svg"); } .btn-settings { width: 28px; height: 28px; background-size: 28px; - background-image: url("../img/svg/settings.svg"); + background-image: url("../img/settings.svg"); background-color: transparent; } .btn-settings:hover, .btn-settings:active { - background-image: url("../img/svg/settings-hover.svg"); + background-image: url("../img/settings-hover.svg"); } .btn-screen-share { - background-image: url("../img/svg/sharing.svg"); + background-image: url("../img/sharing.svg"); } .btn-screen-share:hover, .btn-screen-share:active { - background-image: url("../img/svg/sharing-hover.svg"); + background-image: url("../img/sharing-hover.svg"); } .btn-screen-share.active { - background-image: url("../img/svg/sharing-active.svg"); + background-image: url("../img/sharing-active.svg"); } .btn-screen-share.disabled { /* The screen share button is in its pending state when its disabled. */ - background-image: url("../img/svg/sharing-pending.svg"); + background-image: url("../img/sharing-pending.svg"); } /* General Call (incoming or outgoing). */ diff --git a/browser/extensions/loop/content/shared/js/crypto.js b/browser/extensions/loop/content/shared/js/crypto.js index b067698f44d1..22b0616d2451 100644 --- a/browser/extensions/loop/content/shared/js/crypto.js +++ b/browser/extensions/loop/content/shared/js/crypto.js @@ -18,7 +18,7 @@ var inChrome = typeof Components != "undefined" && "utils" in Components; rootObject = { crypto: crypto }; - sharedUtils = Cu.import("resource:///modules/loop/utils.js", {}).utils; + sharedUtils = Cu.import("chrome://loop/content/shared/js/utils.js", {}).utils; } else { sharedUtils = this.shared.utils; } diff --git a/browser/extensions/loop/content/shared/js/views.js b/browser/extensions/loop/content/shared/js/views.js index 34cbc45c5fe9..bdb6caea01d4 100644 --- a/browser/extensions/loop/content/shared/js/views.js +++ b/browser/extensions/loop/content/shared/js/views.js @@ -854,7 +854,7 @@ loop.shared.views = (function(_, mozL10n) { if (!thumbnail) { thumbnail = this.props.useDesktopPaths ? - "loop/shared/img/icons-16x16.svg#globe" : + "shared/img/icons-16x16.svg#globe" : "shared/img/icons-16x16.svg#globe"; } diff --git a/browser/extensions/loop/content/shared/js/views.jsx b/browser/extensions/loop/content/shared/js/views.jsx index 9eb26b42e6e3..723e739f29b4 100644 --- a/browser/extensions/loop/content/shared/js/views.jsx +++ b/browser/extensions/loop/content/shared/js/views.jsx @@ -854,7 +854,7 @@ loop.shared.views = (function(_, mozL10n) { if (!thumbnail) { thumbnail = this.props.useDesktopPaths ? - "loop/shared/img/icons-16x16.svg#globe" : + "shared/img/icons-16x16.svg#globe" : "shared/img/icons-16x16.svg#globe"; } diff --git a/browser/extensions/loop/moz.build b/browser/extensions/loop/moz.build index f9124ef2fe21..f53a007a2cab 100644 --- a/browser/extensions/loop/moz.build +++ b/browser/extensions/loop/moz.build @@ -4,7 +4,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -FINAL_TARGET = 'dist/bin/browser/features/loop@test.mozilla.org' +FINAL_TARGET = 'dist/bin/browser/features/loop@mozilla.org' FINAL_TARGET_FILES += [ 'bootstrap.js' diff --git a/browser/extensions/loop/skin/shared/loop.css b/browser/extensions/loop/skin/shared/loop.css index 3a81e96a6fc4..e83219f68df6 100644 --- a/browser/extensions/loop/skin/shared/loop.css +++ b/browser/extensions/loop/skin/shared/loop.css @@ -17,12 +17,12 @@ } #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar.png); + list-style-image: url(chrome://loop/skin/toolbar.png); -moz-image-region: rect(0, 18px, 18px, 0); } toolbar[brighttext] #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-inverted.png); + list-style-image: url(chrome://loop/skin/toolbar-inverted.png); } #loop-button[state="disabled"], @@ -52,12 +52,12 @@ @media (min-resolution: 1.1dppx) { #loop-button { - list-style-image: url("chrome://browser/skin/loop/toolbar@2x.png"); + list-style-image: url("chrome://loop/skin/toolbar@2x.png"); -moz-image-region: rect(0, 36px, 36px, 0); } toolbar[brighttext] #loop-button { - list-style-image: url("chrome://browser/skin/loop/toolbar-inverted@2x.png"); + list-style-image: url("chrome://loop/skin/toolbar-inverted@2x.png"); } #loop-button[state="disabled"], @@ -87,7 +87,7 @@ #loop-button[cui-areatype="menu-panel"], toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://browser/skin/loop/menuPanel@2x.png); + list-style-image: url(chrome://loop/skin/menuPanel@2x.png); -moz-image-region: rect(0, 64px, 64px, 0); } @@ -125,7 +125,7 @@ @media not all and (min-resolution: 1.1dppx) { #loop-button[cui-areatype="menu-panel"], toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://browser/skin/loop/menuPanel.png); + list-style-image: url(chrome://loop/skin/menuPanel.png); -moz-image-region: rect(0, 32px, 32px, 0); } diff --git a/browser/extensions/loop/skin/windows/platform.css b/browser/extensions/loop/skin/windows/platform.css index e90639bbd434..417dc6c615ea 100644 --- a/browser/extensions/loop/skin/windows/platform.css +++ b/browser/extensions/loop/skin/windows/platform.css @@ -6,13 +6,13 @@ @media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) { #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver.png) + list-style-image: url(chrome://loop/skin/toolbar-lunaSilver.png) } } @media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver@2x.png) + list-style-image: url(chrome://loop/skin/toolbar-lunaSilver@2x.png) } } diff --git a/browser/extensions/loop/standalone/content/css/webapp.css b/browser/extensions/loop/standalone/content/css/webapp.css index bc46ed3d9e9d..525608decf9b 100644 --- a/browser/extensions/loop/standalone/content/css/webapp.css +++ b/browser/extensions/loop/standalone/content/css/webapp.css @@ -87,7 +87,7 @@ html[dir="rtl"] .standalone-overlay-wrapper > .general-support-url { background-size: contain; width: 16px; height: 16px; - background: transparent url("../shared/img/svg/glyph-help-16x16.svg") no-repeat; + background: transparent url("../shared/img/glyph-help-16x16.svg") no-repeat; } .standalone-overlay-wrapper > .standalone-moz-logo { @@ -271,7 +271,7 @@ html[dir="rtl"] .standalone-overlay-wrapper > .standalone-moz-logo { } .room-inner-info-area > .room-waiting-area > a >.room-waiting-help { - background: transparent url("../shared/img/svg/glyph-help-16x16.svg") no-repeat; + background: transparent url("../shared/img/glyph-help-16x16.svg") no-repeat; display: inline-block; height: 16px; margin-left: 5px; diff --git a/browser/extensions/loop/standalone/content/webappEntryPoint.js b/browser/extensions/loop/standalone/content/webappEntryPoint.js index 73f7eeec03ce..526e3708fe6f 100644 --- a/browser/extensions/loop/standalone/content/webappEntryPoint.js +++ b/browser/extensions/loop/standalone/content/webappEntryPoint.js @@ -17,20 +17,20 @@ // The OpenTok SDK tries to do some heuristic detection of require and // assumes a node environment if it's present, which confuses webpack, so // we turn that off by forcing require to false in that context. -require("imports?require=>false!shared/libs/sdk.js"); +require("imports?require=>false!shared/vendor/sdk.js"); // Ultimately, we'll likely want to pull the vendor libraries from npm, as that // makes upgrading easier, and it's generally better practice to minify the // "source" versions of libraries rather than built artifacts. We probably do // want to minify them ourselves since this allows for better dead-code // elimination, but that can be a bit of judgement call. -require("exports?_!shared/libs/lodash-3.9.3.js"); +require("exports?_!shared/vendor/lodash-3.9.3.js"); // Disable Backbone's AMD auto-detection, as described at: // // https://github.com/jashkenas/backbone/wiki/Using-Backbone-without-jQuery // -require("expose?Backbone!imports?define=>false!shared/libs/backbone-1.2.1.js"); +require("expose?Backbone!imports?define=>false!shared/vendor/backbone-1.2.1.js"); /* global: __PROD__ */ if (typeof __PROD__ !== "undefined") { @@ -41,8 +41,8 @@ if (typeof __PROD__ !== "undefined") { require("expose?classNames!classnames"); } else { // our development server setup doesn't yet handle real modules, so for now... - require("shared/libs/react-0.13.3.js"); - require("shared/libs/classnames-2.2.0.js"); + require("shared/vendor/react-0.13.3.js"); + require("shared/vendor/classnames-2.2.0.js"); } diff --git a/browser/extensions/loop/standalone/server.js b/browser/extensions/loop/standalone/server.js index 5c178c34ea7f..3c6cb09f4b40 100644 --- a/browser/extensions/loop/standalone/server.js +++ b/browser/extensions/loop/standalone/server.js @@ -90,6 +90,10 @@ app.use("/content/c", express.static(path.join(__dirname, "..", "content"))); // Two lines for the same reason as /content above. app.use("/test", express.static(path.join(__dirname, "test"))); app.use("/test", express.static(path.join(__dirname, "..", "test"))); +// Hacks for desktop to stop errors being raised in the tests for content loading. +app.use("/test/shared/shared", express.static(path.join(__dirname, "..", "content/shared"))); +app.use("/test/desktop-local/shared", express.static(path.join(__dirname, "..", "content/shared"))); + // As we don't have hashes on the urls, the best way to serve the index files // appears to be to be to closely filter the url and match appropriately. diff --git a/browser/extensions/loop/test/desktop-local/README.md b/browser/extensions/loop/test/desktop-local/README.md index 5f459e32fc4a..43dc73c5c315 100644 --- a/browser/extensions/loop/test/desktop-local/README.md +++ b/browser/extensions/loop/test/desktop-local/README.md @@ -11,7 +11,7 @@ a file: or HTTP URL to run the tests. Alternately, from the top-level of your Gecko source directory, execute: ``` -./mach marionette-test browser/components/loop/test/manifest.ini +./mach marionette-test browser/extensions/loop/test/manifest.ini ``` Next steps: diff --git a/browser/extensions/loop/test/desktop-local/index.html b/browser/extensions/loop/test/desktop-local/index.html index d5108f264576..f434148925e3 100644 --- a/browser/extensions/loop/test/desktop-local/index.html +++ b/browser/extensions/loop/test/desktop-local/index.html @@ -14,17 +14,17 @@
- + - - - - + + + + @@ -50,12 +50,12 @@ - - - - - - + + + + + + diff --git a/browser/extensions/loop/test/karma/karma.coverage.desktop.js b/browser/extensions/loop/test/karma/karma.coverage.desktop.js index 6863e06041e7..67f43865cf92 100644 --- a/browser/extensions/loop/test/karma/karma.coverage.desktop.js +++ b/browser/extensions/loop/test/karma/karma.coverage.desktop.js @@ -10,11 +10,11 @@ module.exports = function(config) { // List of files / patterns to load in the browser. baseConfig.files = baseConfig.files.concat([ - "content/libs/l10n.js", - "content/shared/libs/react-0.13.3.js", - "content/shared/libs/classnames-2.2.0.js", - "content/shared/libs/lodash-3.9.3.js", - "content/shared/libs/backbone-1.2.1.js", + "content/panels/vendor/l10n.js", + "content/shared/vendor/react-0.13.3.js", + "content/shared/vendor/classnames-2.2.0.js", + "content/shared/vendor/lodash-3.9.3.js", + "content/shared/vendor/backbone-1.2.1.js", "test/shared/vendor/*.js", "test/shared/loop_mocha_utils.js", "test/karma/head.js", // Stub out DOM event listener due to races. @@ -31,11 +31,11 @@ module.exports = function(config) { "content/shared/js/views.js", "content/shared/js/textChatStore.js", "content/shared/js/textChatView.js", - "content/js/feedbackViews.js", - "content/js/conversationAppStore.js", - "content/js/roomStore.js", - "content/js/roomViews.js", - "content/js/conversation.js", + "content/panels/js/feedbackViews.js", + "content/panels/js/conversationAppStore.js", + "content/panels/js/roomStore.js", + "content/panels/js/roomViews.js", + "content/panels/js/conversation.js", "test/desktop-local/*.js" ]); @@ -47,7 +47,7 @@ module.exports = function(config) { // Preprocess matching files before serving them to the browser. // Available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor . baseConfig.preprocessors = { - "content/js/*.js": ["coverage"] + "content/panels/js/*.js": ["coverage"] }; baseConfig.coverageReporter.dir = "test/coverage/desktop"; diff --git a/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js b/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js index 7bd346cbf178..299c44f2185d 100644 --- a/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js +++ b/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js @@ -11,11 +11,11 @@ module.exports = function(config) { // List of files / patterns to load in the browser. baseConfig.files = baseConfig.files.concat([ "standalone/content/libs/l10n-gaia-02ca67948fe8.js", - "content/shared/libs/lodash-3.9.3.js", - "content/shared/libs/backbone-1.2.1.js", - "content/shared/libs/react-0.13.3.js", - "content/shared/libs/classnames-2.2.0.js", - "content/shared/libs/sdk.js", + "content/shared/vendor/lodash-3.9.3.js", + "content/shared/vendor/backbone-1.2.1.js", + "content/shared/vendor/react-0.13.3.js", + "content/shared/vendor/classnames-2.2.0.js", + "content/shared/vendor/sdk.js", "test/shared/vendor/*.js", "test/shared/loop_mocha_utils.js", "test/karma/head.js", // Add test fixture container diff --git a/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js b/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js index ae693218ebc9..0ef65728b599 100644 --- a/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js +++ b/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js @@ -12,7 +12,7 @@ var { WebChannel } = Cu.import("resource://gre/modules/WebChannel.jsm", {}); var { Chat } = Cu.import("resource:///modules/Chat.jsm", {}); const TEST_URI = - "example.com/browser/browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html"; + "example.com/browser/browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html"; const TEST_URI_GOOD = Services.io.newURI("https://" + TEST_URI, null, null); const TEST_URI_BAD = Services.io.newURI("http://" + TEST_URI, null, null); diff --git a/browser/extensions/loop/test/mochitest/browser_fxa_login.js b/browser/extensions/loop/test/mochitest/browser_fxa_login.js index 9036c06ad98d..0d5e359aff27 100644 --- a/browser/extensions/loop/test/mochitest/browser_fxa_login.js +++ b/browser/extensions/loop/test/mochitest/browser_fxa_login.js @@ -8,7 +8,7 @@ "use strict"; const BASE_URL = Services.prefs.getCharPref("loop.server"); -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); function* checkFxA401() { let err = MozLoopService.errors.get("login"); diff --git a/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js b/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js index ae7f6eeaee1e..62c30531b6ad 100644 --- a/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js +++ b/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js @@ -7,7 +7,7 @@ "use strict"; -const BASE_URL = "http://mochi.test:8888/browser/browser/components/loop/test/mochitest/loop_fxa.sjs?"; +const BASE_URL = "http://mochi.test:8888/browser/browser/extensions/loop/test/mochitest/loop_fxa.sjs?"; registerCleanupFunction(function* () { yield promiseDeletedOAuthParams(BASE_URL); diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js index 5528f9036dd5..6c96ebef236b 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); add_task(function* test_mozLoop_appVersionInfo() { diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js index e5b3bd9563b3..424de044dbf8 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js @@ -7,7 +7,7 @@ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); function promiseGetMetadata() { diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js index 04dc02256089..78aa1428199b 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js @@ -6,7 +6,7 @@ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); var handlers = [ diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js index 0347ed9d936c..21c416962d20 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js @@ -4,7 +4,7 @@ Cu.import("resource://gre/modules/Promise.jsm"); const { SocialService } = Cu.import("resource://gre/modules/SocialService.jsm", {}); -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js index 8746c2ca579a..7a2b42190613 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js @@ -7,7 +7,7 @@ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); var gConstants; gHandlers.GetAllConstants({}, constants => gConstants = constants); diff --git a/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js b/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js index 4023ce9db724..707212e5a99c 100644 --- a/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js +++ b/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js @@ -8,7 +8,7 @@ "use strict"; Components.utils.import("resource://gre/modules/Promise.jsm", this); -const { LoopRoomsInternal } = Components.utils.import("resource:///modules/loop/LoopRooms.jsm", {}); +const { LoopRoomsInternal } = Components.utils.import("chrome://loop/content/modules/LoopRooms.jsm", {}); Services.prefs.setBoolPref("loop.gettingStarted.seen", true); const fxASampleToken = { diff --git a/browser/extensions/loop/test/mochitest/head.js b/browser/extensions/loop/test/mochitest/head.js index 5f6baa274fe1..ba0315b1b919 100644 --- a/browser/extensions/loop/test/mochitest/head.js +++ b/browser/extensions/loop/test/mochitest/head.js @@ -8,8 +8,8 @@ const { LOOP_SESSION_TYPE, MozLoopServiceInternal, MozLoopService -} = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); -const { LoopRooms } = Cu.import("resource:///modules/loop/LoopRooms.jsm", {}); +} = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); +const { LoopRooms } = Cu.import("chrome://loop/content/modules/LoopRooms.jsm", {}); // Cache this value only once, at the beginning of a // test run, so that it doesn't pick up the offline=true @@ -133,7 +133,7 @@ function promiseOAuthParamsSetup(baseURL, params) { } function* resetFxA() { - let global = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); + let global = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); global.gHawkClient = null; global.gFxAOAuthClientPromise = null; global.gFxAOAuthClient = null; @@ -152,7 +152,7 @@ function checkFxAOAuthTokenData(aValue) { } function checkLoggedOutState() { - let global = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); + let global = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); is(global.gFxAOAuthClientPromise, null, "gFxAOAuthClientPromise should be cleared"); is(MozLoopService.userProfile, null, "fxAOAuthProfile should be cleared"); is(global.gFxAOAuthClient, null, "gFxAOAuthClient should be cleared"); diff --git a/browser/extensions/loop/test/shared/index.html b/browser/extensions/loop/test/shared/index.html index 6489871738e5..95f94ad1b1f8 100644 --- a/browser/extensions/loop/test/shared/index.html +++ b/browser/extensions/loop/test/shared/index.html @@ -14,16 +14,16 @@
- + - - - + + + diff --git a/browser/extensions/loop/test/shared/views_test.js b/browser/extensions/loop/test/shared/views_test.js index 3cf0188aeba5..b71ccbcb09b3 100644 --- a/browser/extensions/loop/test/shared/views_test.js +++ b/browser/extensions/loop/test/shared/views_test.js @@ -840,7 +840,7 @@ describe("loop.shared.views", function() { }); expect(view.getDOMNode().querySelector(".context-preview").getAttribute("src")) - .eql("loop/shared/img/icons-16x16.svg#globe"); + .eql("shared/img/icons-16x16.svg#globe"); }); it("should not display a title if by default", function() { diff --git a/browser/extensions/loop/test/standalone/index.html b/browser/extensions/loop/test/standalone/index.html index 5af0462cf562..a8ffd06fa7a1 100644 --- a/browser/extensions/loop/test/standalone/index.html +++ b/browser/extensions/loop/test/standalone/index.html @@ -14,16 +14,16 @@
- + - - - + + + diff --git a/browser/extensions/loop/test/xpcshell/.eslintrc b/browser/extensions/loop/test/xpcshell/.eslintrc index e61193d5f6c3..7732b0d1ce76 100644 --- a/browser/extensions/loop/test/xpcshell/.eslintrc +++ b/browser/extensions/loop/test/xpcshell/.eslintrc @@ -17,6 +17,7 @@ "do_timeout": false, "run_next_test": false, // head.js items. + "FileUtils": false, "MockWebSocketChannel": false, "extend": true, "getLoopString": false, @@ -27,7 +28,8 @@ "mockPushHandler": true, "setupFakeFxAUserProfile": false, "setupFakeLoopServer": false, - "timerHandlers", + "timerHandlers": false, + "updateAppInfo": false, "waitForCondition": true, // Loop specific items "MozLoopServiceInternal": true, diff --git a/browser/extensions/loop/test/xpcshell/head.js b/browser/extensions/loop/test/xpcshell/head.js index 820510ce0d51..3f8f1e008021 100644 --- a/browser/extensions/loop/test/xpcshell/head.js +++ b/browser/extensions/loop/test/xpcshell/head.js @@ -12,15 +12,15 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Http.jsm"); Cu.import("resource://testing-common/httpd.js"); -Cu.import("resource:///modules/loop/MozLoopService.jsm"); +Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); +Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); Cu.import("resource://gre/modules/osfile.jsm"); -const { MozLoopServiceInternal } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); -const { LoopRoomsInternal, timerHandlers } = Cu.import("resource:///modules/loop/LoopRooms.jsm", {}); +const { MozLoopServiceInternal } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); +const { LoopRoomsInternal, timerHandlers } = Cu.import("chrome://loop/content/modules/LoopRooms.jsm", {}); XPCOMUtils.defineLazyModuleGetter(this, "MozLoopPushHandler", - "resource:///modules/loop/MozLoopPushHandler.jsm"); + "chrome://loop/content/modules/MozLoopPushHandler.jsm"); const kMockWebSocketChannelName = "Mock WebSocket Channel"; const kWebSocketChannelContractID = "@mozilla.org/network/protocol;1?name=wss"; diff --git a/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js b/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js index bb32bfb1034e..5a86540b1d3c 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js +++ b/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); add_task(function* test_mozLoop_doNotDisturb() { diff --git a/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js b/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js index 313b06d82fa6..17066b85c27d 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js +++ b/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js @@ -3,7 +3,7 @@ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); const [LoopAPIInternal] = LoopAPI.inspect(); add_test(function test_intialize() { diff --git a/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js b/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js index 2d84a94a3df4..1142acfbdb05 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js +++ b/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); add_task(function* test_mozLoop_charPref() { diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms.js b/browser/extensions/loop/test/xpcshell/test_looprooms.js index 2ead43579f2f..6930b3cf07d2 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms.js @@ -5,7 +5,7 @@ "use strict"; Cu.import("resource://services-common/utils.js"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); +Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); Cu.import("resource:///modules/Chat.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js b/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js index 23ef34e64ee9..1d2eb38c0d4c 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js @@ -7,7 +7,7 @@ timerHandlers.startTimer = callback => callback(); Cu.import("resource://services-common/utils.js"); -const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("resource:///modules/loop/LoopRoomsCache.jsm", {}); +const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("chrome://loop/content/modules/LoopRoomsCache.jsm", {}); const kContextEnabledPref = "loop.contextInConverations.enabled"; diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js b/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js index daaa6cd8f599..d32321f26a1b 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js @@ -4,7 +4,7 @@ "use strict"; Cu.import("resource://services-common/utils.js"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); +Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); Cu.import("resource:///modules/Chat.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js b/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js index 534ec287f1a4..b4351e16a7eb 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js @@ -4,7 +4,6 @@ "use strict"; Cu.import("resource://services-common/utils.js"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); Cu.import("resource:///modules/Chat.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js b/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js index 36fdac465fb6..acd73e23950e 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js @@ -6,8 +6,8 @@ Cu.import("resource://services-common/utils.js"); -const loopCrypto = Cu.import("resource:///modules/loop/crypto.js", {}).LoopCrypto; -const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("resource:///modules/loop/LoopRoomsCache.jsm", {}); +const loopCrypto = Cu.import("chrome://loop/content/shared/js/crypto.js", {}).LoopCrypto; +const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("chrome://loop/content/modules/LoopRoomsCache.jsm", {}); var gTimerArgs = []; diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js b/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js index 9cbe314ff0e9..96d2f298c219 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js +++ b/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js @@ -10,7 +10,7 @@ "use strict"; -const { INVALID_AUTH_TOKEN } = Cu.import("resource:///modules/loop/MozLoopService.jsm"); +const { INVALID_AUTH_TOKEN } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); /** * An HTTP request for /NNN responds with a request with a status of NNN. diff --git a/browser/extensions/loop/ui/README.md b/browser/extensions/loop/ui/README.md index a0025bb5cff9..f3912bc0090b 100644 --- a/browser/extensions/loop/ui/README.md +++ b/browser/extensions/loop/ui/README.md @@ -5,6 +5,6 @@ This app file showcases all Loop's view components. If you want to modify the app, launch the following command: - browser/components/loop/build-jsx --watch + browser/extensions/loop/build-jsx --watch And start editing the `ui-showcase.jsx` file. diff --git a/browser/extensions/loop/ui/index.html b/browser/extensions/loop/ui/index.html index 1ea6254e3277..b0581de67d22 100644 --- a/browser/extensions/loop/ui/index.html +++ b/browser/extensions/loop/ui/index.html @@ -10,7 +10,7 @@ + href="../content/panels/css/panel.css"> @@ -25,10 +25,10 @@
- - - - + + + + @@ -43,16 +43,16 @@ - + - - + + - - + + From 8467065ddf9c0674682f143ef171d5f822d9211f Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:57:40 +0000 Subject: [PATCH 085/153] Bug 1223573 - Part 6. Tidy up bootstrap.js add enough setup to get xpcshell-tests passing again. r=mikedeboer --- browser/extensions/loop/bootstrap.js | 51 ++++++++++++++++--- browser/extensions/loop/test/xpcshell/head.js | 37 ++++++++++++++ 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js index 3626102d6a29..342800e74d60 100644 --- a/browser/extensions/loop/bootstrap.js +++ b/browser/extensions/loop/bootstrap.js @@ -1,9 +1,18 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +const { utils: Cu, classes: Cc } = Components; + +Cu.import("resource://gre/modules/Services.jsm"); var WindowListener = { - + /** + * Sets up the chrome integration within browser windows for Loop. + * + * @param {Object} window The window to inject the integration into. + */ setupBrowserUI: function(window) { const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; const kBrowserSharingNotificationId = "loop-sharing-notification"; @@ -22,7 +31,7 @@ var WindowListener = { */ get toolbarButton() { delete this.toolbarButton; - return this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window); + return (this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window)); }, /** @@ -30,7 +39,7 @@ var WindowListener = { */ get panel() { delete this.panel; - return this.panel = document.getElementById("loop-notification-panel"); + return (this.panel = document.getElementById("loop-notification-panel")); }, /** @@ -93,7 +102,7 @@ var WindowListener = { win.LoopUI.togglePanel(event, tabId); }; Services.obs.addObserver(obs, "browser-delayed-startup-finished", false); - return OpenBrowserWindow(); + return window.OpenBrowserWindow(); } if (this.panel.state == "open") { return new Promise(resolve => { @@ -106,7 +115,7 @@ var WindowListener = { let fm = Services.focus; fm.moveFocus(doc.defaultView, null, fm.MOVEFOCUS_FIRST, fm.FLAG_NOSCROLL); }).catch(err => { - Cu.reportError(x); + Cu.reportError(err); }); }, @@ -383,7 +392,9 @@ var WindowListener = { try { window.focus(); - } catch (ex) {} + } catch (ex) { + // Do nothing. + } // We need a setTimeout here, otherwise the panel won't show after the // window received focus. @@ -616,4 +627,32 @@ var WindowListener = { XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); } +}; + +/** + * Loads the default preferences from the prefs file. This loads the preferences + * into the default branch, so they don't appear as user preferences. + */ +function loadDefaultPrefs() { + var branch = Services.prefs.getDefaultBranch(""); + Services.scriptloader.loadSubScript("chrome://loop/content/preferences/prefs.js", { + pref: (key, val) => { + switch (typeof val) { + case "boolean": + branch.setBoolPref(key, val); + break; + case "number": + branch.setIntPref(key, val); + break; + case "string": + branch.setCharPref(key, val); + break; + } + } + }); +} + + +function startup(data, reason) { + loadDefaultPrefs(); } diff --git a/browser/extensions/loop/test/xpcshell/head.js b/browser/extensions/loop/test/xpcshell/head.js index 3f8f1e008021..31378fafdf36 100644 --- a/browser/extensions/loop/test/xpcshell/head.js +++ b/browser/extensions/loop/test/xpcshell/head.js @@ -10,6 +10,43 @@ do_get_profile(); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); + +// Setup the add-ons manager for this test. +Cu.import("resource://gre/modules/FileUtils.jsm"); + +function registerDirectory(key, dir) { + let dirProvider = { + getFile: function(prop, persistent) { + persistent.value = false; + if (prop == key) { + return dir.clone(); + } + return null; + }, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsIDirectoryServiceProvider, + Ci.nsISupports]) + }; + Services.dirsvc.registerProvider(dirProvider); +} + +// As we're not running in application, we need to setup the features directory +// manually. +const distroDir = FileUtils.getDir("GreD", ["browser", "features"], true); +registerDirectory("XREAppFeat", distroDir); + +// Set up application info - xpcshell doesn't have this by default. +Cu.import("resource://testing-common/AppInfo.jsm"); +updateAppInfo(); + +// Now trigger the addons-startup, and hence startup the manager itself. This +// should load the manager correctly. +var gInternalManager = Cc["@mozilla.org/addons/integration;1"] + .getService(Ci.nsIObserver) + .QueryInterface(Ci.nsITimerCallback); + +gInternalManager.observe(null, "addons-startup", null); + Cu.import("resource://gre/modules/Http.jsm"); Cu.import("resource://testing-common/httpd.js"); Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); From de5b1389a788e6ef3e521d70dddcc8fb07ca9b78 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:57:40 +0000 Subject: [PATCH 086/153] Bug 1223573 - Part 7. Add support in bootstrap.js for starting Loop and displaying the button. Also get all tests passing again. r=mikedeboer --- browser/components/about/AboutRedirector.cpp | 4 +- .../customizableui/CustomizableWidgets.jsm | 36 --- browser/extensions/loop/.eslintrc-gecko | 1 + browser/extensions/loop/bootstrap.js | 205 +++++++++++++++++- testing/profiles/prefs_general.js | 2 +- 5 files changed, 200 insertions(+), 48 deletions(-) diff --git a/browser/components/about/AboutRedirector.cpp b/browser/components/about/AboutRedirector.cpp index e9a60346fe65..78f55c9b64c1 100644 --- a/browser/components/about/AboutRedirector.cpp +++ b/browser/components/about/AboutRedirector.cpp @@ -108,12 +108,12 @@ static RedirEntry kRedirMap[] = { { "debugging", "chrome://devtools/content/aboutdebugging/aboutdebugging.xhtml", nsIAboutModule::ALLOW_SCRIPT }, - { "loopconversation", "chrome://browser/content/loop/conversation.html", + { "loopconversation", "chrome://loop/content/panels/conversation.html", nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT | nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::HIDE_FROM_ABOUTABOUT | nsIAboutModule::ENABLE_INDEXED_DB }, - { "looppanel", "chrome://browser/content/loop/panel.html", + { "looppanel", "chrome://loop/content/panels/panel.html", nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT | nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::HIDE_FROM_ABOUTABOUT | diff --git a/browser/components/customizableui/CustomizableWidgets.jsm b/browser/components/customizableui/CustomizableWidgets.jsm index 82c6f2bf4d33..b7a1fc9d0aab 100644 --- a/browser/components/customizableui/CustomizableWidgets.jsm +++ b/browser/components/customizableui/CustomizableWidgets.jsm @@ -950,42 +950,6 @@ const CustomizableWidgets = [ let win = aEvent.view; win.MailIntegration.sendLinkForBrowser(win.gBrowser.selectedBrowser) } - }, { - id: "loop-button", - type: "custom", - label: "loop-call-button3.label", - tooltiptext: "loop-call-button3.tooltiptext2", - privateBrowsingTooltiptext: "loop-call-button3-pb.tooltiptext", - defaultArea: CustomizableUI.AREA_NAVBAR, - introducedInVersion: 4, - onBuild: function(aDocument) { - // If we're not supposed to see the button, return zip. - if (!Services.prefs.getBoolPref("loop.enabled")) { - return null; - } - - let isWindowPrivate = PrivateBrowsingUtils.isWindowPrivate(aDocument.defaultView); - - let node = aDocument.createElementNS(kNSXUL, "toolbarbutton"); - node.setAttribute("id", this.id); - node.classList.add("toolbarbutton-1"); - node.classList.add("chromeclass-toolbar-additional"); - node.classList.add("badged-button"); - node.setAttribute("label", CustomizableUI.getLocalizedProperty(this, "label")); - if (isWindowPrivate) - node.setAttribute("disabled", "true"); - let tooltiptext = isWindowPrivate ? - CustomizableUI.getLocalizedProperty(this, "privateBrowsingTooltiptext", - [CustomizableUI.getLocalizedProperty(this, "label")]) : - CustomizableUI.getLocalizedProperty(this, "tooltiptext"); - node.setAttribute("tooltiptext", tooltiptext); - node.setAttribute("removable", "true"); - node.addEventListener("command", function(event) { - aDocument.defaultView.LoopUI.togglePanel(event); - }); - - return node; - } }, { id: "web-apps-button", label: "web-apps-button.label", diff --git a/browser/extensions/loop/.eslintrc-gecko b/browser/extensions/loop/.eslintrc-gecko index 3fda68491412..5c377481cb82 100644 --- a/browser/extensions/loop/.eslintrc-gecko +++ b/browser/extensions/loop/.eslintrc-gecko @@ -42,6 +42,7 @@ "MozLoopPushHandler": true, "MozLoopService": true, "OS": false, + "PrivateBrowsingUtils": false, "roomsPushNotification": true, "Services": false, "Social": false, diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js index 342800e74d60..360257149182 100644 --- a/browser/extensions/loop/bootstrap.js +++ b/browser/extensions/loop/bootstrap.js @@ -3,10 +3,26 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -const { utils: Cu, classes: Cc } = Components; +const { interfaces: Ci, utils: Cu, classes: Cc } = Components; + +const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; +const kBrowserSharingNotificationId = "loop-sharing-notification"; +const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar"; Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", + "resource://gre/modules/PrivateBrowsingUtils.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI", + "resource:///modules/CustomizableUI.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Task", + "resource://gre/modules/Task.jsm"); + +/** + * This window listener gets loaded into each browser.xul window and is used + * to provide the required loop functions for the window. + */ var WindowListener = { /** * Sets up the chrome integration within browser windows for Loop. @@ -14,10 +30,6 @@ var WindowListener = { * @param {Object} window The window to inject the integration into. */ setupBrowserUI: function(window) { - const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - const kBrowserSharingNotificationId = "loop-sharing-notification"; - const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar"; - let document = window.document; let gBrowser = window.gBrowser; let xhrClass = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]; @@ -254,6 +266,11 @@ var WindowListener = { * delayedStartup. */ init: function() { + // Cleanup when the window unloads. + window.addEventListener("unload", () => { + this.uninit(); + }); + // Add observer notifications before the service is initialized Services.obs.addObserver(this, "loop-status-changed", false); @@ -597,7 +614,7 @@ var WindowListener = { this.PlacesUtils.promiseFaviconLinkUrl(pageURI).then(uri => { // We XHR the favicon to get a File object, which we can pass to the FileReader // object. The FileReader turns the File object into a data-uri. - let xhr = new XMLHttpRequest(); + let xhr = xhrClass.createInstance(Ci.nsIXMLHttpRequest); xhr.open("get", uri.spec, true); xhr.responseType = "blob"; xhr.overrideMimeType("image/x-icon"); @@ -626,9 +643,89 @@ var WindowListener = { XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "chrome://loop/content/modules/MozLoopService.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); + + LoopUI.init(); + window.LoopUI = LoopUI; + }, + + tearDownBrowserUI: function(window) { + let document = window.document; + + // Take any steps to remove UI or anything from the browser window + // document.getElementById() etc. will work here + // XXX Add in tear-down of the panel. + }, + + // nsIWindowMediatorListener functions. + onOpenWindow: function(xulWindow) { + // A new window has opened. + let domWindow = xulWindow.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindow); + + // Wait for it to finish loading. + domWindow.addEventListener("load", function listener() { + domWindow.removeEventListener("load", listener, false); + + // If this is a browser window then setup its UI. + if (domWindow.document.documentElement.getAttribute("windowtype") == "navigator:browser") { + WindowListener.setupBrowserUI(domWindow); + } + }, false); + }, + + onCloseWindow: function(xulWindow) { + }, + + onWindowTitleChange: function(xulWindow, newTitle) { } }; +/** + * Creates the loop button on the toolbar. Due to loop being a system-addon + * CustomizableUI already has a placement location for the button, so that + * we can be on the toolbar. + */ +function createLoopButton() { + CustomizableUI.createWidget({ + id: "loop-button", + type: "custom", + label: "loop-call-button3.label", + tooltiptext: "loop-call-button3.tooltiptext2", + privateBrowsingTooltiptext: "loop-call-button3-pb.tooltiptext", + defaultArea: CustomizableUI.AREA_NAVBAR, + removable: true, + onBuild: function(aDocument) { + // If we're not supposed to see the button, return zip. + if (!Services.prefs.getBoolPref("loop.enabled")) { + return null; + } + + let isWindowPrivate = PrivateBrowsingUtils.isWindowPrivate(aDocument.defaultView); + + let node = aDocument.createElementNS(kNSXUL, "toolbarbutton"); + node.setAttribute("id", this.id); + node.classList.add("toolbarbutton-1"); + node.classList.add("chromeclass-toolbar-additional"); + node.classList.add("badged-button"); + node.setAttribute("label", CustomizableUI.getLocalizedProperty(this, "label")); + if (isWindowPrivate) { + node.setAttribute("disabled", "true"); + } + let tooltiptext = isWindowPrivate ? + CustomizableUI.getLocalizedProperty(this, "privateBrowsingTooltiptext", + [CustomizableUI.getLocalizedProperty(this, "label")]) : + CustomizableUI.getLocalizedProperty(this, "tooltiptext"); + node.setAttribute("tooltiptext", tooltiptext); + node.setAttribute("removable", "true"); + node.addEventListener("command", function(event) { + aDocument.defaultView.LoopUI.togglePanel(event); + }); + + return node; + } + }); +} + /** * Loads the default preferences from the prefs file. This loads the preferences * into the default branch, so they don't appear as user preferences. @@ -646,13 +743,103 @@ function loadDefaultPrefs() { break; case "string": branch.setCharPref(key, val); - break; + break; } } }); } - -function startup(data, reason) { +/** + * Called when the add-on is started, e.g. when installed or when Firefox starts. + */ +function startup() { loadDefaultPrefs(); + + createLoopButton(); + + // Attach to hidden window (for OS X). + try { + WindowListener.setupBrowserUI(Services.appShell.hiddenDOMWindow); + } catch (ex) { + // Hidden window didn't exist, so wait until startup is done. + let topic = "browser-delayed-startup-finished"; + Services.obs.addObserver(function observer() { + Services.obs.removeObserver(observer, topic); + WindowListener.setupBrowserUI(Services.appShell.hiddenDOMWindow); + }, topic, false); + } + + // Attach to existing browser windows, for modifying UI. + let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); + let windows = wm.getEnumerator("navigator:browser"); + while (windows.hasMoreElements()) { + let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); + WindowListener.setupBrowserUI(domWindow); + } + + // Wait for any new browser windows to open. + wm.addListener(WindowListener); + + // Load our stylesheets. + let styleSheetService = Cc["@mozilla.org/content/style-sheet-service;1"] + .getService(Components.interfaces.nsIStyleSheetService); + let sheets = ["chrome://loop-shared/skin/loop.css", + "chrome://loop/skin/platform.css"]; + for (let sheet of sheets) { + let styleSheetURI = Services.io.newURI(sheet, null, null); + styleSheetService.loadAndRegisterSheet(styleSheetURI, + styleSheetService.AUTHOR_SHEET); + } } + +/** + * Called when the add-on is shutting down, could be for re-installation + * or just uninstall. + */ +function shutdown() { + // Close any open chat windows + Cu.import("resource:///modules/Chat.jsm"); + let isLoopURL = ({ src }) => /^about:loopconversation#/.test(src); + [...Chat.chatboxes].filter(isLoopURL).forEach(chatbox => { + chatbox.content.contentWindow.close(); + }); + + // Detach from hidden window (for OS X). + WindowListener.tearDownBrowserUI(Services.appShell.hiddenDOMWindow); + + // Detach from browser windows. + let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); + let windows = wm.getEnumerator("navigator:browser"); + while (windows.hasMoreElements()) { + let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); + WindowListener.tearDownBrowserUI(domWindow); + } + + // Stop waiting for browser windows to open. + wm.removeListener(WindowListener); + + CustomizableUI.destroyWidget("loop-button"); + + // Unload stylesheets. + let styleSheetService = Cc["@mozilla.org/content/style-sheet-service;1"] + .getService(Components.interfaces.nsIStyleSheetService); + let sheets = ["chrome://loop/content/addon/css/loop.css", + "chrome://loop/skin/platform.css"]; + for (let sheet of sheets) { + let styleSheetURI = Services.io.newURI(sheet, null, null); + if (styleSheetService.sheetRegistered(styleSheetURI, + styleSheetService.USER_SHEET)) { + styleSheetService.unregisterSheet(styleSheetURI, + styleSheetService.USER_SHEET); + } + } + + // Unload modules. + Cu.unload("chrome://loop/content/modules/MozLoopAPI.jsm"); + Cu.unload("chrome://loop/content/modules/LoopRooms.jsm"); + Cu.unload("chrome://loop/content/modules/MozLoopService.jsm"); +} + +function install() {} + +function uninstall() {} diff --git a/testing/profiles/prefs_general.js b/testing/profiles/prefs_general.js index 637b4e4704f2..949414856781 100644 --- a/testing/profiles/prefs_general.js +++ b/testing/profiles/prefs_general.js @@ -286,7 +286,7 @@ user_pref("browser.newtabpage.directory.ping", ""); user_pref("loop.debug.loglevel", "All"); user_pref("loop.enabled", true); user_pref("loop.throttled", false); -user_pref("loop.server", "http://%(server)s/browser/browser/components/loop/test/mochitest/loop_fxa.sjs?"); +user_pref("loop.server", "http://%(server)s/browser/browser/extensions/loop/test/mochitest/loop_fxa.sjs?"); user_pref("loop.CSP","default-src 'self' about: file: chrome: data: wss://* http://* https://*"); // Ensure UITour won't hit the network From 7a4a5a204024b1ed3c6e1a0f8ab6cff6a00a8c50 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Fri, 27 Nov 2015 18:57:41 +0000 Subject: [PATCH 087/153] Bug 1223573 - Part 8. Work around assertions caused by attempting to load the style sheets as author sheets - load them as user sheets for now. r=mikedeboer --- browser/extensions/loop/bootstrap.js | 6 +- browser/extensions/loop/skin/osx/platform.css | 60 +++++---- browser/extensions/loop/skin/shared/loop.css | 116 +++++++++--------- .../extensions/loop/skin/windows/platform.css | 28 +++-- 4 files changed, 118 insertions(+), 92 deletions(-) diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js index 360257149182..85c28beb062a 100644 --- a/browser/extensions/loop/bootstrap.js +++ b/browser/extensions/loop/bootstrap.js @@ -787,8 +787,12 @@ function startup() { "chrome://loop/skin/platform.css"]; for (let sheet of sheets) { let styleSheetURI = Services.io.newURI(sheet, null, null); + // XXX We would love to specify AUTHOR_SHEET here and in shutdown, however + // bug 1228542 prevents us from doing that as we'd cause a lot of assertions + // in debug mode for tests. Once that is fixed, we should be able to change + // this, and remove the !important attributes from our syle sheets. styleSheetService.loadAndRegisterSheet(styleSheetURI, - styleSheetService.AUTHOR_SHEET); + styleSheetService.USER_SHEET); } } diff --git a/browser/extensions/loop/skin/osx/platform.css b/browser/extensions/loop/skin/osx/platform.css index 49691b879c38..f4ba1617c299 100644 --- a/browser/extensions/loop/skin/osx/platform.css +++ b/browser/extensions/loop/skin/osx/platform.css @@ -4,36 +4,44 @@ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); -notification[value="loop-sharing-notification"] { - background: #00a9dc; - padding: 0; - border: 0; -} +/* Only apply to browser.xul documents */ +@-moz-document url("chrome://browser/content/browser.xul") { + /** + * XXX Due to bug 1228542, anything in this file that overrides a browser style + * must specify !important. Otherwise the style won't get applied correctly + * due to the limitations caused by the bug. + */ -notification[value="loop-sharing-notification"].paused { - background: #ebebeb; -} + notification[value="loop-sharing-notification"] { + background: #00a9dc !important; + padding: 0 !important; + border: 0 !important; + } -notification[value="loop-sharing-notification"] .notification-button { - background: #fff; - border-radius: 0; -} + notification[value="loop-sharing-notification"].paused { + background: #ebebeb !important; + } -notification[value="loop-sharing-notification"].paused .notification-button { - background: #57bd35; -} + notification[value="loop-sharing-notification"] .notification-button { + background: #fff !important; + border-radius: 0 !important; + } -notification[value="loop-sharing-notification"].paused .notification-button:hover { - background: #39a017; -} + notification[value="loop-sharing-notification"].paused .notification-button { + background: #57bd35 !important; + } -notification[value="loop-sharing-notification"] .notification-button:hover, -notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background: #ebebeb; -} + notification[value="loop-sharing-notification"].paused .notification-button:hover { + background: #39a017 !important; + } -notification[value="loop-sharing-notification"] .notification-button-default, -notification[value="loop-sharing-notification"].paused .notification-button-default { - background: #fff; -} + notification[value="loop-sharing-notification"] .notification-button:hover, + notification[value="loop-sharing-notification"].paused .notification-button-default:hover { + background: #ebebeb !important; + } + notification[value="loop-sharing-notification"] .notification-button-default, + notification[value="loop-sharing-notification"].paused .notification-button-default { + background: #fff !important; + } +} diff --git a/browser/extensions/loop/skin/shared/loop.css b/browser/extensions/loop/skin/shared/loop.css index e83219f68df6..14bc6062bf61 100644 --- a/browser/extensions/loop/skin/shared/loop.css +++ b/browser/extensions/loop/skin/shared/loop.css @@ -6,14 +6,20 @@ /* Only apply to browser.xul documents */ @-moz-document url("chrome://browser/content/browser.xul") { + /** + * XXX Due to bug 1228542, anything in this file that overrides a browser style + * must specify !important. Otherwise the style won't get applied correctly + * due to the limitations caused by the bug. + */ + /* XXX Copied from browser/themes//browser.css. Should really be changing the sizes of icons in files to 16px x 16px and no borders. */ :-moz-any(toolbar, .widget-overflow-list) #loop-button > .toolbarbutton-icon, :-moz-any(toolbar, .widget-overflow-list) #loop-button > :-moz-any(.toolbarbutton-menubutton-button, .toolbarbutton-badge-stack) > .toolbarbutton-icon { - max-width: 18px; - margin: 0; + max-width: 18px !important; + margin: 0 !important; } #loop-button { @@ -161,120 +167,120 @@ } notification[value="loop-sharing-notification"] { - -moz-appearance: none; - height: 40px; - background-color: #00a9dc; - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; + -moz-appearance: none !important; + height: 40px !important; + background-color: #00a9dc !important; + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset !important; } notification[value="loop-sharing-notification"].paused { - background-color: #ebebeb; + background-color: #ebebeb !important; } notification[value="loop-sharing-notification"] .notification-inner { - color: #fff; - padding: 0; + color: #fff !important; + padding: 0 !important; } notification[value="loop-sharing-notification"].paused .notification-inner { - color: #00a9dc; + color: #00a9dc !important; } notification[value="loop-sharing-notification"] .notification-button { - -moz-appearance: none; - background-color: #fff; - border: 0; - border-right: solid 1px #ebebeb; - width: 100px; - height: 40px; - margin: 0; - list-style-image: url(chrome://browser/content/loop/shared/img/pause-12x12.svg); - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; - text-shadow: none; + -moz-appearance: none !important; + background-color: #fff !important; + border: 0 !important; + border-right: solid 1px #ebebeb !important; + width: 100px !important; + height: 40px !important; + margin: 0 !important; + list-style-image: url(chrome://loop/content/shared/img/pause-12x12.svg) !important; + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset !important; + text-shadow: none !important; } notification[value="loop-sharing-notification"] .notification-button:-moz-locale-dir(rtl) { - border-right: 0; - border-left: solid 1px #ebebeb; + border-right: 0 !important; + border-left: solid 1px #ebebeb !important; } notification[value="loop-sharing-notification"].paused .notification-button { - background-color: #57bd35; - color: #fff; - list-style-image: url(chrome://browser/content/loop/shared/img/play-12x12.svg); + background-color: #57bd35 !important; + color: #fff !important; + list-style-image: url(chrome://loop/content/shared/img/play-12x12.svg) !important; } notification[value="loop-sharing-notification"].paused .notification-button:hover { - background-color: #39a017; + background-color: #39a017 !important; } notification[value="loop-sharing-notification"] .notification-button:hover, notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background-color: #ebebeb; + background-color: #ebebeb !important; } notification[value="loop-sharing-notification"] .notification-button-default, notification[value="loop-sharing-notification"].paused .notification-button-default { - color: #d92215; - background-color: #fff; - border-right: 0; - list-style-image: url(chrome://browser/content/loop/shared/img/stop-12x12.svg); + color: #d92215 !important; + background-color: #fff !important; + border-right: 0 !important; + list-style-image: url(chrome://loop/content/shared/img/stop-12x12.svg) !important; } notification[value="loop-sharing-notification"] .notification-button .button-icon { - display: block; - -moz-margin-end: 6px; + display: block !important; + -moz-margin-end: 6px !important; } notification[value="loop-sharing-notification"] .button-menubutton-button { - min-width: 0; + min-width: 0 !important; } notification[value="loop-sharing-notification"] .messageImage { - list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-white); - margin-inline-start: 14px; + list-style-image: url(chrome://loop/content/shared/img/icons-16x16.svg#loop-icon-white) !important; + margin-inline-start: 14px !important; } notification[value="loop-sharing-notification"].paused .messageImage { - list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-still); + list-style-image: url(chrome://loop/content/shared/img/icons-16x16.svg#loop-icon-still) !important; } notification[value="loop-sharing-notification"] .close-icon { - display: none; + display: none !important; } chatbox[src^="about:loopconversation#"] > .chat-titlebar { - background-color: #00a9dc; - border-color: #00a9dc; + background-color: #00a9dc !important; + border-color: #00a9dc !important; } chatbox[src^="about:loopconversation#"] .chat-title { - color: white; + color: white !important; } chatbox[src^="about:loopconversation#"] .chat-minimize-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white"); + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white") !important; } chatbox[src^="about:loopconversation#"] .chat-swap-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white"); + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white") !important; } .chat-loop-hangup { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white"); - background-color: #d13f1a; - border: 1px solid #d13f1a; - border-top-right-radius: 4px; - width: 32px; - height: 26px; - margin-top: -6px; - margin-bottom: -5px; - -moz-margin-start: 6px; - -moz-margin-end: -5px; + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white") !important; + background-color: #d13f1a !important; + border: 1px solid #d13f1a !important; + border-top-right-radius: 4px !important; + width: 32px !important; + height: 26px !important; + margin-top: -6px !important; + margin-bottom: -5px !important; + -moz-margin-start: 6px !important; + -moz-margin-end: -5px !important; } .chat-toolbarbutton.chat-loop-hangup:-moz-any(:hover,:hover:active) { - background-color: #ef6745; - border-color: #ef6745; + background-color: #ef6745 !important; + border-color: #ef6745 !important; } } diff --git a/browser/extensions/loop/skin/windows/platform.css b/browser/extensions/loop/skin/windows/platform.css index 417dc6c615ea..6f0c7610e9af 100644 --- a/browser/extensions/loop/skin/windows/platform.css +++ b/browser/extensions/loop/skin/windows/platform.css @@ -4,15 +4,23 @@ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); -@media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) { - #loop-button { - list-style-image: url(chrome://loop/skin/toolbar-lunaSilver.png) +/* Only apply to browser.xul documents */ +@-moz-document url("chrome://browser/content/browser.xul") { + /** + * XXX Due to bug 1228542, anything in this file that overrides a browser style + * must specify !important. Otherwise the style won't get applied correctly + * due to the limitations caused by the bug. + */ + + @media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) { + #loop-button { + list-style-image: url(chrome://loop/skin/toolbar-lunaSilver.png) + } + } + + @media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { + #loop-button { + list-style-image: url(chrome://loop/skin/toolbar-lunaSilver@2x.png) + } } } - -@media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { - #loop-button { - list-style-image: url(chrome://loop/skin/toolbar-lunaSilver@2x.png) - } -} - From 3593419254e3253caa0b5db672f8b5bdea7fe38d Mon Sep 17 00:00:00 2001 From: Dave Townsend Date: Fri, 27 Nov 2015 09:39:59 -0800 Subject: [PATCH 088/153] Bug 1228628: Move all eslintignore rules to the top-level of the tree. r=mconley --HG-- extra : commitid : Dwq9c2G0xAV extra : rebase_source : 29ef8c7dad0b0477933d82ea87fd157607cc7b14 extra : amend_source : f0353d9eab87d940d29377401b60606153644985 --- .eslintignore | 157 +++++++++++++++++++++++++++++++++++ devtools/.eslintignore | 22 ----- mobile/android/.eslintignore | 23 ----- python/mach_commands.py | 5 +- 4 files changed, 159 insertions(+), 48 deletions(-) create mode 100644 .eslintignore delete mode 100644 devtools/.eslintignore delete mode 100644 mobile/android/.eslintignore diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000000..9aff64986095 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,157 @@ +# Always ignore node_modules. +**/node_modules/**/*.* + +# Exclude expected objdirs. +obj*/** + +# We ignore all these directories by default, until we get them enabled. +# If you are enabling a directory, please add directory specific exclusions +# below. +accessible/** +addon-sdk/** +b2g/** +build/** +caps/** +chrome/** +config/** +db/** +docshell/** +dom/** +editor/** +embedding/** +extensions/** +gfx/** +gradle/** +hal/** +image/** +intl/** +ipc/** +js/** +layout/** +media/** +memory/** +mfbt/** +modules/** +mozglue/** +netwerk/** +nsprpub/** +other-licenses/** +parser/** +probes/** +python/** +rdf/** +security/** +services/** +startupcache/** +storage/** +testing/** +toolkit/** +tools/** +uriloader/** +view/** +webapprt/** +widget/** +xpcom/** +xpfe/** +xulrunner/** + +# browser/ exclusions +browser/app/** +browser/base/** +browser/branding/** +browser/components/** +browser/config/** +browser/docs/** +browser/experiments/** +browser/extensions/pdfjs/** +browser/extensions/shumway/** +browser/fuel/** +browser/installer/** +browser/locales/** +browser/modules/** +browser/themes/** + +# Loop specific exclusions + +# This file currently uses a non-standard (and not on a standards track) +# if statement within catch. +browser/extensions/loop/content/modules/MozLoopWorker.js +# This file currently uses es7 features eslint issue: +# https://github.com/eslint/espree/issues/125 +browser/extensions/loop/content/modules/MozLoopAPI.jsm +# Need to fix the configuration for this. +browser/extensions/loop/bootstrap.js +# Need to drop the preprocessing (bug 1212428) +browser/extensions/loop/content/preferences/prefs.js +# Libs we don't need to check +browser/extensions/loop/content/panels/vendor +browser/extensions/loop/content/shared/vendor +browser/extensions/loop/standalone/content/libs +# Libs we don't need to check +browser/extensions/loop/test/shared/vendor +# Coverage files +browser/extensions/loop/test/coverage +# These are generated react files that we don't need to check +browser/extensions/loop/content/panels/js/conversation.js +browser/extensions/loop/content/panels/js/conversationViews.js +browser/extensions/loop/content/panels/js/panel.js +browser/extensions/loop/content/panels/js/roomViews.js +browser/extensions/loop/content/panels/js/feedbackViews.js +browser/extensions/loop/content/shared/js/textChatView.js +browser/extensions/loop/content/shared/js/linkifiedTextView.js +browser/extensions/loop/content/shared/js/views.js +browser/extensions/loop/standalone/content/js/standaloneRoomViews.js +browser/extensions/loop/standalone/content/js/webapp.js +browser/extensions/loop/ui/ui-showcase.js +# Don't need to check the built tree +browser/extensions/loop/standalone/dist + +# devtools/ exclusions +# Ignore d3 +devtools/client/shared/d3.js +devtools/client/webaudioeditor/lib/dagre-d3.js + +# Ignore codemirror +devtools/client/sourceeditor/codemirror/*.js +devtools/client/sourceeditor/codemirror/**/*.js + +# Ignore jquery test libs +devtools/client/markupview/test/lib_* + +# Ignore pre-processed files +devtools/client/framework/toolbox-process-window.js +devtools/client/performance/system.js +devtools/client/webide/webide-prefs.js + +# Ignore various libs +devtools/shared/jsbeautify/* +devtools/shared/acorn/* +devtools/shared/tern/* +devtools/shared/pretty-fast/* +devtools/shared/sourcemap/* + +# mobile/android/ exclusions +mobile/android/chrome/content +mobile/android/tests/ + +# Uses `#filter substitution` +mobile/android/b2gdroid/app/b2gdroid.js +mobile/android/app/mobile.js +mobile/android/chrome/content/healthreport-prefs.js + +# Uses `#expand` +mobile/android/chrome/content/about.js + +# Not much JS to lint and non-standard at that +mobile/android/installer/ +mobile/android/locales/ + +# Pretty sure we're disabling this one anyway +mobile/android/modules/ContactService.jsm + +# es7 proposed: array comprehensions +# https://github.com/eslint/espree/issues/125 +mobile/android/modules/WebappManager.jsm + +# Non-standard `(catch ex if ...)` +mobile/android/components/Snippets.js diff --git a/devtools/.eslintignore b/devtools/.eslintignore deleted file mode 100644 index 09de1f744db4..000000000000 --- a/devtools/.eslintignore +++ /dev/null @@ -1,22 +0,0 @@ -# Ignore d3 -client/shared/d3.js -client/webaudioeditor/lib/dagre-d3.js - -# Ignore codemirror -client/sourceeditor/codemirror/*.js -client/sourceeditor/codemirror/**/*.js - -# Ignore jquery test libs -client/markupview/test/lib_* - -# Ignore pre-processed files -client/framework/toolbox-process-window.js -client/performance/system.js -client/webide/webide-prefs.js - -# Ignore various libs -shared/jsbeautify/* -shared/acorn/* -shared/tern/* -shared/pretty-fast/* -shared/sourcemap/* diff --git a/mobile/android/.eslintignore b/mobile/android/.eslintignore deleted file mode 100644 index 80955a6040da..000000000000 --- a/mobile/android/.eslintignore +++ /dev/null @@ -1,23 +0,0 @@ -chrome/content -tests/ - -# Uses `#filter substitution` -app/mobile.js -chrome/content/healthreport-prefs.js - -# Uses `#expand` -chrome/content/about.js - -# Not much JS to lint and non-standard at that -installer/ -locales/ - -# Pretty sure we're disabling this one anyway -modules/ContactService.jsm - -# es7 proposed: array comprehensions -# https://github.com/eslint/espree/issues/125 -modules/WebappManager.jsm - -# Non-standard `(catch ex if ...)` -components/Snippets.js diff --git a/python/mach_commands.py b/python/mach_commands.py index 58a6f5b758c6..19674d255fb9 100644 --- a/python/mach_commands.py +++ b/python/mach_commands.py @@ -212,11 +212,10 @@ class MachCommands(MachCommandBase): cmd_args = [binary, '--ext', ext, # This keeps ext as a single argument. ] + args - # Path must come after arguments. Path is '.' due to cwd below. - cmd_args += ['.'] + # Path must come after arguments. + cmd_args += [path] return self.run_process(cmd_args, - cwd=path, pass_thru=True, # Allow user to run eslint interactively. ensure_exit_code=False, # Don't throw on non-zero exit code. ) From bd090743b5cbb040da7cca09951e07cbab1e943a Mon Sep 17 00:00:00 2001 From: Kalpesh Krishna Date: Fri, 27 Nov 2015 12:51:02 -0800 Subject: [PATCH 089/153] Bug 1148028 - Remove MOZ_ANDROID_SHARE_OVERLAY. r=vivek,nalexander Fennec ships the Share Overlay everywhere. --HG-- extra : commitid : 5BjYeDt7odR extra : rebase_source : 8f8b97ee70161312a3c4ba7add801a1b2d340d23 --- configure.in | 9 - mobile/android/b2gdroid/confvars.sh | 3 - mobile/android/base/AndroidManifest.xml.in | 3 +- mobile/android/base/android-services.mozbuild | 2 - mobile/android/base/locales/moz.build | 3 - mobile/android/base/moz.build | 30 +- .../android/base/sync/CommandProcessor.java | 3 +- .../activities/ClientRecordArrayAdapter.java | 158 ------- .../setup/activities/SendTabActivity.java | 408 ------------------ mobile/android/confvars.sh | 3 - .../SyncAndroidManifest_activities.xml.in | 19 - 11 files changed, 15 insertions(+), 626 deletions(-) delete mode 100644 mobile/android/base/sync/setup/activities/ClientRecordArrayAdapter.java delete mode 100644 mobile/android/base/sync/setup/activities/SendTabActivity.java diff --git a/configure.in b/configure.in index 1d009fde2d1c..255926dc2aae 100644 --- a/configure.in +++ b/configure.in @@ -3761,7 +3761,6 @@ MOZ_ANDROID_SEARCH_ACTIVITY= MOZ_ANDROID_DOWNLOADS_INTEGRATION= MOZ_ANDROID_GCM= MOZ_ANDROID_MLS_STUMBLER= -MOZ_ANDROID_SHARE_OVERLAY= MOZ_EXCLUDE_HYPHENATION_DICTIONARIES= MOZ_INSTALL_TRACKING= MOZ_SWITCHBOARD= @@ -4863,13 +4862,6 @@ if test -n "$MOZ_ANDROID_MLS_STUMBLER"; then AC_DEFINE(MOZ_ANDROID_MLS_STUMBLER) fi -dnl ======================================================== -dnl = Include share overlay on Android -dnl ======================================================== -if test -n "$MOZ_ANDROID_SHARE_OVERLAY"; then - AC_DEFINE(MOZ_ANDROID_SHARE_OVERLAY) -fi - dnl = Include Tab Queue on Android dnl = Temporary build flag to allow development in Nightly dnl ======================================================== @@ -8593,7 +8585,6 @@ AC_SUBST(MOZ_ANDROID_GCM) AC_SUBST(MOZ_ANDROID_GECKOLIBS_AAR) AC_SUBST(MOZ_ANDROID_READING_LIST_SERVICE) AC_SUBST(MOZ_ANDROID_SEARCH_ACTIVITY) -AC_SUBST(MOZ_ANDROID_SHARE_OVERLAY) AC_SUBST(MOZ_ANDROID_TAB_QUEUE) AC_SUBST(MOZ_ANDROID_MLS_STUMBLER) AC_SUBST(MOZ_ANDROID_DOWNLOADS_INTEGRATION) diff --git a/mobile/android/b2gdroid/confvars.sh b/mobile/android/b2gdroid/confvars.sh index 92c12f7352f7..64403663d8a3 100644 --- a/mobile/android/b2gdroid/confvars.sh +++ b/mobile/android/b2gdroid/confvars.sh @@ -91,9 +91,6 @@ fi # Mark as WebGL conformant MOZ_WEBGL_CONFORMANT=1 -# Enable the share handler. -MOZ_ANDROID_SHARE_OVERLAY=1 - # Enable Tab Queue if test "$NIGHTLY_BUILD"; then MOZ_ANDROID_TAB_QUEUE=1 diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in index 13f95be3cbca..4c5232fb534c 100644 --- a/mobile/android/base/AndroidManifest.xml.in +++ b/mobile/android/base/AndroidManifest.xml.in @@ -423,7 +423,6 @@ android:authorities="@ANDROID_PACKAGE_NAME@.db.browser" android:permission="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"/> -#ifdef MOZ_ANDROID_SHARE_OVERLAY -#endif + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/extensions/loop/content/panels/css/panel.css b/browser/components/loop/content/css/panel.css similarity index 92% rename from browser/extensions/loop/content/panels/css/panel.css rename to browser/components/loop/content/css/panel.css index f875d502bae5..374d86543028 100644 --- a/browser/extensions/loop/content/panels/css/panel.css +++ b/browser/components/loop/content/css/panel.css @@ -12,7 +12,7 @@ body { /* Beta Ribbon */ .beta-ribbon { - background: url("../../shared/img/beta-ribbon.svg") no-repeat; + background: url("../shared/img/beta-ribbon.svg") no-repeat; background-size: 30px; width: 30px; height: 30px; @@ -158,7 +158,7 @@ body { transform: translateY(-50%); padding-top: 11rem; padding-bottom: 1rem; - background-image: url("../../shared/img/empty_conversations.svg"); + background-image: url("../shared/img/empty_conversations.svg"); background-repeat: no-repeat; background-position: top center; } @@ -324,11 +324,11 @@ body { } .room-list > .room-entry:hover > h2 > .copy-link { - background-image: url(../../shared/img/icons-16x16.svg#copy); + background-image: url(../shared/img/icons-16x16.svg#copy); } .room-list > .room-entry:hover > h2 > .delete-link { - background-image: url(../../shared/img/icons-16x16.svg#trash); + background-image: url(../shared/img/icons-16x16.svg#trash); } /* scale this up to 1.1x and then back to the original size */ @@ -338,7 +338,7 @@ body { } .room-list > .room-entry > h2 > .copy-link.checked { - background: transparent url(../../shared/img/icons-16x16.svg#checkmark); + background: transparent url(../shared/img/icons-16x16.svg#checkmark); animation: pulse .150s; animation-timing-function: ease-in-out; top: 0; @@ -362,7 +362,7 @@ body { /* Room entry edit button */ .room-entry-context-edit-btn { - background-image: url("../../shared/img/icons-10x10.svg#edit-darkgrey"); + background-image: url("../shared/img/icons-10x10.svg#edit-darkgrey"); background-position: center; background-repeat: no-repeat; background-size: 12px; @@ -399,7 +399,7 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu { .button-close { background-color: transparent; - background-image: url(../../shared/img/icons-10x10.svg#close); + background-image: url(../shared/img/icons-10x10.svg#close); background-repeat: no-repeat; background-size: 8px 8px; border: none; @@ -428,7 +428,7 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu { } .spinner.busy { - background-image: url(../../shared/img/spinner.png); + background-image: url(../shared/img/spinner.png); animation-name: spinnerRotate; animation-duration: 1s; animation-timing-function: linear; @@ -437,7 +437,7 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu { @media (min-resolution: 2dppx) { .spinner.busy { - background-image: url(../../shared/img/spinner@2x.png); + background-image: url(../shared/img/spinner@2x.png); } } @@ -502,7 +502,7 @@ html[dir="rtl"] .generate-url-spinner { margin-left: 10px; margin-right: 10px; vertical-align: middle; - background-image: url("../../shared/img/telefonica.png"); + background-image: url("../shared/img/telefonica.png"); background-size: 72px 20px; width: 72px; height: 20px; @@ -510,21 +510,21 @@ html[dir="rtl"] .generate-url-spinner { #powered-by-logo.en-GB, #powered-by-logo.de { - background-image: url("../../shared/img/02.png"); + background-image: url("../shared/img/02.png"); background-size: 21px 20px; width: 21px; height: 20px; } #powered-by-logo.pt-BR { - background-image: url("../../shared/img/vivo.png"); + background-image: url("../shared/img/vivo.png"); background-size: 53px 26px; width: 53px; height: 26px; } #powered-by-logo[class^="es-"] { - background-image: url("../../shared/img/movistar.png"); + background-image: url("../shared/img/movistar.png"); background-size: 92px 20px; width: 92px; height: 20px; @@ -532,20 +532,20 @@ html[dir="rtl"] .generate-url-spinner { @media (min-resolution: 2dppx) { #powered-by-logo { - background-image: url("../../shared/img/telefonica@2x.png"); + background-image: url("../shared/img/telefonica@2x.png"); } #powered-by-logo.en-GB, #powered-by-logo.de { - background-image: url("../../shared/img/02@2x.png"); + background-image: url("../shared/img/02@2x.png"); } #powered-by-logo.pt-BR { - background-image: url("../../shared/img/vivo@2x.png"); + background-image: url("../shared/img/vivo@2x.png"); } #powered-by-logo[class^="es-"] { - background-image: url("../../shared/img/movistar@2x.png"); + background-image: url("../shared/img/movistar@2x.png"); } } @@ -594,7 +594,7 @@ html[dir="rtl"] .generate-url-spinner { border: none; cursor: pointer; vertical-align: middle; - background: transparent url("../../shared/img/icons-10x10.svg#settings-cog"); + background: transparent url("../shared/img/icons-10x10.svg#settings-cog"); background-position: center; background-repeat: no-repeat; background-size: cover; diff --git a/browser/extensions/loop/content/panels/js/.eslintrc b/browser/components/loop/content/js/.eslintrc similarity index 100% rename from browser/extensions/loop/content/panels/js/.eslintrc rename to browser/components/loop/content/js/.eslintrc diff --git a/browser/extensions/loop/content/panels/js/conversation.js b/browser/components/loop/content/js/conversation.js similarity index 100% rename from browser/extensions/loop/content/panels/js/conversation.js rename to browser/components/loop/content/js/conversation.js diff --git a/browser/extensions/loop/content/panels/js/conversation.jsx b/browser/components/loop/content/js/conversation.jsx similarity index 100% rename from browser/extensions/loop/content/panels/js/conversation.jsx rename to browser/components/loop/content/js/conversation.jsx diff --git a/browser/extensions/loop/content/panels/js/conversationAppStore.js b/browser/components/loop/content/js/conversationAppStore.js similarity index 100% rename from browser/extensions/loop/content/panels/js/conversationAppStore.js rename to browser/components/loop/content/js/conversationAppStore.js diff --git a/browser/extensions/loop/content/panels/js/feedbackViews.js b/browser/components/loop/content/js/feedbackViews.js similarity index 100% rename from browser/extensions/loop/content/panels/js/feedbackViews.js rename to browser/components/loop/content/js/feedbackViews.js diff --git a/browser/extensions/loop/content/panels/js/feedbackViews.jsx b/browser/components/loop/content/js/feedbackViews.jsx similarity index 100% rename from browser/extensions/loop/content/panels/js/feedbackViews.jsx rename to browser/components/loop/content/js/feedbackViews.jsx diff --git a/browser/extensions/loop/content/panels/js/otconfig.js b/browser/components/loop/content/js/otconfig.js similarity index 100% rename from browser/extensions/loop/content/panels/js/otconfig.js rename to browser/components/loop/content/js/otconfig.js diff --git a/browser/extensions/loop/content/panels/js/panel.js b/browser/components/loop/content/js/panel.js similarity index 98% rename from browser/extensions/loop/content/panels/js/panel.js rename to browser/components/loop/content/js/panel.js index e5c41a08ceb6..ff4ca198eb3a 100644 --- a/browser/extensions/loop/content/panels/js/panel.js +++ b/browser/components/loop/content/js/panel.js @@ -29,7 +29,7 @@ loop.panel = (function(_, mozL10n) { return ( React.createElement("div", {className: "fte-get-started-content"}, React.createElement("header", {className: "fte-title"}, - React.createElement("img", {src: "shared/img/hello_logo.svg"}), + React.createElement("img", {src: "loop/shared/img/hello_logo.svg"}), React.createElement("div", {className: "fte-subheader"}, mozL10n.get("first_time_experience_subheading") ) @@ -379,7 +379,7 @@ loop.panel = (function(_, mozL10n) { _renderDefaultIcon: function() { return ( React.createElement("div", {className: "room-entry-context-item"}, - React.createElement("img", {src: "shared/img/icons-16x16.svg#globe"}) + React.createElement("img", {src: "loop/shared/img/icons-16x16.svg#globe"}) ) ); }, @@ -390,7 +390,7 @@ loop.panel = (function(_, mozL10n) { React.createElement("a", {href: roomUrl.location, onClick: this.handleClick, title: roomUrl.description}, - React.createElement("img", {src: roomUrl.thumbnail || "shared/img/icons-16x16.svg#globe"}) + React.createElement("img", {src: roomUrl.thumbnail || "loop/shared/img/icons-16x16.svg#globe"}) ) ) ); @@ -717,7 +717,7 @@ loop.panel = (function(_, mozL10n) { React.createElement("div", {className: "room-list"}, this._renderNewRoomButton(), React.createElement("div", {className: "room-list-loading"}, - React.createElement("img", {src: "shared/img/animated-spinner.svg"}) + React.createElement("img", {src: "loop/shared/img/animated-spinner.svg"}) ) ) ); @@ -884,7 +884,7 @@ loop.panel = (function(_, mozL10n) { return ( React.createElement("div", {className: "error-content"}, React.createElement("header", {className: "error-title"}, - React.createElement("img", {src: "shared/img/sad_hello_icon_64x64.svg"}), + React.createElement("img", {src: "loop/shared/img/sad_hello_icon_64x64.svg"}), React.createElement("p", {className: "error-subheader"}, mozL10n.get("e10s_not_supported_subheading", { brandShortname: mozL10n.get("clientShortname2") diff --git a/browser/extensions/loop/content/panels/js/panel.jsx b/browser/components/loop/content/js/panel.jsx similarity index 99% rename from browser/extensions/loop/content/panels/js/panel.jsx rename to browser/components/loop/content/js/panel.jsx index d2c11eca60a5..fb14776745f8 100644 --- a/browser/extensions/loop/content/panels/js/panel.jsx +++ b/browser/components/loop/content/js/panel.jsx @@ -29,7 +29,7 @@ loop.panel = (function(_, mozL10n) { return (
- +
{mozL10n.get("first_time_experience_subheading")}
@@ -379,7 +379,7 @@ loop.panel = (function(_, mozL10n) { _renderDefaultIcon: function() { return (
- +
); }, @@ -390,7 +390,7 @@ loop.panel = (function(_, mozL10n) { - +
); @@ -717,7 +717,7 @@ loop.panel = (function(_, mozL10n) {
{this._renderNewRoomButton()}
- +
); @@ -884,7 +884,7 @@ loop.panel = (function(_, mozL10n) { return (
- +

{mozL10n.get("e10s_not_supported_subheading", { brandShortname: mozL10n.get("clientShortname2") diff --git a/browser/extensions/loop/content/panels/js/roomStore.js b/browser/components/loop/content/js/roomStore.js similarity index 100% rename from browser/extensions/loop/content/panels/js/roomStore.js rename to browser/components/loop/content/js/roomStore.js diff --git a/browser/extensions/loop/content/panels/js/roomViews.js b/browser/components/loop/content/js/roomViews.js similarity index 99% rename from browser/extensions/loop/content/panels/js/roomViews.js rename to browser/components/loop/content/js/roomViews.js index 67e02207c999..5f49fdbf1f61 100644 --- a/browser/extensions/loop/content/panels/js/roomViews.js +++ b/browser/components/loop/content/js/roomViews.js @@ -346,14 +346,14 @@ loop.roomViews = (function(mozL10n) { "triggered": this.state.copiedUrl }), onClick: this.handleCopyButtonClick}, - React.createElement("img", {src: "shared/img/glyph-link-16x16.svg"}), + React.createElement("img", {src: "loop/shared/img/svg/glyph-link-16x16.svg"}), React.createElement("p", null, mozL10n.get(this.state.copiedUrl ? "invite_copied_link_button" : "invite_copy_link_button")) ), React.createElement("div", {className: "btn-email invite-button", onClick: this.handleEmailButtonClick, onMouseOver: this.resetTriggeredButtons}, - React.createElement("img", {src: "shared/img/glyph-email-16x16.svg"}), + React.createElement("img", {src: "loop/shared/img/svg/glyph-email-16x16.svg"}), React.createElement("p", null, mozL10n.get("invite_email_link_button")) ) ), @@ -536,7 +536,7 @@ loop.roomViews = (function(mozL10n) { } var url = this._getURL(); - var thumbnail = url && url.thumbnail || "shared/img/icons-16x16.svg#globe"; + var thumbnail = url && url.thumbnail || "loop/shared/img/icons-16x16.svg#globe"; var urlDescription = url && url.description || ""; var location = url && url.location || ""; diff --git a/browser/extensions/loop/content/panels/js/roomViews.jsx b/browser/components/loop/content/js/roomViews.jsx similarity index 99% rename from browser/extensions/loop/content/panels/js/roomViews.jsx rename to browser/components/loop/content/js/roomViews.jsx index 5bbbd0fb2765..7f5d66f7a6dc 100644 --- a/browser/extensions/loop/content/panels/js/roomViews.jsx +++ b/browser/components/loop/content/js/roomViews.jsx @@ -346,14 +346,14 @@ loop.roomViews = (function(mozL10n) { "triggered": this.state.copiedUrl })} onClick={this.handleCopyButtonClick}> - +

{mozL10n.get(this.state.copiedUrl ? "invite_copied_link_button" : "invite_copy_link_button")}

- +

{mozL10n.get("invite_email_link_button")}

@@ -536,7 +536,7 @@ loop.roomViews = (function(mozL10n) { } var url = this._getURL(); - var thumbnail = url && url.thumbnail || "shared/img/icons-16x16.svg#globe"; + var thumbnail = url && url.thumbnail || "loop/shared/img/icons-16x16.svg#globe"; var urlDescription = url && url.description || ""; var location = url && url.location || ""; diff --git a/browser/extensions/loop/content/panels/vendor/l10n.js b/browser/components/loop/content/libs/l10n.js similarity index 100% rename from browser/extensions/loop/content/panels/vendor/l10n.js rename to browser/components/loop/content/libs/l10n.js diff --git a/browser/components/loop/content/panel.html b/browser/components/loop/content/panel.html new file mode 100644 index 000000000000..87fb62711b2c --- /dev/null +++ b/browser/components/loop/content/panel.html @@ -0,0 +1,35 @@ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/browser/extensions/loop/content/shared/README.md b/browser/components/loop/content/shared/README.md similarity index 100% rename from browser/extensions/loop/content/shared/README.md rename to browser/components/loop/content/shared/README.md diff --git a/browser/extensions/loop/content/shared/css/common.css b/browser/components/loop/content/shared/css/common.css similarity index 100% rename from browser/extensions/loop/content/shared/css/common.css rename to browser/components/loop/content/shared/css/common.css diff --git a/browser/extensions/loop/content/shared/css/conversation.css b/browser/components/loop/content/shared/css/conversation.css similarity index 95% rename from browser/extensions/loop/content/shared/css/conversation.css rename to browser/components/loop/content/shared/css/conversation.css index aacca74062f4..b56876429489 100644 --- a/browser/extensions/loop/content/shared/css/conversation.css +++ b/browser/components/loop/content/shared/css/conversation.css @@ -65,7 +65,7 @@ html[dir="rtl"] .conversation-toolbar > li { background-position: center; background-repeat: no-repeat; background-color: transparent; - background-image: url("../img/media-group.svg"); + background-image: url("../img/svg/media-group.svg"); background-size: cover; height: 28px; width: 67px; @@ -73,25 +73,25 @@ html[dir="rtl"] .conversation-toolbar > li { .conversation-toolbar-media-btn-group-box > button:last-child:active, .conversation-toolbar-media-btn-group-box > button:last-child:hover { - background-image: url("../img/media-group-right-hover.svg"); + background-image: url("../img/svg/media-group-right-hover.svg"); background-size: cover; } html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:last-child:active, html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:last-child:hover { - background-image: url("../img/media-group-left-hover.svg"); + background-image: url("../img/svg/media-group-left-hover.svg"); background-size: cover; } .conversation-toolbar-media-btn-group-box > button:first-child:active, .conversation-toolbar-media-btn-group-box > button:first-child:hover { - background-image: url("../img/media-group-left-hover.svg"); + background-image: url("../img/svg/media-group-left-hover.svg"); background-size: cover; } html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:first-child:active, html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:first-child:hover { - background-image: url("../img/media-group-right-hover.svg"); + background-image: url("../img/svg/media-group-right-hover.svg"); background-size: cover; } @@ -106,76 +106,76 @@ html[dir="rtl"] .conversation-toolbar-btn-box.btn-edit-entry { /* conversationViews.jsx */ .conversation-toolbar .btn-hangup { - background-image: url("../img/exit.svg"); + background-image: url("../img/svg/exit.svg"); border: 0; } /* Audio mute button */ .btn-mute-audio:after { - content: url("../img/audio.svg"); + content: url("../img/svg/audio.svg"); } .btn-mute-audio.muted:after { - content: url("../img/audio-mute.svg"); + content: url("../img/svg/audio-mute.svg"); } .btn-mute-audio:hover:after, .btn-mute-audio:active:after { - content: url("../img/audio-hover.svg"); + content: url("../img/svg/audio-hover.svg"); } .btn-mute-audio.muted:hover:after, .btn-mute-audio.muted:active:after { - content: url("../img/audio-mute-hover.svg"); + content: url("../img/svg/audio-mute-hover.svg"); } /* Video mute button */ .btn-mute-video:after { - content: url("../img/video.svg"); + content: url("../img/svg/video.svg"); } .btn-mute-video:active:after, .btn-mute-video:hover:after { - content: url("../img/video-hover.svg"); + content: url("../img/svg/video-hover.svg"); } .btn-mute-video.muted:after { - content: url("../img/video-mute.svg"); + content: url("../img/svg/video-mute.svg"); } .btn-mute-video.muted:hover:after, .btn-mute-video.muted:active:after { - content: url("../img/video-mute-hover.svg"); + content: url("../img/svg/video-mute-hover.svg"); } .btn-settings { width: 28px; height: 28px; background-size: 28px; - background-image: url("../img/settings.svg"); + background-image: url("../img/svg/settings.svg"); background-color: transparent; } .btn-settings:hover, .btn-settings:active { - background-image: url("../img/settings-hover.svg"); + background-image: url("../img/svg/settings-hover.svg"); } .btn-screen-share { - background-image: url("../img/sharing.svg"); + background-image: url("../img/svg/sharing.svg"); } .btn-screen-share:hover, .btn-screen-share:active { - background-image: url("../img/sharing-hover.svg"); + background-image: url("../img/svg/sharing-hover.svg"); } .btn-screen-share.active { - background-image: url("../img/sharing-active.svg"); + background-image: url("../img/svg/sharing-active.svg"); } .btn-screen-share.disabled { /* The screen share button is in its pending state when its disabled. */ - background-image: url("../img/sharing-pending.svg"); + background-image: url("../img/svg/sharing-pending.svg"); } /* General Call (incoming or outgoing). */ diff --git a/browser/extensions/loop/content/shared/css/reset.css b/browser/components/loop/content/shared/css/reset.css similarity index 100% rename from browser/extensions/loop/content/shared/css/reset.css rename to browser/components/loop/content/shared/css/reset.css diff --git a/browser/extensions/loop/content/shared/img/02.png b/browser/components/loop/content/shared/img/02.png similarity index 100% rename from browser/extensions/loop/content/shared/img/02.png rename to browser/components/loop/content/shared/img/02.png diff --git a/browser/extensions/loop/content/shared/img/02@2x.png b/browser/components/loop/content/shared/img/02@2x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/02@2x.png rename to browser/components/loop/content/shared/img/02@2x.png diff --git a/browser/extensions/loop/content/shared/img/animated-spinner.svg b/browser/components/loop/content/shared/img/animated-spinner.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/animated-spinner.svg rename to browser/components/loop/content/shared/img/animated-spinner.svg diff --git a/browser/extensions/loop/content/shared/img/audio-call-avatar.svg b/browser/components/loop/content/shared/img/audio-call-avatar.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/audio-call-avatar.svg rename to browser/components/loop/content/shared/img/audio-call-avatar.svg diff --git a/browser/extensions/loop/content/shared/img/audio-default-16x16@1.5x.png b/browser/components/loop/content/shared/img/audio-default-16x16@1.5x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/audio-default-16x16@1.5x.png rename to browser/components/loop/content/shared/img/audio-default-16x16@1.5x.png diff --git a/browser/extensions/loop/content/shared/img/audio-default-16x16@2x.png b/browser/components/loop/content/shared/img/audio-default-16x16@2x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/audio-default-16x16@2x.png rename to browser/components/loop/content/shared/img/audio-default-16x16@2x.png diff --git a/browser/extensions/loop/content/shared/img/avatars.svg b/browser/components/loop/content/shared/img/avatars.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/avatars.svg rename to browser/components/loop/content/shared/img/avatars.svg diff --git a/browser/extensions/loop/content/shared/img/beta-ribbon.svg b/browser/components/loop/content/shared/img/beta-ribbon.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/beta-ribbon.svg rename to browser/components/loop/content/shared/img/beta-ribbon.svg diff --git a/browser/extensions/loop/content/shared/img/chatbubble-arrow-left.svg b/browser/components/loop/content/shared/img/chatbubble-arrow-left.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/chatbubble-arrow-left.svg rename to browser/components/loop/content/shared/img/chatbubble-arrow-left.svg diff --git a/browser/extensions/loop/content/shared/img/chatbubble-arrow-right.svg b/browser/components/loop/content/shared/img/chatbubble-arrow-right.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/chatbubble-arrow-right.svg rename to browser/components/loop/content/shared/img/chatbubble-arrow-right.svg diff --git a/browser/extensions/loop/content/shared/img/check.svg b/browser/components/loop/content/shared/img/check.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/check.svg rename to browser/components/loop/content/shared/img/check.svg diff --git a/browser/extensions/loop/content/shared/img/ellipsis-v.svg b/browser/components/loop/content/shared/img/ellipsis-v.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/ellipsis-v.svg rename to browser/components/loop/content/shared/img/ellipsis-v.svg diff --git a/browser/extensions/loop/content/shared/img/empty_conversations.svg b/browser/components/loop/content/shared/img/empty_conversations.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/empty_conversations.svg rename to browser/components/loop/content/shared/img/empty_conversations.svg diff --git a/browser/extensions/loop/content/shared/img/empty_search.svg b/browser/components/loop/content/shared/img/empty_search.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/empty_search.svg rename to browser/components/loop/content/shared/img/empty_search.svg diff --git a/browser/extensions/loop/content/shared/img/facemute-14x14.png b/browser/components/loop/content/shared/img/facemute-14x14.png similarity index 100% rename from browser/extensions/loop/content/shared/img/facemute-14x14.png rename to browser/components/loop/content/shared/img/facemute-14x14.png diff --git a/browser/extensions/loop/content/shared/img/facemute-14x14@2x.png b/browser/components/loop/content/shared/img/facemute-14x14@2x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/facemute-14x14@2x.png rename to browser/components/loop/content/shared/img/facemute-14x14@2x.png diff --git a/browser/extensions/loop/content/shared/img/firefox-avatar.svg b/browser/components/loop/content/shared/img/firefox-avatar.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/firefox-avatar.svg rename to browser/components/loop/content/shared/img/firefox-avatar.svg diff --git a/browser/extensions/loop/content/shared/img/firefox-logo.png b/browser/components/loop/content/shared/img/firefox-logo.png similarity index 100% rename from browser/extensions/loop/content/shared/img/firefox-logo.png rename to browser/components/loop/content/shared/img/firefox-logo.png diff --git a/browser/extensions/loop/content/shared/img/hangup-inverse-14x14.png b/browser/components/loop/content/shared/img/hangup-inverse-14x14.png similarity index 100% rename from browser/extensions/loop/content/shared/img/hangup-inverse-14x14.png rename to browser/components/loop/content/shared/img/hangup-inverse-14x14.png diff --git a/browser/extensions/loop/content/shared/img/hangup-inverse-14x14@2x.png b/browser/components/loop/content/shared/img/hangup-inverse-14x14@2x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/hangup-inverse-14x14@2x.png rename to browser/components/loop/content/shared/img/hangup-inverse-14x14@2x.png diff --git a/browser/extensions/loop/content/shared/img/happy.png b/browser/components/loop/content/shared/img/happy.png similarity index 100% rename from browser/extensions/loop/content/shared/img/happy.png rename to browser/components/loop/content/shared/img/happy.png diff --git a/browser/extensions/loop/content/shared/img/hello_logo.svg b/browser/components/loop/content/shared/img/hello_logo.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/hello_logo.svg rename to browser/components/loop/content/shared/img/hello_logo.svg diff --git a/browser/extensions/loop/content/shared/img/helloicon.svg b/browser/components/loop/content/shared/img/helloicon.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/helloicon.svg rename to browser/components/loop/content/shared/img/helloicon.svg diff --git a/browser/extensions/loop/content/shared/img/icon_32.png b/browser/components/loop/content/shared/img/icon_32.png similarity index 100% rename from browser/extensions/loop/content/shared/img/icon_32.png rename to browser/components/loop/content/shared/img/icon_32.png diff --git a/browser/extensions/loop/content/shared/img/icon_64.png b/browser/components/loop/content/shared/img/icon_64.png similarity index 100% rename from browser/extensions/loop/content/shared/img/icon_64.png rename to browser/components/loop/content/shared/img/icon_64.png diff --git a/browser/extensions/loop/content/shared/img/icons-10x10.svg b/browser/components/loop/content/shared/img/icons-10x10.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/icons-10x10.svg rename to browser/components/loop/content/shared/img/icons-10x10.svg diff --git a/browser/extensions/loop/content/shared/img/icons-14x14.svg b/browser/components/loop/content/shared/img/icons-14x14.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/icons-14x14.svg rename to browser/components/loop/content/shared/img/icons-14x14.svg diff --git a/browser/extensions/loop/content/shared/img/icons-16x16.svg b/browser/components/loop/content/shared/img/icons-16x16.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/icons-16x16.svg rename to browser/components/loop/content/shared/img/icons-16x16.svg diff --git a/browser/extensions/loop/content/shared/img/movistar.png b/browser/components/loop/content/shared/img/movistar.png similarity index 100% rename from browser/extensions/loop/content/shared/img/movistar.png rename to browser/components/loop/content/shared/img/movistar.png diff --git a/browser/extensions/loop/content/shared/img/movistar@2x.png b/browser/components/loop/content/shared/img/movistar@2x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/movistar@2x.png rename to browser/components/loop/content/shared/img/movistar@2x.png diff --git a/browser/extensions/loop/content/shared/img/mute-inverse-14x14.png b/browser/components/loop/content/shared/img/mute-inverse-14x14.png similarity index 100% rename from browser/extensions/loop/content/shared/img/mute-inverse-14x14.png rename to browser/components/loop/content/shared/img/mute-inverse-14x14.png diff --git a/browser/extensions/loop/content/shared/img/mute-inverse-14x14@2x.png b/browser/components/loop/content/shared/img/mute-inverse-14x14@2x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/mute-inverse-14x14@2x.png rename to browser/components/loop/content/shared/img/mute-inverse-14x14@2x.png diff --git a/browser/extensions/loop/content/shared/img/pause-12x12.svg b/browser/components/loop/content/shared/img/pause-12x12.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/pause-12x12.svg rename to browser/components/loop/content/shared/img/pause-12x12.svg diff --git a/browser/extensions/loop/content/shared/img/play-12x12.svg b/browser/components/loop/content/shared/img/play-12x12.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/play-12x12.svg rename to browser/components/loop/content/shared/img/play-12x12.svg diff --git a/browser/extensions/loop/content/shared/img/sad.png b/browser/components/loop/content/shared/img/sad.png similarity index 100% rename from browser/extensions/loop/content/shared/img/sad.png rename to browser/components/loop/content/shared/img/sad.png diff --git a/browser/extensions/loop/content/shared/img/sad_hello_icon_64x64.svg b/browser/components/loop/content/shared/img/sad_hello_icon_64x64.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/sad_hello_icon_64x64.svg rename to browser/components/loop/content/shared/img/sad_hello_icon_64x64.svg diff --git a/browser/extensions/loop/content/shared/img/spinner.png b/browser/components/loop/content/shared/img/spinner.png similarity index 100% rename from browser/extensions/loop/content/shared/img/spinner.png rename to browser/components/loop/content/shared/img/spinner.png diff --git a/browser/extensions/loop/content/shared/img/spinner.svg b/browser/components/loop/content/shared/img/spinner.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/spinner.svg rename to browser/components/loop/content/shared/img/spinner.svg diff --git a/browser/extensions/loop/content/shared/img/spinner@2x.png b/browser/components/loop/content/shared/img/spinner@2x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/spinner@2x.png rename to browser/components/loop/content/shared/img/spinner@2x.png diff --git a/browser/extensions/loop/content/shared/img/stop-12x12.svg b/browser/components/loop/content/shared/img/stop-12x12.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/stop-12x12.svg rename to browser/components/loop/content/shared/img/stop-12x12.svg diff --git a/browser/extensions/loop/content/shared/img/audio-hover.svg b/browser/components/loop/content/shared/img/svg/audio-hover.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/audio-hover.svg rename to browser/components/loop/content/shared/img/svg/audio-hover.svg diff --git a/browser/extensions/loop/content/shared/img/audio-mute-hover.svg b/browser/components/loop/content/shared/img/svg/audio-mute-hover.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/audio-mute-hover.svg rename to browser/components/loop/content/shared/img/svg/audio-mute-hover.svg diff --git a/browser/extensions/loop/content/shared/img/audio-mute.svg b/browser/components/loop/content/shared/img/svg/audio-mute.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/audio-mute.svg rename to browser/components/loop/content/shared/img/svg/audio-mute.svg diff --git a/browser/extensions/loop/content/shared/img/audio.svg b/browser/components/loop/content/shared/img/svg/audio.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/audio.svg rename to browser/components/loop/content/shared/img/svg/audio.svg diff --git a/browser/extensions/loop/content/shared/img/cam_audio-no.svg b/browser/components/loop/content/shared/img/svg/cam_audio-no.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/cam_audio-no.svg rename to browser/components/loop/content/shared/img/svg/cam_audio-no.svg diff --git a/browser/extensions/loop/content/shared/img/cam_audio.svg b/browser/components/loop/content/shared/img/svg/cam_audio.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/cam_audio.svg rename to browser/components/loop/content/shared/img/svg/cam_audio.svg diff --git a/browser/extensions/loop/content/shared/img/cam_audio_h.svg b/browser/components/loop/content/shared/img/svg/cam_audio_h.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/cam_audio_h.svg rename to browser/components/loop/content/shared/img/svg/cam_audio_h.svg diff --git a/browser/extensions/loop/content/shared/img/exit.svg b/browser/components/loop/content/shared/img/svg/exit.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/exit.svg rename to browser/components/loop/content/shared/img/svg/exit.svg diff --git a/browser/extensions/loop/content/shared/img/glyph-email-16x16.svg b/browser/components/loop/content/shared/img/svg/glyph-email-16x16.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/glyph-email-16x16.svg rename to browser/components/loop/content/shared/img/svg/glyph-email-16x16.svg diff --git a/browser/extensions/loop/content/shared/img/glyph-facebook-16x16.svg b/browser/components/loop/content/shared/img/svg/glyph-facebook-16x16.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/glyph-facebook-16x16.svg rename to browser/components/loop/content/shared/img/svg/glyph-facebook-16x16.svg diff --git a/browser/extensions/loop/content/shared/img/glyph-help-16x16.svg b/browser/components/loop/content/shared/img/svg/glyph-help-16x16.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/glyph-help-16x16.svg rename to browser/components/loop/content/shared/img/svg/glyph-help-16x16.svg diff --git a/browser/extensions/loop/content/shared/img/glyph-link-16x16.svg b/browser/components/loop/content/shared/img/svg/glyph-link-16x16.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/glyph-link-16x16.svg rename to browser/components/loop/content/shared/img/svg/glyph-link-16x16.svg diff --git a/browser/extensions/loop/content/shared/img/glyph-user-16x16.svg b/browser/components/loop/content/shared/img/svg/glyph-user-16x16.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/glyph-user-16x16.svg rename to browser/components/loop/content/shared/img/svg/glyph-user-16x16.svg diff --git a/browser/extensions/loop/content/shared/img/media-group-left-hover.svg b/browser/components/loop/content/shared/img/svg/media-group-left-hover.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/media-group-left-hover.svg rename to browser/components/loop/content/shared/img/svg/media-group-left-hover.svg diff --git a/browser/extensions/loop/content/shared/img/media-group-right-hover.svg b/browser/components/loop/content/shared/img/svg/media-group-right-hover.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/media-group-right-hover.svg rename to browser/components/loop/content/shared/img/svg/media-group-right-hover.svg diff --git a/browser/extensions/loop/content/shared/img/media-group.svg b/browser/components/loop/content/shared/img/svg/media-group.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/media-group.svg rename to browser/components/loop/content/shared/img/svg/media-group.svg diff --git a/browser/extensions/loop/content/shared/img/settings-hover.svg b/browser/components/loop/content/shared/img/svg/settings-hover.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/settings-hover.svg rename to browser/components/loop/content/shared/img/svg/settings-hover.svg diff --git a/browser/extensions/loop/content/shared/img/settings.svg b/browser/components/loop/content/shared/img/svg/settings.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/settings.svg rename to browser/components/loop/content/shared/img/svg/settings.svg diff --git a/browser/extensions/loop/content/shared/img/sharing-active.svg b/browser/components/loop/content/shared/img/svg/sharing-active.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/sharing-active.svg rename to browser/components/loop/content/shared/img/svg/sharing-active.svg diff --git a/browser/extensions/loop/content/shared/img/sharing-hover.svg b/browser/components/loop/content/shared/img/svg/sharing-hover.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/sharing-hover.svg rename to browser/components/loop/content/shared/img/svg/sharing-hover.svg diff --git a/browser/extensions/loop/content/shared/img/sharing-pending.svg b/browser/components/loop/content/shared/img/svg/sharing-pending.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/sharing-pending.svg rename to browser/components/loop/content/shared/img/svg/sharing-pending.svg diff --git a/browser/extensions/loop/content/shared/img/sharing.svg b/browser/components/loop/content/shared/img/svg/sharing.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/sharing.svg rename to browser/components/loop/content/shared/img/svg/sharing.svg diff --git a/browser/extensions/loop/content/shared/img/video-hover.svg b/browser/components/loop/content/shared/img/svg/video-hover.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/video-hover.svg rename to browser/components/loop/content/shared/img/svg/video-hover.svg diff --git a/browser/extensions/loop/content/shared/img/video-mute-hover.svg b/browser/components/loop/content/shared/img/svg/video-mute-hover.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/video-mute-hover.svg rename to browser/components/loop/content/shared/img/svg/video-mute-hover.svg diff --git a/browser/extensions/loop/content/shared/img/video-mute.svg b/browser/components/loop/content/shared/img/svg/video-mute.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/video-mute.svg rename to browser/components/loop/content/shared/img/svg/video-mute.svg diff --git a/browser/extensions/loop/content/shared/img/video.svg b/browser/components/loop/content/shared/img/svg/video.svg similarity index 100% rename from browser/extensions/loop/content/shared/img/video.svg rename to browser/components/loop/content/shared/img/svg/video.svg diff --git a/browser/extensions/loop/content/shared/img/telefonica.png b/browser/components/loop/content/shared/img/telefonica.png similarity index 100% rename from browser/extensions/loop/content/shared/img/telefonica.png rename to browser/components/loop/content/shared/img/telefonica.png diff --git a/browser/extensions/loop/content/shared/img/telefonica@2x.png b/browser/components/loop/content/shared/img/telefonica@2x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/telefonica@2x.png rename to browser/components/loop/content/shared/img/telefonica@2x.png diff --git a/browser/extensions/loop/content/shared/img/vivo.png b/browser/components/loop/content/shared/img/vivo.png similarity index 100% rename from browser/extensions/loop/content/shared/img/vivo.png rename to browser/components/loop/content/shared/img/vivo.png diff --git a/browser/extensions/loop/content/shared/img/vivo@2x.png b/browser/components/loop/content/shared/img/vivo@2x.png similarity index 100% rename from browser/extensions/loop/content/shared/img/vivo@2x.png rename to browser/components/loop/content/shared/img/vivo@2x.png diff --git a/browser/extensions/loop/content/shared/js/actions.js b/browser/components/loop/content/shared/js/actions.js similarity index 100% rename from browser/extensions/loop/content/shared/js/actions.js rename to browser/components/loop/content/shared/js/actions.js diff --git a/browser/extensions/loop/content/shared/js/activeRoomStore.js b/browser/components/loop/content/shared/js/activeRoomStore.js similarity index 100% rename from browser/extensions/loop/content/shared/js/activeRoomStore.js rename to browser/components/loop/content/shared/js/activeRoomStore.js diff --git a/browser/extensions/loop/content/shared/js/crypto.js b/browser/components/loop/content/shared/js/crypto.js similarity index 98% rename from browser/extensions/loop/content/shared/js/crypto.js rename to browser/components/loop/content/shared/js/crypto.js index 22b0616d2451..b067698f44d1 100644 --- a/browser/extensions/loop/content/shared/js/crypto.js +++ b/browser/components/loop/content/shared/js/crypto.js @@ -18,7 +18,7 @@ var inChrome = typeof Components != "undefined" && "utils" in Components; rootObject = { crypto: crypto }; - sharedUtils = Cu.import("chrome://loop/content/shared/js/utils.js", {}).utils; + sharedUtils = Cu.import("resource:///modules/loop/utils.js", {}).utils; } else { sharedUtils = this.shared.utils; } diff --git a/browser/extensions/loop/content/shared/js/dispatcher.js b/browser/components/loop/content/shared/js/dispatcher.js similarity index 100% rename from browser/extensions/loop/content/shared/js/dispatcher.js rename to browser/components/loop/content/shared/js/dispatcher.js diff --git a/browser/extensions/loop/content/shared/js/linkifiedTextView.js b/browser/components/loop/content/shared/js/linkifiedTextView.js similarity index 100% rename from browser/extensions/loop/content/shared/js/linkifiedTextView.js rename to browser/components/loop/content/shared/js/linkifiedTextView.js diff --git a/browser/extensions/loop/content/shared/js/linkifiedTextView.jsx b/browser/components/loop/content/shared/js/linkifiedTextView.jsx similarity index 100% rename from browser/extensions/loop/content/shared/js/linkifiedTextView.jsx rename to browser/components/loop/content/shared/js/linkifiedTextView.jsx diff --git a/browser/extensions/loop/content/shared/js/loopapi-client.js b/browser/components/loop/content/shared/js/loopapi-client.js similarity index 100% rename from browser/extensions/loop/content/shared/js/loopapi-client.js rename to browser/components/loop/content/shared/js/loopapi-client.js diff --git a/browser/extensions/loop/content/shared/js/mixins.js b/browser/components/loop/content/shared/js/mixins.js similarity index 100% rename from browser/extensions/loop/content/shared/js/mixins.js rename to browser/components/loop/content/shared/js/mixins.js diff --git a/browser/extensions/loop/content/shared/js/models.js b/browser/components/loop/content/shared/js/models.js similarity index 100% rename from browser/extensions/loop/content/shared/js/models.js rename to browser/components/loop/content/shared/js/models.js diff --git a/browser/extensions/loop/content/shared/js/otSdkDriver.js b/browser/components/loop/content/shared/js/otSdkDriver.js similarity index 100% rename from browser/extensions/loop/content/shared/js/otSdkDriver.js rename to browser/components/loop/content/shared/js/otSdkDriver.js diff --git a/browser/extensions/loop/content/shared/js/store.js b/browser/components/loop/content/shared/js/store.js similarity index 100% rename from browser/extensions/loop/content/shared/js/store.js rename to browser/components/loop/content/shared/js/store.js diff --git a/browser/extensions/loop/content/shared/js/textChatStore.js b/browser/components/loop/content/shared/js/textChatStore.js similarity index 100% rename from browser/extensions/loop/content/shared/js/textChatStore.js rename to browser/components/loop/content/shared/js/textChatStore.js diff --git a/browser/extensions/loop/content/shared/js/textChatView.js b/browser/components/loop/content/shared/js/textChatView.js similarity index 100% rename from browser/extensions/loop/content/shared/js/textChatView.js rename to browser/components/loop/content/shared/js/textChatView.js diff --git a/browser/extensions/loop/content/shared/js/textChatView.jsx b/browser/components/loop/content/shared/js/textChatView.jsx similarity index 100% rename from browser/extensions/loop/content/shared/js/textChatView.jsx rename to browser/components/loop/content/shared/js/textChatView.jsx diff --git a/browser/extensions/loop/content/shared/js/urlRegExps.js b/browser/components/loop/content/shared/js/urlRegExps.js similarity index 100% rename from browser/extensions/loop/content/shared/js/urlRegExps.js rename to browser/components/loop/content/shared/js/urlRegExps.js diff --git a/browser/extensions/loop/content/shared/js/utils.js b/browser/components/loop/content/shared/js/utils.js similarity index 100% rename from browser/extensions/loop/content/shared/js/utils.js rename to browser/components/loop/content/shared/js/utils.js diff --git a/browser/extensions/loop/content/shared/js/validate.js b/browser/components/loop/content/shared/js/validate.js similarity index 100% rename from browser/extensions/loop/content/shared/js/validate.js rename to browser/components/loop/content/shared/js/validate.js diff --git a/browser/extensions/loop/content/shared/js/views.js b/browser/components/loop/content/shared/js/views.js similarity index 99% rename from browser/extensions/loop/content/shared/js/views.js rename to browser/components/loop/content/shared/js/views.js index bdb6caea01d4..34cbc45c5fe9 100644 --- a/browser/extensions/loop/content/shared/js/views.js +++ b/browser/components/loop/content/shared/js/views.js @@ -854,7 +854,7 @@ loop.shared.views = (function(_, mozL10n) { if (!thumbnail) { thumbnail = this.props.useDesktopPaths ? - "shared/img/icons-16x16.svg#globe" : + "loop/shared/img/icons-16x16.svg#globe" : "shared/img/icons-16x16.svg#globe"; } diff --git a/browser/extensions/loop/content/shared/js/views.jsx b/browser/components/loop/content/shared/js/views.jsx similarity index 99% rename from browser/extensions/loop/content/shared/js/views.jsx rename to browser/components/loop/content/shared/js/views.jsx index 723e739f29b4..9eb26b42e6e3 100644 --- a/browser/extensions/loop/content/shared/js/views.jsx +++ b/browser/components/loop/content/shared/js/views.jsx @@ -854,7 +854,7 @@ loop.shared.views = (function(_, mozL10n) { if (!thumbnail) { thumbnail = this.props.useDesktopPaths ? - "shared/img/icons-16x16.svg#globe" : + "loop/shared/img/icons-16x16.svg#globe" : "shared/img/icons-16x16.svg#globe"; } diff --git a/browser/extensions/loop/content/shared/vendor/backbone-1.2.1.js b/browser/components/loop/content/shared/libs/backbone-1.2.1.js similarity index 100% rename from browser/extensions/loop/content/shared/vendor/backbone-1.2.1.js rename to browser/components/loop/content/shared/libs/backbone-1.2.1.js diff --git a/browser/extensions/loop/content/shared/vendor/classnames-2.2.0.js b/browser/components/loop/content/shared/libs/classnames-2.2.0.js similarity index 100% rename from browser/extensions/loop/content/shared/vendor/classnames-2.2.0.js rename to browser/components/loop/content/shared/libs/classnames-2.2.0.js diff --git a/browser/extensions/loop/content/shared/vendor/lodash-3.9.3.js b/browser/components/loop/content/shared/libs/lodash-3.9.3.js similarity index 100% rename from browser/extensions/loop/content/shared/vendor/lodash-3.9.3.js rename to browser/components/loop/content/shared/libs/lodash-3.9.3.js diff --git a/browser/extensions/loop/content/shared/vendor/react-0.13.3-prod.js b/browser/components/loop/content/shared/libs/react-0.13.3-prod.js similarity index 100% rename from browser/extensions/loop/content/shared/vendor/react-0.13.3-prod.js rename to browser/components/loop/content/shared/libs/react-0.13.3-prod.js diff --git a/browser/extensions/loop/content/shared/vendor/react-0.13.3.js b/browser/components/loop/content/shared/libs/react-0.13.3.js similarity index 100% rename from browser/extensions/loop/content/shared/vendor/react-0.13.3.js rename to browser/components/loop/content/shared/libs/react-0.13.3.js diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/css/ot.css b/browser/components/loop/content/shared/libs/sdk-content/css/ot.css similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/css/ot.css rename to browser/components/loop/content/shared/libs/sdk-content/css/ot.css diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-chrome.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-chrome.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-chrome.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-chrome.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-copy-firefox.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-copy-firefox.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-copy-firefox.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-copy-firefox.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-firefox.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-firefox.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-firefox.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-firefox.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-predenied-chrome.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-predenied-chrome.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-predenied-chrome.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-predenied-chrome.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-prompt-chrome.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-prompt-chrome.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-prompt-chrome.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-prompt-chrome.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-publisher.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-publisher.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-publisher.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-publisher.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-subscriber.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-subscriber.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-subscriber.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-subscriber.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/buttons.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/buttons.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/buttons.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/buttons.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/loader.gif b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/loader.gif similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/loader.gif rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/loader.gif diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-off.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-off.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-off.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-off.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-on.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-on.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-on.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-on.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-off.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-off.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-off.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-off.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-on.png b/browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-on.png similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-on.png rename to browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-on.png diff --git a/browser/extensions/loop/content/shared/vendor/sdk-content/js/dynamic_config.min.js b/browser/components/loop/content/shared/libs/sdk-content/js/dynamic_config.min.js similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk-content/js/dynamic_config.min.js rename to browser/components/loop/content/shared/libs/sdk-content/js/dynamic_config.min.js diff --git a/browser/extensions/loop/content/shared/vendor/sdk.js b/browser/components/loop/content/shared/libs/sdk.js similarity index 100% rename from browser/extensions/loop/content/shared/vendor/sdk.js rename to browser/components/loop/content/shared/libs/sdk.js diff --git a/browser/extensions/loop/content/shared/sounds/connected.ogg b/browser/components/loop/content/shared/sounds/connected.ogg similarity index 100% rename from browser/extensions/loop/content/shared/sounds/connected.ogg rename to browser/components/loop/content/shared/sounds/connected.ogg diff --git a/browser/extensions/loop/content/shared/sounds/connecting.ogg b/browser/components/loop/content/shared/sounds/connecting.ogg similarity index 100% rename from browser/extensions/loop/content/shared/sounds/connecting.ogg rename to browser/components/loop/content/shared/sounds/connecting.ogg diff --git a/browser/extensions/loop/content/shared/sounds/failure.ogg b/browser/components/loop/content/shared/sounds/failure.ogg similarity index 100% rename from browser/extensions/loop/content/shared/sounds/failure.ogg rename to browser/components/loop/content/shared/sounds/failure.ogg diff --git a/browser/extensions/loop/content/shared/sounds/message.ogg b/browser/components/loop/content/shared/sounds/message.ogg similarity index 100% rename from browser/extensions/loop/content/shared/sounds/message.ogg rename to browser/components/loop/content/shared/sounds/message.ogg diff --git a/browser/extensions/loop/content/shared/sounds/ringtone.ogg b/browser/components/loop/content/shared/sounds/ringtone.ogg similarity index 100% rename from browser/extensions/loop/content/shared/sounds/ringtone.ogg rename to browser/components/loop/content/shared/sounds/ringtone.ogg diff --git a/browser/extensions/loop/content/shared/sounds/room-joined-in.ogg b/browser/components/loop/content/shared/sounds/room-joined-in.ogg similarity index 100% rename from browser/extensions/loop/content/shared/sounds/room-joined-in.ogg rename to browser/components/loop/content/shared/sounds/room-joined-in.ogg diff --git a/browser/extensions/loop/content/shared/sounds/room-joined.ogg b/browser/components/loop/content/shared/sounds/room-joined.ogg similarity index 100% rename from browser/extensions/loop/content/shared/sounds/room-joined.ogg rename to browser/components/loop/content/shared/sounds/room-joined.ogg diff --git a/browser/extensions/loop/content/shared/sounds/room-left.ogg b/browser/components/loop/content/shared/sounds/room-left.ogg similarity index 100% rename from browser/extensions/loop/content/shared/sounds/room-left.ogg rename to browser/components/loop/content/shared/sounds/room-left.ogg diff --git a/browser/extensions/loop/content/shared/sounds/terminated.ogg b/browser/components/loop/content/shared/sounds/terminated.ogg similarity index 100% rename from browser/extensions/loop/content/shared/sounds/terminated.ogg rename to browser/components/loop/content/shared/sounds/terminated.ogg diff --git a/browser/components/loop/jar.mn b/browser/components/loop/jar.mn new file mode 100644 index 000000000000..3532277924e4 --- /dev/null +++ b/browser/components/loop/jar.mn @@ -0,0 +1,136 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +browser.jar: + # Desktop html files + content/browser/loop/conversation.html (content/conversation.html) + content/browser/loop/panel.html (content/panel.html) + + # Desktop libs (see bottom of this file for TokBox sdk assets) + content/browser/loop/libs/l10n.js (content/libs/l10n.js) + + # Desktop script + content/browser/loop/js/conversation.js (content/js/conversation.js) + content/browser/loop/js/conversationAppStore.js (content/js/conversationAppStore.js) + content/browser/loop/js/otconfig.js (content/js/otconfig.js) + content/browser/loop/js/panel.js (content/js/panel.js) + content/browser/loop/js/roomStore.js (content/js/roomStore.js) + content/browser/loop/js/roomViews.js (content/js/roomViews.js) + content/browser/loop/js/feedbackViews.js (content/js/feedbackViews.js) + + # Desktop styles + content/browser/loop/css/panel.css (content/css/panel.css) + + # Shared styles + content/browser/loop/shared/css/reset.css (content/shared/css/reset.css) + content/browser/loop/shared/css/common.css (content/shared/css/common.css) + content/browser/loop/shared/css/conversation.css (content/shared/css/conversation.css) + + # Shared images + content/browser/loop/shared/img/helloicon.svg (content/shared/img/helloicon.svg) + content/browser/loop/shared/img/icon_32.png (content/shared/img/icon_32.png) + content/browser/loop/shared/img/icon_64.png (content/shared/img/icon_64.png) + content/browser/loop/shared/img/spinner.svg (content/shared/img/spinner.svg) + # XXX could get rid of the png spinner usages and replace them with the svg + # one? + content/browser/loop/shared/img/spinner.png (content/shared/img/spinner.png) + content/browser/loop/shared/img/spinner@2x.png (content/shared/img/spinner@2x.png) + content/browser/loop/shared/img/sad_hello_icon_64x64.svg (content/shared/img/sad_hello_icon_64x64.svg) + content/browser/loop/shared/img/chatbubble-arrow-left.svg (content/shared/img/chatbubble-arrow-left.svg) + content/browser/loop/shared/img/chatbubble-arrow-right.svg (content/shared/img/chatbubble-arrow-right.svg) + content/browser/loop/shared/img/facemute-14x14.png (content/shared/img/facemute-14x14.png) + content/browser/loop/shared/img/facemute-14x14@2x.png (content/shared/img/facemute-14x14@2x.png) + content/browser/loop/shared/img/hangup-inverse-14x14.png (content/shared/img/hangup-inverse-14x14.png) + content/browser/loop/shared/img/hangup-inverse-14x14@2x.png (content/shared/img/hangup-inverse-14x14@2x.png) + content/browser/loop/shared/img/mute-inverse-14x14.png (content/shared/img/mute-inverse-14x14.png) + content/browser/loop/shared/img/mute-inverse-14x14@2x.png (content/shared/img/mute-inverse-14x14@2x.png) + content/browser/loop/shared/img/svg/glyph-email-16x16.svg (content/shared/img/svg/glyph-email-16x16.svg) + content/browser/loop/shared/img/svg/glyph-facebook-16x16.svg (content/shared/img/svg/glyph-facebook-16x16.svg) + content/browser/loop/shared/img/svg/glyph-help-16x16.svg (content/shared/img/svg/glyph-help-16x16.svg) + content/browser/loop/shared/img/svg/glyph-link-16x16.svg (content/shared/img/svg/glyph-link-16x16.svg) + content/browser/loop/shared/img/svg/glyph-user-16x16.svg (content/shared/img/svg/glyph-user-16x16.svg) + content/browser/loop/shared/img/svg/exit.svg (content/shared/img/svg/exit.svg) + content/browser/loop/shared/img/svg/audio.svg (content/shared/img/svg/audio.svg) + content/browser/loop/shared/img/svg/audio-hover.svg (content/shared/img/svg/audio-hover.svg) + content/browser/loop/shared/img/svg/audio-mute.svg (content/shared/img/svg/audio-mute.svg) + content/browser/loop/shared/img/svg/audio-mute-hover.svg (content/shared/img/svg/audio-mute-hover.svg) + content/browser/loop/shared/img/svg/video.svg (content/shared/img/svg/video.svg) + content/browser/loop/shared/img/svg/video-hover.svg (content/shared/img/svg/video-hover.svg) + content/browser/loop/shared/img/svg/video-mute.svg (content/shared/img/svg/video-mute.svg) + content/browser/loop/shared/img/svg/video-mute-hover.svg (content/shared/img/svg/video-mute-hover.svg) + content/browser/loop/shared/img/svg/settings.svg (content/shared/img/svg/settings.svg) + content/browser/loop/shared/img/svg/settings-hover.svg (content/shared/img/svg/settings-hover.svg) + content/browser/loop/shared/img/svg/sharing.svg (content/shared/img/svg/sharing.svg) + content/browser/loop/shared/img/svg/sharing-active.svg (content/shared/img/svg/sharing-active.svg) + content/browser/loop/shared/img/svg/sharing-pending.svg (content/shared/img/svg/sharing-pending.svg) + content/browser/loop/shared/img/svg/sharing-hover.svg (content/shared/img/svg/sharing-hover.svg) + content/browser/loop/shared/img/svg/media-group.svg (content/shared/img/svg/media-group.svg) + content/browser/loop/shared/img/svg/media-group-left-hover.svg (content/shared/img/svg/media-group-left-hover.svg) + content/browser/loop/shared/img/svg/media-group-right-hover.svg (content/shared/img/svg/media-group-right-hover.svg) + content/browser/loop/shared/img/audio-call-avatar.svg (content/shared/img/audio-call-avatar.svg) + content/browser/loop/shared/img/beta-ribbon.svg (content/shared/img/beta-ribbon.svg) + content/browser/loop/shared/img/check.svg (content/shared/img/check.svg) + content/browser/loop/shared/img/icons-10x10.svg (content/shared/img/icons-10x10.svg) + content/browser/loop/shared/img/icons-14x14.svg (content/shared/img/icons-14x14.svg) + content/browser/loop/shared/img/icons-16x16.svg (content/shared/img/icons-16x16.svg) + content/browser/loop/shared/img/movistar.png (content/shared/img/movistar.png) + content/browser/loop/shared/img/movistar@2x.png (content/shared/img/movistar@2x.png) + content/browser/loop/shared/img/vivo.png (content/shared/img/vivo.png) + content/browser/loop/shared/img/vivo@2x.png (content/shared/img/vivo@2x.png) + content/browser/loop/shared/img/02.png (content/shared/img/02.png) + content/browser/loop/shared/img/02@2x.png (content/shared/img/02@2x.png) + content/browser/loop/shared/img/telefonica.png (content/shared/img/telefonica.png) + content/browser/loop/shared/img/hello_logo.svg (content/shared/img/hello_logo.svg) + content/browser/loop/shared/img/telefonica@2x.png (content/shared/img/telefonica@2x.png) + content/browser/loop/shared/img/ellipsis-v.svg (content/shared/img/ellipsis-v.svg) + content/browser/loop/shared/img/empty_conversations.svg (content/shared/img/empty_conversations.svg) + content/browser/loop/shared/img/empty_search.svg (content/shared/img/empty_search.svg) + content/browser/loop/shared/img/animated-spinner.svg (content/shared/img/animated-spinner.svg) + content/browser/loop/shared/img/avatars.svg (content/shared/img/avatars.svg) + content/browser/loop/shared/img/firefox-avatar.svg (content/shared/img/firefox-avatar.svg) + content/browser/loop/shared/img/pause-12x12.svg (content/shared/img/pause-12x12.svg) + content/browser/loop/shared/img/play-12x12.svg (content/shared/img/play-12x12.svg) + content/browser/loop/shared/img/stop-12x12.svg (content/shared/img/stop-12x12.svg) + + # Shared scripts + content/browser/loop/shared/js/actions.js (content/shared/js/actions.js) + content/browser/loop/shared/js/store.js (content/shared/js/store.js) + content/browser/loop/shared/js/activeRoomStore.js (content/shared/js/activeRoomStore.js) + content/browser/loop/shared/js/dispatcher.js (content/shared/js/dispatcher.js) + content/browser/loop/shared/js/linkifiedTextView.js (content/shared/js/linkifiedTextView.js) + content/browser/loop/shared/js/loopapi-client.js (content/shared/js/loopapi-client.js) + content/browser/loop/shared/js/models.js (content/shared/js/models.js) + content/browser/loop/shared/js/mixins.js (content/shared/js/mixins.js) + content/browser/loop/shared/js/otSdkDriver.js (content/shared/js/otSdkDriver.js) + content/browser/loop/shared/js/views.js (content/shared/js/views.js) + content/browser/loop/shared/js/textChatStore.js (content/shared/js/textChatStore.js) + content/browser/loop/shared/js/textChatView.js (content/shared/js/textChatView.js) + content/browser/loop/shared/js/urlRegExps.js (content/shared/js/urlRegExps.js) + content/browser/loop/shared/js/utils.js (content/shared/js/utils.js) + content/browser/loop/shared/js/validate.js (content/shared/js/validate.js) + + # Shared libs +#ifdef DEBUG + content/browser/loop/shared/libs/react-0.13.3.js (content/shared/libs/react-0.13.3.js) +#else + content/browser/loop/shared/libs/react-0.13.3.js (content/shared/libs/react-0.13.3-prod.js) +#endif + content/browser/loop/shared/libs/lodash-3.9.3.js (content/shared/libs/lodash-3.9.3.js) + content/browser/loop/shared/libs/backbone-1.2.1.js (content/shared/libs/backbone-1.2.1.js) + content/browser/loop/shared/libs/classnames-2.2.0.js (content/shared/libs/classnames-2.2.0.js) + + # Shared sounds + content/browser/loop/shared/sounds/ringtone.ogg (content/shared/sounds/ringtone.ogg) + content/browser/loop/shared/sounds/connecting.ogg (content/shared/sounds/connecting.ogg) + content/browser/loop/shared/sounds/connected.ogg (content/shared/sounds/connected.ogg) + content/browser/loop/shared/sounds/terminated.ogg (content/shared/sounds/terminated.ogg) + content/browser/loop/shared/sounds/room-joined.ogg (content/shared/sounds/room-joined.ogg) + content/browser/loop/shared/sounds/room-joined-in.ogg (content/shared/sounds/room-joined-in.ogg) + content/browser/loop/shared/sounds/room-left.ogg (content/shared/sounds/room-left.ogg) + content/browser/loop/shared/sounds/failure.ogg (content/shared/sounds/failure.ogg) + content/browser/loop/shared/sounds/message.ogg (content/shared/sounds/message.ogg) + + # Partner SDK assets + content/browser/loop/libs/sdk.js (content/shared/libs/sdk.js) + content/browser/loop/sdk-content/js/dynamic_config.min.js (content/shared/libs/sdk-content/js/dynamic_config.min.js) diff --git a/browser/extensions/loop/manifest.ini b/browser/components/loop/manifest.ini similarity index 100% rename from browser/extensions/loop/manifest.ini rename to browser/components/loop/manifest.ini diff --git a/browser/components/loop/modules/.eslintrc b/browser/components/loop/modules/.eslintrc new file mode 100644 index 000000000000..de960d6e5eec --- /dev/null +++ b/browser/components/loop/modules/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "../.eslintrc-gecko" +} diff --git a/browser/extensions/loop/content/modules/LoopRooms.jsm b/browser/components/loop/modules/LoopRooms.jsm similarity index 99% rename from browser/extensions/loop/content/modules/LoopRooms.jsm rename to browser/components/loop/modules/LoopRooms.jsm index 7665ef5e9616..22b5541e270f 100644 --- a/browser/extensions/loop/content/modules/LoopRooms.jsm +++ b/browser/components/loop/modules/LoopRooms.jsm @@ -10,7 +10,7 @@ Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Task.jsm"); Cu.import("resource://gre/modules/Timer.jsm"); -const { MozLoopService, LOOP_SESSION_TYPE } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); +const { MozLoopService, LOOP_SESSION_TYPE } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); XPCOMUtils.defineLazyModuleGetter(this, "Promise", "resource://gre/modules/Promise.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "CommonUtils", @@ -27,11 +27,11 @@ XPCOMUtils.defineLazyGetter(this, "gLoopBundle", function() { }); XPCOMUtils.defineLazyModuleGetter(this, "LoopRoomsCache", - "chrome://loop/content/modules/LoopRoomsCache.jsm"); + "resource:///modules/loop/LoopRoomsCache.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "loopUtils", - "chrome://loop/content/modules/utils.js", "utils"); + "resource:///modules/loop/utils.js", "utils"); XPCOMUtils.defineLazyModuleGetter(this, "loopCrypto", - "chrome://loop/content/shared/js/crypto.js", "LoopCrypto"); + "resource:///modules/loop/crypto.js", "LoopCrypto"); XPCOMUtils.defineLazyModuleGetter(this, "ObjectUtils", "resource://gre/modules/ObjectUtils.jsm"); diff --git a/browser/extensions/loop/content/modules/LoopRoomsCache.jsm b/browser/components/loop/modules/LoopRoomsCache.jsm similarity index 98% rename from browser/extensions/loop/content/modules/LoopRoomsCache.jsm rename to browser/components/loop/modules/LoopRoomsCache.jsm index de123d2e3d6b..f1265a6611b6 100644 --- a/browser/extensions/loop/content/modules/LoopRoomsCache.jsm +++ b/browser/components/loop/modules/LoopRoomsCache.jsm @@ -9,7 +9,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Task.jsm"); const { MozLoopService, LOOP_SESSION_TYPE } = - Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); + Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); XPCOMUtils.defineLazyModuleGetter(this, "CommonUtils", "resource://services-common/utils.js"); XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm"); diff --git a/browser/extensions/loop/content/modules/MozLoopAPI.jsm b/browser/components/loop/modules/MozLoopAPI.jsm similarity index 99% rename from browser/extensions/loop/content/modules/MozLoopAPI.jsm rename to browser/components/loop/modules/MozLoopAPI.jsm index 49f4a30b2604..70638ee9fe3e 100644 --- a/browser/extensions/loop/content/modules/MozLoopAPI.jsm +++ b/browser/components/loop/modules/MozLoopAPI.jsm @@ -9,8 +9,8 @@ const { classes: Cc, interfaces: Ci, utils: Cu } = Components; Cu.import("resource://services-common/utils.js"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); -Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); +Cu.import("resource:///modules/loop/MozLoopService.jsm"); +Cu.import("resource:///modules/loop/LoopRooms.jsm"); Cu.importGlobalProperties(["Blob"]); XPCOMUtils.defineLazyModuleGetter(this, "PageMetadata", diff --git a/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm b/browser/components/loop/modules/MozLoopPushHandler.jsm similarity index 99% rename from browser/extensions/loop/content/modules/MozLoopPushHandler.jsm rename to browser/components/loop/modules/MozLoopPushHandler.jsm index cb10cea3f6ad..8be93ff80f7c 100644 --- a/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm +++ b/browser/components/loop/modules/MozLoopPushHandler.jsm @@ -10,7 +10,7 @@ Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Timer.jsm"); -const { MozLoopService } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); +const { MozLoopService } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); const consoleLog = MozLoopService.log; this.EXPORTED_SYMBOLS = ["MozLoopPushHandler"]; diff --git a/browser/extensions/loop/content/modules/MozLoopService.jsm b/browser/components/loop/modules/MozLoopService.jsm similarity index 99% rename from browser/extensions/loop/content/modules/MozLoopService.jsm rename to browser/components/loop/modules/MozLoopService.jsm index 43e3c5609370..15c8bae30773 100644 --- a/browser/extensions/loop/content/modules/MozLoopService.jsm +++ b/browser/components/loop/modules/MozLoopService.jsm @@ -121,14 +121,14 @@ XPCOMUtils.defineConstant(this, "ROOM_DELETE", ROOM_DELETE); XPCOMUtils.defineConstant(this, "ROOM_CONTEXT_ADD", ROOM_CONTEXT_ADD); XPCOMUtils.defineLazyModuleGetter(this, "LoopAPI", - "chrome://loop/content/modules/MozLoopAPI.jsm"); + "resource:///modules/loop/MozLoopAPI.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "convertToRTCStatsReport", "resource://gre/modules/media/RTCStatsReport.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "loopUtils", - "chrome://loop/content/modules/utils.js", "utils"); + "resource:///modules/loop/utils.js", "utils"); XPCOMUtils.defineLazyModuleGetter(this, "loopCrypto", - "chrome://loop/content/shared/js/crypto.js", "LoopCrypto"); + "resource:///modules/loop/crypto.js", "LoopCrypto"); XPCOMUtils.defineLazyModuleGetter(this, "Chat", "resource:///modules/Chat.jsm"); @@ -151,13 +151,13 @@ XPCOMUtils.defineLazyModuleGetter(this, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "LoopRooms", - "chrome://loop/content/modules/LoopRooms.jsm"); + "resource:///modules/loop/LoopRooms.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "roomsPushNotification", - "chrome://loop/content/modules/LoopRooms.jsm"); + "resource:///modules/loop/LoopRooms.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "MozLoopPushHandler", - "chrome://loop/content/modules/MozLoopPushHandler.jsm"); + "resource:///modules/loop/MozLoopPushHandler.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "UITour", "resource:///modules/UITour.jsm"); diff --git a/browser/extensions/loop/content/modules/MozLoopWorker.js b/browser/components/loop/modules/MozLoopWorker.js similarity index 100% rename from browser/extensions/loop/content/modules/MozLoopWorker.js rename to browser/components/loop/modules/MozLoopWorker.js diff --git a/browser/extensions/loop/moz.build b/browser/components/loop/moz.build similarity index 64% rename from browser/extensions/loop/moz.build rename to browser/components/loop/moz.build index f53a007a2cab..b76d562ec638 100644 --- a/browser/extensions/loop/moz.build +++ b/browser/components/loop/moz.build @@ -4,16 +4,6 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -FINAL_TARGET = 'dist/bin/browser/features/loop@mozilla.org' - -FINAL_TARGET_FILES += [ - 'bootstrap.js' -] - -DIST_FILES += [ - 'install.rdf.in' -] - JAR_MANIFESTS += ['jar.mn'] XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell/xpcshell.ini'] @@ -22,5 +12,16 @@ BROWSER_CHROME_MANIFESTS += [ 'test/mochitest/browser.ini', ] +EXTRA_JS_MODULES.loop += [ + 'content/shared/js/crypto.js', + 'content/shared/js/utils.js', + 'modules/LoopRooms.jsm', + 'modules/LoopRoomsCache.jsm', + 'modules/MozLoopAPI.jsm', + 'modules/MozLoopPushHandler.jsm', + 'modules/MozLoopService.jsm', + 'modules/MozLoopWorker.js', +] + with Files('**'): BUG_COMPONENT = ('Loop', 'Client') diff --git a/browser/extensions/loop/run-all-loop-tests.sh b/browser/components/loop/run-all-loop-tests.sh similarity index 94% rename from browser/extensions/loop/run-all-loop-tests.sh rename to browser/components/loop/run-all-loop-tests.sh index dee165708fc5..2628c0b1aed2 100755 --- a/browser/extensions/loop/run-all-loop-tests.sh +++ b/browser/components/loop/run-all-loop-tests.sh @@ -12,7 +12,7 @@ set -e # Main tests -LOOPDIR=browser/extensions/loop +LOOPDIR=browser/components/loop ESLINT=standalone/node_modules/.bin/eslint if [ -x "${LOOPDIR}/${ESLINT}" ]; then echo 'running eslint; see http://eslint.org/docs/rules/ for error info' @@ -25,7 +25,7 @@ fi # Build tests coverage. MISSINGDEPSMSG="\nMake sure all dependencies are up to date by running -'npm install' inside the 'browser/extensions/loop/test/' directory.\n" +'npm install' inside the 'browser/components/loop/test/' directory.\n" ( cd ${LOOPDIR}/test if ! npm run-script build-coverage ; then diff --git a/browser/extensions/loop/standalone/.gitignore b/browser/components/loop/standalone/.gitignore similarity index 100% rename from browser/extensions/loop/standalone/.gitignore rename to browser/components/loop/standalone/.gitignore diff --git a/browser/extensions/loop/standalone/Makefile b/browser/components/loop/standalone/Makefile similarity index 100% rename from browser/extensions/loop/standalone/Makefile rename to browser/components/loop/standalone/Makefile diff --git a/browser/extensions/loop/standalone/README.md b/browser/components/loop/standalone/README.md similarity index 100% rename from browser/extensions/loop/standalone/README.md rename to browser/components/loop/standalone/README.md diff --git a/browser/extensions/loop/standalone/content/css/webapp.css b/browser/components/loop/standalone/content/css/webapp.css similarity index 97% rename from browser/extensions/loop/standalone/content/css/webapp.css rename to browser/components/loop/standalone/content/css/webapp.css index 525608decf9b..bc46ed3d9e9d 100644 --- a/browser/extensions/loop/standalone/content/css/webapp.css +++ b/browser/components/loop/standalone/content/css/webapp.css @@ -87,7 +87,7 @@ html[dir="rtl"] .standalone-overlay-wrapper > .general-support-url { background-size: contain; width: 16px; height: 16px; - background: transparent url("../shared/img/glyph-help-16x16.svg") no-repeat; + background: transparent url("../shared/img/svg/glyph-help-16x16.svg") no-repeat; } .standalone-overlay-wrapper > .standalone-moz-logo { @@ -271,7 +271,7 @@ html[dir="rtl"] .standalone-overlay-wrapper > .standalone-moz-logo { } .room-inner-info-area > .room-waiting-area > a >.room-waiting-help { - background: transparent url("../shared/img/glyph-help-16x16.svg") no-repeat; + background: transparent url("../shared/img/svg/glyph-help-16x16.svg") no-repeat; display: inline-block; height: 16px; margin-left: 5px; diff --git a/browser/extensions/loop/standalone/content/favicon.ico b/browser/components/loop/standalone/content/favicon.ico similarity index 100% rename from browser/extensions/loop/standalone/content/favicon.ico rename to browser/components/loop/standalone/content/favicon.ico diff --git a/browser/extensions/loop/standalone/content/img/gum-chrome.svg b/browser/components/loop/standalone/content/img/gum-chrome.svg similarity index 100% rename from browser/extensions/loop/standalone/content/img/gum-chrome.svg rename to browser/components/loop/standalone/content/img/gum-chrome.svg diff --git a/browser/extensions/loop/standalone/content/img/gum-firefox.svg b/browser/components/loop/standalone/content/img/gum-firefox.svg similarity index 100% rename from browser/extensions/loop/standalone/content/img/gum-firefox.svg rename to browser/components/loop/standalone/content/img/gum-firefox.svg diff --git a/browser/extensions/loop/standalone/content/img/gum-opera.svg b/browser/components/loop/standalone/content/img/gum-opera.svg similarity index 100% rename from browser/extensions/loop/standalone/content/img/gum-opera.svg rename to browser/components/loop/standalone/content/img/gum-opera.svg diff --git a/browser/extensions/loop/standalone/content/img/gum-others.svg b/browser/components/loop/standalone/content/img/gum-others.svg similarity index 100% rename from browser/extensions/loop/standalone/content/img/gum-others.svg rename to browser/components/loop/standalone/content/img/gum-others.svg diff --git a/browser/extensions/loop/standalone/content/img/hello-logo-text.svg b/browser/components/loop/standalone/content/img/hello-logo-text.svg similarity index 100% rename from browser/extensions/loop/standalone/content/img/hello-logo-text.svg rename to browser/components/loop/standalone/content/img/hello-logo-text.svg diff --git a/browser/extensions/loop/standalone/content/img/logo.png b/browser/components/loop/standalone/content/img/logo.png similarity index 100% rename from browser/extensions/loop/standalone/content/img/logo.png rename to browser/components/loop/standalone/content/img/logo.png diff --git a/browser/extensions/loop/standalone/content/img/mozilla-logo.svg b/browser/components/loop/standalone/content/img/mozilla-logo.svg similarity index 100% rename from browser/extensions/loop/standalone/content/img/mozilla-logo.svg rename to browser/components/loop/standalone/content/img/mozilla-logo.svg diff --git a/browser/extensions/loop/standalone/content/index.html b/browser/components/loop/standalone/content/index.html similarity index 100% rename from browser/extensions/loop/standalone/content/index.html rename to browser/components/loop/standalone/content/index.html diff --git a/browser/extensions/loop/standalone/content/js/standaloneAppStore.js b/browser/components/loop/standalone/content/js/standaloneAppStore.js similarity index 100% rename from browser/extensions/loop/standalone/content/js/standaloneAppStore.js rename to browser/components/loop/standalone/content/js/standaloneAppStore.js diff --git a/browser/extensions/loop/standalone/content/js/standaloneMetricsStore.js b/browser/components/loop/standalone/content/js/standaloneMetricsStore.js similarity index 100% rename from browser/extensions/loop/standalone/content/js/standaloneMetricsStore.js rename to browser/components/loop/standalone/content/js/standaloneMetricsStore.js diff --git a/browser/extensions/loop/standalone/content/js/standaloneMozLoop.js b/browser/components/loop/standalone/content/js/standaloneMozLoop.js similarity index 100% rename from browser/extensions/loop/standalone/content/js/standaloneMozLoop.js rename to browser/components/loop/standalone/content/js/standaloneMozLoop.js diff --git a/browser/extensions/loop/standalone/content/js/standaloneRoomViews.js b/browser/components/loop/standalone/content/js/standaloneRoomViews.js similarity index 100% rename from browser/extensions/loop/standalone/content/js/standaloneRoomViews.js rename to browser/components/loop/standalone/content/js/standaloneRoomViews.js diff --git a/browser/extensions/loop/standalone/content/js/standaloneRoomViews.jsx b/browser/components/loop/standalone/content/js/standaloneRoomViews.jsx similarity index 100% rename from browser/extensions/loop/standalone/content/js/standaloneRoomViews.jsx rename to browser/components/loop/standalone/content/js/standaloneRoomViews.jsx diff --git a/browser/extensions/loop/standalone/content/js/webapp.js b/browser/components/loop/standalone/content/js/webapp.js similarity index 100% rename from browser/extensions/loop/standalone/content/js/webapp.js rename to browser/components/loop/standalone/content/js/webapp.js diff --git a/browser/extensions/loop/standalone/content/js/webapp.jsx b/browser/components/loop/standalone/content/js/webapp.jsx similarity index 100% rename from browser/extensions/loop/standalone/content/js/webapp.jsx rename to browser/components/loop/standalone/content/js/webapp.jsx diff --git a/browser/extensions/loop/standalone/content/l10n/en-US/loop.properties b/browser/components/loop/standalone/content/l10n/en-US/loop.properties similarity index 100% rename from browser/extensions/loop/standalone/content/l10n/en-US/loop.properties rename to browser/components/loop/standalone/content/l10n/en-US/loop.properties diff --git a/browser/extensions/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js b/browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js similarity index 100% rename from browser/extensions/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js rename to browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js diff --git a/browser/extensions/loop/standalone/content/libs/l10n-gaia-upstream.txt b/browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt similarity index 100% rename from browser/extensions/loop/standalone/content/libs/l10n-gaia-upstream.txt rename to browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt diff --git a/browser/extensions/loop/standalone/content/robots.txt b/browser/components/loop/standalone/content/robots.txt similarity index 100% rename from browser/extensions/loop/standalone/content/robots.txt rename to browser/components/loop/standalone/content/robots.txt diff --git a/browser/extensions/loop/standalone/content/webappEntryPoint.js b/browser/components/loop/standalone/content/webappEntryPoint.js similarity index 93% rename from browser/extensions/loop/standalone/content/webappEntryPoint.js rename to browser/components/loop/standalone/content/webappEntryPoint.js index 526e3708fe6f..73f7eeec03ce 100644 --- a/browser/extensions/loop/standalone/content/webappEntryPoint.js +++ b/browser/components/loop/standalone/content/webappEntryPoint.js @@ -17,20 +17,20 @@ // The OpenTok SDK tries to do some heuristic detection of require and // assumes a node environment if it's present, which confuses webpack, so // we turn that off by forcing require to false in that context. -require("imports?require=>false!shared/vendor/sdk.js"); +require("imports?require=>false!shared/libs/sdk.js"); // Ultimately, we'll likely want to pull the vendor libraries from npm, as that // makes upgrading easier, and it's generally better practice to minify the // "source" versions of libraries rather than built artifacts. We probably do // want to minify them ourselves since this allows for better dead-code // elimination, but that can be a bit of judgement call. -require("exports?_!shared/vendor/lodash-3.9.3.js"); +require("exports?_!shared/libs/lodash-3.9.3.js"); // Disable Backbone's AMD auto-detection, as described at: // // https://github.com/jashkenas/backbone/wiki/Using-Backbone-without-jQuery // -require("expose?Backbone!imports?define=>false!shared/vendor/backbone-1.2.1.js"); +require("expose?Backbone!imports?define=>false!shared/libs/backbone-1.2.1.js"); /* global: __PROD__ */ if (typeof __PROD__ !== "undefined") { @@ -41,8 +41,8 @@ if (typeof __PROD__ !== "undefined") { require("expose?classNames!classnames"); } else { // our development server setup doesn't yet handle real modules, so for now... - require("shared/vendor/react-0.13.3.js"); - require("shared/vendor/classnames-2.2.0.js"); + require("shared/libs/react-0.13.3.js"); + require("shared/libs/classnames-2.2.0.js"); } diff --git a/browser/extensions/loop/standalone/package.json b/browser/components/loop/standalone/package.json similarity index 100% rename from browser/extensions/loop/standalone/package.json rename to browser/components/loop/standalone/package.json diff --git a/browser/extensions/loop/standalone/server.js b/browser/components/loop/standalone/server.js similarity index 95% rename from browser/extensions/loop/standalone/server.js rename to browser/components/loop/standalone/server.js index 3c6cb09f4b40..5c178c34ea7f 100644 --- a/browser/extensions/loop/standalone/server.js +++ b/browser/components/loop/standalone/server.js @@ -90,10 +90,6 @@ app.use("/content/c", express.static(path.join(__dirname, "..", "content"))); // Two lines for the same reason as /content above. app.use("/test", express.static(path.join(__dirname, "test"))); app.use("/test", express.static(path.join(__dirname, "..", "test"))); -// Hacks for desktop to stop errors being raised in the tests for content loading. -app.use("/test/shared/shared", express.static(path.join(__dirname, "..", "content/shared"))); -app.use("/test/desktop-local/shared", express.static(path.join(__dirname, "..", "content/shared"))); - // As we don't have hashes on the urls, the best way to serve the index files // appears to be to be to closely filter the url and match appropriately. diff --git a/browser/extensions/loop/standalone/webpack.config.js b/browser/components/loop/standalone/webpack.config.js similarity index 100% rename from browser/extensions/loop/standalone/webpack.config.js rename to browser/components/loop/standalone/webpack.config.js diff --git a/browser/extensions/loop/test/.eslintrc b/browser/components/loop/test/.eslintrc similarity index 100% rename from browser/extensions/loop/test/.eslintrc rename to browser/components/loop/test/.eslintrc diff --git a/browser/extensions/loop/test/coverage/index.html b/browser/components/loop/test/coverage/index.html similarity index 100% rename from browser/extensions/loop/test/coverage/index.html rename to browser/components/loop/test/coverage/index.html diff --git a/browser/extensions/loop/test/desktop-local/.eslintrc b/browser/components/loop/test/desktop-local/.eslintrc similarity index 100% rename from browser/extensions/loop/test/desktop-local/.eslintrc rename to browser/components/loop/test/desktop-local/.eslintrc diff --git a/browser/extensions/loop/test/desktop-local/README.md b/browser/components/loop/test/desktop-local/README.md similarity index 89% rename from browser/extensions/loop/test/desktop-local/README.md rename to browser/components/loop/test/desktop-local/README.md index 43dc73c5c315..5f459e32fc4a 100644 --- a/browser/extensions/loop/test/desktop-local/README.md +++ b/browser/components/loop/test/desktop-local/README.md @@ -11,7 +11,7 @@ a file: or HTTP URL to run the tests. Alternately, from the top-level of your Gecko source directory, execute: ``` -./mach marionette-test browser/extensions/loop/test/manifest.ini +./mach marionette-test browser/components/loop/test/manifest.ini ``` Next steps: diff --git a/browser/extensions/loop/test/desktop-local/conversationAppStore_test.js b/browser/components/loop/test/desktop-local/conversationAppStore_test.js similarity index 100% rename from browser/extensions/loop/test/desktop-local/conversationAppStore_test.js rename to browser/components/loop/test/desktop-local/conversationAppStore_test.js diff --git a/browser/extensions/loop/test/desktop-local/conversation_test.js b/browser/components/loop/test/desktop-local/conversation_test.js similarity index 100% rename from browser/extensions/loop/test/desktop-local/conversation_test.js rename to browser/components/loop/test/desktop-local/conversation_test.js diff --git a/browser/extensions/loop/test/desktop-local/feedbackViews_test.js b/browser/components/loop/test/desktop-local/feedbackViews_test.js similarity index 100% rename from browser/extensions/loop/test/desktop-local/feedbackViews_test.js rename to browser/components/loop/test/desktop-local/feedbackViews_test.js diff --git a/browser/extensions/loop/test/desktop-local/index.html b/browser/components/loop/test/desktop-local/index.html similarity index 77% rename from browser/extensions/loop/test/desktop-local/index.html rename to browser/components/loop/test/desktop-local/index.html index f434148925e3..d5108f264576 100644 --- a/browser/extensions/loop/test/desktop-local/index.html +++ b/browser/components/loop/test/desktop-local/index.html @@ -14,17 +14,17 @@
- + - - - - + + + + @@ -50,12 +50,12 @@ - - - - - - + + + + + + diff --git a/browser/extensions/loop/test/desktop-local/l10n_test.js b/browser/components/loop/test/desktop-local/l10n_test.js similarity index 100% rename from browser/extensions/loop/test/desktop-local/l10n_test.js rename to browser/components/loop/test/desktop-local/l10n_test.js diff --git a/browser/extensions/loop/test/desktop-local/panel_test.js b/browser/components/loop/test/desktop-local/panel_test.js similarity index 100% rename from browser/extensions/loop/test/desktop-local/panel_test.js rename to browser/components/loop/test/desktop-local/panel_test.js diff --git a/browser/extensions/loop/test/desktop-local/roomStore_test.js b/browser/components/loop/test/desktop-local/roomStore_test.js similarity index 100% rename from browser/extensions/loop/test/desktop-local/roomStore_test.js rename to browser/components/loop/test/desktop-local/roomStore_test.js diff --git a/browser/extensions/loop/test/desktop-local/roomViews_test.js b/browser/components/loop/test/desktop-local/roomViews_test.js similarity index 100% rename from browser/extensions/loop/test/desktop-local/roomViews_test.js rename to browser/components/loop/test/desktop-local/roomViews_test.js diff --git a/browser/extensions/loop/test/desktop-local/test_desktop_all.py b/browser/components/loop/test/desktop-local/test_desktop_all.py similarity index 100% rename from browser/extensions/loop/test/desktop-local/test_desktop_all.py rename to browser/components/loop/test/desktop-local/test_desktop_all.py diff --git a/browser/extensions/loop/test/functional/config.py b/browser/components/loop/test/functional/config.py similarity index 100% rename from browser/extensions/loop/test/functional/config.py rename to browser/components/loop/test/functional/config.py diff --git a/browser/extensions/loop/test/functional/hanging_threads.py b/browser/components/loop/test/functional/hanging_threads.py similarity index 100% rename from browser/extensions/loop/test/functional/hanging_threads.py rename to browser/components/loop/test/functional/hanging_threads.py diff --git a/browser/extensions/loop/test/functional/manifest.ini b/browser/components/loop/test/functional/manifest.ini similarity index 100% rename from browser/extensions/loop/test/functional/manifest.ini rename to browser/components/loop/test/functional/manifest.ini diff --git a/browser/extensions/loop/test/functional/serversetup.py b/browser/components/loop/test/functional/serversetup.py similarity index 100% rename from browser/extensions/loop/test/functional/serversetup.py rename to browser/components/loop/test/functional/serversetup.py diff --git a/browser/extensions/loop/test/functional/test_1_browser_call.py b/browser/components/loop/test/functional/test_1_browser_call.py similarity index 100% rename from browser/extensions/loop/test/functional/test_1_browser_call.py rename to browser/components/loop/test/functional/test_1_browser_call.py diff --git a/browser/extensions/loop/test/index.html b/browser/components/loop/test/index.html similarity index 100% rename from browser/extensions/loop/test/index.html rename to browser/components/loop/test/index.html diff --git a/browser/extensions/loop/test/karma/head.js b/browser/components/loop/test/karma/head.js similarity index 100% rename from browser/extensions/loop/test/karma/head.js rename to browser/components/loop/test/karma/head.js diff --git a/browser/extensions/loop/test/karma/karma.conf.base.js b/browser/components/loop/test/karma/karma.conf.base.js similarity index 100% rename from browser/extensions/loop/test/karma/karma.conf.base.js rename to browser/components/loop/test/karma/karma.conf.base.js diff --git a/browser/extensions/loop/test/karma/karma.coverage.desktop.js b/browser/components/loop/test/karma/karma.coverage.desktop.js similarity index 75% rename from browser/extensions/loop/test/karma/karma.coverage.desktop.js rename to browser/components/loop/test/karma/karma.coverage.desktop.js index 67f43865cf92..6863e06041e7 100644 --- a/browser/extensions/loop/test/karma/karma.coverage.desktop.js +++ b/browser/components/loop/test/karma/karma.coverage.desktop.js @@ -10,11 +10,11 @@ module.exports = function(config) { // List of files / patterns to load in the browser. baseConfig.files = baseConfig.files.concat([ - "content/panels/vendor/l10n.js", - "content/shared/vendor/react-0.13.3.js", - "content/shared/vendor/classnames-2.2.0.js", - "content/shared/vendor/lodash-3.9.3.js", - "content/shared/vendor/backbone-1.2.1.js", + "content/libs/l10n.js", + "content/shared/libs/react-0.13.3.js", + "content/shared/libs/classnames-2.2.0.js", + "content/shared/libs/lodash-3.9.3.js", + "content/shared/libs/backbone-1.2.1.js", "test/shared/vendor/*.js", "test/shared/loop_mocha_utils.js", "test/karma/head.js", // Stub out DOM event listener due to races. @@ -31,11 +31,11 @@ module.exports = function(config) { "content/shared/js/views.js", "content/shared/js/textChatStore.js", "content/shared/js/textChatView.js", - "content/panels/js/feedbackViews.js", - "content/panels/js/conversationAppStore.js", - "content/panels/js/roomStore.js", - "content/panels/js/roomViews.js", - "content/panels/js/conversation.js", + "content/js/feedbackViews.js", + "content/js/conversationAppStore.js", + "content/js/roomStore.js", + "content/js/roomViews.js", + "content/js/conversation.js", "test/desktop-local/*.js" ]); @@ -47,7 +47,7 @@ module.exports = function(config) { // Preprocess matching files before serving them to the browser. // Available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor . baseConfig.preprocessors = { - "content/panels/js/*.js": ["coverage"] + "content/js/*.js": ["coverage"] }; baseConfig.coverageReporter.dir = "test/coverage/desktop"; diff --git a/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js b/browser/components/loop/test/karma/karma.coverage.shared_standalone.js similarity index 89% rename from browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js rename to browser/components/loop/test/karma/karma.coverage.shared_standalone.js index 299c44f2185d..7bd346cbf178 100644 --- a/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js +++ b/browser/components/loop/test/karma/karma.coverage.shared_standalone.js @@ -11,11 +11,11 @@ module.exports = function(config) { // List of files / patterns to load in the browser. baseConfig.files = baseConfig.files.concat([ "standalone/content/libs/l10n-gaia-02ca67948fe8.js", - "content/shared/vendor/lodash-3.9.3.js", - "content/shared/vendor/backbone-1.2.1.js", - "content/shared/vendor/react-0.13.3.js", - "content/shared/vendor/classnames-2.2.0.js", - "content/shared/vendor/sdk.js", + "content/shared/libs/lodash-3.9.3.js", + "content/shared/libs/backbone-1.2.1.js", + "content/shared/libs/react-0.13.3.js", + "content/shared/libs/classnames-2.2.0.js", + "content/shared/libs/sdk.js", "test/shared/vendor/*.js", "test/shared/loop_mocha_utils.js", "test/karma/head.js", // Add test fixture container diff --git a/browser/extensions/loop/test/mochitest/.eslintrc b/browser/components/loop/test/mochitest/.eslintrc similarity index 100% rename from browser/extensions/loop/test/mochitest/.eslintrc rename to browser/components/loop/test/mochitest/.eslintrc diff --git a/browser/extensions/loop/test/mochitest/browser.ini b/browser/components/loop/test/mochitest/browser.ini similarity index 100% rename from browser/extensions/loop/test/mochitest/browser.ini rename to browser/components/loop/test/mochitest/browser.ini diff --git a/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js b/browser/components/loop/test/mochitest/browser_LoopRooms_channel.js similarity index 98% rename from browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js rename to browser/components/loop/test/mochitest/browser_LoopRooms_channel.js index 0ef65728b599..ae693218ebc9 100644 --- a/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js +++ b/browser/components/loop/test/mochitest/browser_LoopRooms_channel.js @@ -12,7 +12,7 @@ var { WebChannel } = Cu.import("resource://gre/modules/WebChannel.jsm", {}); var { Chat } = Cu.import("resource:///modules/Chat.jsm", {}); const TEST_URI = - "example.com/browser/browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html"; + "example.com/browser/browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html"; const TEST_URI_GOOD = Services.io.newURI("https://" + TEST_URI, null, null); const TEST_URI_BAD = Services.io.newURI("http://" + TEST_URI, null, null); diff --git a/browser/extensions/loop/test/mochitest/browser_fxa_login.js b/browser/components/loop/test/mochitest/browser_fxa_login.js similarity index 99% rename from browser/extensions/loop/test/mochitest/browser_fxa_login.js rename to browser/components/loop/test/mochitest/browser_fxa_login.js index 0d5e359aff27..9036c06ad98d 100644 --- a/browser/extensions/loop/test/mochitest/browser_fxa_login.js +++ b/browser/components/loop/test/mochitest/browser_fxa_login.js @@ -8,7 +8,7 @@ "use strict"; const BASE_URL = Services.prefs.getCharPref("loop.server"); -const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); function* checkFxA401() { let err = MozLoopService.errors.get("login"); diff --git a/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js b/browser/components/loop/test/mochitest/browser_loop_fxa_server.js similarity index 97% rename from browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js rename to browser/components/loop/test/mochitest/browser_loop_fxa_server.js index 62c30531b6ad..ae7f6eeaee1e 100644 --- a/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js +++ b/browser/components/loop/test/mochitest/browser_loop_fxa_server.js @@ -7,7 +7,7 @@ "use strict"; -const BASE_URL = "http://mochi.test:8888/browser/browser/extensions/loop/test/mochitest/loop_fxa.sjs?"; +const BASE_URL = "http://mochi.test:8888/browser/browser/components/loop/test/mochitest/loop_fxa.sjs?"; registerCleanupFunction(function* () { yield promiseDeletedOAuthParams(BASE_URL); diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js b/browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js similarity index 92% rename from browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js rename to browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js index 6c96ebef236b..5528f9036dd5 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js +++ b/browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); add_task(function* test_mozLoop_appVersionInfo() { diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_chat.js b/browser/components/loop/test/mochitest/browser_mozLoop_chat.js similarity index 100% rename from browser/extensions/loop/test/mochitest/browser_mozLoop_chat.js rename to browser/components/loop/test/mochitest/browser_mozLoop_chat.js diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js b/browser/components/loop/test/mochitest/browser_mozLoop_context.js similarity index 96% rename from browser/extensions/loop/test/mochitest/browser_mozLoop_context.js rename to browser/components/loop/test/mochitest/browser_mozLoop_context.js index 424de044dbf8..e5b3bd9563b3 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js +++ b/browser/components/loop/test/mochitest/browser_mozLoop_context.js @@ -7,7 +7,7 @@ */ "use strict"; -const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); function promiseGetMetadata() { diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js b/browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js similarity index 98% rename from browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js rename to browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js index 78aa1428199b..04dc02256089 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js +++ b/browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js @@ -6,7 +6,7 @@ */ "use strict"; -const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); var handlers = [ diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js b/browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js similarity index 98% rename from browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js rename to browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js index 21c416962d20..0347ed9d936c 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js +++ b/browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js @@ -4,7 +4,7 @@ Cu.import("resource://gre/modules/Promise.jsm"); const { SocialService } = Cu.import("resource://gre/modules/SocialService.jsm", {}); -const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js b/browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js similarity index 98% rename from browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js rename to browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js index 7a2b42190613..8746c2ca579a 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js +++ b/browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js @@ -7,7 +7,7 @@ "use strict"; -const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); var gConstants; gHandlers.GetAllConstants({}, constants => gConstants = constants); diff --git a/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js b/browser/components/loop/test/mochitest/browser_toolbarbutton.js similarity index 99% rename from browser/extensions/loop/test/mochitest/browser_toolbarbutton.js rename to browser/components/loop/test/mochitest/browser_toolbarbutton.js index 707212e5a99c..4023ce9db724 100644 --- a/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js +++ b/browser/components/loop/test/mochitest/browser_toolbarbutton.js @@ -8,7 +8,7 @@ "use strict"; Components.utils.import("resource://gre/modules/Promise.jsm", this); -const { LoopRoomsInternal } = Components.utils.import("chrome://loop/content/modules/LoopRooms.jsm", {}); +const { LoopRoomsInternal } = Components.utils.import("resource:///modules/loop/LoopRooms.jsm", {}); Services.prefs.setBoolPref("loop.gettingStarted.seen", true); const fxASampleToken = { diff --git a/browser/extensions/loop/test/mochitest/head.js b/browser/components/loop/test/mochitest/head.js similarity index 96% rename from browser/extensions/loop/test/mochitest/head.js rename to browser/components/loop/test/mochitest/head.js index ba0315b1b919..5f6baa274fe1 100644 --- a/browser/extensions/loop/test/mochitest/head.js +++ b/browser/components/loop/test/mochitest/head.js @@ -8,8 +8,8 @@ const { LOOP_SESSION_TYPE, MozLoopServiceInternal, MozLoopService -} = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); -const { LoopRooms } = Cu.import("chrome://loop/content/modules/LoopRooms.jsm", {}); +} = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); +const { LoopRooms } = Cu.import("resource:///modules/loop/LoopRooms.jsm", {}); // Cache this value only once, at the beginning of a // test run, so that it doesn't pick up the offline=true @@ -133,7 +133,7 @@ function promiseOAuthParamsSetup(baseURL, params) { } function* resetFxA() { - let global = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); + let global = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); global.gHawkClient = null; global.gFxAOAuthClientPromise = null; global.gFxAOAuthClient = null; @@ -152,7 +152,7 @@ function checkFxAOAuthTokenData(aValue) { } function checkLoggedOutState() { - let global = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); + let global = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); is(global.gFxAOAuthClientPromise, null, "gFxAOAuthClientPromise should be cleared"); is(MozLoopService.userProfile, null, "fxAOAuthProfile should be cleared"); is(global.gFxAOAuthClient, null, "gFxAOAuthClient should be cleared"); diff --git a/browser/extensions/loop/test/mochitest/loop_fxa.sjs b/browser/components/loop/test/mochitest/loop_fxa.sjs similarity index 100% rename from browser/extensions/loop/test/mochitest/loop_fxa.sjs rename to browser/components/loop/test/mochitest/loop_fxa.sjs diff --git a/browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html b/browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html similarity index 100% rename from browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html rename to browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html diff --git a/browser/extensions/loop/test/package.json b/browser/components/loop/test/package.json similarity index 100% rename from browser/extensions/loop/test/package.json rename to browser/components/loop/test/package.json diff --git a/browser/extensions/loop/test/shared/activeRoomStore_test.js b/browser/components/loop/test/shared/activeRoomStore_test.js similarity index 100% rename from browser/extensions/loop/test/shared/activeRoomStore_test.js rename to browser/components/loop/test/shared/activeRoomStore_test.js diff --git a/browser/extensions/loop/test/shared/crypto_test.js b/browser/components/loop/test/shared/crypto_test.js similarity index 100% rename from browser/extensions/loop/test/shared/crypto_test.js rename to browser/components/loop/test/shared/crypto_test.js diff --git a/browser/extensions/loop/test/shared/dispatcher_test.js b/browser/components/loop/test/shared/dispatcher_test.js similarity index 100% rename from browser/extensions/loop/test/shared/dispatcher_test.js rename to browser/components/loop/test/shared/dispatcher_test.js diff --git a/browser/extensions/loop/test/shared/frontend_tester.py b/browser/components/loop/test/shared/frontend_tester.py similarity index 100% rename from browser/extensions/loop/test/shared/frontend_tester.py rename to browser/components/loop/test/shared/frontend_tester.py diff --git a/browser/extensions/loop/test/shared/index.html b/browser/components/loop/test/shared/index.html similarity index 91% rename from browser/extensions/loop/test/shared/index.html rename to browser/components/loop/test/shared/index.html index 95f94ad1b1f8..6489871738e5 100644 --- a/browser/extensions/loop/test/shared/index.html +++ b/browser/components/loop/test/shared/index.html @@ -14,16 +14,16 @@
- + - - - + + + diff --git a/browser/extensions/loop/test/shared/linkifiedTextView_test.js b/browser/components/loop/test/shared/linkifiedTextView_test.js similarity index 100% rename from browser/extensions/loop/test/shared/linkifiedTextView_test.js rename to browser/components/loop/test/shared/linkifiedTextView_test.js diff --git a/browser/extensions/loop/test/shared/loop_mocha_utils.js b/browser/components/loop/test/shared/loop_mocha_utils.js similarity index 100% rename from browser/extensions/loop/test/shared/loop_mocha_utils.js rename to browser/components/loop/test/shared/loop_mocha_utils.js diff --git a/browser/extensions/loop/test/shared/loopapi-client_test.js b/browser/components/loop/test/shared/loopapi-client_test.js similarity index 100% rename from browser/extensions/loop/test/shared/loopapi-client_test.js rename to browser/components/loop/test/shared/loopapi-client_test.js diff --git a/browser/extensions/loop/test/shared/mixins_test.js b/browser/components/loop/test/shared/mixins_test.js similarity index 100% rename from browser/extensions/loop/test/shared/mixins_test.js rename to browser/components/loop/test/shared/mixins_test.js diff --git a/browser/extensions/loop/test/shared/models_test.js b/browser/components/loop/test/shared/models_test.js similarity index 100% rename from browser/extensions/loop/test/shared/models_test.js rename to browser/components/loop/test/shared/models_test.js diff --git a/browser/extensions/loop/test/shared/otSdkDriver_test.js b/browser/components/loop/test/shared/otSdkDriver_test.js similarity index 100% rename from browser/extensions/loop/test/shared/otSdkDriver_test.js rename to browser/components/loop/test/shared/otSdkDriver_test.js diff --git a/browser/extensions/loop/test/shared/sdk_mock.js b/browser/components/loop/test/shared/sdk_mock.js similarity index 100% rename from browser/extensions/loop/test/shared/sdk_mock.js rename to browser/components/loop/test/shared/sdk_mock.js diff --git a/browser/extensions/loop/test/shared/store_test.js b/browser/components/loop/test/shared/store_test.js similarity index 100% rename from browser/extensions/loop/test/shared/store_test.js rename to browser/components/loop/test/shared/store_test.js diff --git a/browser/extensions/loop/test/shared/test_shared_all.py b/browser/components/loop/test/shared/test_shared_all.py similarity index 100% rename from browser/extensions/loop/test/shared/test_shared_all.py rename to browser/components/loop/test/shared/test_shared_all.py diff --git a/browser/extensions/loop/test/shared/textChatStore_test.js b/browser/components/loop/test/shared/textChatStore_test.js similarity index 100% rename from browser/extensions/loop/test/shared/textChatStore_test.js rename to browser/components/loop/test/shared/textChatStore_test.js diff --git a/browser/extensions/loop/test/shared/textChatView_test.js b/browser/components/loop/test/shared/textChatView_test.js similarity index 100% rename from browser/extensions/loop/test/shared/textChatView_test.js rename to browser/components/loop/test/shared/textChatView_test.js diff --git a/browser/extensions/loop/test/shared/utils_test.js b/browser/components/loop/test/shared/utils_test.js similarity index 100% rename from browser/extensions/loop/test/shared/utils_test.js rename to browser/components/loop/test/shared/utils_test.js diff --git a/browser/extensions/loop/test/shared/validate_test.js b/browser/components/loop/test/shared/validate_test.js similarity index 100% rename from browser/extensions/loop/test/shared/validate_test.js rename to browser/components/loop/test/shared/validate_test.js diff --git a/browser/extensions/loop/test/shared/vendor/chai-3.0.0.js b/browser/components/loop/test/shared/vendor/chai-3.0.0.js similarity index 100% rename from browser/extensions/loop/test/shared/vendor/chai-3.0.0.js rename to browser/components/loop/test/shared/vendor/chai-3.0.0.js diff --git a/browser/extensions/loop/test/shared/vendor/chai-as-promised-5.1.0.js b/browser/components/loop/test/shared/vendor/chai-as-promised-5.1.0.js similarity index 100% rename from browser/extensions/loop/test/shared/vendor/chai-as-promised-5.1.0.js rename to browser/components/loop/test/shared/vendor/chai-as-promised-5.1.0.js diff --git a/browser/extensions/loop/test/shared/vendor/mocha-2.2.5.css b/browser/components/loop/test/shared/vendor/mocha-2.2.5.css similarity index 100% rename from browser/extensions/loop/test/shared/vendor/mocha-2.2.5.css rename to browser/components/loop/test/shared/vendor/mocha-2.2.5.css diff --git a/browser/extensions/loop/test/shared/vendor/mocha-2.2.5.js b/browser/components/loop/test/shared/vendor/mocha-2.2.5.js similarity index 100% rename from browser/extensions/loop/test/shared/vendor/mocha-2.2.5.js rename to browser/components/loop/test/shared/vendor/mocha-2.2.5.js diff --git a/browser/extensions/loop/test/shared/vendor/sinon-1.16.1.js b/browser/components/loop/test/shared/vendor/sinon-1.16.1.js similarity index 100% rename from browser/extensions/loop/test/shared/vendor/sinon-1.16.1.js rename to browser/components/loop/test/shared/vendor/sinon-1.16.1.js diff --git a/browser/extensions/loop/test/shared/views_test.js b/browser/components/loop/test/shared/views_test.js similarity index 99% rename from browser/extensions/loop/test/shared/views_test.js rename to browser/components/loop/test/shared/views_test.js index b71ccbcb09b3..3cf0188aeba5 100644 --- a/browser/extensions/loop/test/shared/views_test.js +++ b/browser/components/loop/test/shared/views_test.js @@ -840,7 +840,7 @@ describe("loop.shared.views", function() { }); expect(view.getDOMNode().querySelector(".context-preview").getAttribute("src")) - .eql("shared/img/icons-16x16.svg#globe"); + .eql("loop/shared/img/icons-16x16.svg#globe"); }); it("should not display a title if by default", function() { diff --git a/browser/extensions/loop/test/standalone/index.html b/browser/components/loop/test/standalone/index.html similarity index 90% rename from browser/extensions/loop/test/standalone/index.html rename to browser/components/loop/test/standalone/index.html index a8ffd06fa7a1..5af0462cf562 100644 --- a/browser/extensions/loop/test/standalone/index.html +++ b/browser/components/loop/test/standalone/index.html @@ -14,16 +14,16 @@
- + - - - + + + diff --git a/browser/extensions/loop/test/standalone/standaloneAppStore_test.js b/browser/components/loop/test/standalone/standaloneAppStore_test.js similarity index 100% rename from browser/extensions/loop/test/standalone/standaloneAppStore_test.js rename to browser/components/loop/test/standalone/standaloneAppStore_test.js diff --git a/browser/extensions/loop/test/standalone/standaloneMetricsStore_test.js b/browser/components/loop/test/standalone/standaloneMetricsStore_test.js similarity index 100% rename from browser/extensions/loop/test/standalone/standaloneMetricsStore_test.js rename to browser/components/loop/test/standalone/standaloneMetricsStore_test.js diff --git a/browser/extensions/loop/test/standalone/standaloneMozLoop_test.js b/browser/components/loop/test/standalone/standaloneMozLoop_test.js similarity index 100% rename from browser/extensions/loop/test/standalone/standaloneMozLoop_test.js rename to browser/components/loop/test/standalone/standaloneMozLoop_test.js diff --git a/browser/extensions/loop/test/standalone/standaloneRoomViews_test.js b/browser/components/loop/test/standalone/standaloneRoomViews_test.js similarity index 100% rename from browser/extensions/loop/test/standalone/standaloneRoomViews_test.js rename to browser/components/loop/test/standalone/standaloneRoomViews_test.js diff --git a/browser/extensions/loop/test/standalone/test_standalone_all.py b/browser/components/loop/test/standalone/test_standalone_all.py similarity index 100% rename from browser/extensions/loop/test/standalone/test_standalone_all.py rename to browser/components/loop/test/standalone/test_standalone_all.py diff --git a/browser/extensions/loop/test/standalone/webapp_test.js b/browser/components/loop/test/standalone/webapp_test.js similarity index 100% rename from browser/extensions/loop/test/standalone/webapp_test.js rename to browser/components/loop/test/standalone/webapp_test.js diff --git a/browser/extensions/loop/test/ui-showcase/test_ui-showcase.py b/browser/components/loop/test/ui-showcase/test_ui-showcase.py similarity index 100% rename from browser/extensions/loop/test/ui-showcase/test_ui-showcase.py rename to browser/components/loop/test/ui-showcase/test_ui-showcase.py diff --git a/browser/extensions/loop/test/visual-regression/README.md b/browser/components/loop/test/visual-regression/README.md similarity index 100% rename from browser/extensions/loop/test/visual-regression/README.md rename to browser/components/loop/test/visual-regression/README.md diff --git a/browser/extensions/loop/test/visual-regression/screenshot b/browser/components/loop/test/visual-regression/screenshot similarity index 100% rename from browser/extensions/loop/test/visual-regression/screenshot rename to browser/components/loop/test/visual-regression/screenshot diff --git a/browser/extensions/loop/test/xpcshell/.eslintrc b/browser/components/loop/test/xpcshell/.eslintrc similarity index 91% rename from browser/extensions/loop/test/xpcshell/.eslintrc rename to browser/components/loop/test/xpcshell/.eslintrc index 7732b0d1ce76..e61193d5f6c3 100644 --- a/browser/extensions/loop/test/xpcshell/.eslintrc +++ b/browser/components/loop/test/xpcshell/.eslintrc @@ -17,7 +17,6 @@ "do_timeout": false, "run_next_test": false, // head.js items. - "FileUtils": false, "MockWebSocketChannel": false, "extend": true, "getLoopString": false, @@ -28,8 +27,7 @@ "mockPushHandler": true, "setupFakeFxAUserProfile": false, "setupFakeLoopServer": false, - "timerHandlers": false, - "updateAppInfo": false, + "timerHandlers", "waitForCondition": true, // Loop specific items "MozLoopServiceInternal": true, diff --git a/browser/extensions/loop/test/xpcshell/head.js b/browser/components/loop/test/xpcshell/head.js similarity index 79% rename from browser/extensions/loop/test/xpcshell/head.js rename to browser/components/loop/test/xpcshell/head.js index 31378fafdf36..820510ce0d51 100644 --- a/browser/extensions/loop/test/xpcshell/head.js +++ b/browser/components/loop/test/xpcshell/head.js @@ -10,54 +10,17 @@ do_get_profile(); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); - -// Setup the add-ons manager for this test. -Cu.import("resource://gre/modules/FileUtils.jsm"); - -function registerDirectory(key, dir) { - let dirProvider = { - getFile: function(prop, persistent) { - persistent.value = false; - if (prop == key) { - return dir.clone(); - } - return null; - }, - - QueryInterface: XPCOMUtils.generateQI([Ci.nsIDirectoryServiceProvider, - Ci.nsISupports]) - }; - Services.dirsvc.registerProvider(dirProvider); -} - -// As we're not running in application, we need to setup the features directory -// manually. -const distroDir = FileUtils.getDir("GreD", ["browser", "features"], true); -registerDirectory("XREAppFeat", distroDir); - -// Set up application info - xpcshell doesn't have this by default. -Cu.import("resource://testing-common/AppInfo.jsm"); -updateAppInfo(); - -// Now trigger the addons-startup, and hence startup the manager itself. This -// should load the manager correctly. -var gInternalManager = Cc["@mozilla.org/addons/integration;1"] - .getService(Ci.nsIObserver) - .QueryInterface(Ci.nsITimerCallback); - -gInternalManager.observe(null, "addons-startup", null); - Cu.import("resource://gre/modules/Http.jsm"); Cu.import("resource://testing-common/httpd.js"); -Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); +Cu.import("resource:///modules/loop/MozLoopService.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); -Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); +Cu.import("resource:///modules/loop/LoopRooms.jsm"); Cu.import("resource://gre/modules/osfile.jsm"); -const { MozLoopServiceInternal } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); -const { LoopRoomsInternal, timerHandlers } = Cu.import("chrome://loop/content/modules/LoopRooms.jsm", {}); +const { MozLoopServiceInternal } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); +const { LoopRoomsInternal, timerHandlers } = Cu.import("resource:///modules/loop/LoopRooms.jsm", {}); XPCOMUtils.defineLazyModuleGetter(this, "MozLoopPushHandler", - "chrome://loop/content/modules/MozLoopPushHandler.jsm"); + "resource:///modules/loop/MozLoopPushHandler.jsm"); const kMockWebSocketChannelName = "Mock WebSocket Channel"; const kWebSocketChannelContractID = "@mozilla.org/network/protocol;1?name=wss"; diff --git a/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js b/browser/components/loop/test/xpcshell/test_loopapi_doNotDisturb.js similarity index 89% rename from browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js rename to browser/components/loop/test/xpcshell/test_loopapi_doNotDisturb.js index 5a86540b1d3c..bb32bfb1034e 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js +++ b/browser/components/loop/test/xpcshell/test_loopapi_doNotDisturb.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); add_task(function* test_mozLoop_doNotDisturb() { diff --git a/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js b/browser/components/loop/test/xpcshell/test_loopapi_internal.js similarity index 96% rename from browser/extensions/loop/test/xpcshell/test_loopapi_internal.js rename to browser/components/loop/test/xpcshell/test_loopapi_internal.js index 17066b85c27d..313b06d82fa6 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js +++ b/browser/components/loop/test/xpcshell/test_loopapi_internal.js @@ -3,7 +3,7 @@ "use strict"; -const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); const [LoopAPIInternal] = LoopAPI.inspect(); add_test(function test_intialize() { diff --git a/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js b/browser/components/loop/test/xpcshell/test_loopapi_prefs.js similarity index 92% rename from browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js rename to browser/components/loop/test/xpcshell/test_loopapi_prefs.js index 1142acfbdb05..2d84a94a3df4 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js +++ b/browser/components/loop/test/xpcshell/test_loopapi_prefs.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); add_task(function* test_mozLoop_charPref() { diff --git a/browser/extensions/loop/test/xpcshell/test_looppush_initialize.js b/browser/components/loop/test/xpcshell/test_looppush_initialize.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_looppush_initialize.js rename to browser/components/loop/test/xpcshell/test_looppush_initialize.js diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms.js b/browser/components/loop/test/xpcshell/test_looprooms.js similarity index 99% rename from browser/extensions/loop/test/xpcshell/test_looprooms.js rename to browser/components/loop/test/xpcshell/test_looprooms.js index 6930b3cf07d2..2ead43579f2f 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms.js +++ b/browser/components/loop/test/xpcshell/test_looprooms.js @@ -5,7 +5,7 @@ "use strict"; Cu.import("resource://services-common/utils.js"); -Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); +Cu.import("resource:///modules/loop/LoopRooms.jsm"); Cu.import("resource:///modules/Chat.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js b/browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js similarity index 98% rename from browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js rename to browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js index 1d2eb38c0d4c..23ef34e64ee9 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js +++ b/browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js @@ -7,7 +7,7 @@ timerHandlers.startTimer = callback => callback(); Cu.import("resource://services-common/utils.js"); -const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("chrome://loop/content/modules/LoopRoomsCache.jsm", {}); +const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("resource:///modules/loop/LoopRoomsCache.jsm", {}); const kContextEnabledPref = "loop.contextInConverations.enabled"; diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js b/browser/components/loop/test/xpcshell/test_looprooms_first_notification.js similarity index 98% rename from browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js rename to browser/components/loop/test/xpcshell/test_looprooms_first_notification.js index d32321f26a1b..daaa6cd8f599 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js +++ b/browser/components/loop/test/xpcshell/test_looprooms_first_notification.js @@ -4,7 +4,7 @@ "use strict"; Cu.import("resource://services-common/utils.js"); -Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); +Cu.import("resource:///modules/loop/LoopRooms.jsm"); Cu.import("resource:///modules/Chat.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js b/browser/components/loop/test/xpcshell/test_looprooms_getall.js similarity index 98% rename from browser/extensions/loop/test/xpcshell/test_looprooms_getall.js rename to browser/components/loop/test/xpcshell/test_looprooms_getall.js index b4351e16a7eb..534ec287f1a4 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js +++ b/browser/components/loop/test/xpcshell/test_looprooms_getall.js @@ -4,6 +4,7 @@ "use strict"; Cu.import("resource://services-common/utils.js"); +Cu.import("resource:///modules/loop/LoopRooms.jsm"); Cu.import("resource:///modules/Chat.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js b/browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js similarity index 95% rename from browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js rename to browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js index acd73e23950e..36fdac465fb6 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js +++ b/browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js @@ -6,8 +6,8 @@ Cu.import("resource://services-common/utils.js"); -const loopCrypto = Cu.import("chrome://loop/content/shared/js/crypto.js", {}).LoopCrypto; -const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("chrome://loop/content/modules/LoopRoomsCache.jsm", {}); +const loopCrypto = Cu.import("resource:///modules/loop/crypto.js", {}).LoopCrypto; +const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("resource:///modules/loop/LoopRoomsCache.jsm", {}); var gTimerArgs = []; diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_dnd.js b/browser/components/loop/test/xpcshell/test_loopservice_dnd.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_dnd.js rename to browser/components/loop/test/xpcshell/test_loopservice_dnd.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_encryptionkey.js b/browser/components/loop/test/xpcshell/test_loopservice_encryptionkey.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_encryptionkey.js rename to browser/components/loop/test/xpcshell/test_loopservice_encryptionkey.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js b/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js similarity index 98% rename from browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js rename to browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js index 96d2f298c219..9cbe314ff0e9 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js @@ -10,7 +10,7 @@ "use strict"; -const { INVALID_AUTH_TOKEN } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); +const { INVALID_AUTH_TOKEN } = Cu.import("resource:///modules/loop/MozLoopService.jsm"); /** * An HTTP request for /NNN responds with a request with a status of NNN. diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_request.js b/browser/components/loop/test/xpcshell/test_loopservice_hawk_request.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_hawk_request.js rename to browser/components/loop/test/xpcshell/test_loopservice_hawk_request.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_initialize.js b/browser/components/loop/test/xpcshell/test_loopservice_initialize.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_initialize.js rename to browser/components/loop/test/xpcshell/test_loopservice_initialize.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_locales.js b/browser/components/loop/test/xpcshell/test_loopservice_locales.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_locales.js rename to browser/components/loop/test/xpcshell/test_loopservice_locales.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_loop_prefs.js b/browser/components/loop/test/xpcshell/test_loopservice_loop_prefs.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_loop_prefs.js rename to browser/components/loop/test/xpcshell/test_loopservice_loop_prefs.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_registration.js b/browser/components/loop/test/xpcshell/test_loopservice_registration.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_registration.js rename to browser/components/loop/test/xpcshell/test_loopservice_registration.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_registration_retry.js b/browser/components/loop/test/xpcshell/test_loopservice_registration_retry.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_registration_retry.js rename to browser/components/loop/test/xpcshell/test_loopservice_registration_retry.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_restart.js b/browser/components/loop/test/xpcshell/test_loopservice_restart.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_restart.js rename to browser/components/loop/test/xpcshell/test_loopservice_restart.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_token_invalid.js b/browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_token_invalid.js rename to browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_token_save.js b/browser/components/loop/test/xpcshell/test_loopservice_token_save.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_token_save.js rename to browser/components/loop/test/xpcshell/test_loopservice_token_save.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_token_send.js b/browser/components/loop/test/xpcshell/test_loopservice_token_send.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_token_send.js rename to browser/components/loop/test/xpcshell/test_loopservice_token_send.js diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_token_validation.js b/browser/components/loop/test/xpcshell/test_loopservice_token_validation.js similarity index 100% rename from browser/extensions/loop/test/xpcshell/test_loopservice_token_validation.js rename to browser/components/loop/test/xpcshell/test_loopservice_token_validation.js diff --git a/browser/extensions/loop/test/xpcshell/xpcshell.ini b/browser/components/loop/test/xpcshell/xpcshell.ini similarity index 100% rename from browser/extensions/loop/test/xpcshell/xpcshell.ini rename to browser/components/loop/test/xpcshell/xpcshell.ini diff --git a/browser/extensions/loop/ui/README.md b/browser/components/loop/ui/README.md similarity index 82% rename from browser/extensions/loop/ui/README.md rename to browser/components/loop/ui/README.md index f3912bc0090b..a0025bb5cff9 100644 --- a/browser/extensions/loop/ui/README.md +++ b/browser/components/loop/ui/README.md @@ -5,6 +5,6 @@ This app file showcases all Loop's view components. If you want to modify the app, launch the following command: - browser/extensions/loop/build-jsx --watch + browser/components/loop/build-jsx --watch And start editing the `ui-showcase.jsx` file. diff --git a/browser/extensions/loop/ui/fake-l10n.js b/browser/components/loop/ui/fake-l10n.js similarity index 100% rename from browser/extensions/loop/ui/fake-l10n.js rename to browser/components/loop/ui/fake-l10n.js diff --git a/browser/extensions/loop/ui/fake-mozLoop.js b/browser/components/loop/ui/fake-mozLoop.js similarity index 100% rename from browser/extensions/loop/ui/fake-mozLoop.js rename to browser/components/loop/ui/fake-mozLoop.js diff --git a/browser/extensions/loop/ui/index.html b/browser/components/loop/ui/index.html similarity index 78% rename from browser/extensions/loop/ui/index.html rename to browser/components/loop/ui/index.html index b0581de67d22..1ea6254e3277 100644 --- a/browser/extensions/loop/ui/index.html +++ b/browser/components/loop/ui/index.html @@ -10,7 +10,7 @@ + href="../content/css/panel.css"> @@ -25,10 +25,10 @@
- - - - + + + + @@ -43,16 +43,16 @@ - + - - + + - - + + diff --git a/browser/extensions/loop/ui/react-frame-component.js b/browser/components/loop/ui/react-frame-component.js similarity index 100% rename from browser/extensions/loop/ui/react-frame-component.js rename to browser/components/loop/ui/react-frame-component.js diff --git a/browser/extensions/loop/ui/sample-img/video-screen-local.png b/browser/components/loop/ui/sample-img/video-screen-local.png similarity index 100% rename from browser/extensions/loop/ui/sample-img/video-screen-local.png rename to browser/components/loop/ui/sample-img/video-screen-local.png diff --git a/browser/extensions/loop/ui/sample-img/video-screen-remote.png b/browser/components/loop/ui/sample-img/video-screen-remote.png similarity index 100% rename from browser/extensions/loop/ui/sample-img/video-screen-remote.png rename to browser/components/loop/ui/sample-img/video-screen-remote.png diff --git a/browser/extensions/loop/ui/sample-img/video-screen-terminal.png b/browser/components/loop/ui/sample-img/video-screen-terminal.png similarity index 100% rename from browser/extensions/loop/ui/sample-img/video-screen-terminal.png rename to browser/components/loop/ui/sample-img/video-screen-terminal.png diff --git a/browser/extensions/loop/ui/ui-showcase.css b/browser/components/loop/ui/ui-showcase.css similarity index 100% rename from browser/extensions/loop/ui/ui-showcase.css rename to browser/components/loop/ui/ui-showcase.css diff --git a/browser/extensions/loop/ui/ui-showcase.js b/browser/components/loop/ui/ui-showcase.js similarity index 100% rename from browser/extensions/loop/ui/ui-showcase.js rename to browser/components/loop/ui/ui-showcase.js diff --git a/browser/extensions/loop/ui/ui-showcase.jsx b/browser/components/loop/ui/ui-showcase.jsx similarity index 100% rename from browser/extensions/loop/ui/ui-showcase.jsx rename to browser/components/loop/ui/ui-showcase.jsx diff --git a/browser/components/moz.build b/browser/components/moz.build index 74461650a938..8e0d3cbd0c3f 100644 --- a/browser/components/moz.build +++ b/browser/components/moz.build @@ -11,6 +11,7 @@ DIRS += [ 'downloads', 'extensions', 'feeds', + 'loop', 'migration', 'newtab', 'places', diff --git a/browser/components/uitour/test/browser_UITour_loop.js b/browser/components/uitour/test/browser_UITour_loop.js index 97b4093a4e89..0f6a6ba38c11 100644 --- a/browser/components/uitour/test/browser_UITour_loop.js +++ b/browser/components/uitour/test/browser_UITour_loop.js @@ -9,8 +9,8 @@ var gContentWindow; var loopButton; var loopPanel = document.getElementById("loop-notification-panel"); -const { LoopRooms } = Components.utils.import("chrome://loop/content/modules/LoopRooms.jsm", {}); -const { MozLoopServiceInternal } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); +const { LoopRooms } = Components.utils.import("resource:///modules/loop/LoopRooms.jsm", {}); +const { MozLoopServiceInternal } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); function test() { UITourTest(); diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js deleted file mode 100644 index 85c28beb062a..000000000000 --- a/browser/extensions/loop/bootstrap.js +++ /dev/null @@ -1,849 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -"use strict"; - -const { interfaces: Ci, utils: Cu, classes: Cc } = Components; - -const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; -const kBrowserSharingNotificationId = "loop-sharing-notification"; -const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar"; - -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", - "resource://gre/modules/PrivateBrowsingUtils.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI", - "resource:///modules/CustomizableUI.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "Task", - "resource://gre/modules/Task.jsm"); - -/** - * This window listener gets loaded into each browser.xul window and is used - * to provide the required loop functions for the window. - */ -var WindowListener = { - /** - * Sets up the chrome integration within browser windows for Loop. - * - * @param {Object} window The window to inject the integration into. - */ - setupBrowserUI: function(window) { - let document = window.document; - let gBrowser = window.gBrowser; - let xhrClass = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]; - let FileReader = window.FileReader; - - // the "exported" symbols - var LoopUI = { - /** - * @var {XULWidgetSingleWrapper} toolbarButton Getter for the Loop toolbarbutton - * instance for this window. - */ - get toolbarButton() { - delete this.toolbarButton; - return (this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window)); - }, - - /** - * @var {XULElement} panel Getter for the Loop panel element. - */ - get panel() { - delete this.panel; - return (this.panel = document.getElementById("loop-notification-panel")); - }, - - /** - * @var {XULElement|null} browser Getter for the Loop panel browser element. - * Will be NULL if the panel hasn't loaded yet. - */ - get browser() { - let browser = document.querySelector("#loop-notification-panel > #loop-panel-iframe"); - if (browser) { - delete this.browser; - this.browser = browser; - } - return browser; - }, - - /** - * @var {String|null} selectedTab Getter for the name of the currently selected - * tab inside the Loop panel. Will be NULL if - * the panel hasn't loaded yet. - */ - get selectedTab() { - if (!this.browser) { - return null; - } - - let selectedTab = this.browser.contentDocument.querySelector(".tab-view > .selected"); - return selectedTab && selectedTab.getAttribute("data-tab-name"); - }, - - /** - * @return {Promise} - */ - promiseDocumentVisible(aDocument) { - if (!aDocument.hidden) { - return Promise.resolve(aDocument); - } - - return new Promise((resolve) => { - aDocument.addEventListener("visibilitychange", function onVisibilityChanged() { - aDocument.removeEventListener("visibilitychange", onVisibilityChanged); - resolve(aDocument); - }); - }); - }, - - /** - * Toggle between opening or hiding the Loop panel. - * - * @param {DOMEvent} [event] Optional event that triggered the call to this - * function. - * @param {String} [tabId] Optional name of the tab to select after the panel - * has opened. Does nothing when the panel is hidden. - * @return {Promise} - */ - togglePanel: function(event, tabId = null) { - if (!this.panel) { - // We're on the hidden window! What fun! - let obs = win => { - Services.obs.removeObserver(obs, "browser-delayed-startup-finished"); - win.LoopUI.togglePanel(event, tabId); - }; - Services.obs.addObserver(obs, "browser-delayed-startup-finished", false); - return window.OpenBrowserWindow(); - } - if (this.panel.state == "open") { - return new Promise(resolve => { - this.panel.hidePopup(); - resolve(); - }); - } - - return this.openCallPanel(event, tabId).then(doc => { - let fm = Services.focus; - fm.moveFocus(doc.defaultView, null, fm.MOVEFOCUS_FIRST, fm.FLAG_NOSCROLL); - }).catch(err => { - Cu.reportError(err); - }); - }, - - /** - * Opens the panel for Loop and sizes it appropriately. - * - * @param {event} event The event opening the panel, used to anchor - * the panel to the button which triggers it. - * @param {String} [tabId] Identifier of the tab to select when the panel is - * opened. Example: 'rooms', 'contacts', etc. - * @return {Promise} - */ - openCallPanel: function(event, tabId = null) { - return new Promise((resolve) => { - let callback = iframe => { - // Helper function to show a specific tab view in the panel. - function showTab() { - if (!tabId) { - resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); - return; - } - - let win = iframe.contentWindow; - let ev = new win.CustomEvent("UIAction", Cu.cloneInto({ - detail: { - action: "selectTab", - tab: tabId - } - }, win)); - win.dispatchEvent(ev); - resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); - } - - // If the panel has been opened and initialized before, we can skip waiting - // for the content to load - because it's already there. - if (("contentWindow" in iframe) && iframe.contentWindow.document.readyState == "complete") { - showTab(); - return; - } - - let documentDOMLoaded = () => { - iframe.removeEventListener("DOMContentLoaded", documentDOMLoaded, true); - // Handle window.close correctly on the panel. - this.hookWindowCloseForPanelClose(iframe.contentWindow); - iframe.contentWindow.addEventListener("loopPanelInitialized", function loopPanelInitialized() { - iframe.contentWindow.removeEventListener("loopPanelInitialized", - loopPanelInitialized); - showTab(); - }); - }; - iframe.addEventListener("DOMContentLoaded", documentDOMLoaded, true); - }; - - // Used to clear the temporary "login" state from the button. - Services.obs.notifyObservers(null, "loop-status-changed", null); - - this.shouldResumeTour().then((resume) => { - if (resume) { - // Assume the conversation with the visitor wasn't open since we would - // have resumed the tour as soon as the visitor joined if it was (and - // the pref would have been set to false already. - this.MozLoopService.resumeTour("waiting"); - resolve(); - return; - } - - this.LoopAPI.initialize(); - - let anchor = event ? event.target : this.toolbarButton.anchor; - let setHeight = 410; - if (gBrowser.selectedBrowser.getAttribute("remote") === "true") { - setHeight = 262; - } - this.PanelFrame.showPopup(window, anchor, - "loop", null, "about:looppanel", - // Loop wants a fixed size for the panel. This also stops it dynamically resizing. - { width: 330, height: setHeight }, - callback); - }); - }); - }, - - /** - * Method to know whether actions to open the panel should instead resume the tour. - * - * We need the panel to be opened via UITour so that it gets @noautohide. - * - * @return {Promise} resolving with a {Boolean} of whether the tour should be resumed instead of - * opening the panel. - */ - shouldResumeTour: Task.async(function* () { - // Resume the FTU tour if this is the first time a room was joined by - // someone else since the tour. - if (!Services.prefs.getBoolPref("loop.gettingStarted.resumeOnFirstJoin")) { - return false; - } - - if (!this.LoopRooms.participantsCount) { - // Nobody is in the rooms - return false; - } - - let roomsWithNonOwners = yield this.roomsWithNonOwners(); - if (!roomsWithNonOwners.length) { - // We were the only one in a room but we want to know about someone else joining. - return false; - } - - return true; - }), - - /** - * @return {Promise} resolved with an array of Rooms with participants (excluding owners) - */ - roomsWithNonOwners: function() { - return new Promise(resolve => { - this.LoopRooms.getAll((error, rooms) => { - let roomsWithNonOwners = []; - for (let room of rooms) { - if (!("participants" in room)) { - continue; - } - let numNonOwners = room.participants.filter(participant => !participant.owner).length; - if (!numNonOwners) { - continue; - } - roomsWithNonOwners.push(room); - } - resolve(roomsWithNonOwners); - }); - }); - }, - - /** - * Triggers the initialization of the loop service. Called by - * delayedStartup. - */ - init: function() { - // Cleanup when the window unloads. - window.addEventListener("unload", () => { - this.uninit(); - }); - - // Add observer notifications before the service is initialized - Services.obs.addObserver(this, "loop-status-changed", false); - - // This is a promise for test purposes, but we don't want to be logging - // expected errors to the console, so we catch them here. - this.MozLoopService.initialize().catch(ex => { - if (!ex.message || - (!ex.message.contains("not enabled") && - !ex.message.contains("not needed"))) { - console.error(ex); - } - }); - this.updateToolbarState(); - }, - - uninit: function() { - Services.obs.removeObserver(this, "loop-status-changed"); - }, - - // Implements nsIObserver - observe: function(subject, topic, data) { - if (topic != "loop-status-changed") { - return; - } - this.updateToolbarState(data); - }, - - /** - * Updates the toolbar/menu-button state to reflect Loop status. - * - * @param {string} [aReason] Some states are only shown if - * a related reason is provided. - * - * aReason="login": Used after a login is completed - * successfully. This is used so the state can be - * temporarily shown until the next state change. - */ - updateToolbarState: function(aReason = null) { - if (!this.toolbarButton.node) { - return; - } - let state = ""; - let mozL10nId = "loop-call-button3"; - let suffix = ".tooltiptext"; - if (this.MozLoopService.errors.size) { - state = "error"; - mozL10nId += "-error"; - } else if (this.MozLoopService.screenShareActive) { - state = "action"; - mozL10nId += "-screensharing"; - } else if (aReason == "login" && this.MozLoopService.userProfile) { - state = "active"; - mozL10nId += "-active"; - suffix += "2"; - } else if (this.MozLoopService.doNotDisturb) { - state = "disabled"; - mozL10nId += "-donotdisturb"; - } else if (this.MozLoopService.roomsParticipantsCount > 0) { - state = "active"; - this.roomsWithNonOwners().then(roomsWithNonOwners => { - if (roomsWithNonOwners.length > 0) { - mozL10nId += "-participantswaiting"; - } else { - mozL10nId += "-active"; - } - - suffix += "2"; - this.updateTooltiptext(mozL10nId + suffix); - this.toolbarButton.node.setAttribute("state", state); - }); - return; - } else { - suffix += "2"; - } - - this.toolbarButton.node.setAttribute("state", state); - this.updateTooltiptext(mozL10nId + suffix); - }, - - /** - * Updates the tootltiptext to reflect Loop status. - * - * @param {string} [mozL10nId] l10n ID that refelct the current - * Loop status. - */ - updateTooltiptext: function(mozL10nId) { - this.toolbarButton.node.setAttribute("tooltiptext", mozL10nId); - var tooltiptext = CustomizableUI.getLocalizedProperty(this.toolbarButton, "tooltiptext"); - this.toolbarButton.node.setAttribute("tooltiptext", tooltiptext); - }, - - /** - * Show a desktop notification when 'do not disturb' isn't enabled. - * - * @param {Object} options Set of options that may tweak the appearance and - * behavior of the notification. - * Option params: - * - {String} title Notification title message - * - {String} [message] Notification body text - * - {String} [icon] Notification icon - * - {String} [sound] Sound to play - * - {String} [selectTab] Tab to select when the panel - * opens - * - {Function} [onclick] Callback to invoke when - * the notification is clicked. - * Opens the panel by default. - */ - showNotification: function(options) { - if (this.MozLoopService.doNotDisturb) { - return; - } - - if (!options.title) { - throw new Error("Missing title, can not display notification"); - } - - let notificationOptions = { - body: options.message || "" - }; - if (options.icon) { - notificationOptions.icon = options.icon; - } - if (options.sound) { - // This will not do anything, until bug bug 1105222 is resolved. - notificationOptions.mozbehavior = { - soundFile: "" - }; - this.playSound(options.sound); - } - - let notification = new window.Notification(options.title, notificationOptions); - notification.addEventListener("click", e => { - if (window.closed) { - return; - } - - try { - window.focus(); - } catch (ex) { - // Do nothing. - } - - // We need a setTimeout here, otherwise the panel won't show after the - // window received focus. - window.setTimeout(() => { - if (typeof options.onclick == "function") { - options.onclick(); - } else { - // Open the Loop panel as a default action. - this.openCallPanel(null, options.selectTab || null); - } - }, 0); - }); - }, - - /** - * Play a sound in this window IF there's no sound playing yet. - * - * @param {String} name Name of the sound, like 'ringtone' or 'room-joined' - */ - playSound: function(name) { - if (this.ActiveSound || this.MozLoopService.doNotDisturb) { - return; - } - - this.activeSound = new window.Audio(); - this.activeSound.src = `chrome://loop/content/shared/sounds/${name}.ogg`; - this.activeSound.load(); - this.activeSound.play(); - - this.activeSound.addEventListener("ended", () => this.activeSound = undefined, false); - }, - - /** - * Start listening to selected tab changes and notify any content page that's - * listening to 'BrowserSwitch' push messages. - * - * Push message parameters: - * - {Integer} windowId The new windowId for the browser. - */ - startBrowserSharing: function() { - if (!this._listeningToTabSelect) { - gBrowser.tabContainer.addEventListener("TabSelect", this); - this._listeningToTabSelect = true; - } - - this._maybeShowBrowserSharingInfoBar(); - - // Get the first window Id for the listener. - this.LoopAPI.broadcastPushMessage("BrowserSwitch", - gBrowser.selectedBrowser.outerWindowID); - }, - - /** - * Stop listening to selected tab changes. - */ - stopBrowserSharing: function() { - if (!this._listeningToTabSelect) { - return; - } - - this._hideBrowserSharingInfoBar(); - gBrowser.tabContainer.removeEventListener("TabSelect", this); - this._listeningToTabSelect = false; - }, - - /** - * Helper function to fetch a localized string via the MozLoopService API. - * It's currently inconveniently wrapped inside a string of stringified JSON. - * - * @param {String} key The element id to get strings for. - * @return {String} - */ - _getString: function(key) { - let str = this.MozLoopService.getStrings(key); - if (str) { - str = JSON.parse(str).textContent; - } - return str; - }, - - /** - * Shows an infobar notification at the top of the browser window that warns - * the user that their browser tabs are being broadcasted through the current - * conversation. - */ - _maybeShowBrowserSharingInfoBar: function() { - this._hideBrowserSharingInfoBar(); - - // Don't show the infobar if it's been permanently disabled from the menu. - if (!this.MozLoopService.getLoopPref(kPrefBrowserSharingInfoBar)) { - return; - } - - let box = gBrowser.getNotificationBox(); - let paused = false; - let bar = box.appendNotification( - this._getString("infobar_screenshare_browser_message"), - kBrowserSharingNotificationId, - // Icon is defined in browser theme CSS. - null, - box.PRIORITY_WARNING_LOW, - [{ - label: this._getString("infobar_button_pause_label"), - accessKey: this._getString("infobar_button_pause_accesskey"), - isDefault: false, - callback: (event, buttonInfo, buttonNode) => { - paused = !paused; - bar.label = paused ? this._getString("infobar_screenshare_paused_browser_message") : - this._getString("infobar_screenshare_browser_message"); - bar.classList.toggle("paused", paused); - buttonNode.label = paused ? this._getString("infobar_button_resume_label") : - this._getString("infobar_button_pause_label"); - buttonNode.accessKey = paused ? this._getString("infobar_button_resume_accesskey") : - this._getString("infobar_button_pause_accesskey"); - return true; - } - }, - { - label: this._getString("infobar_button_stop_label"), - accessKey: this._getString("infobar_button_stop_accesskey"), - isDefault: true, - callback: () => { - this._hideBrowserSharingInfoBar(); - LoopUI.MozLoopService.hangupAllChatWindows(); - } - }] - ); - - // Keep showing the notification bar until the user explicitly closes it. - bar.persistence = -1; - }, - - /** - * Hides the infobar, permanantly if requested. - * - * @param {Boolean} permanently Flag that determines if the infobar will never - * been shown again. Defaults to `false`. - * @return {Boolean} |true| if the infobar was hidden here. - */ - _hideBrowserSharingInfoBar: function(permanently = false, browser) { - browser = browser || gBrowser.selectedBrowser; - let box = gBrowser.getNotificationBox(browser); - let notification = box.getNotificationWithValue(kBrowserSharingNotificationId); - let removed = false; - if (notification) { - box.removeNotification(notification); - removed = true; - } - - if (permanently) { - this.MozLoopService.setLoopPref(kPrefBrowserSharingInfoBar, false); - } - - return removed; - }, - - /** - * Handles events from gBrowser. - */ - handleEvent: function(event) { - // We only should get "select" events. - if (event.type != "TabSelect") { - return; - } - - let wasVisible = false; - // Hide the infobar from the previous tab. - if (event.detail.previousTab) { - wasVisible = this._hideBrowserSharingInfoBar(false, - event.detail.previousTab.linkedBrowser); - } - - // We've changed the tab, so get the new window id. - this.LoopAPI.broadcastPushMessage("BrowserSwitch", - gBrowser.selectedBrowser.outerWindowID); - - if (wasVisible) { - // If the infobar was visible before, we should show it again after the - // switch. - this._maybeShowBrowserSharingInfoBar(); - } - }, - - /** - * Fetch the favicon of the currently selected tab in the format of a data-uri. - * - * @param {Function} callback Function to be invoked with an error object as - * its first argument when an error occurred or - * a string as second argument when the favicon - * has been fetched. - */ - getFavicon: function(callback) { - let pageURI = gBrowser.selectedTab.linkedBrowser.currentURI.spec; - // If the tab page’s url starts with http(s), fetch icon. - if (!/^https?:/.test(pageURI)) { - callback(); - return; - } - - this.PlacesUtils.promiseFaviconLinkUrl(pageURI).then(uri => { - // We XHR the favicon to get a File object, which we can pass to the FileReader - // object. The FileReader turns the File object into a data-uri. - let xhr = xhrClass.createInstance(Ci.nsIXMLHttpRequest); - xhr.open("get", uri.spec, true); - xhr.responseType = "blob"; - xhr.overrideMimeType("image/x-icon"); - xhr.onload = () => { - if (xhr.status != 200) { - callback(new Error("Invalid status code received for favicon XHR: " + xhr.status)); - return; - } - - let reader = new FileReader(); - reader.onload = reader.onload = () => callback(null, reader.result); - reader.onerror = callback; - reader.readAsDataURL(xhr.response); - }; - xhr.onerror = callback; - xhr.send(); - }).catch(err => { - callback(err || new Error("No favicon found")); - }); - } - }; - - XPCOMUtils.defineLazyModuleGetter(LoopUI, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopAPI", "chrome://loop/content/modules/MozLoopAPI.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopRooms", "chrome://loop/content/modules/LoopRooms.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "chrome://loop/content/modules/MozLoopService.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); - - LoopUI.init(); - window.LoopUI = LoopUI; - }, - - tearDownBrowserUI: function(window) { - let document = window.document; - - // Take any steps to remove UI or anything from the browser window - // document.getElementById() etc. will work here - // XXX Add in tear-down of the panel. - }, - - // nsIWindowMediatorListener functions. - onOpenWindow: function(xulWindow) { - // A new window has opened. - let domWindow = xulWindow.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDOMWindow); - - // Wait for it to finish loading. - domWindow.addEventListener("load", function listener() { - domWindow.removeEventListener("load", listener, false); - - // If this is a browser window then setup its UI. - if (domWindow.document.documentElement.getAttribute("windowtype") == "navigator:browser") { - WindowListener.setupBrowserUI(domWindow); - } - }, false); - }, - - onCloseWindow: function(xulWindow) { - }, - - onWindowTitleChange: function(xulWindow, newTitle) { - } -}; - -/** - * Creates the loop button on the toolbar. Due to loop being a system-addon - * CustomizableUI already has a placement location for the button, so that - * we can be on the toolbar. - */ -function createLoopButton() { - CustomizableUI.createWidget({ - id: "loop-button", - type: "custom", - label: "loop-call-button3.label", - tooltiptext: "loop-call-button3.tooltiptext2", - privateBrowsingTooltiptext: "loop-call-button3-pb.tooltiptext", - defaultArea: CustomizableUI.AREA_NAVBAR, - removable: true, - onBuild: function(aDocument) { - // If we're not supposed to see the button, return zip. - if (!Services.prefs.getBoolPref("loop.enabled")) { - return null; - } - - let isWindowPrivate = PrivateBrowsingUtils.isWindowPrivate(aDocument.defaultView); - - let node = aDocument.createElementNS(kNSXUL, "toolbarbutton"); - node.setAttribute("id", this.id); - node.classList.add("toolbarbutton-1"); - node.classList.add("chromeclass-toolbar-additional"); - node.classList.add("badged-button"); - node.setAttribute("label", CustomizableUI.getLocalizedProperty(this, "label")); - if (isWindowPrivate) { - node.setAttribute("disabled", "true"); - } - let tooltiptext = isWindowPrivate ? - CustomizableUI.getLocalizedProperty(this, "privateBrowsingTooltiptext", - [CustomizableUI.getLocalizedProperty(this, "label")]) : - CustomizableUI.getLocalizedProperty(this, "tooltiptext"); - node.setAttribute("tooltiptext", tooltiptext); - node.setAttribute("removable", "true"); - node.addEventListener("command", function(event) { - aDocument.defaultView.LoopUI.togglePanel(event); - }); - - return node; - } - }); -} - -/** - * Loads the default preferences from the prefs file. This loads the preferences - * into the default branch, so they don't appear as user preferences. - */ -function loadDefaultPrefs() { - var branch = Services.prefs.getDefaultBranch(""); - Services.scriptloader.loadSubScript("chrome://loop/content/preferences/prefs.js", { - pref: (key, val) => { - switch (typeof val) { - case "boolean": - branch.setBoolPref(key, val); - break; - case "number": - branch.setIntPref(key, val); - break; - case "string": - branch.setCharPref(key, val); - break; - } - } - }); -} - -/** - * Called when the add-on is started, e.g. when installed or when Firefox starts. - */ -function startup() { - loadDefaultPrefs(); - - createLoopButton(); - - // Attach to hidden window (for OS X). - try { - WindowListener.setupBrowserUI(Services.appShell.hiddenDOMWindow); - } catch (ex) { - // Hidden window didn't exist, so wait until startup is done. - let topic = "browser-delayed-startup-finished"; - Services.obs.addObserver(function observer() { - Services.obs.removeObserver(observer, topic); - WindowListener.setupBrowserUI(Services.appShell.hiddenDOMWindow); - }, topic, false); - } - - // Attach to existing browser windows, for modifying UI. - let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); - let windows = wm.getEnumerator("navigator:browser"); - while (windows.hasMoreElements()) { - let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); - WindowListener.setupBrowserUI(domWindow); - } - - // Wait for any new browser windows to open. - wm.addListener(WindowListener); - - // Load our stylesheets. - let styleSheetService = Cc["@mozilla.org/content/style-sheet-service;1"] - .getService(Components.interfaces.nsIStyleSheetService); - let sheets = ["chrome://loop-shared/skin/loop.css", - "chrome://loop/skin/platform.css"]; - for (let sheet of sheets) { - let styleSheetURI = Services.io.newURI(sheet, null, null); - // XXX We would love to specify AUTHOR_SHEET here and in shutdown, however - // bug 1228542 prevents us from doing that as we'd cause a lot of assertions - // in debug mode for tests. Once that is fixed, we should be able to change - // this, and remove the !important attributes from our syle sheets. - styleSheetService.loadAndRegisterSheet(styleSheetURI, - styleSheetService.USER_SHEET); - } -} - -/** - * Called when the add-on is shutting down, could be for re-installation - * or just uninstall. - */ -function shutdown() { - // Close any open chat windows - Cu.import("resource:///modules/Chat.jsm"); - let isLoopURL = ({ src }) => /^about:loopconversation#/.test(src); - [...Chat.chatboxes].filter(isLoopURL).forEach(chatbox => { - chatbox.content.contentWindow.close(); - }); - - // Detach from hidden window (for OS X). - WindowListener.tearDownBrowserUI(Services.appShell.hiddenDOMWindow); - - // Detach from browser windows. - let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); - let windows = wm.getEnumerator("navigator:browser"); - while (windows.hasMoreElements()) { - let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); - WindowListener.tearDownBrowserUI(domWindow); - } - - // Stop waiting for browser windows to open. - wm.removeListener(WindowListener); - - CustomizableUI.destroyWidget("loop-button"); - - // Unload stylesheets. - let styleSheetService = Cc["@mozilla.org/content/style-sheet-service;1"] - .getService(Components.interfaces.nsIStyleSheetService); - let sheets = ["chrome://loop/content/addon/css/loop.css", - "chrome://loop/skin/platform.css"]; - for (let sheet of sheets) { - let styleSheetURI = Services.io.newURI(sheet, null, null); - if (styleSheetService.sheetRegistered(styleSheetURI, - styleSheetService.USER_SHEET)) { - styleSheetService.unregisterSheet(styleSheetURI, - styleSheetService.USER_SHEET); - } - } - - // Unload modules. - Cu.unload("chrome://loop/content/modules/MozLoopAPI.jsm"); - Cu.unload("chrome://loop/content/modules/LoopRooms.jsm"); - Cu.unload("chrome://loop/content/modules/MozLoopService.jsm"); -} - -function install() {} - -function uninstall() {} diff --git a/browser/extensions/loop/content/modules/.eslintrc b/browser/extensions/loop/content/modules/.eslintrc deleted file mode 100644 index 5c7868e56d0f..000000000000 --- a/browser/extensions/loop/content/modules/.eslintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../.eslintrc-gecko" -} diff --git a/browser/extensions/loop/content/panels/conversation.html b/browser/extensions/loop/content/panels/conversation.html deleted file mode 100644 index 7cbb81835f2c..000000000000 --- a/browser/extensions/loop/content/panels/conversation.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/extensions/loop/content/panels/panel.html b/browser/extensions/loop/content/panels/panel.html deleted file mode 100644 index 982006f70846..000000000000 --- a/browser/extensions/loop/content/panels/panel.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - diff --git a/browser/extensions/loop/content/preferences/prefs.js b/browser/extensions/loop/content/preferences/prefs.js deleted file mode 100644 index 67ff6255c705..000000000000 --- a/browser/extensions/loop/content/preferences/prefs.js +++ /dev/null @@ -1,33 +0,0 @@ -pref("loop.enabled", true); -pref("loop.textChat.enabled", true); -pref("loop.server", "https://loop.services.mozilla.com/v0"); -pref("loop.linkClicker.url", "https://hello.firefox.com/"); -pref("loop.gettingStarted.seen", false); -pref("loop.gettingStarted.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/hello/start/"); -pref("loop.gettingStarted.resumeOnFirstJoin", false); -pref("loop.learnMoreUrl", "https://www.firefox.com/hello/"); -pref("loop.legal.ToS_url", "https://www.mozilla.org/about/legal/terms/firefox-hello/"); -pref("loop.legal.privacy_url", "https://www.mozilla.org/privacy/firefox-hello/"); -pref("loop.do_not_disturb", false); -pref("loop.ringtone", "chrome://browser/content/loop/shared/sounds/ringtone.ogg"); -pref("loop.retry_delay.start", 60000); -pref("loop.retry_delay.limit", 300000); -pref("loop.ping.interval", 1800000); -pref("loop.ping.timeout", 10000); -pref("loop.debug.loglevel", "Error"); -pref("loop.debug.dispatcher", false); -pref("loop.debug.sdk", false); -pref("loop.debug.twoWayMediaTelemetry", false); -pref("loop.feedback.dateLastSeenSec", 0); -pref("loop.feedback.periodSec", 15770000); // 6 months. -pref("loop.feedback.formURL", "https://www.mozilla.org/firefox/hello/npssurvey/"); -pref("loop.feedback.manualFormURL", "https://www.mozilla.org/firefox/hello/feedbacksurvey/"); -#ifdef DEBUG -pref("loop.CSP", "default-src 'self' about: file: chrome: http://localhost:*; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net http://localhost:* ws://localhost:*; media-src blob:"); -#else -pref("loop.CSP", "default-src 'self' about: file: chrome:; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net; media-src blob:"); -#endif -pref("loop.fxa_oauth.tokendata", ""); -pref("loop.fxa_oauth.profile", ""); -pref("loop.support_url", "https://support.mozilla.org/kb/group-conversations-firefox-hello-webrtc"); -pref("loop.browserSharing.showInfoBar", true); diff --git a/browser/extensions/loop/install.rdf.in b/browser/extensions/loop/install.rdf.in deleted file mode 100644 index 2b09874541e4..000000000000 --- a/browser/extensions/loop/install.rdf.in +++ /dev/null @@ -1,39 +0,0 @@ - - - -#filter substitution - - - - loop@mozilla.org - true - 0.1 - 2 - - - - - {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - 45.0a1 - @FIREFOX_VERSION@ - - - - - - - xpcshell@tests.mozilla.org - 0 - 10 - - - - - Firefox Hello - Web sharing for Firefox - Mozilla - - diff --git a/browser/extensions/loop/jar.mn b/browser/extensions/loop/jar.mn deleted file mode 100644 index e7ebe3d4ea9b..000000000000 --- a/browser/extensions/loop/jar.mn +++ /dev/null @@ -1,164 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -[.] chrome.jar: -% content loop %content/ contentaccessible=yes -% skin loop classic/1.0 %skin/linux/ os=Linux -% skin loop classic/1.0 %skin/osx/ os=Darwin -% skin loop classic/1.0 %skin/windows/ os=WINNT -% skin loop-shared classic/1.0 %skin/shared/ -% override chrome://loop/skin/menuPanel.png chrome://loop/skin/menuPanel-yosemite.png os=Darwin osversion>=10.10 -% override chrome://loop/skin/menuPanel@2x.png chrome://loop/skin/menuPanel-yosemite@2x.png os=Darwin osversion>=10.10 -% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-yosemite.png os=Darwin osversion>=10.10 -% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-yosemite@2x.png os=Darwin osversion>=10.10 -% override chrome://loop/skin/menuPanel.png chrome://loop/skin/menuPanel-aero.png os=WINNT osversion=6 -% override chrome://loop/skin/menuPanel.png chrome://loop/skin/menuPanel-aero.png os=WINNT osversion=6.1 -% override chrome://loop/skin/menuPanel@2x.png chrome://loop/skin/menuPanel-aero@2x.png os=WINNT osversion=6 -% override chrome://loop/skin/menuPanel@2x.png chrome://loop/skin/menuPanel-aero@2x.png os=WINNT osversion=6.1 -% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-XP.png os=WINNT osversion<6 -% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-aero.png os=WINNT osversion=6 -% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-aero.png os=WINNT osversion=6.1 -% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-win8.png os=WINNT osversion=6.2 -% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-win8.png os=WINNT osversion=6.3 -% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-XP@2x.png os=WINNT osversion<6 -% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-aero@2x.png os=WINNT osversion=6 -% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-aero@2x.png os=WINNT osversion=6.1 -% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-win8@2x.png os=WINNT osversion=6.2 -% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-win8@2x.png os=WINNT osversion=6.3 - skin/ (skin/*) - content/modules/ (content/modules/*) -* content/preferences/prefs.js (content/preferences/prefs.js) - - # Desktop html files - content/panels/conversation.html (content/panels/conversation.html) - content/panels/panel.html (content/panels/panel.html) - - # Desktop vendor (see bottom of this file for TokBox sdk assets) - content/panels/vendor/l10n.js (content/panels/vendor/l10n.js) - - # Desktop script - content/panels/js/conversation.js (content/panels/js/conversation.js) - content/panels/js/conversationAppStore.js (content/panels/js/conversationAppStore.js) - content/panels/js/otconfig.js (content/panels/js/otconfig.js) - content/panels/js/panel.js (content/panels/js/panel.js) - content/panels/js/roomStore.js (content/panels/js/roomStore.js) - content/panels/js/roomViews.js (content/panels/js/roomViews.js) - content/panels/js/feedbackViews.js (content/panels/js/feedbackViews.js) - - # Desktop styles - content/panels/css/panel.css (content/panels/css/panel.css) - - # Shared styles - content/shared/css/reset.css (content/shared/css/reset.css) - content/shared/css/common.css (content/shared/css/common.css) - content/shared/css/conversation.css (content/shared/css/conversation.css) - - # Shared images - content/shared/img/helloicon.svg (content/shared/img/helloicon.svg) - content/shared/img/icon_32.png (content/shared/img/icon_32.png) - content/shared/img/icon_64.png (content/shared/img/icon_64.png) - content/shared/img/spinner.svg (content/shared/img/spinner.svg) - # XXX could get rid of the png spinner usages and replace them with the svg - # one? - content/shared/img/spinner.png (content/shared/img/spinner.png) - content/shared/img/spinner@2x.png (content/shared/img/spinner@2x.png) - content/shared/img/sad_hello_icon_64x64.svg (content/shared/img/sad_hello_icon_64x64.svg) - content/shared/img/chatbubble-arrow-left.svg (content/shared/img/chatbubble-arrow-left.svg) - content/shared/img/chatbubble-arrow-right.svg (content/shared/img/chatbubble-arrow-right.svg) - content/shared/img/facemute-14x14.png (content/shared/img/facemute-14x14.png) - content/shared/img/facemute-14x14@2x.png (content/shared/img/facemute-14x14@2x.png) - content/shared/img/hangup-inverse-14x14.png (content/shared/img/hangup-inverse-14x14.png) - content/shared/img/hangup-inverse-14x14@2x.png (content/shared/img/hangup-inverse-14x14@2x.png) - content/shared/img/mute-inverse-14x14.png (content/shared/img/mute-inverse-14x14.png) - content/shared/img/mute-inverse-14x14@2x.png (content/shared/img/mute-inverse-14x14@2x.png) - content/shared/img/glyph-email-16x16.svg (content/shared/img/glyph-email-16x16.svg) - content/shared/img/glyph-facebook-16x16.svg (content/shared/img/glyph-facebook-16x16.svg) - content/shared/img/glyph-help-16x16.svg (content/shared/img/glyph-help-16x16.svg) - content/shared/img/glyph-link-16x16.svg (content/shared/img/glyph-link-16x16.svg) - content/shared/img/glyph-user-16x16.svg (content/shared/img/glyph-user-16x16.svg) - content/shared/img/exit.svg (content/shared/img/exit.svg) - content/shared/img/audio.svg (content/shared/img/audio.svg) - content/shared/img/audio-hover.svg (content/shared/img/audio-hover.svg) - content/shared/img/audio-mute.svg (content/shared/img/audio-mute.svg) - content/shared/img/audio-mute-hover.svg (content/shared/img/audio-mute-hover.svg) - content/shared/img/video.svg (content/shared/img/video.svg) - content/shared/img/video-hover.svg (content/shared/img/video-hover.svg) - content/shared/img/video-mute.svg (content/shared/img/video-mute.svg) - content/shared/img/video-mute-hover.svg (content/shared/img/video-mute-hover.svg) - content/shared/img/settings.svg (content/shared/img/settings.svg) - content/shared/img/settings-hover.svg (content/shared/img/settings-hover.svg) - content/shared/img/sharing.svg (content/shared/img/sharing.svg) - content/shared/img/sharing-active.svg (content/shared/img/sharing-active.svg) - content/shared/img/sharing-pending.svg (content/shared/img/sharing-pending.svg) - content/shared/img/sharing-hover.svg (content/shared/img/sharing-hover.svg) - content/shared/img/media-group.svg (content/shared/img/media-group.svg) - content/shared/img/media-group-left-hover.svg (content/shared/img/media-group-left-hover.svg) - content/shared/img/media-group-right-hover.svg (content/shared/img/media-group-right-hover.svg) - content/shared/img/audio-call-avatar.svg (content/shared/img/audio-call-avatar.svg) - content/shared/img/beta-ribbon.svg (content/shared/img/beta-ribbon.svg) - content/shared/img/check.svg (content/shared/img/check.svg) - content/shared/img/icons-10x10.svg (content/shared/img/icons-10x10.svg) - content/shared/img/icons-14x14.svg (content/shared/img/icons-14x14.svg) - content/shared/img/icons-16x16.svg (content/shared/img/icons-16x16.svg) - content/shared/img/movistar.png (content/shared/img/movistar.png) - content/shared/img/movistar@2x.png (content/shared/img/movistar@2x.png) - content/shared/img/vivo.png (content/shared/img/vivo.png) - content/shared/img/vivo@2x.png (content/shared/img/vivo@2x.png) - content/shared/img/02.png (content/shared/img/02.png) - content/shared/img/02@2x.png (content/shared/img/02@2x.png) - content/shared/img/telefonica.png (content/shared/img/telefonica.png) - content/shared/img/hello_logo.svg (content/shared/img/hello_logo.svg) - content/shared/img/telefonica@2x.png (content/shared/img/telefonica@2x.png) - content/shared/img/ellipsis-v.svg (content/shared/img/ellipsis-v.svg) - content/shared/img/empty_conversations.svg (content/shared/img/empty_conversations.svg) - content/shared/img/empty_search.svg (content/shared/img/empty_search.svg) - content/shared/img/animated-spinner.svg (content/shared/img/animated-spinner.svg) - content/shared/img/avatars.svg (content/shared/img/avatars.svg) - content/shared/img/firefox-avatar.svg (content/shared/img/firefox-avatar.svg) - content/shared/img/pause-12x12.svg (content/shared/img/pause-12x12.svg) - content/shared/img/play-12x12.svg (content/shared/img/play-12x12.svg) - content/shared/img/stop-12x12.svg (content/shared/img/stop-12x12.svg) - - # Shared scripts - content/shared/js/actions.js (content/shared/js/actions.js) - content/shared/js/crypto.js (content/shared/js/crypto.js) - content/shared/js/store.js (content/shared/js/store.js) - content/shared/js/activeRoomStore.js (content/shared/js/activeRoomStore.js) - content/shared/js/dispatcher.js (content/shared/js/dispatcher.js) - content/shared/js/linkifiedTextView.js (content/shared/js/linkifiedTextView.js) - content/shared/js/loopapi-client.js (content/shared/js/loopapi-client.js) - content/shared/js/models.js (content/shared/js/models.js) - content/shared/js/mixins.js (content/shared/js/mixins.js) - content/shared/js/otSdkDriver.js (content/shared/js/otSdkDriver.js) - content/shared/js/views.js (content/shared/js/views.js) - content/shared/js/textChatStore.js (content/shared/js/textChatStore.js) - content/shared/js/textChatView.js (content/shared/js/textChatView.js) - content/shared/js/urlRegExps.js (content/shared/js/urlRegExps.js) - content/shared/js/utils.js (content/shared/js/utils.js) - content/shared/js/validate.js (content/shared/js/validate.js) - - # Shared libs -#ifdef DEBUG - content/shared/vendor/react-0.13.3.js (content/shared/vendor/react-0.13.3.js) -#else - content/shared/vendor/react-0.13.3.js (content/shared/vendor/react-0.13.3-prod.js) -#endif - content/shared/vendor/lodash-3.9.3.js (content/shared/vendor/lodash-3.9.3.js) - content/shared/vendor/backbone-1.2.1.js (content/shared/vendor/backbone-1.2.1.js) - content/shared/vendor/classnames-2.2.0.js (content/shared/vendor/classnames-2.2.0.js) - - # Shared sounds - content/shared/sounds/ringtone.ogg (content/shared/sounds/ringtone.ogg) - content/shared/sounds/connecting.ogg (content/shared/sounds/connecting.ogg) - content/shared/sounds/connected.ogg (content/shared/sounds/connected.ogg) - content/shared/sounds/terminated.ogg (content/shared/sounds/terminated.ogg) - content/shared/sounds/room-joined.ogg (content/shared/sounds/room-joined.ogg) - content/shared/sounds/room-joined-in.ogg (content/shared/sounds/room-joined-in.ogg) - content/shared/sounds/room-left.ogg (content/shared/sounds/room-left.ogg) - content/shared/sounds/failure.ogg (content/shared/sounds/failure.ogg) - content/shared/sounds/message.ogg (content/shared/sounds/message.ogg) - - # Partner SDK assets - content/shared/vendor/sdk.js (content/shared/vendor/sdk.js) - content/sdk-content/js/dynamic_config.min.js (content/shared/vendor/sdk-content/js/dynamic_config.min.js) diff --git a/browser/extensions/loop/skin/osx/platform.css b/browser/extensions/loop/skin/osx/platform.css deleted file mode 100644 index f4ba1617c299..000000000000 --- a/browser/extensions/loop/skin/osx/platform.css +++ /dev/null @@ -1,47 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); - -/* Only apply to browser.xul documents */ -@-moz-document url("chrome://browser/content/browser.xul") { - /** - * XXX Due to bug 1228542, anything in this file that overrides a browser style - * must specify !important. Otherwise the style won't get applied correctly - * due to the limitations caused by the bug. - */ - - notification[value="loop-sharing-notification"] { - background: #00a9dc !important; - padding: 0 !important; - border: 0 !important; - } - - notification[value="loop-sharing-notification"].paused { - background: #ebebeb !important; - } - - notification[value="loop-sharing-notification"] .notification-button { - background: #fff !important; - border-radius: 0 !important; - } - - notification[value="loop-sharing-notification"].paused .notification-button { - background: #57bd35 !important; - } - - notification[value="loop-sharing-notification"].paused .notification-button:hover { - background: #39a017 !important; - } - - notification[value="loop-sharing-notification"] .notification-button:hover, - notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background: #ebebeb !important; - } - - notification[value="loop-sharing-notification"] .notification-button-default, - notification[value="loop-sharing-notification"].paused .notification-button-default { - background: #fff !important; - } -} diff --git a/browser/extensions/loop/skin/shared/loop.css b/browser/extensions/loop/skin/shared/loop.css deleted file mode 100644 index 14bc6062bf61..000000000000 --- a/browser/extensions/loop/skin/shared/loop.css +++ /dev/null @@ -1,286 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); - -/* Only apply to browser.xul documents */ -@-moz-document url("chrome://browser/content/browser.xul") { - /** - * XXX Due to bug 1228542, anything in this file that overrides a browser style - * must specify !important. Otherwise the style won't get applied correctly - * due to the limitations caused by the bug. - */ - - /* - XXX Copied from browser/themes//browser.css. Should really be - changing the sizes of icons in files to 16px x 16px and no borders. - */ - :-moz-any(toolbar, .widget-overflow-list) #loop-button > .toolbarbutton-icon, - :-moz-any(toolbar, .widget-overflow-list) #loop-button > :-moz-any(.toolbarbutton-menubutton-button, .toolbarbutton-badge-stack) > .toolbarbutton-icon { - max-width: 18px !important; - margin: 0 !important; - } - - #loop-button { - list-style-image: url(chrome://loop/skin/toolbar.png); - -moz-image-region: rect(0, 18px, 18px, 0); - } - - toolbar[brighttext] #loop-button { - list-style-image: url(chrome://loop/skin/toolbar-inverted.png); - } - - #loop-button[state="disabled"], - #loop-button[disabled="true"] { - -moz-image-region: rect(0, 36px, 18px, 18px); - } - - #loop-button:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 54px, 18px, 36px); - } - - #loop-button:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 72px, 18px, 54px); - } - - #loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 90px, 18px, 72px); - } - - #loop-button:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 108px, 18px, 90px); - } - - #loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 126px, 18px, 108px); - } - - @media (min-resolution: 1.1dppx) { - #loop-button { - list-style-image: url("chrome://loop/skin/toolbar@2x.png"); - -moz-image-region: rect(0, 36px, 36px, 0); - } - - toolbar[brighttext] #loop-button { - list-style-image: url("chrome://loop/skin/toolbar-inverted@2x.png"); - } - - #loop-button[state="disabled"], - #loop-button[disabled="true"] { - -moz-image-region: rect(0, 72px, 36px, 36px); - } - - #loop-button:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 108px, 36px, 72px); - } - - #loop-button:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 144px, 36px, 108px); - } - - #loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 180px, 36px, 144px); - } - - #loop-button:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 216px, 36px, 180px); - } - - #loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 252px, 36px, 216px); - } - - #loop-button[cui-areatype="menu-panel"], - toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://loop/skin/menuPanel@2x.png); - -moz-image-region: rect(0, 64px, 64px, 0); - } - - /* Make sure that the state icons are not shown in the customization palette. */ - toolbarpaletteitem[place="palette"] > #loop-button { - -moz-image-region: rect(0, 64px, 64px, 0) !important; - } - - #loop-button[cui-areatype="menu-panel"][state="disabled"], - #loop-button[cui-areatype="menu-panel"][disabled="true"] { - -moz-image-region: rect(0, 128px, 64px, 64px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 192px, 64px, 128px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 256px, 64px, 192px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 320px, 64px, 256px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 384px, 64px, 320px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 448px, 64px, 384px); - } - } - - @media not all and (min-resolution: 1.1dppx) { - #loop-button[cui-areatype="menu-panel"], - toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://loop/skin/menuPanel.png); - -moz-image-region: rect(0, 32px, 32px, 0); - } - - /* Make sure that the state icons are not shown in the customization palette. */ - toolbarpaletteitem[place="palette"] > #loop-button { - -moz-image-region: rect(0, 32px, 32px, 0) !important; - } - - #loop-button[cui-areatype="menu-panel"][state="disabled"], - #loop-button[cui-areatype="menu-panel"][disabled="true"] { - -moz-image-region: rect(0, 64px, 32px, 32px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 96px, 32px, 64px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 128px, 32px, 96px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 160px, 32px, 128px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 192px, 32px, 160px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 224px, 32px, 192px); - } - } - - notification[value="loop-sharing-notification"] { - -moz-appearance: none !important; - height: 40px !important; - background-color: #00a9dc !important; - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset !important; - } - - notification[value="loop-sharing-notification"].paused { - background-color: #ebebeb !important; - } - - notification[value="loop-sharing-notification"] .notification-inner { - color: #fff !important; - padding: 0 !important; - } - - notification[value="loop-sharing-notification"].paused .notification-inner { - color: #00a9dc !important; - } - - notification[value="loop-sharing-notification"] .notification-button { - -moz-appearance: none !important; - background-color: #fff !important; - border: 0 !important; - border-right: solid 1px #ebebeb !important; - width: 100px !important; - height: 40px !important; - margin: 0 !important; - list-style-image: url(chrome://loop/content/shared/img/pause-12x12.svg) !important; - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset !important; - text-shadow: none !important; - } - - notification[value="loop-sharing-notification"] .notification-button:-moz-locale-dir(rtl) { - border-right: 0 !important; - border-left: solid 1px #ebebeb !important; - } - - notification[value="loop-sharing-notification"].paused .notification-button { - background-color: #57bd35 !important; - color: #fff !important; - list-style-image: url(chrome://loop/content/shared/img/play-12x12.svg) !important; - } - - notification[value="loop-sharing-notification"].paused .notification-button:hover { - background-color: #39a017 !important; - } - - notification[value="loop-sharing-notification"] .notification-button:hover, - notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background-color: #ebebeb !important; - } - - notification[value="loop-sharing-notification"] .notification-button-default, - notification[value="loop-sharing-notification"].paused .notification-button-default { - color: #d92215 !important; - background-color: #fff !important; - border-right: 0 !important; - list-style-image: url(chrome://loop/content/shared/img/stop-12x12.svg) !important; - } - - notification[value="loop-sharing-notification"] .notification-button .button-icon { - display: block !important; - -moz-margin-end: 6px !important; - } - - notification[value="loop-sharing-notification"] .button-menubutton-button { - min-width: 0 !important; - } - - notification[value="loop-sharing-notification"] .messageImage { - list-style-image: url(chrome://loop/content/shared/img/icons-16x16.svg#loop-icon-white) !important; - margin-inline-start: 14px !important; - } - - notification[value="loop-sharing-notification"].paused .messageImage { - list-style-image: url(chrome://loop/content/shared/img/icons-16x16.svg#loop-icon-still) !important; - } - - notification[value="loop-sharing-notification"] .close-icon { - display: none !important; - } - - chatbox[src^="about:loopconversation#"] > .chat-titlebar { - background-color: #00a9dc !important; - border-color: #00a9dc !important; - } - - chatbox[src^="about:loopconversation#"] .chat-title { - color: white !important; - } - - chatbox[src^="about:loopconversation#"] .chat-minimize-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white") !important; - } - - chatbox[src^="about:loopconversation#"] .chat-swap-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white") !important; - } - - .chat-loop-hangup { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white") !important; - background-color: #d13f1a !important; - border: 1px solid #d13f1a !important; - border-top-right-radius: 4px !important; - width: 32px !important; - height: 26px !important; - margin-top: -6px !important; - margin-bottom: -5px !important; - -moz-margin-start: 6px !important; - -moz-margin-end: -5px !important; - } - - .chat-toolbarbutton.chat-loop-hangup:-moz-any(:hover,:hover:active) { - background-color: #ef6745 !important; - border-color: #ef6745 !important; - } -} diff --git a/browser/extensions/loop/skin/windows/platform.css b/browser/extensions/loop/skin/windows/platform.css deleted file mode 100644 index 6f0c7610e9af..000000000000 --- a/browser/extensions/loop/skin/windows/platform.css +++ /dev/null @@ -1,26 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); - -/* Only apply to browser.xul documents */ -@-moz-document url("chrome://browser/content/browser.xul") { - /** - * XXX Due to bug 1228542, anything in this file that overrides a browser style - * must specify !important. Otherwise the style won't get applied correctly - * due to the limitations caused by the bug. - */ - - @media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) { - #loop-button { - list-style-image: url(chrome://loop/skin/toolbar-lunaSilver.png) - } - } - - @media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { - #loop-button { - list-style-image: url(chrome://loop/skin/toolbar-lunaSilver@2x.png) - } - } -} diff --git a/browser/extensions/moz.build b/browser/extensions/moz.build index 7d54e6e2f045..cf19e7519aae 100644 --- a/browser/extensions/moz.build +++ b/browser/extensions/moz.build @@ -5,7 +5,6 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. DIRS += [ - 'loop', 'pdfjs', 'shumway', ] diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index 35bccc54d340..0e3771f7872e 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -676,7 +676,6 @@ @RESPATH@/browser/chrome/icons/default/default32.png @RESPATH@/browser/chrome/icons/default/default48.png #endif -@RESPATH@/browser/features/* ; [Webide Files] @RESPATH@/browser/chrome/webide@JAREXT@ diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn index bb09979e74d1..6e70af6af79e 100644 --- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -47,6 +47,12 @@ browser.jar: skin/classic/browser/Toolbar-inverted.png skin/classic/browser/Toolbar-small.png skin/classic/browser/webRTC-indicator.css + skin/classic/browser/loop/menuPanel.png (loop/menuPanel.png) + skin/classic/browser/loop/menuPanel@2x.png (loop/menuPanel@2x.png) + skin/classic/browser/loop/toolbar.png (loop/toolbar.png) + skin/classic/browser/loop/toolbar@2x.png (loop/toolbar@2x.png) + skin/classic/browser/loop/toolbar-inverted.png (loop/toolbar-inverted.png) + skin/classic/browser/loop/toolbar-inverted@2x.png (loop/toolbar-inverted@2x.png) * skin/classic/browser/controlcenter/panel.css (controlcenter/panel.css) skin/classic/browser/customizableui/background-noise-toolbar.png (customizableui/background-noise-toolbar.png) skin/classic/browser/customizableui/customizeMode-gridTexture.png (customizableui/customizeMode-gridTexture.png) diff --git a/browser/extensions/loop/skin/linux/menuPanel.png b/browser/themes/linux/loop/menuPanel.png similarity index 100% rename from browser/extensions/loop/skin/linux/menuPanel.png rename to browser/themes/linux/loop/menuPanel.png diff --git a/browser/extensions/loop/skin/linux/menuPanel@2x.png b/browser/themes/linux/loop/menuPanel@2x.png similarity index 100% rename from browser/extensions/loop/skin/linux/menuPanel@2x.png rename to browser/themes/linux/loop/menuPanel@2x.png diff --git a/browser/extensions/loop/skin/linux/toolbar-inverted.png b/browser/themes/linux/loop/toolbar-inverted.png similarity index 100% rename from browser/extensions/loop/skin/linux/toolbar-inverted.png rename to browser/themes/linux/loop/toolbar-inverted.png diff --git a/browser/extensions/loop/skin/linux/toolbar-inverted@2x.png b/browser/themes/linux/loop/toolbar-inverted@2x.png similarity index 100% rename from browser/extensions/loop/skin/linux/toolbar-inverted@2x.png rename to browser/themes/linux/loop/toolbar-inverted@2x.png diff --git a/browser/extensions/loop/skin/linux/toolbar.png b/browser/themes/linux/loop/toolbar.png similarity index 100% rename from browser/extensions/loop/skin/linux/toolbar.png rename to browser/themes/linux/loop/toolbar.png diff --git a/browser/extensions/loop/skin/linux/toolbar@2x.png b/browser/themes/linux/loop/toolbar@2x.png similarity index 100% rename from browser/extensions/loop/skin/linux/toolbar@2x.png rename to browser/themes/linux/loop/toolbar@2x.png diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css index 9fd2f5435881..8ab1b90fa505 100644 --- a/browser/themes/osx/browser.css +++ b/browser/themes/osx/browser.css @@ -3211,6 +3211,40 @@ menulist.translate-infobar-element > .menulist-dropmarker { } } +/* Loop/ Hello browser styles */ +notification[value="loop-sharing-notification"] { + background: #00a9dc; + padding: 0; + border: 0; +} + +notification[value="loop-sharing-notification"].paused { + background: #ebebeb; +} + +notification[value="loop-sharing-notification"] .notification-button { + background: #fff; + border-radius: 0; +} + +notification[value="loop-sharing-notification"].paused .notification-button { + background: #57bd35; +} + +notification[value="loop-sharing-notification"].paused .notification-button:hover { + background: #39a017; +} + +notification[value="loop-sharing-notification"] .notification-button:hover, +notification[value="loop-sharing-notification"].paused .notification-button-default:hover { + background: #ebebeb; +} + +notification[value="loop-sharing-notification"] .notification-button-default, +notification[value="loop-sharing-notification"].paused .notification-button-default { + background: #fff; +} + .popup-notification-body[popupid="addon-progress"], .popup-notification-body[popupid="addon-install-confirmation"] { width: 28em; diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn index 48911ec4ac93..067270e3d4ca 100644 --- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -73,6 +73,16 @@ browser.jar: skin/classic/browser/webRTC-sharingScreen-menubar.png skin/classic/browser/webRTC-sharingScreen-menubar@2x.png skin/classic/browser/webRTC-indicator.css + skin/classic/browser/loop/menuPanel.png (loop/menuPanel.png) + skin/classic/browser/loop/menuPanel@2x.png (loop/menuPanel@2x.png) + skin/classic/browser/loop/toolbar.png (loop/toolbar.png) + skin/classic/browser/loop/toolbar@2x.png (loop/toolbar@2x.png) + skin/classic/browser/loop/toolbar-inverted.png (loop/toolbar-inverted.png) + skin/classic/browser/loop/toolbar-inverted@2x.png (loop/toolbar-inverted@2x.png) + skin/classic/browser/yosemite/loop/menuPanel.png (loop/menuPanel-yosemite.png) + skin/classic/browser/yosemite/loop/menuPanel@2x.png (loop/menuPanel-yosemite@2x.png) + skin/classic/browser/yosemite/loop/toolbar.png (loop/toolbar-yosemite.png) + skin/classic/browser/yosemite/loop/toolbar@2x.png (loop/toolbar-yosemite@2x.png) * skin/classic/browser/controlcenter/panel.css (controlcenter/panel.css) skin/classic/browser/customizableui/background-noise-toolbar.png (customizableui/background-noise-toolbar.png) skin/classic/browser/customizableui/customize-titleBar-toggle.png (customizableui/customize-titleBar-toggle.png) @@ -270,6 +280,10 @@ browser.jar: % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/yosemite/Toolbar@2x.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel.png chrome://browser/skin/yosemite/menuPanel.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel@2x.png chrome://browser/skin/yosemite/menuPanel@2x.png os=Darwin osversion>=10.10 +% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/yosemite/loop/menuPanel.png os=Darwin osversion>=10.10 +% override chrome://browser/skin/loop/menuPanel@2x.png chrome://browser/skin/yosemite/loop/menuPanel@2x.png os=Darwin osversion>=10.10 +% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/yosemite/loop/toolbar.png os=Darwin osversion>=10.10 +% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/yosemite/loop/toolbar@2x.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel-customize.png chrome://browser/skin/yosemite/menuPanel-customize.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel-customize@2x.png chrome://browser/skin/yosemite/menuPanel-customize@2x.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel-exit.png chrome://browser/skin/yosemite/menuPanel-exit.png os=Darwin osversion>=10.10 diff --git a/browser/extensions/loop/skin/osx/menuPanel-yosemite.png b/browser/themes/osx/loop/menuPanel-yosemite.png similarity index 100% rename from browser/extensions/loop/skin/osx/menuPanel-yosemite.png rename to browser/themes/osx/loop/menuPanel-yosemite.png diff --git a/browser/extensions/loop/skin/osx/menuPanel-yosemite@2x.png b/browser/themes/osx/loop/menuPanel-yosemite@2x.png similarity index 100% rename from browser/extensions/loop/skin/osx/menuPanel-yosemite@2x.png rename to browser/themes/osx/loop/menuPanel-yosemite@2x.png diff --git a/browser/extensions/loop/skin/osx/menuPanel.png b/browser/themes/osx/loop/menuPanel.png similarity index 100% rename from browser/extensions/loop/skin/osx/menuPanel.png rename to browser/themes/osx/loop/menuPanel.png diff --git a/browser/extensions/loop/skin/osx/menuPanel@2x.png b/browser/themes/osx/loop/menuPanel@2x.png similarity index 100% rename from browser/extensions/loop/skin/osx/menuPanel@2x.png rename to browser/themes/osx/loop/menuPanel@2x.png diff --git a/browser/extensions/loop/skin/osx/toolbar-inverted.png b/browser/themes/osx/loop/toolbar-inverted.png similarity index 100% rename from browser/extensions/loop/skin/osx/toolbar-inverted.png rename to browser/themes/osx/loop/toolbar-inverted.png diff --git a/browser/extensions/loop/skin/osx/toolbar-inverted@2x.png b/browser/themes/osx/loop/toolbar-inverted@2x.png similarity index 100% rename from browser/extensions/loop/skin/osx/toolbar-inverted@2x.png rename to browser/themes/osx/loop/toolbar-inverted@2x.png diff --git a/browser/extensions/loop/skin/osx/toolbar-yosemite.png b/browser/themes/osx/loop/toolbar-yosemite.png similarity index 100% rename from browser/extensions/loop/skin/osx/toolbar-yosemite.png rename to browser/themes/osx/loop/toolbar-yosemite.png diff --git a/browser/extensions/loop/skin/osx/toolbar-yosemite@2x.png b/browser/themes/osx/loop/toolbar-yosemite@2x.png similarity index 100% rename from browser/extensions/loop/skin/osx/toolbar-yosemite@2x.png rename to browser/themes/osx/loop/toolbar-yosemite@2x.png diff --git a/browser/extensions/loop/skin/osx/toolbar.png b/browser/themes/osx/loop/toolbar.png similarity index 100% rename from browser/extensions/loop/skin/osx/toolbar.png rename to browser/themes/osx/loop/toolbar.png diff --git a/browser/extensions/loop/skin/osx/toolbar@2x.png b/browser/themes/osx/loop/toolbar@2x.png similarity index 100% rename from browser/extensions/loop/skin/osx/toolbar@2x.png rename to browser/themes/osx/loop/toolbar@2x.png diff --git a/browser/themes/shared/browser.inc b/browser/themes/shared/browser.inc index 904488a75030..52bf968c13f7 100644 --- a/browser/themes/shared/browser.inc +++ b/browser/themes/shared/browser.inc @@ -2,7 +2,7 @@ % Note that zoom-reset-button is a bit different since it doesn't use an image and thus has the image with display: none. %define nestedButtons #zoom-out-button, #zoom-reset-button, #zoom-in-button, #cut-button, #copy-button, #paste-button -%define primaryToolbarButtons #back-button, #forward-button, #home-button, #print-button, #downloads-button, #bookmarks-menu-button, #new-tab-button, #new-window-button, #fullscreen-button, #sync-button, #feed-button, #tabview-button, #social-share-button, #open-file-button, #find-button, #developer-button, #preferences-button, #privatebrowsing-button, #save-page-button, #add-ons-button, #history-panelmenu, #nav-bar-overflow-button, #PanelUI-menu-button, #characterencoding-button, #email-link-button, #sidebar-button, @nestedButtons@, #e10s-button, #panic-button, #web-apps-button, #webide-button, #pocket-button +%define primaryToolbarButtons #back-button, #forward-button, #home-button, #print-button, #downloads-button, #bookmarks-menu-button, #new-tab-button, #new-window-button, #fullscreen-button, #sync-button, #feed-button, #tabview-button, #social-share-button, #open-file-button, #find-button, #developer-button, #preferences-button, #privatebrowsing-button, #save-page-button, #add-ons-button, #history-panelmenu, #nav-bar-overflow-button, #PanelUI-menu-button, #characterencoding-button, #email-link-button, #sidebar-button, @nestedButtons@, #e10s-button, #panic-button, #web-apps-button, #webide-button, #loop-button, #pocket-button %ifdef XP_MACOSX % Prior to 10.7 there wasn't a native fullscreen button so we use #restore-button to exit fullscreen diff --git a/browser/themes/shared/menupanel.inc.css b/browser/themes/shared/menupanel.inc.css index c47973560d4a..785d0fac2d84 100644 --- a/browser/themes/shared/menupanel.inc.css +++ b/browser/themes/shared/menupanel.inc.css @@ -191,6 +191,42 @@ -moz-image-region: rect(0, 832px, 32px, 800px); } + #loop-button[cui-areatype="menu-panel"], + toolbarpaletteitem[place="palette"] > #loop-button { + list-style-image: url(chrome://browser/skin/loop/menuPanel.png); + -moz-image-region: rect(0, 32px, 32px, 0); + } + + /* Make sure that the state icons are not shown in the customization palette. */ + toolbarpaletteitem[place="palette"] > #loop-button { + -moz-image-region: rect(0, 32px, 32px, 0) !important; + } + + #loop-button[cui-areatype="menu-panel"][state="disabled"], + #loop-button[cui-areatype="menu-panel"][disabled="true"] { + -moz-image-region: rect(0, 64px, 32px, 32px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 96px, 32px, 64px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 128px, 32px, 96px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 160px, 32px, 128px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 192px, 32px, 160px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 224px, 32px, 192px); + } + /* Wide panel control icons */ #edit-controls@inAnyPanel@ > toolbarbutton, @@ -339,6 +375,42 @@ -moz-image-region: rect(64px, 1984px, 128px, 1920px); } + #loop-button[cui-areatype="menu-panel"], + toolbarpaletteitem[place="palette"] > #loop-button { + list-style-image: url(chrome://browser/skin/loop/menuPanel@2x.png); + -moz-image-region: rect(0, 64px, 64px, 0); + } + + /* Make sure that the state icons are not shown in the customization palette. */ + toolbarpaletteitem[place="palette"] > #loop-button { + -moz-image-region: rect(0, 64px, 64px, 0) !important; + } + + #loop-button[cui-areatype="menu-panel"][state="disabled"], + #loop-button[cui-areatype="menu-panel"][disabled="true"] { + -moz-image-region: rect(0, 128px, 64px, 64px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 192px, 64px, 128px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 256px, 64px, 192px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 320px, 64px, 256px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 384px, 64px, 320px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 448px, 64px, 384px); + } + #new-tab-button[cui-areatype="menu-panel"], toolbarpaletteitem[place="palette"] > #new-tab-button { -moz-image-region: rect(0px, 1088px, 64px, 1024px); diff --git a/browser/themes/shared/notification-icons.inc.css b/browser/themes/shared/notification-icons.inc.css index adfc829618a2..09e74f8829d7 100644 --- a/browser/themes/shared/notification-icons.inc.css +++ b/browser/themes/shared/notification-icons.inc.css @@ -445,3 +445,83 @@ } %endif } + +/* Loop notification */ +notification[value="loop-sharing-notification"] { + -moz-appearance: none; + height: 40px; + background-color: #00a9dc; + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; +} + +notification[value="loop-sharing-notification"].paused { + background-color: #ebebeb; +} + +notification[value="loop-sharing-notification"] .notification-inner { + color: #fff; + padding: 0; +} + +notification[value="loop-sharing-notification"].paused .notification-inner { + color: #00a9dc; +} + +notification[value="loop-sharing-notification"] .notification-button { + -moz-appearance: none; + background-color: #fff; + border: 0; + border-right: solid 1px #ebebeb; + width: 100px; + height: 40px; + margin: 0; + list-style-image: url(chrome://browser/content/loop/shared/img/pause-12x12.svg); + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; + text-shadow: none; +} + +notification[value="loop-sharing-notification"] .notification-button:-moz-locale-dir(rtl) { + border-right: 0; + border-left: solid 1px #ebebeb; +} + +notification[value="loop-sharing-notification"].paused .notification-button { + background-color: #57bd35; + color: #fff; + list-style-image: url(chrome://browser/content/loop/shared/img/play-12x12.svg); +} + +notification[value="loop-sharing-notification"].paused .notification-button:hover { + background-color: #39a017; +} + +notification[value="loop-sharing-notification"] .notification-button:hover, +notification[value="loop-sharing-notification"].paused .notification-button-default:hover { + background-color: #ebebeb; +} + +notification[value="loop-sharing-notification"] .notification-button-default, +notification[value="loop-sharing-notification"].paused .notification-button-default { + color: #d92215; + background-color: #fff; + border-right: 0; + list-style-image: url(chrome://browser/content/loop/shared/img/stop-12x12.svg); +} + +notification[value="loop-sharing-notification"] .notification-button .button-icon { + display: block; + -moz-margin-end: 6px; +} + +notification[value="loop-sharing-notification"] .button-menubutton-button { + min-width: 0; +} + +notification[value="loop-sharing-notification"] .messageImage { + list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-white); + margin-inline-start: 14px; +} + +notification[value="loop-sharing-notification"].paused .messageImage { + list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-still); +} \ No newline at end of file diff --git a/browser/themes/shared/social/chat.inc.css b/browser/themes/shared/social/chat.inc.css index b7fe906cd284..2d32b8ed54a3 100644 --- a/browser/themes/shared/social/chat.inc.css +++ b/browser/themes/shared/social/chat.inc.css @@ -105,12 +105,42 @@ chatbar > chatbox > .chat-titlebar > .chat-swap-button { transform: none; } +chatbox[src^="about:loopconversation#"] .chat-minimize-button { + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white"); +} + +chatbox[src^="about:loopconversation#"] .chat-swap-button { + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white"); +} + +.chat-loop-hangup { + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white"); + background-color: #d13f1a; + border: 1px solid #d13f1a; + border-top-right-radius: 4px; + width: 32px; + height: 26px; + margin-top: -6px; + margin-bottom: -5px; + -moz-margin-start: 6px; + -moz-margin-end: -5px; +} + +.chat-toolbarbutton.chat-loop-hangup:-moz-any(:hover,:hover:active) { + background-color: #ef6745; + border-color: #ef6745; +} + .chat-title { color: #666; text-shadow: none; cursor: inherit; } +chatbox[src^="about:loopconversation#"] .chat-title { + color: white; +} + .chat-titlebar { height: 26px; min-height: 26px; @@ -129,6 +159,11 @@ chatbar > chatbox > .chat-titlebar > .chat-swap-button { background-color: #f0f0f0; } +chatbox[src^="about:loopconversation#"] > .chat-titlebar { + background-color: #00a9dc; + border-color: #00a9dc; +} + .chat-titlebar > .notification-anchor-icon { margin-left: 2px; margin-right: 2px; diff --git a/browser/themes/shared/toolbarbuttons.inc.css b/browser/themes/shared/toolbarbuttons.inc.css index a899571fda43..4cafa3d117d3 100644 --- a/browser/themes/shared/toolbarbuttons.inc.css +++ b/browser/themes/shared/toolbarbuttons.inc.css @@ -184,6 +184,40 @@ toolbar[brighttext] #sync-button[status="active"] { -moz-image-region: rect(0, 720px, 18px, 702px); } +#loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar.png); + -moz-image-region: rect(0, 18px, 18px, 0); +} + +toolbar[brighttext] #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar-inverted.png); +} + +#loop-button[state="disabled"], +#loop-button[disabled="true"] { + -moz-image-region: rect(0, 36px, 18px, 18px); +} + +#loop-button:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 54px, 18px, 36px); +} + +#loop-button:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 72px, 18px, 54px); +} + +#loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 90px, 18px, 72px); +} + +#loop-button:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 108px, 18px, 90px); +} + +#loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 126px, 18px, 108px); +} + #webide-button[cui-areatype="toolbar"] { -moz-image-region: rect(0, 738px, 18px, 720px); } @@ -395,5 +429,39 @@ toolbar[brighttext] #sync-button[status="active"] { -moz-image-region: rect(36px, 1548px, 72px, 1512px); %endif } + + #loop-button { + list-style-image: url("chrome://browser/skin/loop/toolbar@2x.png"); + -moz-image-region: rect(0, 36px, 36px, 0); + } + + toolbar[brighttext] #loop-button { + list-style-image: url("chrome://browser/skin/loop/toolbar-inverted@2x.png"); + } + + #loop-button[state="disabled"], + #loop-button[disabled="true"] { + -moz-image-region: rect(0, 72px, 36px, 36px); + } + + #loop-button:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 108px, 36px, 72px); + } + + #loop-button:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 144px, 36px, 108px); + } + + #loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 180px, 36px, 144px); + } + + #loop-button:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 216px, 36px, 180px); + } + + #loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 252px, 36px, 216px); + } } %endif diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css index ddf756c7ebeb..2e1066f3bd84 100644 --- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css @@ -652,6 +652,16 @@ menuitem.bookmark-item { #bookmarks-menu-button.toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon { list-style-image: url("chrome://browser/skin/Toolbar-lunaSilver.png"); } + + #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver.png) + } +} + +@media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { + #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver@2x.png) + } } #main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-icon, diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn index 43cc06470123..6006c67bfb2c 100644 --- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -83,6 +83,22 @@ browser.jar: skin/classic/browser/urlbar-history-dropmarker-XPVista7.png skin/classic/browser/urlbar-history-dropmarker-XPVista7@2x.png skin/classic/browser/webRTC-indicator.css + skin/classic/browser/loop/menuPanel.png (loop/menuPanel.png) + skin/classic/browser/loop/menuPanel@2x.png (loop/menuPanel@2x.png) + skin/classic/browser/loop/menuPanel-aero.png (loop/menuPanel-aero.png) + skin/classic/browser/loop/menuPanel-aero@2x.png (loop/menuPanel-aero@2x.png) + skin/classic/browser/loop/toolbar.png (loop/toolbar.png) + skin/classic/browser/loop/toolbar@2x.png (loop/toolbar@2x.png) + skin/classic/browser/loop/toolbar-aero.png (loop/toolbar-aero.png) + skin/classic/browser/loop/toolbar-aero@2x.png (loop/toolbar-aero@2x.png) + skin/classic/browser/loop/toolbar-inverted.png (loop/toolbar-inverted.png) + skin/classic/browser/loop/toolbar-inverted@2x.png (loop/toolbar-inverted@2x.png) + skin/classic/browser/loop/toolbar-lunaSilver.png (loop/toolbar-lunaSilver.png) + skin/classic/browser/loop/toolbar-lunaSilver@2x.png (loop/toolbar-lunaSilver@2x.png) + skin/classic/browser/loop/toolbar-win8.png (loop/toolbar-win8.png) + skin/classic/browser/loop/toolbar-win8@2x.png (loop/toolbar-win8@2x.png) + skin/classic/browser/loop/toolbar-XP.png (loop/toolbar-XP.png) + skin/classic/browser/loop/toolbar-XP@2x.png (loop/toolbar-XP@2x.png) * skin/classic/browser/controlcenter/panel.css (controlcenter/panel.css) skin/classic/browser/customizableui/background-noise-toolbar.png (customizableui/background-noise-toolbar.png) skin/classic/browser/customizableui/customize-titleBar-toggle.png (customizableui/customize-titleBar-toggle.png) @@ -309,11 +325,26 @@ browser.jar: % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/Toolbar-aero@2x.png os=WINNT osversion=6.1 % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/Toolbar-win8@2x.png os=WINNT osversion=6.2 % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/Toolbar-win8@2x.png os=WINNT osversion=6.3 +% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/loop/menuPanel-aero.png os=WINNT osversion=6 +% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/loop/menuPanel-aero.png os=WINNT osversion=6.1 +% override chrome://browser/skin/loop/menuPanel@2x.png chrome://browser/skin/loop/menuPanel-aero@2x.png os=WINNT osversion=6 +% override chrome://browser/skin/loop/menuPanel@2x.png chrome://browser/skin/loop/menuPanel-aero@2x.png os=WINNT osversion=6.1 + % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-XP.png os=WINNT osversion<6 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-aero.png os=WINNT osversion=6 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-aero.png os=WINNT osversion=6.1 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-win8.png os=WINNT osversion=6.2 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-win8.png os=WINNT osversion=6.3 +% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-XP.png os=WINNT osversion<6 +% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-aero.png os=WINNT osversion=6 +% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-aero.png os=WINNT osversion=6.1 +% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-win8.png os=WINNT osversion=6.2 +% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-win8.png os=WINNT osversion=6.3 +% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-XP@2x.png os=WINNT osversion<6 +% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-aero@2x.png os=WINNT osversion=6 +% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-aero@2x.png os=WINNT osversion=6.1 +% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-win8@2x.png os=WINNT osversion=6.2 +% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-win8@2x.png os=WINNT osversion=6.3 % override chrome://browser/skin/preferences/checkbox.png chrome://browser/skin/preferences/checkbox-aero.png os=WINNT osversion=6 % override chrome://browser/skin/preferences/checkbox.png chrome://browser/skin/preferences/checkbox-aero.png os=WINNT osversion=6.1 % override chrome://browser/skin/preferences/checkbox.png chrome://browser/skin/preferences/checkbox-xp.png os=WINNT osversion<6 diff --git a/browser/extensions/loop/skin/windows/menuPanel-aero.png b/browser/themes/windows/loop/menuPanel-aero.png similarity index 100% rename from browser/extensions/loop/skin/windows/menuPanel-aero.png rename to browser/themes/windows/loop/menuPanel-aero.png diff --git a/browser/extensions/loop/skin/windows/menuPanel-aero@2x.png b/browser/themes/windows/loop/menuPanel-aero@2x.png similarity index 100% rename from browser/extensions/loop/skin/windows/menuPanel-aero@2x.png rename to browser/themes/windows/loop/menuPanel-aero@2x.png diff --git a/browser/extensions/loop/skin/windows/menuPanel.png b/browser/themes/windows/loop/menuPanel.png similarity index 100% rename from browser/extensions/loop/skin/windows/menuPanel.png rename to browser/themes/windows/loop/menuPanel.png diff --git a/browser/extensions/loop/skin/windows/menuPanel@2x.png b/browser/themes/windows/loop/menuPanel@2x.png similarity index 100% rename from browser/extensions/loop/skin/windows/menuPanel@2x.png rename to browser/themes/windows/loop/menuPanel@2x.png diff --git a/browser/extensions/loop/skin/windows/toolbar-XP.png b/browser/themes/windows/loop/toolbar-XP.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-XP.png rename to browser/themes/windows/loop/toolbar-XP.png diff --git a/browser/extensions/loop/skin/windows/toolbar-XP@2x.png b/browser/themes/windows/loop/toolbar-XP@2x.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-XP@2x.png rename to browser/themes/windows/loop/toolbar-XP@2x.png diff --git a/browser/extensions/loop/skin/windows/toolbar-aero.png b/browser/themes/windows/loop/toolbar-aero.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-aero.png rename to browser/themes/windows/loop/toolbar-aero.png diff --git a/browser/extensions/loop/skin/windows/toolbar-aero@2x.png b/browser/themes/windows/loop/toolbar-aero@2x.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-aero@2x.png rename to browser/themes/windows/loop/toolbar-aero@2x.png diff --git a/browser/extensions/loop/skin/windows/toolbar-inverted.png b/browser/themes/windows/loop/toolbar-inverted.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-inverted.png rename to browser/themes/windows/loop/toolbar-inverted.png diff --git a/browser/extensions/loop/skin/windows/toolbar-inverted@2x.png b/browser/themes/windows/loop/toolbar-inverted@2x.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-inverted@2x.png rename to browser/themes/windows/loop/toolbar-inverted@2x.png diff --git a/browser/extensions/loop/skin/windows/toolbar-lunaSilver.png b/browser/themes/windows/loop/toolbar-lunaSilver.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-lunaSilver.png rename to browser/themes/windows/loop/toolbar-lunaSilver.png diff --git a/browser/extensions/loop/skin/windows/toolbar-lunaSilver@2x.png b/browser/themes/windows/loop/toolbar-lunaSilver@2x.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-lunaSilver@2x.png rename to browser/themes/windows/loop/toolbar-lunaSilver@2x.png diff --git a/browser/extensions/loop/skin/windows/toolbar-win8.png b/browser/themes/windows/loop/toolbar-win8.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-win8.png rename to browser/themes/windows/loop/toolbar-win8.png diff --git a/browser/extensions/loop/skin/windows/toolbar-win8@2x.png b/browser/themes/windows/loop/toolbar-win8@2x.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar-win8@2x.png rename to browser/themes/windows/loop/toolbar-win8@2x.png diff --git a/browser/extensions/loop/skin/windows/toolbar.png b/browser/themes/windows/loop/toolbar.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar.png rename to browser/themes/windows/loop/toolbar.png diff --git a/browser/extensions/loop/skin/windows/toolbar@2x.png b/browser/themes/windows/loop/toolbar@2x.png similarity index 100% rename from browser/extensions/loop/skin/windows/toolbar@2x.png rename to browser/themes/windows/loop/toolbar@2x.png diff --git a/testing/marionette/client/marionette/tests/unit-tests.ini b/testing/marionette/client/marionette/tests/unit-tests.ini index 5786ad6835f5..aa9e73058eda 100644 --- a/testing/marionette/client/marionette/tests/unit-tests.ini +++ b/testing/marionette/client/marionette/tests/unit-tests.ini @@ -19,4 +19,4 @@ test_container = true [include:../../../../../layout/base/tests/marionette/manifest.ini] ; loop tests -[include:../../../../../browser/extensions/loop/manifest.ini] +[include:../../../../../browser/components/loop/manifest.ini] diff --git a/testing/profiles/prefs_general.js b/testing/profiles/prefs_general.js index 949414856781..637b4e4704f2 100644 --- a/testing/profiles/prefs_general.js +++ b/testing/profiles/prefs_general.js @@ -286,7 +286,7 @@ user_pref("browser.newtabpage.directory.ping", ""); user_pref("loop.debug.loglevel", "All"); user_pref("loop.enabled", true); user_pref("loop.throttled", false); -user_pref("loop.server", "http://%(server)s/browser/browser/extensions/loop/test/mochitest/loop_fxa.sjs?"); +user_pref("loop.server", "http://%(server)s/browser/browser/components/loop/test/mochitest/loop_fxa.sjs?"); user_pref("loop.CSP","default-src 'self' about: file: chrome: data: wss://* http://* https://*"); // Ensure UITour won't hit the network From 6c3da9ec36631906d40be41e4609d9af2123e578 Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Fri, 27 Nov 2015 22:40:54 -0800 Subject: [PATCH 116/153] Back out 4 changesets (bug 1209184) for Android/B2G xpcshell bustage CLOSED TREE Backed out changeset 8e692344588a (bug 1209184) Backed out changeset f9ab76689610 (bug 1209184) Backed out changeset 9c63ffd499eb (bug 1209184) Backed out changeset e75f9f24d0dc (bug 1209184) --- .../protocol/res/ExtensionProtocolHandler.cpp | 113 ---------------- .../protocol/res/ExtensionProtocolHandler.h | 2 - .../res/SubstitutingProtocolHandler.cpp | 5 +- .../res/SubstitutingProtocolHandler.h | 7 - .../extensions/ExtensionManagement.jsm | 2 - toolkit/components/extensions/moz.build | 2 - .../extensions/test/mochitest/mochitest.ini | 1 - .../test/mochitest/test_ext_i18n_css.html | 117 ---------------- .../extensions/test/xpcshell/head.js | 10 -- .../test/xpcshell/test_locale_converter.js | 118 ---------------- .../extensions/test/xpcshell/xpcshell.ini | 4 - toolkit/components/utils/simpleServices.js | 127 +----------------- toolkit/components/utils/utils.manifest | 2 - 13 files changed, 5 insertions(+), 505 deletions(-) delete mode 100644 toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html delete mode 100644 toolkit/components/extensions/test/xpcshell/head.js delete mode 100644 toolkit/components/extensions/test/xpcshell/test_locale_converter.js delete mode 100644 toolkit/components/extensions/test/xpcshell/xpcshell.ini diff --git a/netwerk/protocol/res/ExtensionProtocolHandler.cpp b/netwerk/protocol/res/ExtensionProtocolHandler.cpp index b1e2648dc788..8b5bb37ad07a 100644 --- a/netwerk/protocol/res/ExtensionProtocolHandler.cpp +++ b/netwerk/protocol/res/ExtensionProtocolHandler.cpp @@ -8,16 +8,6 @@ #include "nsIAddonPolicyService.h" #include "nsServiceManagerUtils.h" -#include "nsIURL.h" -#include "nsIChannel.h" -#include "nsIStreamListener.h" -#include "nsIRequestObserver.h" -#include "nsIInputStreamChannel.h" -#include "nsIInputStream.h" -#include "nsIOutputStream.h" -#include "nsIStreamConverterService.h" -#include "nsIPipe.h" -#include "nsNetUtil.h" namespace mozilla { @@ -43,107 +33,4 @@ ExtensionProtocolHandler::GetFlagsForURI(nsIURI* aURI, uint32_t* aFlags) return NS_OK; } -class PipeCloser : public nsIRequestObserver -{ -public: - NS_DECL_ISUPPORTS - - explicit PipeCloser(nsIOutputStream* aOutputStream) : - mOutputStream(aOutputStream) - { - } - - NS_IMETHOD OnStartRequest(nsIRequest*, nsISupports*) override - { - return NS_OK; - } - - NS_IMETHOD OnStopRequest(nsIRequest*, nsISupports*, nsresult aStatusCode) override - { - NS_ENSURE_TRUE(mOutputStream, NS_ERROR_UNEXPECTED); - - nsresult rv = mOutputStream->Close(); - mOutputStream = nullptr; - return rv; - } - -protected: - virtual ~PipeCloser() {} - -private: - nsCOMPtr mOutputStream; -}; - -NS_IMPL_ISUPPORTS(PipeCloser, nsIRequestObserver) - -nsresult -ExtensionProtocolHandler::SubstituteChannel(nsIURI* aURI, - nsILoadInfo* aLoadInfo, - nsIChannel** result) -{ - nsresult rv; - nsCOMPtr url = do_QueryInterface(aURI, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - nsAutoCString ext; - rv = url->GetFileExtension(ext); - NS_ENSURE_SUCCESS(rv, rv); - - if (!ext.LowerCaseEqualsLiteral("css")) { - return NS_OK; - } - - // Filter CSS files to replace locale message tokens with localized strings. - - nsCOMPtr convService = - do_GetService(NS_STREAMCONVERTERSERVICE_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - const char* kFromType = "application/vnd.mozilla.webext.unlocalized"; - const char* kToType = "text/css"; - - nsCOMPtr inputStream; - if (aLoadInfo && aLoadInfo->GetSecurityMode()) { - // Certain security checks require an async channel. - - nsCOMPtr outputStream; - rv = NS_NewPipe(getter_AddRefs(inputStream), getter_AddRefs(outputStream), - 0, UINT32_MAX, true, false); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr listener; - nsCOMPtr observer = new PipeCloser(outputStream); - rv = NS_NewSimpleStreamListener(getter_AddRefs(listener), outputStream, observer); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr converter; - rv = convService->AsyncConvertData(kFromType, kToType, listener, - aURI, getter_AddRefs(converter)); - NS_ENSURE_SUCCESS(rv, rv); - - rv = (*result)->AsyncOpen2(converter); - } else { - // Stylesheet loads for extension content scripts require a sync channel, - // but fortunately do not invoke security checks. - - nsCOMPtr sourceStream; - rv = (*result)->Open(getter_AddRefs(sourceStream)); - NS_ENSURE_SUCCESS(rv, rv); - - rv = convService->Convert(sourceStream, kFromType, kToType, - aURI, getter_AddRefs(inputStream)); - } - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr channel; - rv = NS_NewInputStreamChannelInternal(getter_AddRefs(channel), aURI, inputStream, - NS_LITERAL_CSTRING("text/css"), - NS_LITERAL_CSTRING("utf-8"), - aLoadInfo); - NS_ENSURE_SUCCESS(rv, rv); - - channel.swap(*result); - return NS_OK; -} - } // namespace mozilla diff --git a/netwerk/protocol/res/ExtensionProtocolHandler.h b/netwerk/protocol/res/ExtensionProtocolHandler.h index d30fd4630e77..48f7c4dfe2df 100644 --- a/netwerk/protocol/res/ExtensionProtocolHandler.h +++ b/netwerk/protocol/res/ExtensionProtocolHandler.h @@ -39,8 +39,6 @@ protected: return false; } - - virtual nsresult SubstituteChannel(nsIURI* uri, nsILoadInfo* aLoadInfo, nsIChannel** result) override; }; } // namespace mozilla diff --git a/netwerk/protocol/res/SubstitutingProtocolHandler.cpp b/netwerk/protocol/res/SubstitutingProtocolHandler.cpp index 181aabd72a54..6a2784b21351 100644 --- a/netwerk/protocol/res/SubstitutingProtocolHandler.cpp +++ b/netwerk/protocol/res/SubstitutingProtocolHandler.cpp @@ -253,10 +253,7 @@ SubstitutingProtocolHandler::NewChannel2(nsIURI* uri, nsLoadFlags loadFlags = 0; (*result)->GetLoadFlags(&loadFlags); (*result)->SetLoadFlags(loadFlags & ~nsIChannel::LOAD_REPLACE); - rv = (*result)->SetOriginalURI(uri); - NS_ENSURE_SUCCESS(rv, rv); - - return SubstituteChannel(uri, aLoadInfo, result); + return (*result)->SetOriginalURI(uri); } nsresult diff --git a/netwerk/protocol/res/SubstitutingProtocolHandler.h b/netwerk/protocol/res/SubstitutingProtocolHandler.h index e48f259480d0..1e9f5de251c5 100644 --- a/netwerk/protocol/res/SubstitutingProtocolHandler.h +++ b/netwerk/protocol/res/SubstitutingProtocolHandler.h @@ -59,13 +59,6 @@ protected: return false; } - // Override this in the subclass to check for special case when opening - // channels. - virtual nsresult SubstituteChannel(nsIURI* uri, nsILoadInfo* aLoadInfo, nsIChannel** result) - { - return NS_OK; - } - nsIIOService* IOService() { return mIOService; } private: diff --git a/toolkit/components/extensions/ExtensionManagement.jsm b/toolkit/components/extensions/ExtensionManagement.jsm index 88568e5516c1..0e40ad4d486d 100644 --- a/toolkit/components/extensions/ExtensionManagement.jsm +++ b/toolkit/components/extensions/ExtensionManagement.jsm @@ -135,7 +135,6 @@ var Service = { this.uuidMap.set(uuid, extension); this.aps.setAddonLoadURICallback(extension.id, this.checkAddonMayLoad.bind(this, extension)); - this.aps.setAddonLocalizeCallback(extension.id, extension.localize.bind(extension)); }, // Called when an extension is unloaded. @@ -143,7 +142,6 @@ var Service = { let extension = this.uuidMap.get(uuid); this.uuidMap.delete(uuid); this.aps.setAddonLoadURICallback(extension.id, null); - this.aps.setAddonLocalizeCallback(extension.id, null); let handler = Services.io.getProtocolHandler("moz-extension"); handler.QueryInterface(Ci.nsISubstitutingProtocolHandler); diff --git a/toolkit/components/extensions/moz.build b/toolkit/components/extensions/moz.build index 76afd553ce6c..614b05507adf 100644 --- a/toolkit/components/extensions/moz.build +++ b/toolkit/components/extensions/moz.build @@ -15,5 +15,3 @@ EXTRA_JS_MODULES += [ JAR_MANIFESTS += ['jar.mn'] MOCHITEST_MANIFESTS += ['test/mochitest/mochitest.ini'] - -XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell/xpcshell.ini'] diff --git a/toolkit/components/extensions/test/mochitest/mochitest.ini b/toolkit/components/extensions/test/mochitest/mochitest.ini index dbf39531c736..e535b5d638a5 100644 --- a/toolkit/components/extensions/test/mochitest/mochitest.ini +++ b/toolkit/components/extensions/test/mochitest/mochitest.ini @@ -21,7 +21,6 @@ support-files = [test_ext_simple.html] [test_ext_geturl.html] [test_ext_contentscript.html] -[test_ext_i18n_css.html] [test_ext_webrequest.html] [test_ext_generate.html] [test_ext_localStorage.html] diff --git a/toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html b/toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html deleted file mode 100644 index cc396705a4b1..000000000000 --- a/toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - Test for content script - - - - - - - - - - - - diff --git a/toolkit/components/extensions/test/xpcshell/head.js b/toolkit/components/extensions/test/xpcshell/head.js deleted file mode 100644 index 71823e9e8284..000000000000 --- a/toolkit/components/extensions/test/xpcshell/head.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; - -const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; - -Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", - "resource://gre/modules/NetUtil.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "Services", - "resource://gre/modules/Services.jsm"); diff --git a/toolkit/components/extensions/test/xpcshell/test_locale_converter.js b/toolkit/components/extensions/test/xpcshell/test_locale_converter.js deleted file mode 100644 index 4b3f6c4e156a..000000000000 --- a/toolkit/components/extensions/test/xpcshell/test_locale_converter.js +++ /dev/null @@ -1,118 +0,0 @@ -"use strict"; - -const convService = Cc["@mozilla.org/streamConverters;1"] - .getService(Ci.nsIStreamConverterService); - -const UUID = "72b61ee3-aceb-476c-be1b-0822b036c9f1"; -const ADDON_ID = "test@web.extension"; -const URI = NetUtil.newURI(`moz-extension://${UUID}/file.css`); - -const FROM_TYPE = "application/vnd.mozilla.webext.unlocalized"; -const TO_TYPE = "text/css"; - - -function StringStream(string) { - let stream = Cc["@mozilla.org/io/string-input-stream;1"] - .createInstance(Ci.nsIStringInputStream); - - stream.data = string; - return stream; -} - - -// Initialize the policy service with a stub localizer for our -// add-on ID. -add_task(function* init() { - const aps = Cc["@mozilla.org/addons/policy-service;1"] - .getService(Ci.nsIAddonPolicyService).wrappedJSObject; - - let oldCallback = aps.setExtensionURIToAddonIdCallback(uri => { - if (uri.host == UUID) { - return ADDON_ID; - } - }); - - aps.setAddonLocalizeCallback(ADDON_ID, string => { - return string.replace(/__MSG_(.*?)__/g, ""); - }); - - do_register_cleanup(() => { - aps.setExtensionURIToAddonIdCallback(oldCallback); - aps.setAddonLocalizeCallback(ADDON_ID, null); - }); -}); - - -// Test that the synchronous converter works as expected with a -// simple string. -add_task(function* testSynchronousConvert() { - let stream = StringStream("Foo __MSG_xxx__ bar __MSG_yyy__ baz"); - - let resultStream = convService.convert(stream, FROM_TYPE, TO_TYPE, URI); - - let result = NetUtil.readInputStreamToString(resultStream, resultStream.available()); - - equal(result, "Foo bar baz"); -}); - - -// Test that the asynchronous converter works as expected with input -// split into multiple chunks, and a boundary in the middle of a -// replacement token. -add_task(function* testAsyncConvert() { - let listener; - let awaitResult = new Promise((resolve, reject) => { - listener = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]), - - onDataAvailable(request, context, inputStream, offset, count) { - this.resultParts.push(NetUtil.readInputStreamToString(inputStream, count)); - }, - - onStartRequest() { - ok(!("resultParts" in this)); - this.resultParts = []; - }, - - onStopRequest(request, context, statusCode) { - if (!Components.isSuccessCode(statusCode)) { - reject(new Error(statusCode)); - } - - resolve(this.resultParts.join("\n")); - }, - }; - }); - - let parts = ["Foo __MSG_x", "xx__ bar __MSG_yyy__ baz"]; - - let converter = convService.asyncConvertData(FROM_TYPE, TO_TYPE, listener, URI); - converter.onStartRequest(null, null); - - for (let part of parts) { - converter.onDataAvailable(null, null, StringStream(part), 0, part.length); - } - - converter.onStopRequest(null, null, Cr.NS_OK); - - - let result = yield awaitResult; - equal(result, "Foo bar baz"); -}); - - -// Test that attempting to initialize a converter with the URI of a -// nonexistent WebExtension fails. -add_task(function* testInvalidUUID() { - let uri = NetUtil.newURI("moz-extension://eb4f3be8-41c9-4970-aa6d-b84d1ecc02b2/file.css"); - - Assert.throws(() => { - convService.convert(stream, FROM_TYPE, TO_TYPE, uri); - }); - - Assert.throws(() => { - let listener = { QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]) }; - - convService.asyncConvertData(FROM_TYPE, TO_TYPE, listener, uri); - }); -}); diff --git a/toolkit/components/extensions/test/xpcshell/xpcshell.ini b/toolkit/components/extensions/test/xpcshell/xpcshell.ini deleted file mode 100644 index 2e2e9380aa5d..000000000000 --- a/toolkit/components/extensions/test/xpcshell/xpcshell.ini +++ /dev/null @@ -1,4 +0,0 @@ -[DEFAULT] -head = head.js - -[test_locale_converter.js] diff --git a/toolkit/components/utils/simpleServices.js b/toolkit/components/utils/simpleServices.js index 047aa8075539..608c62475803 100644 --- a/toolkit/components/utils/simpleServices.js +++ b/toolkit/components/utils/simpleServices.js @@ -12,17 +12,11 @@ "use strict"; -const Cc = Components.classes; const Cu = Components.utils; const Ci = Components.interfaces; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", - "resource://gre/modules/NetUtil.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "Services", - "resource://gre/modules/Services.jsm"); - function RemoteTagServiceService() { } @@ -54,7 +48,6 @@ function AddonPolicyService() { this.wrappedJSObject = this; this.mayLoadURICallbacks = new Map(); - this.localizeCallbacks = new Map(); } AddonPolicyService.prototype = { @@ -69,19 +62,10 @@ AddonPolicyService.prototype = { * @see nsIAddonPolicyService.addonMayLoadURI */ addonMayLoadURI(aAddonId, aURI) { - let cb = this.mayLoadURICallbacks.get(aAddonId); + let cb = this.mayLoadURICallbacks[aAddonId]; return cb ? cb(aURI) : false; }, - /* - * Invokes a callback (if any) associated with the addon to loclaize a - * resource belonging to that add-on. - */ - localizeAddonString(aAddonId, aString) { - let cb = this.localizeCallbacks.get(aAddonId); - return cb ? cb(aString) : aString; - }, - /* * Invokes a callback (if any) to determine if an extension URI should be * web-accessible. @@ -121,21 +105,9 @@ AddonPolicyService.prototype = { */ setAddonLoadURICallback(aAddonId, aCallback) { if (aCallback) { - this.mayLoadURICallbacks.set(aAddonId, aCallback); + this.mayLoadURICallbacks[aAddonId] = aCallback; } else { - delete this.mayLoadURICallbacks.delete(aAddonId); - } - }, - - /* - * Sets the callbacks used by the stream converter service to localize - * add-on resources. - */ - setAddonLocalizeCallback(aAddonId, aCallback) { - if (aCallback) { - this.localizeCallbacks.set(aAddonId, aCallback); - } else { - delete this.localizeCallbacks.delete(aAddonId); + delete this.mayLoadURICallbacks[aAddonId]; } }, @@ -162,95 +134,4 @@ AddonPolicyService.prototype = { } }; -/* - * This class provides a stream filter for locale messages in CSS files served - * by the moz-extension: protocol handler. - * - * See SubstituteChannel in netwerk/protocol/res/ExtensionProtocolHandler.cpp - * for usage. - */ -function AddonLocalizationConverter() -{ - this.aps = Cc["@mozilla.org/addons/policy-service;1"].getService(Ci.nsIAddonPolicyService) - .wrappedJSObject; -} - -AddonLocalizationConverter.prototype = { - classID: Components.ID("{ded150e3-c92e-4077-a396-0dba9953e39f}"), - QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamConverter]), - - FROM_TYPE: "application/vnd.mozilla.webext.unlocalized", - TO_TYPE: "text/css", - - checkTypes(aFromType, aToType) { - if (aFromType != this.FROM_TYPE) { - throw Components.Exception("Invalid aFromType value", Cr.NS_ERROR_INVALID_ARG, - Components.stack.caller.caller); - } - if (aToType != this.TO_TYPE) { - throw Components.Exception("Invalid aToType value", Cr.NS_ERROR_INVALID_ARG, - Components.stack.caller.caller); - } - }, - - // aContext must be a nsIURI object for a valid moz-extension: URL. - getAddonId(aContext) { - // In this case, we want the add-on ID even if the URL is web accessible, - // so check the root rather than the exact path. - let uri = Services.io.newURI("/", null, aContext); - - let id = this.aps.extensionURIToAddonId(uri); - if (id == undefined) { - throw new Components.Exception("Invalid context", Cr.NS_ERROR_INVALID_ARG); - } - return id; - }, - - convertToStream(aAddonId, aString) { - let stream = Cc["@mozilla.org/io/string-input-stream;1"] - .createInstance(Ci.nsIStringInputStream); - - stream.data = this.aps.localizeAddonString(aAddonId, aString); - return stream; - }, - - convert(aStream, aFromType, aToType, aContext) { - this.checkTypes(aFromType, aToType); - let addonId = this.getAddonId(aContext); - - let string = NetUtil.readInputStreamToString(aStream, aStream.available()); - return this.convertToStream(addonId, string); - }, - - asyncConvertData(aFromType, aToType, aListener, aContext) { - this.checkTypes(aFromType, aToType); - this.addonId = this.getAddonId(aContext); - this.listener = aListener; - }, - - onStartRequest(aRequest, aContext) { - this.parts = []; - }, - - onDataAvailable(aRequest, aContext, aInputStream, aOffset, aCount) { - this.parts.push(NetUtil.readInputStreamToString(aInputStream, aCount)); - }, - - onStopRequest(aRequest, aContext, aStatusCode) { - try { - this.listener.onStartRequest(aRequest, null); - if (Components.isSuccessCode(aStatusCode)) { - let string = this.parts.join(""); - let stream = this.convertToStream(this.addonId, string); - - this.listener.onDataAvailable(aRequest, null, stream, 0, stream.data.length); - } - } catch (e) { - aStatusCode = e.result || Cr.NS_ERROR_FAILURE; - } - this.listener.onStopRequest(aRequest, null, aStatusCode); - }, -}; - -this.NSGetFactory = XPCOMUtils.generateNSGetFactory([RemoteTagServiceService, AddonPolicyService, - AddonLocalizationConverter]); +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([RemoteTagServiceService, AddonPolicyService]); diff --git a/toolkit/components/utils/utils.manifest b/toolkit/components/utils/utils.manifest index b2d30bd98db6..b08c5d519e13 100644 --- a/toolkit/components/utils/utils.manifest +++ b/toolkit/components/utils/utils.manifest @@ -2,5 +2,3 @@ component {dfd07380-6083-11e4-9803-0800200c9a66} simpleServices.js contract @mozilla.org/addons/remote-tag-service;1 {dfd07380-6083-11e4-9803-0800200c9a66} component {89560ed3-72e3-498d-a0e8-ffe50334d7c5} simpleServices.js contract @mozilla.org/addons/policy-service;1 {89560ed3-72e3-498d-a0e8-ffe50334d7c5} -component {ded150e3-c92e-4077-a396-0dba9953e39f} simpleServices.js -contract @mozilla.org/streamconv;1?from=application/vnd.mozilla.webext.unlocalized&to=text/css {ded150e3-c92e-4077-a396-0dba9953e39f} From 1c4163c30768fb8995d54ce05ac43dbd1eb38f4b Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Fri, 20 Nov 2015 22:39:44 -0800 Subject: [PATCH 117/153] Bug 1209184: Part 1b - [webext] Create a stream converter for localization placeholders. r=billm --HG-- extra : commitid : 2ksN8QqqAqR extra : source : e75f9f24d0dc7c08131ebc08b0dcfcb4f310269c --- .../extensions/ExtensionManagement.jsm | 2 + toolkit/components/utils/simpleServices.js | 127 +++++++++++++++++- toolkit/components/utils/utils.manifest | 2 + 3 files changed, 127 insertions(+), 4 deletions(-) diff --git a/toolkit/components/extensions/ExtensionManagement.jsm b/toolkit/components/extensions/ExtensionManagement.jsm index 0e40ad4d486d..88568e5516c1 100644 --- a/toolkit/components/extensions/ExtensionManagement.jsm +++ b/toolkit/components/extensions/ExtensionManagement.jsm @@ -135,6 +135,7 @@ var Service = { this.uuidMap.set(uuid, extension); this.aps.setAddonLoadURICallback(extension.id, this.checkAddonMayLoad.bind(this, extension)); + this.aps.setAddonLocalizeCallback(extension.id, extension.localize.bind(extension)); }, // Called when an extension is unloaded. @@ -142,6 +143,7 @@ var Service = { let extension = this.uuidMap.get(uuid); this.uuidMap.delete(uuid); this.aps.setAddonLoadURICallback(extension.id, null); + this.aps.setAddonLocalizeCallback(extension.id, null); let handler = Services.io.getProtocolHandler("moz-extension"); handler.QueryInterface(Ci.nsISubstitutingProtocolHandler); diff --git a/toolkit/components/utils/simpleServices.js b/toolkit/components/utils/simpleServices.js index 608c62475803..047aa8075539 100644 --- a/toolkit/components/utils/simpleServices.js +++ b/toolkit/components/utils/simpleServices.js @@ -12,11 +12,17 @@ "use strict"; +const Cc = Components.classes; const Cu = Components.utils; const Ci = Components.interfaces; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", + "resource://gre/modules/NetUtil.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Services", + "resource://gre/modules/Services.jsm"); + function RemoteTagServiceService() { } @@ -48,6 +54,7 @@ function AddonPolicyService() { this.wrappedJSObject = this; this.mayLoadURICallbacks = new Map(); + this.localizeCallbacks = new Map(); } AddonPolicyService.prototype = { @@ -62,10 +69,19 @@ AddonPolicyService.prototype = { * @see nsIAddonPolicyService.addonMayLoadURI */ addonMayLoadURI(aAddonId, aURI) { - let cb = this.mayLoadURICallbacks[aAddonId]; + let cb = this.mayLoadURICallbacks.get(aAddonId); return cb ? cb(aURI) : false; }, + /* + * Invokes a callback (if any) associated with the addon to loclaize a + * resource belonging to that add-on. + */ + localizeAddonString(aAddonId, aString) { + let cb = this.localizeCallbacks.get(aAddonId); + return cb ? cb(aString) : aString; + }, + /* * Invokes a callback (if any) to determine if an extension URI should be * web-accessible. @@ -105,9 +121,21 @@ AddonPolicyService.prototype = { */ setAddonLoadURICallback(aAddonId, aCallback) { if (aCallback) { - this.mayLoadURICallbacks[aAddonId] = aCallback; + this.mayLoadURICallbacks.set(aAddonId, aCallback); } else { - delete this.mayLoadURICallbacks[aAddonId]; + delete this.mayLoadURICallbacks.delete(aAddonId); + } + }, + + /* + * Sets the callbacks used by the stream converter service to localize + * add-on resources. + */ + setAddonLocalizeCallback(aAddonId, aCallback) { + if (aCallback) { + this.localizeCallbacks.set(aAddonId, aCallback); + } else { + delete this.localizeCallbacks.delete(aAddonId); } }, @@ -134,4 +162,95 @@ AddonPolicyService.prototype = { } }; -this.NSGetFactory = XPCOMUtils.generateNSGetFactory([RemoteTagServiceService, AddonPolicyService]); +/* + * This class provides a stream filter for locale messages in CSS files served + * by the moz-extension: protocol handler. + * + * See SubstituteChannel in netwerk/protocol/res/ExtensionProtocolHandler.cpp + * for usage. + */ +function AddonLocalizationConverter() +{ + this.aps = Cc["@mozilla.org/addons/policy-service;1"].getService(Ci.nsIAddonPolicyService) + .wrappedJSObject; +} + +AddonLocalizationConverter.prototype = { + classID: Components.ID("{ded150e3-c92e-4077-a396-0dba9953e39f}"), + QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamConverter]), + + FROM_TYPE: "application/vnd.mozilla.webext.unlocalized", + TO_TYPE: "text/css", + + checkTypes(aFromType, aToType) { + if (aFromType != this.FROM_TYPE) { + throw Components.Exception("Invalid aFromType value", Cr.NS_ERROR_INVALID_ARG, + Components.stack.caller.caller); + } + if (aToType != this.TO_TYPE) { + throw Components.Exception("Invalid aToType value", Cr.NS_ERROR_INVALID_ARG, + Components.stack.caller.caller); + } + }, + + // aContext must be a nsIURI object for a valid moz-extension: URL. + getAddonId(aContext) { + // In this case, we want the add-on ID even if the URL is web accessible, + // so check the root rather than the exact path. + let uri = Services.io.newURI("/", null, aContext); + + let id = this.aps.extensionURIToAddonId(uri); + if (id == undefined) { + throw new Components.Exception("Invalid context", Cr.NS_ERROR_INVALID_ARG); + } + return id; + }, + + convertToStream(aAddonId, aString) { + let stream = Cc["@mozilla.org/io/string-input-stream;1"] + .createInstance(Ci.nsIStringInputStream); + + stream.data = this.aps.localizeAddonString(aAddonId, aString); + return stream; + }, + + convert(aStream, aFromType, aToType, aContext) { + this.checkTypes(aFromType, aToType); + let addonId = this.getAddonId(aContext); + + let string = NetUtil.readInputStreamToString(aStream, aStream.available()); + return this.convertToStream(addonId, string); + }, + + asyncConvertData(aFromType, aToType, aListener, aContext) { + this.checkTypes(aFromType, aToType); + this.addonId = this.getAddonId(aContext); + this.listener = aListener; + }, + + onStartRequest(aRequest, aContext) { + this.parts = []; + }, + + onDataAvailable(aRequest, aContext, aInputStream, aOffset, aCount) { + this.parts.push(NetUtil.readInputStreamToString(aInputStream, aCount)); + }, + + onStopRequest(aRequest, aContext, aStatusCode) { + try { + this.listener.onStartRequest(aRequest, null); + if (Components.isSuccessCode(aStatusCode)) { + let string = this.parts.join(""); + let stream = this.convertToStream(this.addonId, string); + + this.listener.onDataAvailable(aRequest, null, stream, 0, stream.data.length); + } + } catch (e) { + aStatusCode = e.result || Cr.NS_ERROR_FAILURE; + } + this.listener.onStopRequest(aRequest, null, aStatusCode); + }, +}; + +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([RemoteTagServiceService, AddonPolicyService, + AddonLocalizationConverter]); diff --git a/toolkit/components/utils/utils.manifest b/toolkit/components/utils/utils.manifest index b08c5d519e13..b2d30bd98db6 100644 --- a/toolkit/components/utils/utils.manifest +++ b/toolkit/components/utils/utils.manifest @@ -2,3 +2,5 @@ component {dfd07380-6083-11e4-9803-0800200c9a66} simpleServices.js contract @mozilla.org/addons/remote-tag-service;1 {dfd07380-6083-11e4-9803-0800200c9a66} component {89560ed3-72e3-498d-a0e8-ffe50334d7c5} simpleServices.js contract @mozilla.org/addons/policy-service;1 {89560ed3-72e3-498d-a0e8-ffe50334d7c5} +component {ded150e3-c92e-4077-a396-0dba9953e39f} simpleServices.js +contract @mozilla.org/streamconv;1?from=application/vnd.mozilla.webext.unlocalized&to=text/css {ded150e3-c92e-4077-a396-0dba9953e39f} From 2dbcd42794af5553f0c34b03211988621166fb76 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Fri, 27 Nov 2015 16:03:01 -0800 Subject: [PATCH 118/153] Bug 1209184: Part 2 - [webext] Localize CSS files served from moz-extension: channels. r=jdm --HG-- extra : commitid : 5gYtjOdtG4C extra : source : 9c63ffd499ebc4ed4f164d4b35e09a7a03c36387 --- .../protocol/res/ExtensionProtocolHandler.cpp | 113 ++++++++++++++++++ .../protocol/res/ExtensionProtocolHandler.h | 2 + .../res/SubstitutingProtocolHandler.cpp | 5 +- .../res/SubstitutingProtocolHandler.h | 7 ++ 4 files changed, 126 insertions(+), 1 deletion(-) diff --git a/netwerk/protocol/res/ExtensionProtocolHandler.cpp b/netwerk/protocol/res/ExtensionProtocolHandler.cpp index 8b5bb37ad07a..b1e2648dc788 100644 --- a/netwerk/protocol/res/ExtensionProtocolHandler.cpp +++ b/netwerk/protocol/res/ExtensionProtocolHandler.cpp @@ -8,6 +8,16 @@ #include "nsIAddonPolicyService.h" #include "nsServiceManagerUtils.h" +#include "nsIURL.h" +#include "nsIChannel.h" +#include "nsIStreamListener.h" +#include "nsIRequestObserver.h" +#include "nsIInputStreamChannel.h" +#include "nsIInputStream.h" +#include "nsIOutputStream.h" +#include "nsIStreamConverterService.h" +#include "nsIPipe.h" +#include "nsNetUtil.h" namespace mozilla { @@ -33,4 +43,107 @@ ExtensionProtocolHandler::GetFlagsForURI(nsIURI* aURI, uint32_t* aFlags) return NS_OK; } +class PipeCloser : public nsIRequestObserver +{ +public: + NS_DECL_ISUPPORTS + + explicit PipeCloser(nsIOutputStream* aOutputStream) : + mOutputStream(aOutputStream) + { + } + + NS_IMETHOD OnStartRequest(nsIRequest*, nsISupports*) override + { + return NS_OK; + } + + NS_IMETHOD OnStopRequest(nsIRequest*, nsISupports*, nsresult aStatusCode) override + { + NS_ENSURE_TRUE(mOutputStream, NS_ERROR_UNEXPECTED); + + nsresult rv = mOutputStream->Close(); + mOutputStream = nullptr; + return rv; + } + +protected: + virtual ~PipeCloser() {} + +private: + nsCOMPtr mOutputStream; +}; + +NS_IMPL_ISUPPORTS(PipeCloser, nsIRequestObserver) + +nsresult +ExtensionProtocolHandler::SubstituteChannel(nsIURI* aURI, + nsILoadInfo* aLoadInfo, + nsIChannel** result) +{ + nsresult rv; + nsCOMPtr url = do_QueryInterface(aURI, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsAutoCString ext; + rv = url->GetFileExtension(ext); + NS_ENSURE_SUCCESS(rv, rv); + + if (!ext.LowerCaseEqualsLiteral("css")) { + return NS_OK; + } + + // Filter CSS files to replace locale message tokens with localized strings. + + nsCOMPtr convService = + do_GetService(NS_STREAMCONVERTERSERVICE_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + const char* kFromType = "application/vnd.mozilla.webext.unlocalized"; + const char* kToType = "text/css"; + + nsCOMPtr inputStream; + if (aLoadInfo && aLoadInfo->GetSecurityMode()) { + // Certain security checks require an async channel. + + nsCOMPtr outputStream; + rv = NS_NewPipe(getter_AddRefs(inputStream), getter_AddRefs(outputStream), + 0, UINT32_MAX, true, false); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr listener; + nsCOMPtr observer = new PipeCloser(outputStream); + rv = NS_NewSimpleStreamListener(getter_AddRefs(listener), outputStream, observer); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr converter; + rv = convService->AsyncConvertData(kFromType, kToType, listener, + aURI, getter_AddRefs(converter)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = (*result)->AsyncOpen2(converter); + } else { + // Stylesheet loads for extension content scripts require a sync channel, + // but fortunately do not invoke security checks. + + nsCOMPtr sourceStream; + rv = (*result)->Open(getter_AddRefs(sourceStream)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = convService->Convert(sourceStream, kFromType, kToType, + aURI, getter_AddRefs(inputStream)); + } + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr channel; + rv = NS_NewInputStreamChannelInternal(getter_AddRefs(channel), aURI, inputStream, + NS_LITERAL_CSTRING("text/css"), + NS_LITERAL_CSTRING("utf-8"), + aLoadInfo); + NS_ENSURE_SUCCESS(rv, rv); + + channel.swap(*result); + return NS_OK; +} + } // namespace mozilla diff --git a/netwerk/protocol/res/ExtensionProtocolHandler.h b/netwerk/protocol/res/ExtensionProtocolHandler.h index 48f7c4dfe2df..d30fd4630e77 100644 --- a/netwerk/protocol/res/ExtensionProtocolHandler.h +++ b/netwerk/protocol/res/ExtensionProtocolHandler.h @@ -39,6 +39,8 @@ protected: return false; } + + virtual nsresult SubstituteChannel(nsIURI* uri, nsILoadInfo* aLoadInfo, nsIChannel** result) override; }; } // namespace mozilla diff --git a/netwerk/protocol/res/SubstitutingProtocolHandler.cpp b/netwerk/protocol/res/SubstitutingProtocolHandler.cpp index 6a2784b21351..181aabd72a54 100644 --- a/netwerk/protocol/res/SubstitutingProtocolHandler.cpp +++ b/netwerk/protocol/res/SubstitutingProtocolHandler.cpp @@ -253,7 +253,10 @@ SubstitutingProtocolHandler::NewChannel2(nsIURI* uri, nsLoadFlags loadFlags = 0; (*result)->GetLoadFlags(&loadFlags); (*result)->SetLoadFlags(loadFlags & ~nsIChannel::LOAD_REPLACE); - return (*result)->SetOriginalURI(uri); + rv = (*result)->SetOriginalURI(uri); + NS_ENSURE_SUCCESS(rv, rv); + + return SubstituteChannel(uri, aLoadInfo, result); } nsresult diff --git a/netwerk/protocol/res/SubstitutingProtocolHandler.h b/netwerk/protocol/res/SubstitutingProtocolHandler.h index 1e9f5de251c5..e48f259480d0 100644 --- a/netwerk/protocol/res/SubstitutingProtocolHandler.h +++ b/netwerk/protocol/res/SubstitutingProtocolHandler.h @@ -59,6 +59,13 @@ protected: return false; } + // Override this in the subclass to check for special case when opening + // channels. + virtual nsresult SubstituteChannel(nsIURI* uri, nsILoadInfo* aLoadInfo, nsIChannel** result) + { + return NS_OK; + } + nsIIOService* IOService() { return mIOService; } private: From 63106cd553518bb86af5456aa25444444923fb95 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Fri, 27 Nov 2015 23:02:41 -0800 Subject: [PATCH 119/153] Bug 1209184: Part 3 - [webext] Add tests for locale stream converter. r=billm --HG-- extra : commitid : C6EPqRUd2zd extra : source : f9ab766896106b5718920a274ef4fe3605823b75 extra : histedit_source : b8bc9c984956d543d935a0fc6db77875ac8680d5%2Ccd119681f1f3e43e22999fdb3eb2848f47962436 --- toolkit/components/extensions/moz.build | 2 + .../extensions/test/xpcshell/head.js | 10 ++ .../test/xpcshell/test_locale_converter.js | 118 ++++++++++++++++++ .../extensions/test/xpcshell/xpcshell.ini | 5 + 4 files changed, 135 insertions(+) create mode 100644 toolkit/components/extensions/test/xpcshell/head.js create mode 100644 toolkit/components/extensions/test/xpcshell/test_locale_converter.js create mode 100644 toolkit/components/extensions/test/xpcshell/xpcshell.ini diff --git a/toolkit/components/extensions/moz.build b/toolkit/components/extensions/moz.build index 614b05507adf..76afd553ce6c 100644 --- a/toolkit/components/extensions/moz.build +++ b/toolkit/components/extensions/moz.build @@ -15,3 +15,5 @@ EXTRA_JS_MODULES += [ JAR_MANIFESTS += ['jar.mn'] MOCHITEST_MANIFESTS += ['test/mochitest/mochitest.ini'] + +XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell/xpcshell.ini'] diff --git a/toolkit/components/extensions/test/xpcshell/head.js b/toolkit/components/extensions/test/xpcshell/head.js new file mode 100644 index 000000000000..71823e9e8284 --- /dev/null +++ b/toolkit/components/extensions/test/xpcshell/head.js @@ -0,0 +1,10 @@ +"use strict"; + +const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; + +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", + "resource://gre/modules/NetUtil.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Services", + "resource://gre/modules/Services.jsm"); diff --git a/toolkit/components/extensions/test/xpcshell/test_locale_converter.js b/toolkit/components/extensions/test/xpcshell/test_locale_converter.js new file mode 100644 index 000000000000..4b3f6c4e156a --- /dev/null +++ b/toolkit/components/extensions/test/xpcshell/test_locale_converter.js @@ -0,0 +1,118 @@ +"use strict"; + +const convService = Cc["@mozilla.org/streamConverters;1"] + .getService(Ci.nsIStreamConverterService); + +const UUID = "72b61ee3-aceb-476c-be1b-0822b036c9f1"; +const ADDON_ID = "test@web.extension"; +const URI = NetUtil.newURI(`moz-extension://${UUID}/file.css`); + +const FROM_TYPE = "application/vnd.mozilla.webext.unlocalized"; +const TO_TYPE = "text/css"; + + +function StringStream(string) { + let stream = Cc["@mozilla.org/io/string-input-stream;1"] + .createInstance(Ci.nsIStringInputStream); + + stream.data = string; + return stream; +} + + +// Initialize the policy service with a stub localizer for our +// add-on ID. +add_task(function* init() { + const aps = Cc["@mozilla.org/addons/policy-service;1"] + .getService(Ci.nsIAddonPolicyService).wrappedJSObject; + + let oldCallback = aps.setExtensionURIToAddonIdCallback(uri => { + if (uri.host == UUID) { + return ADDON_ID; + } + }); + + aps.setAddonLocalizeCallback(ADDON_ID, string => { + return string.replace(/__MSG_(.*?)__/g, ""); + }); + + do_register_cleanup(() => { + aps.setExtensionURIToAddonIdCallback(oldCallback); + aps.setAddonLocalizeCallback(ADDON_ID, null); + }); +}); + + +// Test that the synchronous converter works as expected with a +// simple string. +add_task(function* testSynchronousConvert() { + let stream = StringStream("Foo __MSG_xxx__ bar __MSG_yyy__ baz"); + + let resultStream = convService.convert(stream, FROM_TYPE, TO_TYPE, URI); + + let result = NetUtil.readInputStreamToString(resultStream, resultStream.available()); + + equal(result, "Foo bar baz"); +}); + + +// Test that the asynchronous converter works as expected with input +// split into multiple chunks, and a boundary in the middle of a +// replacement token. +add_task(function* testAsyncConvert() { + let listener; + let awaitResult = new Promise((resolve, reject) => { + listener = { + QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]), + + onDataAvailable(request, context, inputStream, offset, count) { + this.resultParts.push(NetUtil.readInputStreamToString(inputStream, count)); + }, + + onStartRequest() { + ok(!("resultParts" in this)); + this.resultParts = []; + }, + + onStopRequest(request, context, statusCode) { + if (!Components.isSuccessCode(statusCode)) { + reject(new Error(statusCode)); + } + + resolve(this.resultParts.join("\n")); + }, + }; + }); + + let parts = ["Foo __MSG_x", "xx__ bar __MSG_yyy__ baz"]; + + let converter = convService.asyncConvertData(FROM_TYPE, TO_TYPE, listener, URI); + converter.onStartRequest(null, null); + + for (let part of parts) { + converter.onDataAvailable(null, null, StringStream(part), 0, part.length); + } + + converter.onStopRequest(null, null, Cr.NS_OK); + + + let result = yield awaitResult; + equal(result, "Foo bar baz"); +}); + + +// Test that attempting to initialize a converter with the URI of a +// nonexistent WebExtension fails. +add_task(function* testInvalidUUID() { + let uri = NetUtil.newURI("moz-extension://eb4f3be8-41c9-4970-aa6d-b84d1ecc02b2/file.css"); + + Assert.throws(() => { + convService.convert(stream, FROM_TYPE, TO_TYPE, uri); + }); + + Assert.throws(() => { + let listener = { QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]) }; + + convService.asyncConvertData(FROM_TYPE, TO_TYPE, listener, uri); + }); +}); diff --git a/toolkit/components/extensions/test/xpcshell/xpcshell.ini b/toolkit/components/extensions/test/xpcshell/xpcshell.ini new file mode 100644 index 000000000000..ea2f7d8a63d7 --- /dev/null +++ b/toolkit/components/extensions/test/xpcshell/xpcshell.ini @@ -0,0 +1,5 @@ +[DEFAULT] +head = head.js +tail = + +[test_locale_converter.js] From 0e62607b98de177b0923e8c16749948a2c5255a7 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Fri, 20 Nov 2015 22:39:58 -0800 Subject: [PATCH 120/153] Bug 1209184: Part 4 - [webext] Add tests for CSS localization filters. r=billm --HG-- extra : commitid : 7QQXwv6dFlO extra : source : 8e692344588a9b0155259d0d3fb1050b5f22230c extra : histedit_source : 8eaf0490a1f62b6379cdca19bdc5a415a4d5c3c8 --- .../extensions/test/mochitest/mochitest.ini | 1 + .../test/mochitest/test_ext_i18n_css.html | 117 ++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html diff --git a/toolkit/components/extensions/test/mochitest/mochitest.ini b/toolkit/components/extensions/test/mochitest/mochitest.ini index e535b5d638a5..dbf39531c736 100644 --- a/toolkit/components/extensions/test/mochitest/mochitest.ini +++ b/toolkit/components/extensions/test/mochitest/mochitest.ini @@ -21,6 +21,7 @@ support-files = [test_ext_simple.html] [test_ext_geturl.html] [test_ext_contentscript.html] +[test_ext_i18n_css.html] [test_ext_webrequest.html] [test_ext_generate.html] [test_ext_localStorage.html] diff --git a/toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html b/toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html new file mode 100644 index 000000000000..cc396705a4b1 --- /dev/null +++ b/toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html @@ -0,0 +1,117 @@ + + + + Test for content script + + + + + + + + + + + + From c92e4683548fe9c3e4f58ec0689ce41d46b78549 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Tue, 24 Nov 2015 16:13:25 +1100 Subject: [PATCH 121/153] Bug 1227396: P1. Remove TimestampedMediaByteRange object. r=cpearce --- dom/media/MediaResource.h | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/dom/media/MediaResource.h b/dom/media/MediaResource.h index 9b37f14e83d8..282efbfd214e 100644 --- a/dom/media/MediaResource.h +++ b/dom/media/MediaResource.h @@ -128,9 +128,6 @@ private: bool mIsStarted; }; -// Forward declaration for use in MediaByteRange. -class TimestampedMediaByteRange; - // Represents a section of contiguous media, with a start and end offset. // Used to denote ranges of data which are cached. class MediaByteRange { @@ -143,8 +140,6 @@ public: NS_ASSERTION(mStart <= mEnd, "Range should end after start!"); } - explicit MediaByteRange(TimestampedMediaByteRange& aByteRange); - bool IsNull() const { return mStart == 0 && mEnd == 0; } @@ -178,38 +173,6 @@ public: int64_t mStart, mEnd; }; -// Represents a section of contiguous media, with a start and end offset, and -// a timestamp representing the start time. -class TimestampedMediaByteRange : public MediaByteRange { -public: - TimestampedMediaByteRange() : MediaByteRange(), mStartTime(-1) {} - - TimestampedMediaByteRange(int64_t aStart, int64_t aEnd, int64_t aStartTime) - : MediaByteRange(aStart, aEnd), mStartTime(aStartTime) - { - NS_ASSERTION(aStartTime >= 0, "Start time should not be negative!"); - } - - bool IsNull() const { - return MediaByteRange::IsNull() && mStartTime == -1; - } - - // Clears byte range values. - void Clear() { - MediaByteRange::Clear(); - mStartTime = -1; - } - - // In usecs. - int64_t mStartTime; -}; - -inline MediaByteRange::MediaByteRange(TimestampedMediaByteRange& aByteRange) - : mStart(aByteRange.mStart), mEnd(aByteRange.mEnd) -{ - NS_ASSERTION(mStart < mEnd, "Range should end after start!"); -} - class RtspMediaResource; /** From 70f2124283d91a77f0b8382541bd439b078c9384 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Tue, 24 Nov 2015 16:26:38 +1100 Subject: [PATCH 122/153] Bug 1227396: P2. Rename some MediaByteRange methods. r=cpearce Will facilitate the replacement of MediaByteRange by Interval --- dom/media/MediaResource.cpp | 10 +++++----- dom/media/MediaResource.h | 6 +++--- dom/media/mediasource/ContainerParser.cpp | 2 +- dom/media/mediasource/TrackBuffersManager.cpp | 8 ++++---- media/libstagefright/binding/Index.cpp | 2 +- media/libstagefright/binding/MoofParser.cpp | 8 ++++---- .../libstagefright/binding/include/mp4_demuxer/Box.h | 2 +- media/libstagefright/gtest/TestParser.cpp | 12 ++++++------ 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/dom/media/MediaResource.cpp b/dom/media/MediaResource.cpp index 9b8ab4b89df4..cef5b242eed3 100644 --- a/dom/media/MediaResource.cpp +++ b/dom/media/MediaResource.cpp @@ -236,7 +236,7 @@ ChannelMediaResource::OnStartRequest(nsIRequest* aRequest) // Content-Range header tells us otherwise. bool boundedSeekLimit = true; // Check response code for byte-range requests (seeking, chunk requests). - if (!mByteRange.IsNull() && (responseStatus == HTTP_PARTIAL_RESPONSE_CODE)) { + if (!mByteRange.IsEmpty() && (responseStatus == HTTP_PARTIAL_RESPONSE_CODE)) { // Parse Content-Range header. int64_t rangeStart = 0; int64_t rangeEnd = 0; @@ -273,7 +273,7 @@ ChannelMediaResource::OnStartRequest(nsIRequest* aRequest) mOffset = rangeStart; // We received 'Content-Range', so the server accepts range requests. acceptsRanges = true; - } else if (((mOffset > 0) || !mByteRange.IsNull()) + } else if (((mOffset > 0) || !mByteRange.IsEmpty()) && (responseStatus == HTTP_OK_CODE)) { // If we get an OK response but we were seeking, or requesting a byte // range, then we have to assume that seeking doesn't work. We also need @@ -534,7 +534,7 @@ nsresult ChannelMediaResource::OpenChannel(nsIStreamListener** aStreamListener) *aStreamListener = nullptr; } - if (mByteRange.IsNull()) { + if (mByteRange.IsEmpty()) { // We're not making a byte range request, so set the content length, // if it's available as an HTTP header. This ensures that MediaResource // wrapping objects for platform libraries that expect to know @@ -583,14 +583,14 @@ nsresult ChannelMediaResource::SetupChannelHeaders() // Use |mByteRange| for a specific chunk, or |mOffset| if seeking in a // complete file download. nsAutoCString rangeString("bytes="); - if (!mByteRange.IsNull()) { + if (!mByteRange.IsEmpty()) { rangeString.AppendInt(mByteRange.mStart); mOffset = mByteRange.mStart; } else { rangeString.AppendInt(mOffset); } rangeString.Append('-'); - if (!mByteRange.IsNull()) { + if (!mByteRange.IsEmpty()) { rangeString.AppendInt(mByteRange.mEnd); } nsresult rv = hc->SetRequestHeader(NS_LITERAL_CSTRING("Range"), rangeString, false); diff --git a/dom/media/MediaResource.h b/dom/media/MediaResource.h index 282efbfd214e..3bbdaf611962 100644 --- a/dom/media/MediaResource.h +++ b/dom/media/MediaResource.h @@ -140,7 +140,7 @@ public: NS_ASSERTION(mStart <= mEnd, "Range should end after start!"); } - bool IsNull() const { + bool IsEmpty() const { return mStart == 0 && mEnd == 0; } @@ -158,8 +158,8 @@ public: return aByteRange.mStart >= mStart && aByteRange.mEnd <= mEnd; } - MediaByteRange Extents(const MediaByteRange& aByteRange) const { - if (IsNull()) { + MediaByteRange Span(const MediaByteRange& aByteRange) const { + if (IsEmpty()) { return aByteRange; } return MediaByteRange(std::min(mStart, aByteRange.mStart), diff --git a/dom/media/mediasource/ContainerParser.cpp b/dom/media/mediasource/ContainerParser.cpp index 349723ef0457..6fe9caaea6db 100644 --- a/dom/media/mediasource/ContainerParser.cpp +++ b/dom/media/mediasource/ContainerParser.cpp @@ -267,7 +267,7 @@ public: return false; } - if (mCompleteMediaHeaderRange.IsNull()) { + if (mCompleteMediaHeaderRange.IsEmpty()) { mCompleteMediaHeaderRange = MediaByteRange(mapping[0].mSyncOffset, mapping[0].mEndOffset); } diff --git a/dom/media/mediasource/TrackBuffersManager.cpp b/dom/media/mediasource/TrackBuffersManager.cpp index 360b3f434876..3cece0247c87 100644 --- a/dom/media/mediasource/TrackBuffersManager.cpp +++ b/dom/media/mediasource/TrackBuffersManager.cpp @@ -680,7 +680,7 @@ TrackBuffersManager::SegmentParserLoop() // 5. If the append state equals PARSING_INIT_SEGMENT, then run the // following steps: if (mAppendState == AppendState::PARSING_INIT_SEGMENT) { - if (mParser->InitSegmentRange().IsNull()) { + if (mParser->InitSegmentRange().IsEmpty()) { mInputBuffer = nullptr; NeedMoreData(); return; @@ -707,7 +707,7 @@ TrackBuffersManager::SegmentParserLoop() ResetDemuxingState(); return; } - if (newData || !mParser->MediaSegmentRange().IsNull()) { + if (newData || !mParser->MediaSegmentRange().IsEmpty()) { if (mPendingInputBuffer) { // We now have a complete media segment header. We can resume parsing // the data. @@ -1135,7 +1135,7 @@ TrackBuffersManager::CodedFrameProcessing() MOZ_ASSERT(mProcessingPromise.IsEmpty()); MediaByteRange mediaRange = mParser->MediaSegmentRange(); - if (mediaRange.IsNull()) { + if (mediaRange.IsEmpty()) { AppendDataToCurrentInputBuffer(mInputBuffer); mInputBuffer = nullptr; } else { @@ -1309,7 +1309,7 @@ TrackBuffersManager::CompleteCodedFrameProcessing() } // 5. If the input buffer does not contain a complete media segment, then jump to the need more data step below. - if (mParser->MediaSegmentRange().IsNull()) { + if (mParser->MediaSegmentRange().IsEmpty()) { ResolveProcessing(true, __func__); return; } diff --git a/media/libstagefright/binding/Index.cpp b/media/libstagefright/binding/Index.cpp index e5320584388e..de8dff497383 100644 --- a/media/libstagefright/binding/Index.cpp +++ b/media/libstagefright/binding/Index.cpp @@ -117,7 +117,7 @@ already_AddRefed SampleIterator::GetNext() return nullptr; } - if (!s->mCencRange.IsNull()) { + if (!s->mCencRange.IsEmpty()) { MoofParser* parser = mIndex->mMoofParser.get(); if (!parser || !parser->mSinf.IsValid()) { diff --git a/media/libstagefright/binding/MoofParser.cpp b/media/libstagefright/binding/MoofParser.cpp index 415ac353a32b..c3c0b8bd4589 100644 --- a/media/libstagefright/binding/MoofParser.cpp +++ b/media/libstagefright/binding/MoofParser.cpp @@ -41,7 +41,7 @@ MoofParser::RebuildFragmentedIndex(BoxContext& aContext) bool foundMdat = false; for (Box box(&aContext, mOffset); box.IsAvailable(); box = box.Next()) { - if (box.IsType("moov") && mInitRange.IsNull()) { + if (box.IsType("moov") && mInitRange.IsEmpty()) { mInitRange = MediaByteRange(0, box.Range().mEnd); ParseMoov(box); } else if (box.IsType("moof")) { @@ -68,7 +68,7 @@ MoofParser::RebuildFragmentedIndex(BoxContext& aContext) media::Interval mdat(box.Range().mStart, box.Range().mEnd, 0); if (datarange.Intersects(mdat)) { mMediaRanges.LastElement() = - mMediaRanges.LastElement().Extents(box.Range()); + mMediaRanges.LastElement().Span(box.Range()); } } mOffset = box.NextOffset(); @@ -164,7 +164,7 @@ MoofParser::ScanForMetadata(mozilla::MediaByteRange& aFtyp, break; } } - mInitRange = aFtyp.Extents(aMoov); + mInitRange = aFtyp.Span(aMoov); } bool @@ -559,7 +559,7 @@ Moof::ParseTrun(Box& aBox, Tfhd& aTfhd, Mvhd& aMvhd, Mdhd& aMdhd, Edts& aEdts, u // FIXME: Make this infallible after bug 968520 is done. MOZ_ALWAYS_TRUE(mIndex.AppendElement(sample, fallible)); - mMdatRange = mMdatRange.Extents(sample.mByteRange); + mMdatRange = mMdatRange.Span(sample.mByteRange); } mMaxRoundingError += aMdhd.ToMicroseconds(sampleCount); diff --git a/media/libstagefright/binding/include/mp4_demuxer/Box.h b/media/libstagefright/binding/include/mp4_demuxer/Box.h index edc5d1d0ee9d..b2899a70250e 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/Box.h +++ b/media/libstagefright/binding/include/mp4_demuxer/Box.h @@ -38,7 +38,7 @@ public: Box(BoxContext* aContext, uint64_t aOffset, const Box* aParent = nullptr); Box(); - bool IsAvailable() const { return !mRange.IsNull(); } + bool IsAvailable() const { return !mRange.IsEmpty(); } uint64_t Offset() const { return mRange.mStart; } uint64_t Length() const { return mRange.mEnd - mRange.mStart; } uint64_t NextOffset() const { return mRange.mEnd; } diff --git a/media/libstagefright/gtest/TestParser.cpp b/media/libstagefright/gtest/TestParser.cpp index 45f7b60c7b66..8f40ee06f71d 100644 --- a/media/libstagefright/gtest/TestParser.cpp +++ b/media/libstagefright/gtest/TestParser.cpp @@ -107,14 +107,14 @@ TEST(stagefright_MoofParser, EmptyStream) EXPECT_FALSE(parser.RebuildFragmentedIndex(byteRanges)); EXPECT_TRUE(parser.GetCompositionRange(byteRanges).IsNull()); - EXPECT_TRUE(parser.mInitRange.IsNull()); + EXPECT_TRUE(parser.mInitRange.IsEmpty()); EXPECT_EQ(0u, parser.mOffset); EXPECT_TRUE(parser.ReachedEnd()); EXPECT_FALSE(parser.HasMetadata()); RefPtr metadataBuffer = parser.Metadata(); EXPECT_FALSE(metadataBuffer); - EXPECT_TRUE(parser.FirstCompleteMediaSegment().IsNull()); - EXPECT_TRUE(parser.FirstCompleteMediaHeader().IsNull()); + EXPECT_TRUE(parser.FirstCompleteMediaSegment().IsEmpty()); + EXPECT_TRUE(parser.FirstCompleteMediaHeader().IsEmpty()); } nsTArray @@ -297,14 +297,14 @@ TEST(stagefright_MoofParser, test_case_mp4) EXPECT_FALSE(parser.RebuildFragmentedIndex(byteRanges)); EXPECT_TRUE(parser.GetCompositionRange(byteRanges).IsNull()); - EXPECT_TRUE(parser.mInitRange.IsNull()); + EXPECT_TRUE(parser.mInitRange.IsEmpty()); EXPECT_EQ(0u, parser.mOffset); EXPECT_FALSE(parser.ReachedEnd()); EXPECT_TRUE(parser.HasMetadata()); RefPtr metadataBuffer = parser.Metadata(); EXPECT_TRUE(metadataBuffer); - EXPECT_TRUE(parser.FirstCompleteMediaSegment().IsNull()); - EXPECT_TRUE(parser.FirstCompleteMediaHeader().IsNull()); + EXPECT_TRUE(parser.FirstCompleteMediaSegment().IsEmpty()); + EXPECT_TRUE(parser.FirstCompleteMediaHeader().IsEmpty()); } } From 5499ac529321912ab6c874f03293079d160553a0 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Tue, 24 Nov 2015 19:41:20 +1100 Subject: [PATCH 123/153] Bug 1227396: P3. Add IntervalSet::LastInterval method. r=gerald --- dom/media/Intervals.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dom/media/Intervals.h b/dom/media/Intervals.h index 1ffa8c0f7489..baa4ac6a2314 100644 --- a/dom/media/Intervals.h +++ b/dom/media/Intervals.h @@ -652,6 +652,18 @@ public: return mIntervals.end(); } + ElemType& LastInterval() + { + MOZ_ASSERT(!mIntervals.IsEmpty()); + return mIntervals.LastElement(); + } + + const ElemType& LastInterval() const + { + MOZ_ASSERT(!mIntervals.IsEmpty()); + return mIntervals.LastElement(); + } + protected: ContainerType mIntervals; From f84dc2e04c5609dec333c3c8efc7475d8ec07746 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Tue, 24 Nov 2015 19:44:14 +1100 Subject: [PATCH 124/153] Bug 1227396: P4. Add IntervalSet::Clear method. r=gerald --- dom/media/Intervals.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dom/media/Intervals.h b/dom/media/Intervals.h index baa4ac6a2314..c674d84546d5 100644 --- a/dom/media/Intervals.h +++ b/dom/media/Intervals.h @@ -664,6 +664,11 @@ public: return mIntervals.LastElement(); } + void Clear() + { + mIntervals.Clear(); + } + protected: ContainerType mIntervals; From dd73df29545102a08940acf4c4b0fd509c634743 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Wed, 25 Nov 2015 16:37:34 +1100 Subject: [PATCH 125/153] Bug 1227396: P5. Make Interval::Span ignore empty interval. r=gerald An interval with a length of 0 doesn't really exist and will be removed when used in an IntervalSet. As such, calculating a Span with an empty intervals didn't really make sense --- dom/media/Intervals.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dom/media/Intervals.h b/dom/media/Intervals.h index c674d84546d5..42a4372e94df 100644 --- a/dom/media/Intervals.h +++ b/dom/media/Intervals.h @@ -188,6 +188,9 @@ public: SelfType Span(const SelfType& aOther) const { + if (IsEmpty()) { + return aOther; + } SelfType result(*this); if (aOther.mStart < mStart) { result.mStart = aOther.mStart; From 98b7b59261accf714636e15d3eebf7c2e18c680e Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Tue, 24 Nov 2015 17:57:37 +1100 Subject: [PATCH 126/153] Bug 1227396: P6. Replace MediaByteBuffer with Interval. r=cpearce --- dom/media/MediaResource.h | 56 +++++++++++++-------------------------- 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/dom/media/MediaResource.h b/dom/media/MediaResource.h index 3bbdaf611962..21b81e11dcc6 100644 --- a/dom/media/MediaResource.h +++ b/dom/media/MediaResource.h @@ -14,6 +14,7 @@ #include "nsIStreamListener.h" #include "nsIChannelEventSink.h" #include "nsIInterfaceRequestor.h" +#include "Intervals.h" #include "MediaCache.h" #include "MediaData.h" #include "MediaResourceCallback.h" @@ -130,47 +131,26 @@ private: // Represents a section of contiguous media, with a start and end offset. // Used to denote ranges of data which are cached. -class MediaByteRange { + +class MediaByteRange : public media::Interval { public: - MediaByteRange() : mStart(0), mEnd(0) {} + typedef Interval BaseType; + // We can't use inherited constructors yet. So we have to duplicate the + // constructors found in Interval base class. + // all this could be later replaced with: + // using Interval::Interval; + + MOZ_IMPLICIT MediaByteRange(const BaseType& aOther) + : BaseType(aOther) + {} + MOZ_IMPLICIT MediaByteRange(BaseType&& aOther) + : BaseType(Move(aOther)) + {} MediaByteRange(int64_t aStart, int64_t aEnd) - : mStart(aStart), mEnd(aEnd) - { - NS_ASSERTION(mStart <= mEnd, "Range should end after start!"); - } - - bool IsEmpty() const { - return mStart == 0 && mEnd == 0; - } - - bool operator==(const MediaByteRange& aRange) const { - return mStart == aRange.mStart && mEnd == aRange.mEnd; - } - - // Clears byte range values. - void Clear() { - mStart = 0; - mEnd = 0; - } - - bool Contains(const MediaByteRange& aByteRange) const { - return aByteRange.mStart >= mStart && aByteRange.mEnd <= mEnd; - } - - MediaByteRange Span(const MediaByteRange& aByteRange) const { - if (IsEmpty()) { - return aByteRange; - } - return MediaByteRange(std::min(mStart, aByteRange.mStart), - std::max(mEnd, aByteRange.mEnd)); - } - - int64_t Length() const { - return mEnd - mStart; - } - - int64_t mStart, mEnd; + : media::Interval(aStart, aEnd) + {} + MediaByteRange() = default; }; class RtspMediaResource; From c8c275cee2b774750557c15800c75792f653f162 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Tue, 24 Nov 2015 20:16:52 +1100 Subject: [PATCH 127/153] Bug 1227396: P7. Replace nsTArray with dedicated MediaByteRangeSet object. r=cpearce --- dom/media/BufferMediaResource.h | 4 ++-- dom/media/MediaCache.cpp | 4 ++-- dom/media/MediaCache.h | 5 +++-- dom/media/MediaResource.cpp | 8 ++++---- dom/media/MediaResource.h | 6 ++++-- dom/media/RtspMediaResource.h | 2 +- dom/media/directshow/DirectShowReader.cpp | 2 +- dom/media/fmp4/MP4Demuxer.cpp | 4 ++-- dom/media/gstreamer/GStreamerReader.cpp | 4 ++-- dom/media/gtest/MockMediaResource.cpp | 7 +++---- dom/media/gtest/MockMediaResource.h | 4 ++-- dom/media/mediasource/ContainerParser.cpp | 5 ++--- dom/media/mediasource/MediaSourceResource.h | 4 ++-- dom/media/mediasource/SourceBufferResource.h | 6 +++--- dom/media/ogg/OggReader.cpp | 6 +++--- dom/media/omx/MediaOmxReader.cpp | 2 +- dom/media/webm/WebMBufferedParser.cpp | 2 +- dom/media/webm/WebMBufferedParser.h | 2 +- dom/media/webm/WebMDemuxer.cpp | 4 ++-- dom/media/webm/WebMReader.cpp | 4 ++-- media/libstagefright/binding/Box.cpp | 4 ++-- media/libstagefright/binding/Index.cpp | 10 +++++----- media/libstagefright/binding/MoofParser.cpp | 20 +++++++++---------- .../binding/include/mp4_demuxer/Box.h | 4 ++-- .../binding/include/mp4_demuxer/Index.h | 6 +++--- .../binding/include/mp4_demuxer/MoofParser.h | 8 ++++---- media/libstagefright/gtest/TestParser.cpp | 9 +++------ 27 files changed, 72 insertions(+), 74 deletions(-) diff --git a/dom/media/BufferMediaResource.h b/dom/media/BufferMediaResource.h index 82ff184fdf1f..a5bf11b30fc6 100644 --- a/dom/media/BufferMediaResource.h +++ b/dom/media/BufferMediaResource.h @@ -99,9 +99,9 @@ private: return NS_ERROR_FAILURE; } - virtual nsresult GetCachedRanges(nsTArray& aRanges) override + virtual nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override { - aRanges.AppendElement(MediaByteRange(0, mLength)); + aRanges += MediaByteRange(0, mLength); return NS_OK; } diff --git a/dom/media/MediaCache.cpp b/dom/media/MediaCache.cpp index 0ebe1578fd12..e42a236f8cd5 100644 --- a/dom/media/MediaCache.cpp +++ b/dom/media/MediaCache.cpp @@ -2442,7 +2442,7 @@ MediaCacheStream::InitAsClone(MediaCacheStream* aOriginal) return NS_OK; } -nsresult MediaCacheStream::GetCachedRanges(nsTArray& aRanges) +nsresult MediaCacheStream::GetCachedRanges(MediaByteRangeSet& aRanges) { // Take the monitor, so that the cached data ranges can't grow while we're // trying to loop over them. @@ -2457,7 +2457,7 @@ nsresult MediaCacheStream::GetCachedRanges(nsTArray& aRanges) int64_t endOffset = GetCachedDataEndInternal(startOffset); NS_ASSERTION(startOffset < endOffset, "Buffered range must end after its start"); // Bytes [startOffset..endOffset] are cached. - aRanges.AppendElement(MediaByteRange(startOffset, endOffset)); + aRanges += MediaByteRange(startOffset, endOffset); startOffset = GetNextCachedDataInternal(endOffset); NS_ASSERTION(startOffset == -1 || startOffset > endOffset, "Must have advanced to start of next range, or hit end of stream"); diff --git a/dom/media/MediaCache.h b/dom/media/MediaCache.h index 36b96a8cebaa..0c49986f39e8 100644 --- a/dom/media/MediaCache.h +++ b/dom/media/MediaCache.h @@ -11,13 +11,14 @@ #include "nsCOMPtr.h" #include "nsHashKeys.h" #include "nsTHashtable.h" +#include "Intervals.h" class nsIPrincipal; namespace mozilla { // defined in MediaResource.h class ChannelMediaResource; -class MediaByteRange; +typedef media::IntervalSet MediaByteRangeSet; class MediaResource; class ReentrantMonitorAutoEnter; @@ -300,7 +301,7 @@ public: // cached. Locks the media cache while running, to prevent any ranges // growing. The stream should be pinned while this runs and while its results // are used, to ensure no data is evicted. - nsresult GetCachedRanges(nsTArray& aRanges); + nsresult GetCachedRanges(MediaByteRangeSet& aRanges); // Reads from buffered data only. Will fail if not all data to be read is // in the cache. Will not mark blocks as read. Can be called from the main diff --git a/dom/media/MediaResource.cpp b/dom/media/MediaResource.cpp index cef5b242eed3..ed40054e1bce 100644 --- a/dom/media/MediaResource.cpp +++ b/dom/media/MediaResource.cpp @@ -738,7 +738,7 @@ int64_t ChannelMediaResource::Tell() return mCacheStream.Tell(); } -nsresult ChannelMediaResource::GetCachedRanges(nsTArray& aRanges) +nsresult ChannelMediaResource::GetCachedRanges(MediaByteRangeSet& aRanges) { return mCacheStream.GetCachedRanges(aRanges); } @@ -1202,7 +1202,7 @@ public: virtual bool IsSuspended() override { return true; } virtual bool IsTransportSeekable() override { return true; } - nsresult GetCachedRanges(nsTArray& aRanges) override; + nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override; virtual size_t SizeOfExcludingThis( MallocSizeOf aMallocSizeOf) const override @@ -1274,7 +1274,7 @@ void FileMediaResource::EnsureSizeInitialized() } } -nsresult FileMediaResource::GetCachedRanges(nsTArray& aRanges) +nsresult FileMediaResource::GetCachedRanges(MediaByteRangeSet& aRanges) { MutexAutoLock lock(mLock); @@ -1282,7 +1282,7 @@ nsresult FileMediaResource::GetCachedRanges(nsTArray& aRanges) if (mSize == -1) { return NS_ERROR_FAILURE; } - aRanges.AppendElement(MediaByteRange(0, mSize)); + aRanges += MediaByteRange(0, mSize); return NS_OK; } diff --git a/dom/media/MediaResource.h b/dom/media/MediaResource.h index 21b81e11dcc6..845cccca7bf5 100644 --- a/dom/media/MediaResource.h +++ b/dom/media/MediaResource.h @@ -153,6 +153,8 @@ public: MediaByteRange() = default; }; +typedef media::IntervalSet MediaByteRangeSet; + class RtspMediaResource; /** @@ -343,7 +345,7 @@ public: * in the media cache. Stream should be pinned during call and while * aRanges is being used. */ - virtual nsresult GetCachedRanges(nsTArray& aRanges) = 0; + virtual nsresult GetCachedRanges(MediaByteRangeSet& aRanges) = 0; // Ensure that the media cache writes any data held in its partial block. // Called on the main thread only. @@ -655,7 +657,7 @@ public: }; friend class Listener; - virtual nsresult GetCachedRanges(nsTArray& aRanges) override; + virtual nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override; protected: // These are called on the main thread by Listener. diff --git a/dom/media/RtspMediaResource.h b/dom/media/RtspMediaResource.h index 224da67b5ec9..04ed36c00f09 100644 --- a/dom/media/RtspMediaResource.h +++ b/dom/media/RtspMediaResource.h @@ -162,7 +162,7 @@ public: return false; } // dummy - nsresult GetCachedRanges(nsTArray& aRanges) override { + nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override { return NS_ERROR_FAILURE; } diff --git a/dom/media/directshow/DirectShowReader.cpp b/dom/media/directshow/DirectShowReader.cpp index ed6390a79e5c..14d7b368cd42 100644 --- a/dom/media/directshow/DirectShowReader.cpp +++ b/dom/media/directshow/DirectShowReader.cpp @@ -384,7 +384,7 @@ DirectShowReader::NotifyDataArrivedInternal() } AutoPinned resource(mDecoder->GetResource()); - nsTArray byteRanges; + MediaByteRangeSet byteRanges; nsresult rv = resource->GetCachedRanges(byteRanges); if (NS_FAILED(rv)) { diff --git a/dom/media/fmp4/MP4Demuxer.cpp b/dom/media/fmp4/MP4Demuxer.cpp index 6c11eca7bbb1..a853182e5c58 100644 --- a/dom/media/fmp4/MP4Demuxer.cpp +++ b/dom/media/fmp4/MP4Demuxer.cpp @@ -264,7 +264,7 @@ MP4TrackDemuxer::EnsureUpToDateIndex() return; } AutoPinned resource(mParent->mResource); - nsTArray byteRanges; + MediaByteRangeSet byteRanges; nsresult rv = resource->GetCachedRanges(byteRanges); if (NS_FAILED(rv)) { return; @@ -413,7 +413,7 @@ MP4TrackDemuxer::GetBuffered() { EnsureUpToDateIndex(); AutoPinned resource(mParent->mResource); - nsTArray byteRanges; + MediaByteRangeSet byteRanges; nsresult rv = resource->GetCachedRanges(byteRanges); if (NS_FAILED(rv)) { diff --git a/dom/media/gstreamer/GStreamerReader.cpp b/dom/media/gstreamer/GStreamerReader.cpp index aff07e085819..f6d61cbf111f 100644 --- a/dom/media/gstreamer/GStreamerReader.cpp +++ b/dom/media/gstreamer/GStreamerReader.cpp @@ -885,7 +885,7 @@ media::TimeIntervals GStreamerReader::GetBuffered() GstFormat format = GST_FORMAT_TIME; #endif AutoPinned resource(mDecoder->GetResource()); - nsTArray ranges; + MediaByteRangeSet ranges; resource->GetCachedRanges(ranges); if (resource->IsDataCachedToEndOfResource(0)) { @@ -1286,7 +1286,7 @@ void GStreamerReader::NotifyDataArrivedInternal() } AutoPinned resource(mResource.GetResource()); - nsTArray byteRanges; + MediaByteRangeSet byteRanges; nsresult rv = resource->GetCachedRanges(byteRanges); if (NS_FAILED(rv)) { diff --git a/dom/media/gtest/MockMediaResource.cpp b/dom/media/gtest/MockMediaResource.cpp index 32a77c916ded..951f44bb1250 100644 --- a/dom/media/gtest/MockMediaResource.cpp +++ b/dom/media/gtest/MockMediaResource.cpp @@ -77,7 +77,7 @@ MockMediaResource::MockClearBufferedRanges() void MockMediaResource::MockAddBufferedRange(int64_t aStart, int64_t aEnd) { - mRanges.AppendElement(MediaByteRange(aStart, aEnd)); + mRanges += MediaByteRange(aStart, aEnd); } int64_t @@ -107,10 +107,9 @@ MockMediaResource::GetCachedDataEnd(int64_t aOffset) } nsresult -MockMediaResource::GetCachedRanges(nsTArray& aRanges) +MockMediaResource::GetCachedRanges(MediaByteRangeSet& aRanges) { - aRanges.Clear(); - aRanges.AppendElements(mRanges); + aRanges = mRanges; return NS_OK; } diff --git a/dom/media/gtest/MockMediaResource.h b/dom/media/gtest/MockMediaResource.h index 20a0ea4cab01..331e32640f66 100644 --- a/dom/media/gtest/MockMediaResource.h +++ b/dom/media/gtest/MockMediaResource.h @@ -58,7 +58,7 @@ public: virtual bool IsTransportSeekable() override { return true; } virtual nsresult Open(nsIStreamListener** aStreamListener) override; - virtual nsresult GetCachedRanges(nsTArray& aRanges) + virtual nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override; virtual const nsCString& GetContentType() const override { @@ -74,7 +74,7 @@ protected: private: FILE* mFileHandle; const char* mFileName; - nsTArray mRanges; + MediaByteRangeSet mRanges; Atomic mEntry; nsCString mContentType; }; diff --git a/dom/media/mediasource/ContainerParser.cpp b/dom/media/mediasource/ContainerParser.cpp index 6fe9caaea6db..cf86937fd087 100644 --- a/dom/media/mediasource/ContainerParser.cpp +++ b/dom/media/mediasource/ContainerParser.cpp @@ -438,10 +438,9 @@ public: } mResource->AppendData(aData); - nsTArray byteRanges; - MediaByteRange mbr = + MediaByteRangeSet byteRanges; + byteRanges += MediaByteRange(mParser->mOffset, mResource->GetLength()); - byteRanges.AppendElement(mbr); mParser->RebuildFragmentedIndex(byteRanges); if (initSegment || !HasCompleteInitData()) { diff --git a/dom/media/mediasource/MediaSourceResource.h b/dom/media/mediasource/MediaSourceResource.h index 467232117d08..6349f81d4a30 100644 --- a/dom/media/mediasource/MediaSourceResource.h +++ b/dom/media/mediasource/MediaSourceResource.h @@ -54,10 +54,10 @@ public: return RefPtr(mPrincipal).forget(); } - virtual nsresult GetCachedRanges(nsTArray& aRanges) override + virtual nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override { UNIMPLEMENTED(); - aRanges.AppendElement(MediaByteRange(0, GetLength())); + aRanges += MediaByteRange(0, GetLength()); return NS_OK; } diff --git a/dom/media/mediasource/SourceBufferResource.h b/dom/media/mediasource/SourceBufferResource.h index bac9b4c08a20..0faea0ad2aa7 100644 --- a/dom/media/mediasource/SourceBufferResource.h +++ b/dom/media/mediasource/SourceBufferResource.h @@ -70,12 +70,12 @@ public: virtual bool IsTransportSeekable() override { UNIMPLEMENTED(); return true; } virtual nsresult Open(nsIStreamListener** aStreamListener) override { UNIMPLEMENTED(); return NS_ERROR_FAILURE; } - virtual nsresult GetCachedRanges(nsTArray& aRanges) override + virtual nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override { ReentrantMonitorAutoEnter mon(mMonitor); if (mInputBuffer.GetLength()) { - aRanges.AppendElement(MediaByteRange(mInputBuffer.GetOffset(), - mInputBuffer.GetLength())); + aRanges += MediaByteRange(mInputBuffer.GetOffset(), + mInputBuffer.GetLength()); } return NS_OK; } diff --git a/dom/media/ogg/OggReader.cpp b/dom/media/ogg/OggReader.cpp index 338990038a27..f0f379a55517 100644 --- a/dom/media/ogg/OggReader.cpp +++ b/dom/media/ogg/OggReader.cpp @@ -1160,12 +1160,12 @@ nsresult OggReader::GetSeekRanges(nsTArray& aRanges) { MOZ_ASSERT(OnTaskQueue()); AutoPinned resource(mDecoder->GetResource()); - nsTArray cached; + MediaByteRangeSet cached; nsresult res = resource->GetCachedRanges(cached); NS_ENSURE_SUCCESS(res, res); for (uint32_t index = 0; index < cached.Length(); index++) { - MediaByteRange& range = cached[index]; + auto& range = cached[index]; int64_t startTime = -1; int64_t endTime = -1; if (NS_FAILED(ResetDecode())) { @@ -1841,7 +1841,7 @@ media::TimeIntervals OggReader::GetBuffered() } AutoPinned resource(mDecoder->GetResource()); - nsTArray ranges; + MediaByteRangeSet ranges; nsresult res = resource->GetCachedRanges(ranges); NS_ENSURE_SUCCESS(res, media::TimeIntervals::Invalid()); diff --git a/dom/media/omx/MediaOmxReader.cpp b/dom/media/omx/MediaOmxReader.cpp index 65a370b260b1..aa37beeccee0 100644 --- a/dom/media/omx/MediaOmxReader.cpp +++ b/dom/media/omx/MediaOmxReader.cpp @@ -464,7 +464,7 @@ void MediaOmxReader::NotifyDataArrivedInternal() } AutoPinned resource(mDecoder->GetResource()); - nsTArray byteRanges; + MediaByteRangeSet byteRanges; nsresult rv = resource->GetCachedRanges(byteRanges); if (NS_FAILED(rv)) { diff --git a/dom/media/webm/WebMBufferedParser.cpp b/dom/media/webm/WebMBufferedParser.cpp index 9c7049a427c2..3d9679a24276 100644 --- a/dom/media/webm/WebMBufferedParser.cpp +++ b/dom/media/webm/WebMBufferedParser.cpp @@ -383,7 +383,7 @@ void WebMBufferedState::Reset() { mTimeMapping.Clear(); } -void WebMBufferedState::UpdateIndex(const nsTArray& aRanges, MediaResource* aResource) +void WebMBufferedState::UpdateIndex(const MediaByteRangeSet& aRanges, MediaResource* aResource) { for (uint32_t index = 0; index < aRanges.Length(); index++) { const MediaByteRange& range = aRanges[index]; diff --git a/dom/media/webm/WebMBufferedParser.h b/dom/media/webm/WebMBufferedParser.h index d33f66468a2e..c65897407d63 100644 --- a/dom/media/webm/WebMBufferedParser.h +++ b/dom/media/webm/WebMBufferedParser.h @@ -266,7 +266,7 @@ public: void NotifyDataArrived(const unsigned char* aBuffer, uint32_t aLength, int64_t aOffset); void Reset(); - void UpdateIndex(const nsTArray& aRanges, MediaResource* aResource); + void UpdateIndex(const MediaByteRangeSet& aRanges, MediaResource* aResource); bool CalculateBufferedForRange(int64_t aStartOffset, int64_t aEndOffset, uint64_t* aStartTime, uint64_t* aEndTime); diff --git a/dom/media/webm/WebMDemuxer.cpp b/dom/media/webm/WebMDemuxer.cpp index be95e933734e..ec109d71e5fc 100644 --- a/dom/media/webm/WebMDemuxer.cpp +++ b/dom/media/webm/WebMDemuxer.cpp @@ -439,7 +439,7 @@ WebMDemuxer::EnsureUpToDateIndex() return; } AutoPinned resource(mResource.GetResource()); - nsTArray byteRanges; + MediaByteRangeSet byteRanges; nsresult rv = resource->GetCachedRanges(byteRanges); if (NS_FAILED(rv) || !byteRanges.Length()) { return; @@ -732,7 +732,7 @@ WebMDemuxer::GetBuffered() media::TimeIntervals buffered; - nsTArray ranges; + MediaByteRangeSet ranges; nsresult rv = resource->GetCachedRanges(ranges); if (NS_FAILED(rv)) { return media::TimeIntervals(); diff --git a/dom/media/webm/WebMReader.cpp b/dom/media/webm/WebMReader.cpp index 4083d49483f3..fdee7285d6f2 100644 --- a/dom/media/webm/WebMReader.cpp +++ b/dom/media/webm/WebMReader.cpp @@ -749,7 +749,7 @@ media::TimeIntervals WebMReader::GetBuffered() // Either we the file is not fully cached, or we couldn't find a duration in // the WebM bitstream. - nsTArray ranges; + MediaByteRangeSet ranges; nsresult res = resource->GetCachedRanges(ranges); NS_ENSURE_SUCCESS(res, media::TimeIntervals::Invalid()); @@ -788,7 +788,7 @@ void WebMReader::NotifyDataArrivedInternal() { MOZ_ASSERT(OnTaskQueue()); AutoPinned resource(mDecoder->GetResource()); - nsTArray byteRanges; + MediaByteRangeSet byteRanges; nsresult rv = resource->GetCachedRanges(byteRanges); if (NS_FAILED(rv)) { diff --git a/media/libstagefright/binding/Box.cpp b/media/libstagefright/binding/Box.cpp index fdc2665cdf67..46a46b4e427e 100644 --- a/media/libstagefright/binding/Box.cpp +++ b/media/libstagefright/binding/Box.cpp @@ -56,7 +56,7 @@ Box::Box(BoxContext* aContext, uint64_t aOffset, const Box* aParent) return; } - byteRange = &mContext->mByteRanges[i]; + byteRange = static_cast(&mContext->mByteRanges[i]); if (byteRange->Contains(headerRange)) { break; } @@ -88,7 +88,7 @@ Box::Box(BoxContext* aContext, uint64_t aOffset, const Box* aParent) mBodyOffset = bigLengthRange.mEnd; } else if (size == 0) { // box extends to end of file. - size = mContext->mByteRanges.LastElement().mEnd - aOffset; + size = mContext->mByteRanges.LastInterval().mEnd - aOffset; mBodyOffset = headerRange.mEnd; } else { mBodyOffset = headerRange.mEnd; diff --git a/media/libstagefright/binding/Index.cpp b/media/libstagefright/binding/Index.cpp index de8dff497383..13e689133e8e 100644 --- a/media/libstagefright/binding/Index.cpp +++ b/media/libstagefright/binding/Index.cpp @@ -25,7 +25,7 @@ public: // Given that we're processing this in order we don't use a binary search // to find the apropriate time range. Instead we search linearly from the // last used point. - explicit RangeFinder(const nsTArray& ranges) + explicit RangeFinder(const MediaByteRangeSet& ranges) : mRanges(ranges), mIndex(0) { // Ranges must be normalised for this to work @@ -34,7 +34,7 @@ public: bool Contains(MediaByteRange aByteRange); private: - const nsTArray& mRanges; + const MediaByteRangeSet& mRanges; size_t mIndex; }; @@ -266,7 +266,7 @@ Index::Index(const nsTArray& aIndex, Index::~Index() {} void -Index::UpdateMoofIndex(const nsTArray& aByteRanges) +Index::UpdateMoofIndex(const MediaByteRangeSet& aByteRanges) { if (!mMoofParser) { return; @@ -276,7 +276,7 @@ Index::UpdateMoofIndex(const nsTArray& aByteRanges) } Microseconds -Index::GetEndCompositionIfBuffered(const nsTArray& aByteRanges) +Index::GetEndCompositionIfBuffered(const MediaByteRangeSet& aByteRanges) { FallibleTArray* index; if (mMoofParser) { @@ -305,7 +305,7 @@ Index::GetEndCompositionIfBuffered(const nsTArray& aByteRanges) void Index::ConvertByteRangesToTimeRanges( - const nsTArray& aByteRanges, + const MediaByteRangeSet& aByteRanges, nsTArray>* aTimeRanges) { RangeFinder rangeFinder(aByteRanges); diff --git a/media/libstagefright/binding/MoofParser.cpp b/media/libstagefright/binding/MoofParser.cpp index c3c0b8bd4589..310539048e44 100644 --- a/media/libstagefright/binding/MoofParser.cpp +++ b/media/libstagefright/binding/MoofParser.cpp @@ -28,7 +28,7 @@ using namespace mozilla; bool MoofParser::RebuildFragmentedIndex( - const nsTArray& aByteRanges) + const MediaByteRangeSet& aByteRanges) { BoxContext context(mSource, aByteRanges); return RebuildFragmentedIndex(context); @@ -59,7 +59,7 @@ MoofParser::RebuildFragmentedIndex(BoxContext& aContext) } mMoofs.AppendElement(moof); - mMediaRanges.AppendElement(moof.mRange); + mMediaRanges += moof.mRange; foundValidMoof = true; } else if (box.IsType("mdat") && !Moofs().IsEmpty()) { // Check if we have all our data from last moof. @@ -67,8 +67,8 @@ MoofParser::RebuildFragmentedIndex(BoxContext& aContext) media::Interval datarange(moof.mMdatRange.mStart, moof.mMdatRange.mEnd, 0); media::Interval mdat(box.Range().mStart, box.Range().mEnd, 0); if (datarange.Intersects(mdat)) { - mMediaRanges.LastElement() = - mMediaRanges.LastElement().Span(box.Range()); + mMediaRanges.LastInterval() = + mMediaRanges.LastInterval().Span(box.Range()); } } mOffset = box.NextOffset(); @@ -128,15 +128,15 @@ MoofParser::BlockingReadNextMoof() { int64_t length = std::numeric_limits::max(); mSource->Length(&length); - nsTArray byteRanges; - byteRanges.AppendElement(MediaByteRange(0, length)); + MediaByteRangeSet byteRanges; + byteRanges += MediaByteRange(0, length); RefPtr stream = new BlockingStream(mSource); BoxContext context(stream, byteRanges); for (Box box(&context, mOffset); box.IsAvailable(); box = box.Next()) { if (box.IsType("moof")) { byteRanges.Clear(); - byteRanges.AppendElement(MediaByteRange(mOffset, box.Range().mEnd)); + byteRanges += MediaByteRange(mOffset, box.Range().mEnd); return RebuildFragmentedIndex(context); } } @@ -149,8 +149,8 @@ MoofParser::ScanForMetadata(mozilla::MediaByteRange& aFtyp, { int64_t length = std::numeric_limits::max(); mSource->Length(&length); - nsTArray byteRanges; - byteRanges.AppendElement(MediaByteRange(0, length)); + MediaByteRangeSet byteRanges; + byteRanges += MediaByteRange(0, length); RefPtr stream = new BlockingStream(mSource); BoxContext context(stream, byteRanges); @@ -207,7 +207,7 @@ MoofParser::Metadata() } Interval -MoofParser::GetCompositionRange(const nsTArray& aByteRanges) +MoofParser::GetCompositionRange(const MediaByteRangeSet& aByteRanges) { Interval compositionRange; BoxContext context(mSource, aByteRanges); diff --git a/media/libstagefright/binding/include/mp4_demuxer/Box.h b/media/libstagefright/binding/include/mp4_demuxer/Box.h index b2899a70250e..e79b0130f83e 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/Box.h +++ b/media/libstagefright/binding/include/mp4_demuxer/Box.h @@ -23,13 +23,13 @@ class Stream; class BoxContext { public: - BoxContext(Stream* aSource, const nsTArray& aByteRanges) + BoxContext(Stream* aSource, const MediaByteRangeSet& aByteRanges) : mSource(aSource), mByteRanges(aByteRanges) { } RefPtr mSource; - const nsTArray& mByteRanges; + const MediaByteRangeSet& mByteRanges; }; class Box diff --git a/media/libstagefright/binding/include/mp4_demuxer/Index.h b/media/libstagefright/binding/include/mp4_demuxer/Index.h index c2e4b878b808..b7375087c5c9 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/Index.h +++ b/media/libstagefright/binding/include/mp4_demuxer/Index.h @@ -60,11 +60,11 @@ public: bool aIsAudio, mozilla::Monitor* aMonitor); - void UpdateMoofIndex(const nsTArray& aByteRanges); + void UpdateMoofIndex(const mozilla::MediaByteRangeSet& aByteRanges); Microseconds GetEndCompositionIfBuffered( - const nsTArray& aByteRanges); + const mozilla::MediaByteRangeSet& aByteRanges); void ConvertByteRangesToTimeRanges( - const nsTArray& aByteRanges, + const mozilla::MediaByteRangeSet& aByteRanges, nsTArray>* aTimeRanges); uint64_t GetEvictionOffset(Microseconds aTime); bool IsFragmented() { return mMoofParser; } diff --git a/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h b/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h index ee2a22d7fa49..9feba016d6a3 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h +++ b/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h @@ -165,7 +165,7 @@ public: class AuxInfo { public: AuxInfo(int64_t aMoofOffset, Saiz& aSaiz, Saio& aSaio); - bool GetByteRanges(nsTArray* aByteRanges); + bool GetByteRanges(MediaByteRangeSet* aByteRanges); private: int64_t mMoofOffset; @@ -212,10 +212,10 @@ public: // the composition range for MSE. We need an array of tracks. } bool RebuildFragmentedIndex( - const nsTArray& aByteRanges); + const mozilla::MediaByteRangeSet& aByteRanges); bool RebuildFragmentedIndex(BoxContext& aContext); Interval GetCompositionRange( - const nsTArray& aByteRanges); + const mozilla::MediaByteRangeSet& aByteRanges); bool ReachedEnd(); void ParseMoov(Box& aBox); void ParseTrak(Box& aBox); @@ -250,7 +250,7 @@ private: void ScanForMetadata(mozilla::MediaByteRange& aFtyp, mozilla::MediaByteRange& aMoov); nsTArray mMoofs; - nsTArray mMediaRanges; + MediaByteRangeSet mMediaRanges; bool mIsAudio; }; } diff --git a/media/libstagefright/gtest/TestParser.cpp b/media/libstagefright/gtest/TestParser.cpp index 8f40ee06f71d..4903121c0198 100644 --- a/media/libstagefright/gtest/TestParser.cpp +++ b/media/libstagefright/gtest/TestParser.cpp @@ -102,8 +102,7 @@ TEST(stagefright_MoofParser, EmptyStream) EXPECT_EQ(0u, parser.mOffset); EXPECT_TRUE(parser.ReachedEnd()); - nsTArray byteRanges; - byteRanges.AppendElement(MediaByteRange(0, 0)); + MediaByteRangeSet byteRanges; EXPECT_FALSE(parser.RebuildFragmentedIndex(byteRanges)); EXPECT_TRUE(parser.GetCompositionRange(byteRanges).IsNull()); @@ -292,8 +291,7 @@ TEST(stagefright_MoofParser, test_case_mp4) EXPECT_EQ(0u, parser.mOffset); EXPECT_FALSE(parser.ReachedEnd()); - nsTArray byteRanges; - byteRanges.AppendElement(MediaByteRange(0, 0)); + MediaByteRangeSet byteRanges; EXPECT_FALSE(parser.RebuildFragmentedIndex(byteRanges)); EXPECT_TRUE(parser.GetCompositionRange(byteRanges).IsNull()); @@ -329,8 +327,7 @@ TEST(stagefright_MoofParser, test_case_mp4_subsets) new TestStream(buffer.Elements() + offset, size); MoofParser parser(stream, 0, false, &monitor); - nsTArray byteRanges; - byteRanges.AppendElement(MediaByteRange(0, 0)); + MediaByteRangeSet byteRanges; EXPECT_FALSE(parser.RebuildFragmentedIndex(byteRanges)); parser.GetCompositionRange(byteRanges); parser.HasMetadata(); From a7975b198f74c5c28993893f8e9eb6b7583e50d0 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Tue, 24 Nov 2015 20:37:21 +1100 Subject: [PATCH 128/153] Bug 1227396: P8. Replace MediaByteRange with Interval typedef. r=cpearce It's now okay to simplify. --- dom/media/BufferMediaResource.h | 2 +- dom/media/MediaResource.h | 22 +------------------ dom/media/mediasource/ContainerParser.cpp | 4 ++-- .../mediasource/gtest/TestContainerParser.cpp | 2 +- .../binding/include/mp4_demuxer/MP4Metadata.h | 2 -- 5 files changed, 5 insertions(+), 27 deletions(-) diff --git a/dom/media/BufferMediaResource.h b/dom/media/BufferMediaResource.h index a5bf11b30fc6..f252e6590d56 100644 --- a/dom/media/BufferMediaResource.h +++ b/dom/media/BufferMediaResource.h @@ -101,7 +101,7 @@ private: virtual nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override { - aRanges += MediaByteRange(0, mLength); + aRanges += MediaByteRange(0, int64_t(mLength)); return NS_OK; } diff --git a/dom/media/MediaResource.h b/dom/media/MediaResource.h index 845cccca7bf5..6f5c2df9edab 100644 --- a/dom/media/MediaResource.h +++ b/dom/media/MediaResource.h @@ -132,27 +132,7 @@ private: // Represents a section of contiguous media, with a start and end offset. // Used to denote ranges of data which are cached. -class MediaByteRange : public media::Interval { -public: - typedef Interval BaseType; - - // We can't use inherited constructors yet. So we have to duplicate the - // constructors found in Interval base class. - // all this could be later replaced with: - // using Interval::Interval; - - MOZ_IMPLICIT MediaByteRange(const BaseType& aOther) - : BaseType(aOther) - {} - MOZ_IMPLICIT MediaByteRange(BaseType&& aOther) - : BaseType(Move(aOther)) - {} - MediaByteRange(int64_t aStart, int64_t aEnd) - : media::Interval(aStart, aEnd) - {} - MediaByteRange() = default; -}; - +typedef media::Interval MediaByteRange; typedef media::IntervalSet MediaByteRangeSet; class RtspMediaResource; diff --git a/dom/media/mediasource/ContainerParser.cpp b/dom/media/mediasource/ContainerParser.cpp index cf86937fd087..fb06440fe75e 100644 --- a/dom/media/mediasource/ContainerParser.cpp +++ b/dom/media/mediasource/ContainerParser.cpp @@ -440,7 +440,7 @@ public: mResource->AppendData(aData); MediaByteRangeSet byteRanges; byteRanges += - MediaByteRange(mParser->mOffset, mResource->GetLength()); + MediaByteRange(int64_t(mParser->mOffset), mResource->GetLength()); mParser->RebuildFragmentedIndex(byteRanges); if (initSegment || !HasCompleteInitData()) { @@ -609,7 +609,7 @@ public: return false; } mHasInitData = true; - mCompleteInitSegmentRange = MediaByteRange(0, header.header_length); + mCompleteInitSegmentRange = MediaByteRange(0, int64_t(header.header_length)); // Cache raw header in case the caller wants a copy. mInitData = new MediaByteBuffer(header.header_length); diff --git a/dom/media/mediasource/gtest/TestContainerParser.cpp b/dom/media/mediasource/gtest/TestContainerParser.cpp index a65d691fade8..d29770cd35cc 100644 --- a/dom/media/mediasource/gtest/TestContainerParser.cpp +++ b/dom/media/mediasource/gtest/TestContainerParser.cpp @@ -85,7 +85,7 @@ TEST(ContainerParser, ADTSHeader) { ASSERT_NE(init, nullptr); EXPECT_EQ(init->Length(), header->Length()); - EXPECT_EQ(parser->InitSegmentRange(), MediaByteRange(0, header->Length())); + EXPECT_EQ(parser->InitSegmentRange(), MediaByteRange(0, int64_t(header->Length()))); // Media segment range should be empty here. EXPECT_EQ(parser->MediaHeaderRange(), MediaByteRange()); EXPECT_EQ(parser->MediaSegmentRange(), MediaByteRange()); diff --git a/media/libstagefright/binding/include/mp4_demuxer/MP4Metadata.h b/media/libstagefright/binding/include/mp4_demuxer/MP4Metadata.h index 33eda84fe2a9..e0b8e362cdac 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/MP4Metadata.h +++ b/media/libstagefright/binding/include/mp4_demuxer/MP4Metadata.h @@ -14,8 +14,6 @@ #include "MediaInfo.h" #include "MediaResource.h" -namespace mozilla { class MediaByteRange; } - namespace stagefright { class MetaData; } namespace mp4_demuxer From fdf27ff498113a686be06b36eaa7215710f8dfba Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Wed, 25 Nov 2015 12:24:42 +1100 Subject: [PATCH 129/153] Bug 1227396: P9. Remove unnecessary monitor. r=cpearce The Index and MoofParser are now only used via the MP4Demuxer which is guaranteed to always be called on the same taskqueue. --- dom/media/fmp4/MP4Demuxer.cpp | 13 +------------ dom/media/mediasource/ContainerParser.cpp | 6 +----- media/libstagefright/binding/Index.cpp | 6 ++---- media/libstagefright/binding/MP4Metadata.cpp | 11 ++--------- .../binding/include/mp4_demuxer/Index.h | 5 +---- .../binding/include/mp4_demuxer/MoofParser.h | 8 ++------ media/libstagefright/gtest/TestParser.cpp | 12 +++--------- 7 files changed, 12 insertions(+), 49 deletions(-) diff --git a/dom/media/fmp4/MP4Demuxer.cpp b/dom/media/fmp4/MP4Demuxer.cpp index a853182e5c58..c0c92135f4e9 100644 --- a/dom/media/fmp4/MP4Demuxer.cpp +++ b/dom/media/fmp4/MP4Demuxer.cpp @@ -59,9 +59,6 @@ private: RefPtr mParent; RefPtr mStream; UniquePtr mInfo; - // We do not actually need a monitor, however MoofParser (in mIndex) will - // assert if a monitor isn't held. - Monitor mMonitor; RefPtr mIndex; UniquePtr mIterator; Maybe mNextKeyframeTime; @@ -228,12 +225,10 @@ MP4TrackDemuxer::MP4TrackDemuxer(MP4Demuxer* aParent, : mParent(aParent) , mStream(new mp4_demuxer::ResourceStream(mParent->mResource)) , mInfo(Move(aInfo)) - , mMonitor("MP4TrackDemuxer") , mIndex(new mp4_demuxer::Index(indices, mStream, mInfo->mTrackId, - mInfo->IsAudio(), - &mMonitor)) + mInfo->IsAudio())) , mIterator(MakeUnique(mIndex)) , mNeedReIndex(true) { @@ -269,7 +264,6 @@ MP4TrackDemuxer::EnsureUpToDateIndex() if (NS_FAILED(rv)) { return; } - MonitorAutoLock mon(mMonitor); mIndex->UpdateMoofIndex(byteRanges); mNeedReIndex = false; } @@ -280,7 +274,6 @@ MP4TrackDemuxer::Seek(media::TimeUnit aTime) int64_t seekTime = aTime.ToMicroseconds(); mQueuedSample = nullptr; - MonitorAutoLock mon(mMonitor); mIterator->Seek(seekTime); // Check what time we actually seeked to. @@ -307,7 +300,6 @@ MP4TrackDemuxer::GetSamples(int32_t aNumSamples) mQueuedSample = nullptr; aNumSamples--; } - MonitorAutoLock mon(mMonitor); RefPtr sample; while (aNumSamples && (sample = mIterator->GetNext())) { samples->mSamples.AppendElement(sample); @@ -338,7 +330,6 @@ MP4TrackDemuxer::Reset() { mQueuedSample = nullptr; // TODO, Seek to first frame available, which isn't always 0. - MonitorAutoLock mon(mMonitor); mIterator->Seek(0); SetNextKeyFrameTime(); } @@ -386,7 +377,6 @@ MP4TrackDemuxer::GetNextRandomAccessPoint(media::TimeUnit* aTime) RefPtr MP4TrackDemuxer::SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold) { - MonitorAutoLock mon(mMonitor); mQueuedSample = nullptr; // Loop until we reach the next keyframe after the threshold. uint32_t parsed = 0; @@ -421,7 +411,6 @@ MP4TrackDemuxer::GetBuffered() } nsTArray> timeRanges; - MonitorAutoLock mon(mMonitor); mIndex->ConvertByteRangesToTimeRanges(byteRanges, &timeRanges); // convert timeRanges. media::TimeIntervals ranges = media::TimeIntervals(); diff --git a/dom/media/mediasource/ContainerParser.cpp b/dom/media/mediasource/ContainerParser.cpp index fb06440fe75e..2ed765d4d73b 100644 --- a/dom/media/mediasource/ContainerParser.cpp +++ b/dom/media/mediasource/ContainerParser.cpp @@ -334,7 +334,6 @@ class MP4ContainerParser : public ContainerParser { public: explicit MP4ContainerParser(const nsACString& aType) : ContainerParser(aType) - , mMonitor("MP4ContainerParser Index Monitor") {} bool IsInitSegmentPresent(MediaByteBuffer* aData) override @@ -421,8 +420,6 @@ public: bool ParseStartAndEndTimestamps(MediaByteBuffer* aData, int64_t& aStart, int64_t& aEnd) override { - MonitorAutoLock mon(mMonitor); // We're not actually racing against anything, - // but mParser requires us to hold a monitor. bool initSegment = IsInitSegmentPresent(aData); if (initSegment) { mResource = new SourceBufferResource(NS_LITERAL_CSTRING("video/mp4")); @@ -431,7 +428,7 @@ public: // consumers of ParseStartAndEndTimestamps to add their timestamp offset // manually. This allows the ContainerParser to be shared across different // timestampOffsets. - mParser = new mp4_demuxer::MoofParser(mStream, 0, /* aIsAudio = */ false, &mMonitor); + mParser = new mp4_demuxer::MoofParser(mStream, 0, /* aIsAudio = */ false); mInitData = new MediaByteBuffer(); } else if (!mStream || !mParser) { return false; @@ -495,7 +492,6 @@ public: private: RefPtr mStream; nsAutoPtr mParser; - Monitor mMonitor; }; #endif // MOZ_FMP4 diff --git a/media/libstagefright/binding/Index.cpp b/media/libstagefright/binding/Index.cpp index 13e689133e8e..c3a4e20f84c7 100644 --- a/media/libstagefright/binding/Index.cpp +++ b/media/libstagefright/binding/Index.cpp @@ -236,13 +236,11 @@ SampleIterator::GetNextKeyframeTime() Index::Index(const nsTArray& aIndex, Stream* aSource, uint32_t aTrackId, - bool aIsAudio, - Monitor* aMonitor) + bool aIsAudio) : mSource(aSource) - , mMonitor(aMonitor) { if (aIndex.IsEmpty()) { - mMoofParser = new MoofParser(aSource, aTrackId, aIsAudio, aMonitor); + mMoofParser = new MoofParser(aSource, aTrackId, aIsAudio); } else { if (!mIndex.SetCapacity(aIndex.Length(), fallible)) { // OOM. diff --git a/media/libstagefright/binding/MP4Metadata.cpp b/media/libstagefright/binding/MP4Metadata.cpp index 5ab8ecf3133c..a3f68b73b19a 100644 --- a/media/libstagefright/binding/MP4Metadata.cpp +++ b/media/libstagefright/binding/MP4Metadata.cpp @@ -8,7 +8,6 @@ #include "media/stagefright/MediaSource.h" #include "media/stagefright/MetaData.h" #include "mozilla/Logging.h" -#include "mozilla/Monitor.h" #include "mozilla/Telemetry.h" #include "mp4_demuxer/MoofParser.h" #include "mp4_demuxer/MP4Metadata.h" @@ -333,20 +332,14 @@ MP4Metadata::GetTrackNumber(mozilla::TrackID aTrackID) /*static*/ bool MP4Metadata::HasCompleteMetadata(Stream* aSource) { - // The MoofParser requires a monitor, but we don't need one here. - mozilla::Monitor monitor("MP4Metadata::HasCompleteMetadata"); - mozilla::MonitorAutoLock mon(monitor); - auto parser = mozilla::MakeUnique(aSource, 0, false, &monitor); + auto parser = mozilla::MakeUnique(aSource, 0, false); return parser->HasMetadata(); } /*static*/ already_AddRefed MP4Metadata::Metadata(Stream* aSource) { - // The MoofParser requires a monitor, but we don't need one here. - mozilla::Monitor monitor("MP4Metadata::HasCompleteMetadata"); - mozilla::MonitorAutoLock mon(monitor); - auto parser = mozilla::MakeUnique(aSource, 0, false, &monitor); + auto parser = mozilla::MakeUnique(aSource, 0, false); return parser->Metadata(); } diff --git a/media/libstagefright/binding/include/mp4_demuxer/Index.h b/media/libstagefright/binding/include/mp4_demuxer/Index.h index b7375087c5c9..cd42481e7271 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/Index.h +++ b/media/libstagefright/binding/include/mp4_demuxer/Index.h @@ -7,7 +7,6 @@ #include "MediaData.h" #include "MediaResource.h" -#include "mozilla/Monitor.h" #include "mp4_demuxer/Interval.h" #include "mp4_demuxer/Stream.h" #include "nsISupportsImpl.h" @@ -57,8 +56,7 @@ public: Index(const nsTArray& aIndex, Stream* aSource, uint32_t aTrackId, - bool aIsAudio, - mozilla::Monitor* aMonitor); + bool aIsAudio); void UpdateMoofIndex(const mozilla::MediaByteRangeSet& aByteRanges); Microseconds GetEndCompositionIfBuffered( @@ -77,7 +75,6 @@ private: Stream* mSource; FallibleTArray mIndex; nsAutoPtr mMoofParser; - mozilla::Monitor* mMonitor; }; } diff --git a/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h b/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h index 9feba016d6a3..7b6d8bfd4f4a 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h +++ b/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h @@ -5,7 +5,6 @@ #ifndef MOOF_PARSER_H_ #define MOOF_PARSER_H_ -#include "mozilla/Monitor.h" #include "mp4_demuxer/Atom.h" #include "mp4_demuxer/AtomType.h" #include "mp4_demuxer/SinfParser.h" @@ -14,7 +13,6 @@ #include "MediaResource.h" namespace mp4_demuxer { -using mozilla::Monitor; typedef int64_t Microseconds; class Box; @@ -201,11 +199,10 @@ private: class MoofParser { public: - MoofParser(Stream* aSource, uint32_t aTrackId, bool aIsAudio, Monitor* aMonitor) + MoofParser(Stream* aSource, uint32_t aTrackId, bool aIsAudio) : mSource(aSource) , mOffset(0) , mTrex(aTrackId) - , mMonitor(aMonitor) , mIsAudio(aIsAudio) { // Setting the mTrex.mTrackId to 0 is a nasty work around for calculating @@ -244,8 +241,7 @@ public: Tfdt mTfdt; Edts mEdts; Sinf mSinf; - Monitor* mMonitor; - nsTArray& Moofs() { mMonitor->AssertCurrentThreadOwns(); return mMoofs; } + nsTArray& Moofs() { return mMoofs; } private: void ScanForMetadata(mozilla::MediaByteRange& aFtyp, mozilla::MediaByteRange& aMoov); diff --git a/media/libstagefright/gtest/TestParser.cpp b/media/libstagefright/gtest/TestParser.cpp index 4903121c0198..26942abe4316 100644 --- a/media/libstagefright/gtest/TestParser.cpp +++ b/media/libstagefright/gtest/TestParser.cpp @@ -96,9 +96,7 @@ TEST(stagefright_MoofParser, EmptyStream) { RefPtr stream = new TestStream(nullptr, 0); - Monitor monitor("MP4Metadata::gtest"); - MonitorAutoLock mon(monitor); - MoofParser parser(stream, 0, false, &monitor); + MoofParser parser(stream, 0, false); EXPECT_EQ(0u, parser.mOffset); EXPECT_TRUE(parser.ReachedEnd()); @@ -285,9 +283,7 @@ TEST(stagefright_MoofParser, test_case_mp4) ASSERT_FALSE(buffer.IsEmpty()); RefPtr stream = new TestStream(buffer.Elements(), buffer.Length()); - Monitor monitor("MP4Metadata::HasCompleteMetadata"); - MonitorAutoLock mon(monitor); - MoofParser parser(stream, 0, false, &monitor); + MoofParser parser(stream, 0, false); EXPECT_EQ(0u, parser.mOffset); EXPECT_FALSE(parser.ReachedEnd()); @@ -315,8 +311,6 @@ TEST(stagefright_MoofParser, test_case_mp4_subsets) nsTArray buffer = ReadTestFile(testFiles[test].mFilename); ASSERT_FALSE(buffer.IsEmpty()); ASSERT_LE(step, buffer.Length()); - Monitor monitor("MP4Metadata::HasCompleteMetadata"); - MonitorAutoLock mon(monitor); // Just exercizing the parser starting at different points through the file, // making sure it doesn't crash. // No checks because results would differ for each position. @@ -326,7 +320,7 @@ TEST(stagefright_MoofParser, test_case_mp4_subsets) RefPtr stream = new TestStream(buffer.Elements() + offset, size); - MoofParser parser(stream, 0, false, &monitor); + MoofParser parser(stream, 0, false); MediaByteRangeSet byteRanges; EXPECT_FALSE(parser.RebuildFragmentedIndex(byteRanges)); parser.GetCompositionRange(byteRanges); From 219b4520a66f6f6fe62963af3dab41fd64b50293 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Wed, 25 Nov 2015 13:17:27 +1100 Subject: [PATCH 130/153] Bug 1227396: P10: Remove stray function definition. r=cpearce --- media/libstagefright/binding/include/mp4_demuxer/MoofParser.h | 1 - 1 file changed, 1 deletion(-) diff --git a/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h b/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h index 7b6d8bfd4f4a..af5b8ed80289 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h +++ b/media/libstagefright/binding/include/mp4_demuxer/MoofParser.h @@ -163,7 +163,6 @@ public: class AuxInfo { public: AuxInfo(int64_t aMoofOffset, Saiz& aSaiz, Saio& aSaio); - bool GetByteRanges(MediaByteRangeSet* aByteRanges); private: int64_t mMoofOffset; From 5c7a8901c8ba4adda2bc2596c5f0617f877abf64 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Wed, 25 Nov 2015 20:46:11 +1100 Subject: [PATCH 131/153] Bug 1227396: P11. Add IntervalSet::operator- operand. r=gerald Also fix constness. --- dom/media/Intervals.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/dom/media/Intervals.h b/dom/media/Intervals.h index 42a4372e94df..fa3ea2ed08e9 100644 --- a/dom/media/Intervals.h +++ b/dom/media/Intervals.h @@ -401,7 +401,7 @@ public: return intervals; } - SelfType operator+ (const ElemType& aInterval) + SelfType operator+ (const ElemType& aInterval) const { SelfType intervals(*this); intervals.Add(aInterval); @@ -442,7 +442,14 @@ public: return *this; } - SelfType operator- (const ElemType& aInterval) + SelfType operator- (const SelfType& aInterval) const + { + SelfType intervals(*this); + intervals -= aInterval; + return intervals; + } + + SelfType operator- (const ElemType& aInterval) const { SelfType intervals(*this); intervals -= aInterval; From ead53cc75ed55c8325febdea3ace2c8a7e4cc6ce Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Wed, 25 Nov 2015 20:30:09 +1100 Subject: [PATCH 132/153] Bug 1227396: P12. Use MediaByteRangeSet capabilities to filter already processed data. r=cpearce --- dom/media/MP3FrameParser.h | 18 ------------------ dom/media/directshow/DirectShowReader.cpp | 9 +++++---- dom/media/directshow/DirectShowReader.h | 3 ++- dom/media/gstreamer/GStreamerReader.cpp | 9 +++++---- dom/media/gstreamer/GStreamerReader.h | 2 +- dom/media/omx/MediaOmxReader.cpp | 8 +++++--- dom/media/omx/MediaOmxReader.h | 2 +- 7 files changed, 19 insertions(+), 32 deletions(-) diff --git a/dom/media/MP3FrameParser.h b/dom/media/MP3FrameParser.h index f0489db784bf..9941fe1aad84 100644 --- a/dom/media/MP3FrameParser.h +++ b/dom/media/MP3FrameParser.h @@ -214,24 +214,6 @@ private: }; -class NotifyDataArrivedFilter { -public: - media::IntervalSet NotifyDataArrived(uint32_t aLength, int64_t aOffset) { - media::Interval interval(aOffset, aOffset + aLength); - media::IntervalSet newIntervals(interval); - newIntervals -= mIntervals; - mIntervals += interval; - return newIntervals; - } - - const media::IntervalSet& GetIntervals() { - return mIntervals; - } - -private: - media::IntervalSet mIntervals; -}; - } // namespace mozilla #endif diff --git a/dom/media/directshow/DirectShowReader.cpp b/dom/media/directshow/DirectShowReader.cpp index 14d7b368cd42..9e3372e86cef 100644 --- a/dom/media/directshow/DirectShowReader.cpp +++ b/dom/media/directshow/DirectShowReader.cpp @@ -11,7 +11,6 @@ #include "AudioSinkFilter.h" #include "SourceFilter.h" #include "SampleSink.h" -#include "MediaResource.h" #include "VideoUtils.h" using namespace mozilla::media; @@ -391,10 +390,12 @@ DirectShowReader::NotifyDataArrivedInternal() return; } - IntervalSet intervals; - for (auto& range : byteRanges) { - intervals += mFilter.NotifyDataArrived(range.Length(), range.mStart); + if (byteRanges == mLastCachedRanges) { + return; } + MediaByteRangeSet intervals = byteRanges - mLastCachedRanges; + mLastCachedRanges = byteRanges; + for (const auto& interval : intervals) { RefPtr bytes = resource->MediaReadAt(interval.mStart, interval.Length()); diff --git a/dom/media/directshow/DirectShowReader.h b/dom/media/directshow/DirectShowReader.h index c15f083f6b2d..50ea70b59998 100644 --- a/dom/media/directshow/DirectShowReader.h +++ b/dom/media/directshow/DirectShowReader.h @@ -9,6 +9,7 @@ #include "windows.h" // HRESULT, DWORD #include "MediaDecoderReader.h" +#include "MediaResource.h" #include "mozilla/RefPtr.h" #include "MP3FrameParser.h" @@ -105,7 +106,7 @@ private: // Duration of the stream, in microseconds. int64_t mDuration; - NotifyDataArrivedFilter mFilter; + MediaByteRangeSet mLastCachedRanges; }; } // namespace mozilla diff --git a/dom/media/gstreamer/GStreamerReader.cpp b/dom/media/gstreamer/GStreamerReader.cpp index f6d61cbf111f..431a5188ab8d 100644 --- a/dom/media/gstreamer/GStreamerReader.cpp +++ b/dom/media/gstreamer/GStreamerReader.cpp @@ -1292,11 +1292,12 @@ void GStreamerReader::NotifyDataArrivedInternal() if (NS_FAILED(rv)) { return; } - - IntervalSet intervals; - for (auto& range : byteRanges) { - intervals += mFilter.NotifyDataArrived(range.Length(), range.mStart); + if (byteRanges == mLastCachedRanges) { + return; } + MediaByteRangeSet intervals = byteRanges - mLastCachedRanges; + mLastCachedRanges = byteRanges; + for (const auto& interval : intervals) { RefPtr bytes = resource->MediaReadAt(interval.mStart, interval.Length()); diff --git a/dom/media/gstreamer/GStreamerReader.h b/dom/media/gstreamer/GStreamerReader.h index 5de06a946ea6..01e5320ac1fc 100644 --- a/dom/media/gstreamer/GStreamerReader.h +++ b/dom/media/gstreamer/GStreamerReader.h @@ -256,7 +256,7 @@ private: int fpsDen; MediaResourceIndex mResource; - NotifyDataArrivedFilter mFilter; + MediaByteRangeSet mLastCachedRanges; }; } // namespace mozilla diff --git a/dom/media/omx/MediaOmxReader.cpp b/dom/media/omx/MediaOmxReader.cpp index aa37beeccee0..e31a9119bc05 100644 --- a/dom/media/omx/MediaOmxReader.cpp +++ b/dom/media/omx/MediaOmxReader.cpp @@ -471,10 +471,12 @@ void MediaOmxReader::NotifyDataArrivedInternal() return; } - IntervalSet intervals; - for (auto& range : byteRanges) { - intervals += mFilter.NotifyDataArrived(range.Length(), range.mStart); + if (byteRanges == mLastCachedRanges) { + return; } + MediaByteRangeSet intervals = byteRanges - mLastCachedRanges; + mLastCachedRanges = byteRanges; + for (const auto& interval : intervals) { RefPtr bytes = resource->MediaReadAt(interval.mStart, interval.Length()); diff --git a/dom/media/omx/MediaOmxReader.h b/dom/media/omx/MediaOmxReader.h index 8c9e56751e8f..b0e230c734a9 100644 --- a/dom/media/omx/MediaOmxReader.h +++ b/dom/media/omx/MediaOmxReader.h @@ -120,7 +120,7 @@ private: already_AddRefed SafeGetDecoder(); - NotifyDataArrivedFilter mFilter; + MediaByteRangeSet mLastCachedRanges; }; } // namespace mozilla From bb0aacbf79aef7cd70f1753d3bc9c9ae77a3ba50 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Fri, 27 Nov 2015 15:03:19 +1100 Subject: [PATCH 133/153] Bug 1227396: P13. Refactor how MP4 buffered range is calculated. r=cpearce We now use an index of samples made of block of samples delimited by keyframes. The search is performed using a binary search. This allows to quickly find which blocks are found within the media cache. On a 8 core mac pro, this leads to a 67% improvement on CPU time spent playing a long MP4 video (from 112s CPU to 45s CPU) The optimisation is only possible if all mp4 data chunks are continuous (which they almost always are) --- dom/media/fmp4/MP4Demuxer.cpp | 11 +- media/libstagefright/binding/Index.cpp | 112 ++++++++++++++++-- .../binding/include/mp4_demuxer/Index.h | 50 +++++++- 3 files changed, 146 insertions(+), 27 deletions(-) diff --git a/dom/media/fmp4/MP4Demuxer.cpp b/dom/media/fmp4/MP4Demuxer.cpp index c0c92135f4e9..dc9fb4279092 100644 --- a/dom/media/fmp4/MP4Demuxer.cpp +++ b/dom/media/fmp4/MP4Demuxer.cpp @@ -409,17 +409,8 @@ MP4TrackDemuxer::GetBuffered() if (NS_FAILED(rv)) { return media::TimeIntervals(); } - nsTArray> timeRanges; - mIndex->ConvertByteRangesToTimeRanges(byteRanges, &timeRanges); - // convert timeRanges. - media::TimeIntervals ranges = media::TimeIntervals(); - for (size_t i = 0; i < timeRanges.Length(); i++) { - ranges += - media::TimeInterval(media::TimeUnit::FromMicroseconds(timeRanges[i].start), - media::TimeUnit::FromMicroseconds(timeRanges[i].end)); - } - return ranges; + return mIndex->ConvertByteRangesToTimeRanges(byteRanges); } void diff --git a/media/libstagefright/binding/Index.cpp b/media/libstagefright/binding/Index.cpp index c3a4e20f84c7..993011cc38a4 100644 --- a/media/libstagefright/binding/Index.cpp +++ b/media/libstagefright/binding/Index.cpp @@ -5,7 +5,6 @@ #include "mp4_demuxer/ByteReader.h" #include "mp4_demuxer/Index.h" #include "mp4_demuxer/Interval.h" -#include "mp4_demuxer/MoofParser.h" #include "mp4_demuxer/SinfParser.h" #include "nsAutoPtr.h" #include "mozilla/RefPtr.h" @@ -15,6 +14,7 @@ using namespace stagefright; using namespace mozilla; +using namespace mozilla::media; namespace mp4_demuxer { @@ -45,7 +45,7 @@ RangeFinder::Contains(MediaByteRange aByteRange) return false; } - if (mRanges[mIndex].Contains(aByteRange)) { + if (mRanges[mIndex].ContainsStrict(aByteRange)) { return true; } @@ -56,7 +56,7 @@ RangeFinder::Contains(MediaByteRange aByteRange) return false; } --mIndex; - if (mRanges[mIndex].Contains(aByteRange)) { + if (mRanges[mIndex].ContainsStrict(aByteRange)) { return true; } } while (aByteRange.mStart < mRanges[mIndex].mStart); @@ -69,7 +69,7 @@ RangeFinder::Contains(MediaByteRange aByteRange) return false; } ++mIndex; - if (mRanges[mIndex].Contains(aByteRange)) { + if (mRanges[mIndex].ContainsStrict(aByteRange)) { return true; } } @@ -246,8 +246,19 @@ Index::Index(const nsTArray& aIndex, // OOM. return; } - for (size_t i = 0; i < aIndex.Length(); i++) { - const Indice& indice = aIndex[i]; + media::IntervalSet intervalTime; + MediaByteRange intervalRange; + bool haveSync = false; + bool progressive = true; + int64_t lastOffset = 0; + for (const Indice& indice : aIndex) { + if (indice.sync) { + haveSync = true; + } + if (!haveSync) { + continue; + } + Sample sample; sample.mByteRange = MediaByteRange(indice.start_offset, indice.end_offset); @@ -257,6 +268,40 @@ Index::Index(const nsTArray& aIndex, sample.mSync = indice.sync; // FIXME: Make this infallible after bug 968520 is done. MOZ_ALWAYS_TRUE(mIndex.AppendElement(sample, fallible)); + if (indice.start_offset < lastOffset) { + NS_WARNING("Chunks in MP4 out of order, expect slow down"); + progressive = false; + } + lastOffset = indice.end_offset; + + if (sample.mSync && progressive) { + if (mDataOffset.Length()) { + auto& last = mDataOffset.LastElement(); + last.mEndOffset = intervalRange.mEnd; + NS_ASSERTION(intervalTime.Length() == 1, "Discontinuous samples between keyframes"); + last.mTime.start = intervalTime.GetStart(); + last.mTime.end = intervalTime.GetEnd(); + } + if (!mDataOffset.AppendElement(MP4DataOffset(mIndex.Length() - 1, + indice.start_offset), + fallible)) { + // OOM. + return; + } + intervalTime = media::IntervalSet(); + intervalRange = MediaByteRange(); + } + intervalTime += media::Interval(sample.mCompositionRange.start, + sample.mCompositionRange.end); + intervalRange = intervalRange.Span(sample.mByteRange); + } + + if (mDataOffset.Length() && progressive) { + auto& last = mDataOffset.LastElement(); + last.mEndOffset = aIndex.LastElement().end_offset; + last.mTime = Interval(intervalTime.GetStart(), intervalTime.GetEnd()); + } else { + mDataOffset.Clear(); } } } @@ -301,14 +346,47 @@ Index::GetEndCompositionIfBuffered(const MediaByteRangeSet& aByteRanges) return 0; } -void -Index::ConvertByteRangesToTimeRanges( - const MediaByteRangeSet& aByteRanges, - nsTArray>* aTimeRanges) +TimeIntervals +Index::ConvertByteRangesToTimeRanges(const MediaByteRangeSet& aByteRanges) { + if (aByteRanges == mLastCachedRanges) { + return mLastBufferedRanges; + } + mLastCachedRanges = aByteRanges; + + if (mDataOffset.Length()) { + TimeIntervals timeRanges; + for (const auto& range : aByteRanges) { + uint32_t start = mDataOffset.IndexOfFirstElementGt(range.mStart - 1); + if (start == mDataOffset.Length()) { + continue; + } + uint32_t end = mDataOffset.IndexOfFirstElementGt(range.mEnd, MP4DataOffset::EndOffsetComparator()); + if (end < start) { + continue; + } + if (end > start) { + timeRanges += + TimeInterval(TimeUnit::FromMicroseconds(mDataOffset[start].mTime.start), + TimeUnit::FromMicroseconds(mDataOffset[end-1].mTime.end)); + } + if (end < mDataOffset.Length()) { + // Find samples in partial block contained in the byte range. + for (size_t i = mDataOffset[end].mIndex; + i < mIndex.Length() && range.ContainsStrict(mIndex[i].mByteRange); + i++) { + timeRanges += + TimeInterval(TimeUnit::FromMicroseconds(mIndex[i].mCompositionRange.start), + TimeUnit::FromMicroseconds(mIndex[i].mCompositionRange.end)); + } + } + } + mLastBufferedRanges = timeRanges; + return timeRanges; + } + RangeFinder rangeFinder(aByteRanges); nsTArray> timeRanges; - nsTArray*> indexes; if (mMoofParser) { // We take the index out of the moof parser and move it into a local @@ -353,7 +431,17 @@ Index::ConvertByteRangesToTimeRanges( } // This fixes up when the compositon order differs from the byte range order - Interval::Normalize(timeRanges, aTimeRanges); + nsTArray> timeRangesNormalized; + Interval::Normalize(timeRanges, &timeRangesNormalized); + // convert timeRanges. + media::TimeIntervals ranges; + for (size_t i = 0; i < timeRangesNormalized.Length(); i++) { + ranges += + media::TimeInterval(media::TimeUnit::FromMicroseconds(timeRangesNormalized[i].start), + media::TimeUnit::FromMicroseconds(timeRangesNormalized[i].end)); + } + mLastBufferedRanges = ranges; + return ranges; } uint64_t diff --git a/media/libstagefright/binding/include/mp4_demuxer/Index.h b/media/libstagefright/binding/include/mp4_demuxer/Index.h index cd42481e7271..605cecd62231 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/Index.h +++ b/media/libstagefright/binding/include/mp4_demuxer/Index.h @@ -7,6 +7,8 @@ #include "MediaData.h" #include "MediaResource.h" +#include "TimeUnits.h" +#include "mp4_demuxer/MoofParser.h" #include "mp4_demuxer/Interval.h" #include "mp4_demuxer/Stream.h" #include "nsISupportsImpl.h" @@ -17,8 +19,6 @@ namespace mp4_demuxer { class Index; -class MoofParser; -struct Sample; typedef int64_t Microseconds; @@ -53,6 +53,42 @@ public: bool sync; }; + struct MP4DataOffset + { + MP4DataOffset(uint32_t aIndex, int64_t aStartOffset) + : mIndex(aIndex) + , mStartOffset(aStartOffset) + , mEndOffset(0) + {} + + bool operator==(int64_t aStartOffset) const { + return mStartOffset == aStartOffset; + } + + bool operator!=(int64_t aStartOffset) const { + return mStartOffset != aStartOffset; + } + + bool operator<(int64_t aStartOffset) const { + return mStartOffset < aStartOffset; + } + + struct EndOffsetComparator { + bool Equals(const MP4DataOffset& a, const int64_t& b) const { + return a.mEndOffset == b; + } + + bool LessThan(const MP4DataOffset& a, const int64_t& b) const { + return a.mEndOffset < b; + } + }; + + uint32_t mIndex; + int64_t mStartOffset; + int64_t mEndOffset; + Interval mTime; + }; + Index(const nsTArray& aIndex, Stream* aSource, uint32_t aTrackId, @@ -61,9 +97,8 @@ public: void UpdateMoofIndex(const mozilla::MediaByteRangeSet& aByteRanges); Microseconds GetEndCompositionIfBuffered( const mozilla::MediaByteRangeSet& aByteRanges); - void ConvertByteRangesToTimeRanges( - const mozilla::MediaByteRangeSet& aByteRanges, - nsTArray>* aTimeRanges); + mozilla::media::TimeIntervals ConvertByteRangesToTimeRanges( + const mozilla::MediaByteRangeSet& aByteRanges); uint64_t GetEvictionOffset(Microseconds aTime); bool IsFragmented() { return mMoofParser; } @@ -74,7 +109,12 @@ private: Stream* mSource; FallibleTArray mIndex; + FallibleTArray mDataOffset; nsAutoPtr mMoofParser; + + // ConvertByteRangesToTimeRanges cache + mozilla::MediaByteRangeSet mLastCachedRanges; + mozilla::media::TimeIntervals mLastBufferedRanges; }; } From 5b142826715d3e4dfb0e15718124b686a6957cbf Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Fri, 27 Nov 2015 15:51:58 +1100 Subject: [PATCH 134/153] Bug 1227396: P14. Reduce memory usage of sample index for audio tracks. r=cpearce All samples in an audio track are keyframes. As such, use block on 128 samples instead. --- media/libstagefright/binding/Index.cpp | 23 +++++++++++++++---- .../binding/include/mp4_demuxer/Index.h | 1 + 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/media/libstagefright/binding/Index.cpp b/media/libstagefright/binding/Index.cpp index 993011cc38a4..606dc8b956aa 100644 --- a/media/libstagefright/binding/Index.cpp +++ b/media/libstagefright/binding/Index.cpp @@ -238,6 +238,7 @@ Index::Index(const nsTArray& aIndex, uint32_t aTrackId, bool aIsAudio) : mSource(aSource) + , mIsAudio(aIsAudio) { if (aIndex.IsEmpty()) { mMoofParser = new MoofParser(aSource, aTrackId, aIsAudio); @@ -251,7 +252,8 @@ Index::Index(const nsTArray& aIndex, bool haveSync = false; bool progressive = true; int64_t lastOffset = 0; - for (const Indice& indice : aIndex) { + for (size_t i = 0; i < aIndex.Length(); i++) { + const Indice& indice = aIndex[i]; if (indice.sync) { haveSync = true; } @@ -274,7 +276,8 @@ Index::Index(const nsTArray& aIndex, } lastOffset = indice.end_offset; - if (sample.mSync && progressive) { + // Pack audio samples in group of 128. + if (sample.mSync && progressive && (!mIsAudio || !(i % 128))) { if (mDataOffset.Length()) { auto& last = mDataOffset.LastElement(); last.mEndOffset = intervalRange.mEnd; @@ -358,13 +361,25 @@ Index::ConvertByteRangesToTimeRanges(const MediaByteRangeSet& aByteRanges) TimeIntervals timeRanges; for (const auto& range : aByteRanges) { uint32_t start = mDataOffset.IndexOfFirstElementGt(range.mStart - 1); - if (start == mDataOffset.Length()) { + if (!mIsAudio && start == mDataOffset.Length()) { continue; } uint32_t end = mDataOffset.IndexOfFirstElementGt(range.mEnd, MP4DataOffset::EndOffsetComparator()); - if (end < start) { + if (!mIsAudio && end < start) { continue; } + if (mIsAudio && start && + range.Intersects(MediaByteRange(mDataOffset[start-1].mStartOffset, + mDataOffset[start-1].mEndOffset))) { + // Check if previous audio data block contains some available samples. + for (size_t i = mDataOffset[start-1].mIndex; i < mIndex.Length(); i++) { + if (range.ContainsStrict(mIndex[i].mByteRange)) { + timeRanges += + TimeInterval(TimeUnit::FromMicroseconds(mIndex[i].mCompositionRange.start), + TimeUnit::FromMicroseconds(mIndex[i].mCompositionRange.end)); + } + } + } if (end > start) { timeRanges += TimeInterval(TimeUnit::FromMicroseconds(mDataOffset[start].mTime.start), diff --git a/media/libstagefright/binding/include/mp4_demuxer/Index.h b/media/libstagefright/binding/include/mp4_demuxer/Index.h index 605cecd62231..048f98fc89e8 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/Index.h +++ b/media/libstagefright/binding/include/mp4_demuxer/Index.h @@ -115,6 +115,7 @@ private: // ConvertByteRangesToTimeRanges cache mozilla::MediaByteRangeSet mLastCachedRanges; mozilla::media::TimeIntervals mLastBufferedRanges; + bool mIsAudio; }; } From 87593f3827085bfffd6f84329b964f5be947041c Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Mon, 30 Nov 2015 06:00:31 +0100 Subject: [PATCH 135/153] Bug 1218817 - Implement RootActor.listServiceWorkerRegistrations;r=janx --- devtools/server/actors/root.js | 33 ++++++++++++++++++++ devtools/server/actors/webbrowser.js | 4 ++- devtools/shared/client/main.js | 10 ++++++ toolkit/components/telemetry/Histograms.json | 16 ++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/devtools/server/actors/root.js b/devtools/server/actors/root.js index a892d8fd854e..f0156fe1f603 100644 --- a/devtools/server/actors/root.js +++ b/devtools/server/actors/root.js @@ -95,6 +95,7 @@ function RootActor(aConnection, aParameters) { this._onTabListChanged = this.onTabListChanged.bind(this); this._onAddonListChanged = this.onAddonListChanged.bind(this); this._onWorkerListChanged = this.onWorkerListChanged.bind(this); + this._onServiceWorkerRegistrationListChanged = this.onServiceWorkerRegistrationListChanged.bind(this); this._extraActors = {}; this._globalActorPool = new ActorPool(this.conn); @@ -386,6 +387,37 @@ RootActor.prototype = { this._parameters.workerList.onListChanged = null; }, + onListServiceWorkerRegistrations: function () { + let registrationList = this._parameters.serviceWorkerRegistrationList; + if (!registrationList) { + return { from: this.actorID, error: "noServiceWorkerRegistrations", + message: "This root actor has no service worker registrations." }; + } + + return registrationList.getList().then(actors => { + let pool = new ActorPool(this.conn); + for (let actor of actors) { + pool.addActor(actor); + } + + this.conn.removeActorPool(this._serviceWorkerRegistrationActorPool); + this._serviceWorkerRegistrationActorPool = pool; + this.conn.addActorPool(this._serviceWorkerRegistrationActorPool); + + registrationList.onListChanged = this._onServiceWorkerRegistrationListChanged; + + return { + "from": this.actorID, + "registrations": actors.map(actor => actor.form()) + }; + }); + }, + + onServiceWorkerRegistrationListChanged: function () { + this.conn.send({ from: this.actorID, type: "serviceWorkerRegistrationListChanged" }); + this._parameters.serviceWorkerRegistrationList.onListChanged = null; + }, + onListProcesses: function () { let processes = []; for (let i = 0; i < ppmm.childCount; i++) { @@ -473,6 +505,7 @@ RootActor.prototype.requestTypes = { "getTab": RootActor.prototype.onGetTab, "listAddons": RootActor.prototype.onListAddons, "listWorkers": RootActor.prototype.onListWorkers, + "listServiceWorkerRegistrations": RootActor.prototype.onListServiceWorkerRegistrations, "listProcesses": RootActor.prototype.onListProcesses, "getProcess": RootActor.prototype.onGetProcess, "echo": RootActor.prototype.onEcho, diff --git a/devtools/server/actors/webbrowser.js b/devtools/server/actors/webbrowser.js index 6d7b7444b5f2..73fad140623d 100644 --- a/devtools/server/actors/webbrowser.js +++ b/devtools/server/actors/webbrowser.js @@ -12,7 +12,7 @@ var promise = require("promise"); var { ActorPool, createExtraActors, appendExtraActors } = require("devtools/server/actors/common"); var { DebuggerServer } = require("devtools/server/main"); var DevToolsUtils = require("devtools/shared/DevToolsUtils"); -var { assert } = DevToolsUtils; +var { assert } = DevToolsUtils; var { TabSources } = require("./utils/TabSources"); var makeDebugger = require("./utils/make-debugger"); @@ -23,6 +23,7 @@ loader.lazyRequireGetter(this, "ThreadActor", "devtools/server/actors/script", t loader.lazyRequireGetter(this, "unwrapDebuggerObjectGlobal", "devtools/server/actors/script", true); loader.lazyRequireGetter(this, "BrowserAddonActor", "devtools/server/actors/addon", true); loader.lazyRequireGetter(this, "WorkerActorList", "devtools/server/actors/worker", true); +loader.lazyRequireGetter(this, "ServiceWorkerRegistrationActorList", "devtools/server/actors/worker", true); loader.lazyImporter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm"); // Assumptions on events module: @@ -130,6 +131,7 @@ function createRootActor(aConnection) tabList: new BrowserTabList(aConnection), addonList: new BrowserAddonList(aConnection), workerList: new WorkerActorList({}), + serviceWorkerRegistrationList: new ServiceWorkerRegistrationActorList(), globalActorFactories: DebuggerServer.globalActorFactories, onShutdown: sendShutdownEvent }); diff --git a/devtools/shared/client/main.js b/devtools/shared/client/main.js index 420777f55fc2..afd382aec4b9 100644 --- a/devtools/shared/client/main.js +++ b/devtools/shared/client/main.js @@ -160,6 +160,7 @@ const UnsolicitedNotifications = { "reflowActivity": "reflowActivity", "addonListChanged": "addonListChanged", "workerListChanged": "workerListChanged", + "serviceWorkerRegistrationListChanged": "serviceWorkerRegistrationList", "tabNavigated": "tabNavigated", "frameUpdate": "frameUpdate", "pageError": "pageError", @@ -1529,6 +1530,15 @@ RootClient.prototype = { listWorkers: DebuggerClient.requester({ type: "listWorkers" }, { telemetry: "LISTWORKERS" }), + /** + * List the registered service workers. + * + * @param function aOnResponse + * Called with the response packet. + */ + listServiceWorkerRegistrations: DebuggerClient.requester({ type: "listServiceWorkerRegistrations" }, + { telemetry: "LISTSERVICEWORKERREGISTRATIONS" }), + /** * List the running processes. * diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index 6b7bada491cc..3d28f466b1b8 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -6112,6 +6112,22 @@ "n_buckets": "1000", "description": "The time (in milliseconds) that it took a 'listTabs' request to go round trip." }, + "DEVTOOLS_DEBUGGER_RDP_LOCAL_LISTSERVICEWORKERREGISTRATIONS_MS": { + "alert_emails": ["dev-developer-tools@lists.mozilla.org", "ejpbruel@mozilla.com"], + "expires_in_version": "50", + "kind": "exponential", + "high": "10000", + "n_buckets": "100", + "description": "The time (in milliseconds) that it took a 'listServiceWorkerRegistrations' request to go round trip." + }, + "DEVTOOLS_DEBUGGER_RDP_REMOTE_LISTSERVICEWORKERREGISTRATIONS_MS": { + "alert_emails": ["dev-developer-tools@lists.mozilla.org", "ejpbruel@mozilla.com"], + "expires_in_version": "50", + "kind": "exponential", + "high": "10000", + "n_buckets": "100", + "description": "The time (in milliseconds) that it took a 'listServiceWorkerRegistrations' request to go round trip." + }, "DEVTOOLS_DEBUGGER_RDP_LOCAL_PROTOCOLDESCRIPTION_MS": { "expires_in_version": "never", "kind": "exponential", From 98d8b4c01eae55e1d80f1c74f9605a3297acc6e5 Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Mon, 30 Nov 2015 06:05:35 +0100 Subject: [PATCH 136/153] Bug 1220741 - We should not be able to interact with a detached BrowserTabActor;r=janx --- devtools/server/actors/webbrowser.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/devtools/server/actors/webbrowser.js b/devtools/server/actors/webbrowser.js index 73fad140623d..01ea7d136bbf 100644 --- a/devtools/server/actors/webbrowser.js +++ b/devtools/server/actors/webbrowser.js @@ -1348,7 +1348,26 @@ TabActor.prototype = { this._tabActorPool = null; } + // Make sure that no more workerListChanged notifications are sent. + if (this._workerActorList !== null) { + this._workerActorList.onListChanged = null; + this._workerActorList = null; + } + + if (this._workerActorPool !== null) { + this.conn.removeActorPool(this._workerActorPool); + this._workerActorPool = null; + } + + // Make sure that no more serviceWorkerRegistrationChanged notifications are + // sent. + if (this._mustNotifyServiceWorkerRegistrationChanged) { + swm.removeListener(this); + this._mustNotifyServiceWorkerRegistrationChanged = false; + } + this._attached = false; + return true; }, From 6e21f2935662b89a90539293eb994a6e48ff963c Mon Sep 17 00:00:00 2001 From: JW Wang Date: Mon, 30 Nov 2015 13:06:19 +0800 Subject: [PATCH 137/153] Bug 1227797 - Use MediaEventSource to publish playback events for MDSM. r=jya. --- dom/media/MediaDecoder.cpp | 19 +++++++++++++ dom/media/MediaDecoder.h | 39 +++++++++++++------------- dom/media/MediaDecoderStateMachine.cpp | 23 ++++----------- dom/media/MediaDecoderStateMachine.h | 16 +++++++++++ 4 files changed, 60 insertions(+), 37 deletions(-) diff --git a/dom/media/MediaDecoder.cpp b/dom/media/MediaDecoder.cpp index 00e8997ebd2d..e774a0f92f85 100644 --- a/dom/media/MediaDecoder.cpp +++ b/dom/media/MediaDecoder.cpp @@ -615,6 +615,12 @@ MediaDecoder::Shutdown() mTimedMetadataListener.Disconnect(); mMetadataLoadedListener.Disconnect(); mFirstFrameLoadedListener.Disconnect(); + mOnPlaybackStart.Disconnect(); + mOnPlaybackStop.Disconnect(); + mOnPlaybackEnded.Disconnect(); + mOnDecodeError.Disconnect(); + mOnInvalidate.Disconnect(); + mOnSeekingStart.Disconnect(); } // Force any outstanding seek and byterange requests to complete @@ -698,6 +704,19 @@ MediaDecoder::SetStateMachineParameters() AbstractThread::MainThread(), this, &MediaDecoder::MetadataLoaded); mFirstFrameLoadedListener = mDecoderStateMachine->FirstFrameLoadedEvent().Connect( AbstractThread::MainThread(), this, &MediaDecoder::FirstFrameLoaded); + + mOnPlaybackStart = mDecoderStateMachine->OnPlaybackStart().Connect( + AbstractThread::MainThread(), this, &MediaDecoder::OnPlaybackStarted); + mOnPlaybackStop = mDecoderStateMachine->OnPlaybackStop().Connect( + AbstractThread::MainThread(), this, &MediaDecoder::OnPlaybackStopped); + mOnPlaybackEnded = mDecoderStateMachine->OnPlaybackEnded().Connect( + AbstractThread::MainThread(), this, &MediaDecoder::PlaybackEnded); + mOnDecodeError = mDecoderStateMachine->OnDecodeError().Connect( + AbstractThread::MainThread(), this, &MediaDecoder::DecodeError); + mOnInvalidate = mDecoderStateMachine->OnInvalidate().Connect( + AbstractThread::MainThread(), this, &MediaDecoder::Invalidate); + mOnSeekingStart = mDecoderStateMachine->OnSeekingStart().Connect( + AbstractThread::MainThread(), this, &MediaDecoder::SeekingStarted); } void diff --git a/dom/media/MediaDecoder.h b/dom/media/MediaDecoder.h index e9d88ad6f7df..c31df2d57fb9 100644 --- a/dom/media/MediaDecoder.h +++ b/dom/media/MediaDecoder.h @@ -570,26 +570,6 @@ private: // so recompute it. The monitor must be held. virtual void UpdatePlaybackRate(); - // Used to estimate rates of data passing through the decoder's channel. - // Records activity stopping on the channel. - void DispatchPlaybackStarted() { - RefPtr self = this; - nsCOMPtr r = - NS_NewRunnableFunction([self] () { self->mPlaybackStatistics->Start(); }); - AbstractThread::MainThread()->Dispatch(r.forget()); - } - - // Used to estimate rates of data passing through the decoder's channel. - // Records activity stopping on the channel. - void DispatchPlaybackStopped() { - RefPtr self = this; - nsCOMPtr r = NS_NewRunnableFunction([self] () { - self->mPlaybackStatistics->Stop(); - self->ComputePlaybackRate(); - }); - AbstractThread::MainThread()->Dispatch(r.forget()); - } - // The actual playback rate computation. The monitor must be held. void ComputePlaybackRate(); @@ -820,6 +800,18 @@ private: MediaEventSource* DataArrivedEvent() override { return &mDataArrivedEvent; } + // Used to estimate rates of data passing through the decoder's channel. + // Records activity stopping on the channel. + void OnPlaybackStarted() { mPlaybackStatistics->Start(); } + + // Used to estimate rates of data passing through the decoder's channel. + // Records activity stopping on the channel. + void OnPlaybackStopped() + { + mPlaybackStatistics->Stop(); + ComputePlaybackRate(); + } + MediaEventProducer mDataArrivedEvent; // The state machine object for handling the decoding. It is safe to @@ -941,6 +933,13 @@ protected: MediaEventListener mMetadataLoadedListener; MediaEventListener mFirstFrameLoadedListener; + MediaEventListener mOnPlaybackStart; + MediaEventListener mOnPlaybackStop; + MediaEventListener mOnPlaybackEnded; + MediaEventListener mOnDecodeError; + MediaEventListener mOnInvalidate; + MediaEventListener mOnSeekingStart; + protected: // Whether the state machine is shut down. Mirror mStateMachineIsShutdown; diff --git a/dom/media/MediaDecoderStateMachine.cpp b/dom/media/MediaDecoderStateMachine.cpp index 26a0a96b742e..009d5c72455e 100644 --- a/dom/media/MediaDecoderStateMachine.cpp +++ b/dom/media/MediaDecoderStateMachine.cpp @@ -1054,7 +1054,7 @@ void MediaDecoderStateMachine::StopPlayback() MOZ_ASSERT(OnTaskQueue()); DECODER_LOG("StopPlayback()"); - mDecoder->DispatchPlaybackStopped(); + mOnPlaybackStop.Notify(); if (IsPlaying()) { mMediaSink->SetPlaying(false); @@ -1087,7 +1087,7 @@ void MediaDecoderStateMachine::MaybeStartPlayback() } DECODER_LOG("MaybeStartPlayback() starting playback"); - mDecoder->DispatchPlaybackStarted(); + mOnPlaybackStart.Notify(); StartMediaSink(); if (!IsPlaying()) { @@ -1599,12 +1599,7 @@ MediaDecoderStateMachine::InitiateSeek() StopPlayback(); UpdatePlaybackPositionInternal(mCurrentSeek.mTarget.mTime); - nsCOMPtr startEvent = - NS_NewRunnableMethodWithArg( - mDecoder, - &MediaDecoder::SeekingStarted, - mCurrentSeek.mTarget.mEventVisibility); - AbstractThread::MainThread()->Dispatch(startEvent.forget()); + mOnSeekingStart.Notify(mCurrentSeek.mTarget.mEventVisibility); // Reset our state machine and decoding pipeline before seeking. Reset(); @@ -1897,9 +1892,7 @@ MediaDecoderStateMachine::DecodeError() // MediaDecoder::DecodeError notifies the owner, and then shuts down the state // machine. - nsCOMPtr event = - NS_NewRunnableMethod(mDecoder, &MediaDecoder::DecodeError); - AbstractThread::MainThread()->Dispatch(event.forget()); + mOnDecodeError.Notify(); } void @@ -2158,9 +2151,7 @@ MediaDecoderStateMachine::SeekCompleted() if (video) { mMediaSink->Redraw(); - nsCOMPtr event = - NS_NewRunnableMethod(mDecoder, &MediaDecoder::Invalidate); - AbstractThread::MainThread()->Dispatch(event.forget()); + mOnInvalidate.Notify(); } } @@ -2413,9 +2404,7 @@ nsresult MediaDecoderStateMachine::RunStateMachine() // Ensure readyState is updated before firing the 'ended' event. UpdateNextFrameStatus(); - nsCOMPtr event = - NS_NewRunnableMethod(mDecoder, &MediaDecoder::PlaybackEnded); - AbstractThread::MainThread()->Dispatch(event.forget()); + mOnPlaybackEnded.Notify(); mSentPlaybackEndedEvent = true; diff --git a/dom/media/MediaDecoderStateMachine.h b/dom/media/MediaDecoderStateMachine.h index 047553b582ef..e42a4b4a88f2 100644 --- a/dom/media/MediaDecoderStateMachine.h +++ b/dom/media/MediaDecoderStateMachine.h @@ -233,6 +233,15 @@ public: MediaDecoderEventVisibility>& FirstFrameLoadedEvent() { return mFirstFrameLoadedEvent; } + MediaEventSource& OnPlaybackStart() { return mOnPlaybackStart; } + MediaEventSource& OnPlaybackStop() { return mOnPlaybackStop; } + MediaEventSource& OnPlaybackEnded() { return mOnPlaybackEnded; } + MediaEventSource& OnDecodeError() { return mOnDecodeError; } + MediaEventSource& OnInvalidate() { return mOnInvalidate; } + + MediaEventSource& + OnSeekingStart() { return mOnSeekingStart; } + // Immutable after construction - may be called on any thread. bool IsRealTime() const { return mRealTime; } @@ -1201,6 +1210,13 @@ private: MediaEventProducerExc, MediaDecoderEventVisibility> mFirstFrameLoadedEvent; + MediaEventProducer mOnPlaybackStart; + MediaEventProducer mOnPlaybackStop; + MediaEventProducer mOnPlaybackEnded; + MediaEventProducer mOnDecodeError; + MediaEventProducer mOnInvalidate; + MediaEventProducer mOnSeekingStart; + // True if audio is offloading. // Playback will not start when audio is offloading. bool mAudioOffloading; From 0f6b051df6d5825f2909af56290e71495c659407 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Sun, 22 Nov 2015 14:39:01 -0800 Subject: [PATCH 138/153] Bug 1186808 - Replace nsBaseHashtable::EnumerateRead() calls in dom/camera/ with iterators. r=mikeh. --HG-- extra : rebase_source : f332c1005449f2988936ad82cbfce1c3f65bcd7a --- dom/camera/GonkCameraControl.cpp | 15 +++------------ dom/camera/GonkCameraControl.h | 3 --- dom/camera/GonkCameraParameters.cpp | 24 ++++++++---------------- dom/camera/GonkCameraParameters.h | 2 -- dom/camera/GonkRecorderProfiles.cpp | 16 +++------------- dom/camera/GonkRecorderProfiles.h | 3 --- 6 files changed, 14 insertions(+), 49 deletions(-) diff --git a/dom/camera/GonkCameraControl.cpp b/dom/camera/GonkCameraControl.cpp index b58c8a564492..425d46104f42 100644 --- a/dom/camera/GonkCameraControl.cpp +++ b/dom/camera/GonkCameraControl.cpp @@ -2213,17 +2213,6 @@ nsGonkCameraControl::LoadRecorderProfiles() return NS_OK; } -/* static */ PLDHashOperator -nsGonkCameraControl::Enumerate(const nsAString& aProfileName, - RecorderProfile* aProfile, - void* aUserArg) -{ - nsTArray* profiles = static_cast*>(aUserArg); - MOZ_ASSERT(profiles); - profiles->AppendElement(aProfileName); - return PL_DHASH_NEXT; -} - nsresult nsGonkCameraControl::GetRecorderProfiles(nsTArray& aProfiles) { @@ -2233,7 +2222,9 @@ nsGonkCameraControl::GetRecorderProfiles(nsTArray& aProfiles) } aProfiles.Clear(); - mRecorderProfiles.EnumerateRead(Enumerate, static_cast(&aProfiles)); + for (auto iter = mRecorderProfiles.Iter(); !iter.Done(); iter.Next()) { + aProfiles.AppendElement(iter.Key()); + } return NS_OK; } diff --git a/dom/camera/GonkCameraControl.h b/dom/camera/GonkCameraControl.h index e3a2e8280463..8cb289027c11 100644 --- a/dom/camera/GonkCameraControl.h +++ b/dom/camera/GonkCameraControl.h @@ -156,9 +156,6 @@ protected: void CreatePoster(layers::Image* aImage, uint32_t aWidth, uint32_t aHeight, int32_t aRotation); nsresult LoadRecorderProfiles(); - static PLDHashOperator Enumerate(const nsAString& aProfileName, - RecorderProfile* aProfile, - void* aUserArg); friend class SetPictureSize; friend class SetThumbnailSize; diff --git a/dom/camera/GonkCameraParameters.cpp b/dom/camera/GonkCameraParameters.cpp index 09f6820553fb..ba798733854f 100644 --- a/dom/camera/GonkCameraParameters.cpp +++ b/dom/camera/GonkCameraParameters.cpp @@ -69,27 +69,19 @@ GonkCameraParameters::FindVendorSpecificKey(const char* aPotentialKeys[], return nullptr; } -/* static */ PLDHashOperator -GonkCameraParameters::EnumerateFlatten(const nsACString& aKey, - nsCString* aValue, - void* aUserArg) -{ - nsCString* data = static_cast(aUserArg); - if (!data->IsEmpty()) { - data->Append(';'); - } - data->Append(aKey); - data->Append('='); - data->Append(*aValue); - return PL_DHASH_NEXT; -} - String8 GonkCameraParameters::Flatten() const { MutexAutoLock lock(mLock); nsCString data; - mParams.EnumerateRead(EnumerateFlatten, static_cast(&data)); + for (auto iter = mParams.ConstIter(); !iter.Done(); iter.Next()) { + if (!data.IsEmpty()) { + data.Append(';'); + } + data.Append(iter.Key()); + data.Append('='); + data.Append(*iter.UserData()); + } return String8(data.Data()); } diff --git a/dom/camera/GonkCameraParameters.h b/dom/camera/GonkCameraParameters.h index b32763ff2536..830685a96b35 100644 --- a/dom/camera/GonkCameraParameters.h +++ b/dom/camera/GonkCameraParameters.h @@ -93,8 +93,6 @@ protected: nsClassHashtable mIsoModeMap; nsClassHashtable mParams; - static PLDHashOperator EnumerateFlatten(const nsACString& aKey, nsCString* aValue, void* aUserArg); - nsresult SetImpl(const char* aKey, const char* aValue) { if (!aValue || strchr(aValue, ';') || strchr(aValue, '=')) { diff --git a/dom/camera/GonkRecorderProfiles.cpp b/dom/camera/GonkRecorderProfiles.cpp index 61ed6dc23c84..4479d9278845 100644 --- a/dom/camera/GonkRecorderProfiles.cpp +++ b/dom/camera/GonkRecorderProfiles.cpp @@ -269,18 +269,6 @@ GonkRecorderProfile::GonkRecorderProfile(uint32_t aCameraId, mIsValid = isValid && mAudio.IsValid() && mVideo.IsValid(); } -/* static */ PLDHashOperator -GonkRecorderProfile::Enumerate(const nsAString& aProfileName, - GonkRecorderProfile* aProfile, - void* aUserArg) -{ - nsTArray>* profiles = - static_cast>*>(aUserArg); - MOZ_ASSERT(profiles); - profiles->AppendElement(aProfile); - return PL_DHASH_NEXT; -} - /* static */ already_AddRefed GonkRecorderProfile::CreateProfile(uint32_t aCameraId, int aQuality) @@ -379,7 +367,9 @@ GonkRecorderProfile::GetAll(uint32_t aCameraId, } aProfiles.Clear(); - profiles->EnumerateRead(Enumerate, static_cast(&aProfiles)); + for (auto iter = profiles->Iter(); !iter.Done(); iter.Next()) { + aProfiles.AppendElement(iter.UserData()); + } return NS_OK; } diff --git a/dom/camera/GonkRecorderProfiles.h b/dom/camera/GonkRecorderProfiles.h index b6fe8d0e9a31..dd2a0869e99d 100644 --- a/dom/camera/GonkRecorderProfiles.h +++ b/dom/camera/GonkRecorderProfiles.h @@ -142,9 +142,6 @@ protected: static already_AddRefed CreateProfile(uint32_t aCameraId, int aQuality); static ProfileHashtable* GetProfileHashtable(uint32_t aCameraId); - static PLDHashOperator Enumerate(const nsAString& aProfileName, - GonkRecorderProfile* aProfile, - void* aUserArg); uint32_t mCameraId; int mQuality; From d180cd4a9217f9c663e55d7c007b172518992177 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Sun, 22 Nov 2015 14:39:01 -0800 Subject: [PATCH 139/153] Bug 1181444 (part 1) - Remove nsBaseHashtable::EnumerateRead(). r=froydnj. --HG-- extra : rebase_source : c07a83a2984ca4e67f3441d9e18b6bbac772495d --- xpcom/glue/nsBaseHashtable.h | 38 ++----------- xpcom/tests/TestHashtables.cpp | 99 +++++++++++++++------------------- 2 files changed, 47 insertions(+), 90 deletions(-) diff --git a/xpcom/glue/nsBaseHashtable.h b/xpcom/glue/nsBaseHashtable.h index 54a35c48000b..99705b3f3231 100644 --- a/xpcom/glue/nsBaseHashtable.h +++ b/xpcom/glue/nsBaseHashtable.h @@ -7,16 +7,14 @@ #ifndef nsBaseHashtable_h__ #define nsBaseHashtable_h__ -#include "mozilla/DebugOnly.h" #include "mozilla/MemoryReporting.h" #include "mozilla/Move.h" #include "nsTHashtable.h" #include "nsDebug.h" -// These are the codes returned by |EnumReadFunction| and |EnumFunction|, which -// control the behavior of EnumerateRead() and Enumerate(). The PLD/PL_D prefix -// is because they originated in PLDHashTable, but that class no longer uses -// them. +// These type is returned by |EnumFunction| and controls the behavior of +// Enumerate(). The PLD/PL_D prefix is because it originated in PLDHashTable, +// but that class no longer uses it. enum PLDHashOperator { PL_DHASH_NEXT = 0, // enumerator says continue @@ -157,36 +155,6 @@ public: */ void Remove(KeyType aKey) { this->RemoveEntry(aKey); } - /** - * function type provided by the application for enumeration. - * @param aKey the key being enumerated - * @param aData data being enumerated - * @param aUserArg passed unchanged from Enumerate - * @return @link PLDHashOperator::PL_DHASH_NEXT PL_DHASH_NEXT @endlink - */ - typedef PLDHashOperator (*EnumReadFunction)(KeyType aKey, - UserDataType aData, - void* aUserArg); - - /** - * enumerate entries in the hashtable, without allowing changes - * WARNING: this function is deprecated. Please use Iterator instead. - * @param aEnumFunc enumeration callback - * @param aUserArg passed unchanged to the EnumReadFunction - */ - uint32_t EnumerateRead(EnumReadFunction aEnumFunc, void* aUserArg) const - { - uint32_t n = 0; - for (auto iter = this->mTable.ConstIter(); !iter.Done(); iter.Next()) { - auto entry = static_cast(iter.Get()); - mozilla::DebugOnly op = - aEnumFunc(entry->GetKey(), entry->mData, aUserArg); - n++; - MOZ_ASSERT(!(op & PL_DHASH_REMOVE)); - } - return n; - } - /** * function type provided by the application for enumeration. * @param aKey the key being enumerated diff --git a/xpcom/tests/TestHashtables.cpp b/xpcom/tests/TestHashtables.cpp index 43c719c452dc..b72fe45985a9 100644 --- a/xpcom/tests/TestHashtables.cpp +++ b/xpcom/tests/TestHashtables.cpp @@ -170,25 +170,12 @@ testTHashtable(nsTHashtable& hash, uint32_t numEntries) { } } -PLDHashOperator -nsDEnumRead(const uint32_t& aKey, const char* aData, void* userArg) { - printf(" enumerated %u = \"%s\"\n", aKey, aData); - return PL_DHASH_NEXT; -} - PLDHashOperator nsDEnum(const uint32_t& aKey, const char*& aData, void* userArg) { printf(" enumerated %u = \"%s\"\n", aKey, aData); return PL_DHASH_NEXT; } -PLDHashOperator -nsCEnumRead(const nsACString& aKey, TestUniChar* aData, void* userArg) { - printf(" enumerated \"%s\" = %c\n", - PromiseFlatCString(aKey).get(), aData->GetChar()); - return PL_DHASH_NEXT; -} - PLDHashOperator nsCEnum(const nsACString& aKey, nsAutoPtr& aData, void* userArg) { printf(" enumerated \"%s\" = %c\n", @@ -339,15 +326,6 @@ CreateIFoo( IFoo** result ) return NS_OK; } -PLDHashOperator -nsIEnumRead(const uint32_t& aKey, IFoo* aFoo, void* userArg) { - nsAutoCString str; - aFoo->GetString(str); - - printf(" enumerated %u = \"%s\"\n", aKey, str.get()); - return PL_DHASH_NEXT; -} - PLDHashOperator nsIEnum(const uint32_t& aKey, nsCOMPtr& aData, void* userArg) { nsAutoCString str; @@ -357,17 +335,6 @@ nsIEnum(const uint32_t& aKey, nsCOMPtr& aData, void* userArg) { return PL_DHASH_NEXT; } -PLDHashOperator -nsIEnum2Read(nsISupports* aKey, uint32_t aData, void* userArg) { - nsAutoCString str; - nsCOMPtr foo = do_QueryInterface(aKey); - foo->GetString(str); - - - printf(" enumerated \"%s\" = %u\n", str.get(), aData); - return PL_DHASH_NEXT; -} - PLDHashOperator nsIEnum2(nsISupports* aKey, uint32_t& aData, void* userArg) { nsAutoCString str; @@ -458,17 +425,21 @@ main(void) { printf("FOUND! BAD!\n"); exit (13); } - + printf("not found; good.\n"); - + printf("Enumerating:\n"); - - count = UniToEntity.EnumerateRead(nsDEnumRead, nullptr); + + count = 0; + for (auto iter = UniToEntity.Iter(); !iter.Done(); iter.Next()) { + printf(" enumerated %u = \"%s\"\n", iter.Key(), iter.UserData()); + count++; + } if (count != ENTITY_COUNT) { printf(" Bad count!\n"); exit (14); } - + printf("Clearing..."); UniToEntity.Clear(); printf("OK\n"); @@ -518,17 +489,22 @@ main(void) { printf("FOUND! BAD!\n"); exit (19); } - + printf("not found; good.\n"); - + printf("Enumerating:\n"); - - count = EntToUniClass.EnumerateRead(nsCEnumRead, nullptr); + + count = 0; + for (auto iter = EntToUniClass.Iter(); !iter.Done(); iter.Next()) { + printf(" enumerated \"%s\" = %c\n", + PromiseFlatCString(iter.Key()).get(), iter.UserData()->GetChar()); + count++; + } if (count != ENTITY_COUNT) { printf(" Bad count!\n"); exit (20); } - + printf("Clearing...\n"); EntToUniClass.Clear(); printf(" Clearing OK\n"); @@ -571,7 +547,7 @@ main(void) { for (i = 0; i < ENTITY_COUNT; ++i) { printf(" Getting entry %s...", gEntities[i].mStr); - + if (!EntToUniClass2.Get(fooArray[i], &myChar2)) { printf("FAILED\n"); exit (24); @@ -585,17 +561,24 @@ main(void) { printf("FOUND! BAD!\n"); exit (25); } - + printf("not found; good.\n"); - + printf("Enumerating:\n"); - - count = EntToUniClass2.EnumerateRead(nsIEnum2Read, nullptr); + + count = 0; + for (auto iter = EntToUniClass2.Iter(); !iter.Done(); iter.Next()) { + nsAutoCString s; + nsCOMPtr foo = do_QueryInterface(iter.Key()); + foo->GetString(s); + printf(" enumerated \"%s\" = %u\n", s.get(), iter.UserData()); + count++; + } if (count != ENTITY_COUNT) { printf(" Bad count!\n"); exit (26); } - + printf("Clearing...\n"); EntToUniClass2.Clear(); printf(" Clearing OK\n"); @@ -633,7 +616,7 @@ main(void) { for (i = 0; i < ENTITY_COUNT; ++i) { printf(" Getting entry %s...", gEntities[i].mStr); - + nsCOMPtr myEnt; if (!UniToEntClass2.Get(gEntities[i].mUnicode, getter_AddRefs(myEnt))) { printf("FAILED\n"); @@ -651,17 +634,23 @@ main(void) { printf("FOUND! BAD!\n"); exit (31); } - + printf("not found; good.\n"); - + printf("Enumerating:\n"); - - count = UniToEntClass2.EnumerateRead(nsIEnumRead, nullptr); + + count = 0; + for (auto iter = UniToEntClass2.Iter(); !iter.Done(); iter.Next()) { + nsAutoCString s; + iter.UserData()->GetString(s); + printf(" enumerated %u = \"%s\"\n", iter.Key(), s.get()); + count++; + } if (count != ENTITY_COUNT) { printf(" Bad count!\n"); exit (32); } - + printf("Clearing...\n"); UniToEntClass2.Clear(); printf(" Clearing OK\n"); From b4fae5d56f365139b983029f26dc94bb66766ba1 Mon Sep 17 00:00:00 2001 From: Henrik Skupin Date: Fri, 27 Nov 2015 14:06:32 +0100 Subject: [PATCH 140/153] Bug 1228544 - [firefox-ui-tests] Disable usage of proxxy server. r=armenzg a=tomcat DONTBUILD --- testing/mozharness/configs/firefox_ui_tests/qa_jenkins.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/testing/mozharness/configs/firefox_ui_tests/qa_jenkins.py b/testing/mozharness/configs/firefox_ui_tests/qa_jenkins.py index e5cedc48fb26..afc333d8dbd7 100644 --- a/testing/mozharness/configs/firefox_ui_tests/qa_jenkins.py +++ b/testing/mozharness/configs/firefox_ui_tests/qa_jenkins.py @@ -16,6 +16,9 @@ config = { 'PIP_TRUSTED_HOST': 'pypi.pub.build.mozilla.org', }, + # Don't use any kind of proxxy support + 'proxxy': {}, + # General local variable overwrite 'exes': { 'gittool.py': [ From bbfcb6bd68608ab78ab2a26102743cabd5f84023 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Sat, 28 Nov 2015 01:00:57 -0800 Subject: [PATCH 141/153] Bug 1209184: Follow-up: Disable WebExtension xpcshell tests on Android and gonk. r=me --HG-- extra : commitid : BAyWC1DtflD extra : amend_source : 60f56b9557b55bc67189d52692311f1af309dfc5 --- toolkit/components/extensions/test/xpcshell/xpcshell.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/toolkit/components/extensions/test/xpcshell/xpcshell.ini b/toolkit/components/extensions/test/xpcshell/xpcshell.ini index ea2f7d8a63d7..451bd1b3a18c 100644 --- a/toolkit/components/extensions/test/xpcshell/xpcshell.ini +++ b/toolkit/components/extensions/test/xpcshell/xpcshell.ini @@ -1,5 +1,6 @@ [DEFAULT] head = head.js tail = +skip-if = toolkit == 'android' || toolkit == 'gonk' [test_locale_converter.js] From 83e7fad5739b1bda756370a9f5093646592a7c84 Mon Sep 17 00:00:00 2001 From: Mark Capella Date: Sat, 28 Nov 2015 11:44:54 -0500 Subject: [PATCH 142/153] Bug 1218072 - crash in nsTextEditorState::FinishedRestoringSelection, r=smaug --- dom/html/nsTextEditorState.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dom/html/nsTextEditorState.cpp b/dom/html/nsTextEditorState.cpp index b7d365de805e..64c820d785e3 100644 --- a/dom/html/nsTextEditorState.cpp +++ b/dom/html/nsTextEditorState.cpp @@ -110,7 +110,10 @@ public: } mTextEditorState->mSelectionRestoreEagerInit = false; } - mTextEditorState->FinishedRestoringSelection(); + + if (mTextEditorState) { + mTextEditorState->FinishedRestoringSelection(); + } return NS_OK; } From 2ef1ebcef2c90c945903e6c9b7f88c5d5a506d9c Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Sat, 28 Nov 2015 20:29:48 -0800 Subject: [PATCH 143/153] Back out 5 changesets (bug 1209184) on suspicion of causing OS X opt build startup cache precompilation failures CLOSED TREE Backed out changeset d0404928473e (bug 1209184) Backed out changeset 24282235336d (bug 1209184) Backed out changeset 399404ff25e4 (bug 1209184) Backed out changeset a517959befe9 (bug 1209184) Backed out changeset a4f1765a6cdf (bug 1209184) --- .../protocol/res/ExtensionProtocolHandler.cpp | 113 ---------------- .../protocol/res/ExtensionProtocolHandler.h | 2 - .../res/SubstitutingProtocolHandler.cpp | 5 +- .../res/SubstitutingProtocolHandler.h | 7 - .../extensions/ExtensionManagement.jsm | 2 - toolkit/components/extensions/moz.build | 2 - .../extensions/test/mochitest/mochitest.ini | 1 - .../test/mochitest/test_ext_i18n_css.html | 117 ---------------- .../extensions/test/xpcshell/head.js | 10 -- .../test/xpcshell/test_locale_converter.js | 118 ---------------- .../extensions/test/xpcshell/xpcshell.ini | 6 - toolkit/components/utils/simpleServices.js | 127 +----------------- toolkit/components/utils/utils.manifest | 2 - 13 files changed, 5 insertions(+), 507 deletions(-) delete mode 100644 toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html delete mode 100644 toolkit/components/extensions/test/xpcshell/head.js delete mode 100644 toolkit/components/extensions/test/xpcshell/test_locale_converter.js delete mode 100644 toolkit/components/extensions/test/xpcshell/xpcshell.ini diff --git a/netwerk/protocol/res/ExtensionProtocolHandler.cpp b/netwerk/protocol/res/ExtensionProtocolHandler.cpp index b1e2648dc788..8b5bb37ad07a 100644 --- a/netwerk/protocol/res/ExtensionProtocolHandler.cpp +++ b/netwerk/protocol/res/ExtensionProtocolHandler.cpp @@ -8,16 +8,6 @@ #include "nsIAddonPolicyService.h" #include "nsServiceManagerUtils.h" -#include "nsIURL.h" -#include "nsIChannel.h" -#include "nsIStreamListener.h" -#include "nsIRequestObserver.h" -#include "nsIInputStreamChannel.h" -#include "nsIInputStream.h" -#include "nsIOutputStream.h" -#include "nsIStreamConverterService.h" -#include "nsIPipe.h" -#include "nsNetUtil.h" namespace mozilla { @@ -43,107 +33,4 @@ ExtensionProtocolHandler::GetFlagsForURI(nsIURI* aURI, uint32_t* aFlags) return NS_OK; } -class PipeCloser : public nsIRequestObserver -{ -public: - NS_DECL_ISUPPORTS - - explicit PipeCloser(nsIOutputStream* aOutputStream) : - mOutputStream(aOutputStream) - { - } - - NS_IMETHOD OnStartRequest(nsIRequest*, nsISupports*) override - { - return NS_OK; - } - - NS_IMETHOD OnStopRequest(nsIRequest*, nsISupports*, nsresult aStatusCode) override - { - NS_ENSURE_TRUE(mOutputStream, NS_ERROR_UNEXPECTED); - - nsresult rv = mOutputStream->Close(); - mOutputStream = nullptr; - return rv; - } - -protected: - virtual ~PipeCloser() {} - -private: - nsCOMPtr mOutputStream; -}; - -NS_IMPL_ISUPPORTS(PipeCloser, nsIRequestObserver) - -nsresult -ExtensionProtocolHandler::SubstituteChannel(nsIURI* aURI, - nsILoadInfo* aLoadInfo, - nsIChannel** result) -{ - nsresult rv; - nsCOMPtr url = do_QueryInterface(aURI, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - nsAutoCString ext; - rv = url->GetFileExtension(ext); - NS_ENSURE_SUCCESS(rv, rv); - - if (!ext.LowerCaseEqualsLiteral("css")) { - return NS_OK; - } - - // Filter CSS files to replace locale message tokens with localized strings. - - nsCOMPtr convService = - do_GetService(NS_STREAMCONVERTERSERVICE_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - const char* kFromType = "application/vnd.mozilla.webext.unlocalized"; - const char* kToType = "text/css"; - - nsCOMPtr inputStream; - if (aLoadInfo && aLoadInfo->GetSecurityMode()) { - // Certain security checks require an async channel. - - nsCOMPtr outputStream; - rv = NS_NewPipe(getter_AddRefs(inputStream), getter_AddRefs(outputStream), - 0, UINT32_MAX, true, false); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr listener; - nsCOMPtr observer = new PipeCloser(outputStream); - rv = NS_NewSimpleStreamListener(getter_AddRefs(listener), outputStream, observer); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr converter; - rv = convService->AsyncConvertData(kFromType, kToType, listener, - aURI, getter_AddRefs(converter)); - NS_ENSURE_SUCCESS(rv, rv); - - rv = (*result)->AsyncOpen2(converter); - } else { - // Stylesheet loads for extension content scripts require a sync channel, - // but fortunately do not invoke security checks. - - nsCOMPtr sourceStream; - rv = (*result)->Open(getter_AddRefs(sourceStream)); - NS_ENSURE_SUCCESS(rv, rv); - - rv = convService->Convert(sourceStream, kFromType, kToType, - aURI, getter_AddRefs(inputStream)); - } - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr channel; - rv = NS_NewInputStreamChannelInternal(getter_AddRefs(channel), aURI, inputStream, - NS_LITERAL_CSTRING("text/css"), - NS_LITERAL_CSTRING("utf-8"), - aLoadInfo); - NS_ENSURE_SUCCESS(rv, rv); - - channel.swap(*result); - return NS_OK; -} - } // namespace mozilla diff --git a/netwerk/protocol/res/ExtensionProtocolHandler.h b/netwerk/protocol/res/ExtensionProtocolHandler.h index d30fd4630e77..48f7c4dfe2df 100644 --- a/netwerk/protocol/res/ExtensionProtocolHandler.h +++ b/netwerk/protocol/res/ExtensionProtocolHandler.h @@ -39,8 +39,6 @@ protected: return false; } - - virtual nsresult SubstituteChannel(nsIURI* uri, nsILoadInfo* aLoadInfo, nsIChannel** result) override; }; } // namespace mozilla diff --git a/netwerk/protocol/res/SubstitutingProtocolHandler.cpp b/netwerk/protocol/res/SubstitutingProtocolHandler.cpp index 181aabd72a54..6a2784b21351 100644 --- a/netwerk/protocol/res/SubstitutingProtocolHandler.cpp +++ b/netwerk/protocol/res/SubstitutingProtocolHandler.cpp @@ -253,10 +253,7 @@ SubstitutingProtocolHandler::NewChannel2(nsIURI* uri, nsLoadFlags loadFlags = 0; (*result)->GetLoadFlags(&loadFlags); (*result)->SetLoadFlags(loadFlags & ~nsIChannel::LOAD_REPLACE); - rv = (*result)->SetOriginalURI(uri); - NS_ENSURE_SUCCESS(rv, rv); - - return SubstituteChannel(uri, aLoadInfo, result); + return (*result)->SetOriginalURI(uri); } nsresult diff --git a/netwerk/protocol/res/SubstitutingProtocolHandler.h b/netwerk/protocol/res/SubstitutingProtocolHandler.h index e48f259480d0..1e9f5de251c5 100644 --- a/netwerk/protocol/res/SubstitutingProtocolHandler.h +++ b/netwerk/protocol/res/SubstitutingProtocolHandler.h @@ -59,13 +59,6 @@ protected: return false; } - // Override this in the subclass to check for special case when opening - // channels. - virtual nsresult SubstituteChannel(nsIURI* uri, nsILoadInfo* aLoadInfo, nsIChannel** result) - { - return NS_OK; - } - nsIIOService* IOService() { return mIOService; } private: diff --git a/toolkit/components/extensions/ExtensionManagement.jsm b/toolkit/components/extensions/ExtensionManagement.jsm index 88568e5516c1..0e40ad4d486d 100644 --- a/toolkit/components/extensions/ExtensionManagement.jsm +++ b/toolkit/components/extensions/ExtensionManagement.jsm @@ -135,7 +135,6 @@ var Service = { this.uuidMap.set(uuid, extension); this.aps.setAddonLoadURICallback(extension.id, this.checkAddonMayLoad.bind(this, extension)); - this.aps.setAddonLocalizeCallback(extension.id, extension.localize.bind(extension)); }, // Called when an extension is unloaded. @@ -143,7 +142,6 @@ var Service = { let extension = this.uuidMap.get(uuid); this.uuidMap.delete(uuid); this.aps.setAddonLoadURICallback(extension.id, null); - this.aps.setAddonLocalizeCallback(extension.id, null); let handler = Services.io.getProtocolHandler("moz-extension"); handler.QueryInterface(Ci.nsISubstitutingProtocolHandler); diff --git a/toolkit/components/extensions/moz.build b/toolkit/components/extensions/moz.build index 76afd553ce6c..614b05507adf 100644 --- a/toolkit/components/extensions/moz.build +++ b/toolkit/components/extensions/moz.build @@ -15,5 +15,3 @@ EXTRA_JS_MODULES += [ JAR_MANIFESTS += ['jar.mn'] MOCHITEST_MANIFESTS += ['test/mochitest/mochitest.ini'] - -XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell/xpcshell.ini'] diff --git a/toolkit/components/extensions/test/mochitest/mochitest.ini b/toolkit/components/extensions/test/mochitest/mochitest.ini index dbf39531c736..e535b5d638a5 100644 --- a/toolkit/components/extensions/test/mochitest/mochitest.ini +++ b/toolkit/components/extensions/test/mochitest/mochitest.ini @@ -21,7 +21,6 @@ support-files = [test_ext_simple.html] [test_ext_geturl.html] [test_ext_contentscript.html] -[test_ext_i18n_css.html] [test_ext_webrequest.html] [test_ext_generate.html] [test_ext_localStorage.html] diff --git a/toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html b/toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html deleted file mode 100644 index cc396705a4b1..000000000000 --- a/toolkit/components/extensions/test/mochitest/test_ext_i18n_css.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - Test for content script - - - - - - - - - - - - diff --git a/toolkit/components/extensions/test/xpcshell/head.js b/toolkit/components/extensions/test/xpcshell/head.js deleted file mode 100644 index 71823e9e8284..000000000000 --- a/toolkit/components/extensions/test/xpcshell/head.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; - -const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; - -Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", - "resource://gre/modules/NetUtil.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "Services", - "resource://gre/modules/Services.jsm"); diff --git a/toolkit/components/extensions/test/xpcshell/test_locale_converter.js b/toolkit/components/extensions/test/xpcshell/test_locale_converter.js deleted file mode 100644 index 4b3f6c4e156a..000000000000 --- a/toolkit/components/extensions/test/xpcshell/test_locale_converter.js +++ /dev/null @@ -1,118 +0,0 @@ -"use strict"; - -const convService = Cc["@mozilla.org/streamConverters;1"] - .getService(Ci.nsIStreamConverterService); - -const UUID = "72b61ee3-aceb-476c-be1b-0822b036c9f1"; -const ADDON_ID = "test@web.extension"; -const URI = NetUtil.newURI(`moz-extension://${UUID}/file.css`); - -const FROM_TYPE = "application/vnd.mozilla.webext.unlocalized"; -const TO_TYPE = "text/css"; - - -function StringStream(string) { - let stream = Cc["@mozilla.org/io/string-input-stream;1"] - .createInstance(Ci.nsIStringInputStream); - - stream.data = string; - return stream; -} - - -// Initialize the policy service with a stub localizer for our -// add-on ID. -add_task(function* init() { - const aps = Cc["@mozilla.org/addons/policy-service;1"] - .getService(Ci.nsIAddonPolicyService).wrappedJSObject; - - let oldCallback = aps.setExtensionURIToAddonIdCallback(uri => { - if (uri.host == UUID) { - return ADDON_ID; - } - }); - - aps.setAddonLocalizeCallback(ADDON_ID, string => { - return string.replace(/__MSG_(.*?)__/g, ""); - }); - - do_register_cleanup(() => { - aps.setExtensionURIToAddonIdCallback(oldCallback); - aps.setAddonLocalizeCallback(ADDON_ID, null); - }); -}); - - -// Test that the synchronous converter works as expected with a -// simple string. -add_task(function* testSynchronousConvert() { - let stream = StringStream("Foo __MSG_xxx__ bar __MSG_yyy__ baz"); - - let resultStream = convService.convert(stream, FROM_TYPE, TO_TYPE, URI); - - let result = NetUtil.readInputStreamToString(resultStream, resultStream.available()); - - equal(result, "Foo bar baz"); -}); - - -// Test that the asynchronous converter works as expected with input -// split into multiple chunks, and a boundary in the middle of a -// replacement token. -add_task(function* testAsyncConvert() { - let listener; - let awaitResult = new Promise((resolve, reject) => { - listener = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]), - - onDataAvailable(request, context, inputStream, offset, count) { - this.resultParts.push(NetUtil.readInputStreamToString(inputStream, count)); - }, - - onStartRequest() { - ok(!("resultParts" in this)); - this.resultParts = []; - }, - - onStopRequest(request, context, statusCode) { - if (!Components.isSuccessCode(statusCode)) { - reject(new Error(statusCode)); - } - - resolve(this.resultParts.join("\n")); - }, - }; - }); - - let parts = ["Foo __MSG_x", "xx__ bar __MSG_yyy__ baz"]; - - let converter = convService.asyncConvertData(FROM_TYPE, TO_TYPE, listener, URI); - converter.onStartRequest(null, null); - - for (let part of parts) { - converter.onDataAvailable(null, null, StringStream(part), 0, part.length); - } - - converter.onStopRequest(null, null, Cr.NS_OK); - - - let result = yield awaitResult; - equal(result, "Foo bar baz"); -}); - - -// Test that attempting to initialize a converter with the URI of a -// nonexistent WebExtension fails. -add_task(function* testInvalidUUID() { - let uri = NetUtil.newURI("moz-extension://eb4f3be8-41c9-4970-aa6d-b84d1ecc02b2/file.css"); - - Assert.throws(() => { - convService.convert(stream, FROM_TYPE, TO_TYPE, uri); - }); - - Assert.throws(() => { - let listener = { QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]) }; - - convService.asyncConvertData(FROM_TYPE, TO_TYPE, listener, uri); - }); -}); diff --git a/toolkit/components/extensions/test/xpcshell/xpcshell.ini b/toolkit/components/extensions/test/xpcshell/xpcshell.ini deleted file mode 100644 index 451bd1b3a18c..000000000000 --- a/toolkit/components/extensions/test/xpcshell/xpcshell.ini +++ /dev/null @@ -1,6 +0,0 @@ -[DEFAULT] -head = head.js -tail = -skip-if = toolkit == 'android' || toolkit == 'gonk' - -[test_locale_converter.js] diff --git a/toolkit/components/utils/simpleServices.js b/toolkit/components/utils/simpleServices.js index 047aa8075539..608c62475803 100644 --- a/toolkit/components/utils/simpleServices.js +++ b/toolkit/components/utils/simpleServices.js @@ -12,17 +12,11 @@ "use strict"; -const Cc = Components.classes; const Cu = Components.utils; const Ci = Components.interfaces; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", - "resource://gre/modules/NetUtil.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "Services", - "resource://gre/modules/Services.jsm"); - function RemoteTagServiceService() { } @@ -54,7 +48,6 @@ function AddonPolicyService() { this.wrappedJSObject = this; this.mayLoadURICallbacks = new Map(); - this.localizeCallbacks = new Map(); } AddonPolicyService.prototype = { @@ -69,19 +62,10 @@ AddonPolicyService.prototype = { * @see nsIAddonPolicyService.addonMayLoadURI */ addonMayLoadURI(aAddonId, aURI) { - let cb = this.mayLoadURICallbacks.get(aAddonId); + let cb = this.mayLoadURICallbacks[aAddonId]; return cb ? cb(aURI) : false; }, - /* - * Invokes a callback (if any) associated with the addon to loclaize a - * resource belonging to that add-on. - */ - localizeAddonString(aAddonId, aString) { - let cb = this.localizeCallbacks.get(aAddonId); - return cb ? cb(aString) : aString; - }, - /* * Invokes a callback (if any) to determine if an extension URI should be * web-accessible. @@ -121,21 +105,9 @@ AddonPolicyService.prototype = { */ setAddonLoadURICallback(aAddonId, aCallback) { if (aCallback) { - this.mayLoadURICallbacks.set(aAddonId, aCallback); + this.mayLoadURICallbacks[aAddonId] = aCallback; } else { - delete this.mayLoadURICallbacks.delete(aAddonId); - } - }, - - /* - * Sets the callbacks used by the stream converter service to localize - * add-on resources. - */ - setAddonLocalizeCallback(aAddonId, aCallback) { - if (aCallback) { - this.localizeCallbacks.set(aAddonId, aCallback); - } else { - delete this.localizeCallbacks.delete(aAddonId); + delete this.mayLoadURICallbacks[aAddonId]; } }, @@ -162,95 +134,4 @@ AddonPolicyService.prototype = { } }; -/* - * This class provides a stream filter for locale messages in CSS files served - * by the moz-extension: protocol handler. - * - * See SubstituteChannel in netwerk/protocol/res/ExtensionProtocolHandler.cpp - * for usage. - */ -function AddonLocalizationConverter() -{ - this.aps = Cc["@mozilla.org/addons/policy-service;1"].getService(Ci.nsIAddonPolicyService) - .wrappedJSObject; -} - -AddonLocalizationConverter.prototype = { - classID: Components.ID("{ded150e3-c92e-4077-a396-0dba9953e39f}"), - QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamConverter]), - - FROM_TYPE: "application/vnd.mozilla.webext.unlocalized", - TO_TYPE: "text/css", - - checkTypes(aFromType, aToType) { - if (aFromType != this.FROM_TYPE) { - throw Components.Exception("Invalid aFromType value", Cr.NS_ERROR_INVALID_ARG, - Components.stack.caller.caller); - } - if (aToType != this.TO_TYPE) { - throw Components.Exception("Invalid aToType value", Cr.NS_ERROR_INVALID_ARG, - Components.stack.caller.caller); - } - }, - - // aContext must be a nsIURI object for a valid moz-extension: URL. - getAddonId(aContext) { - // In this case, we want the add-on ID even if the URL is web accessible, - // so check the root rather than the exact path. - let uri = Services.io.newURI("/", null, aContext); - - let id = this.aps.extensionURIToAddonId(uri); - if (id == undefined) { - throw new Components.Exception("Invalid context", Cr.NS_ERROR_INVALID_ARG); - } - return id; - }, - - convertToStream(aAddonId, aString) { - let stream = Cc["@mozilla.org/io/string-input-stream;1"] - .createInstance(Ci.nsIStringInputStream); - - stream.data = this.aps.localizeAddonString(aAddonId, aString); - return stream; - }, - - convert(aStream, aFromType, aToType, aContext) { - this.checkTypes(aFromType, aToType); - let addonId = this.getAddonId(aContext); - - let string = NetUtil.readInputStreamToString(aStream, aStream.available()); - return this.convertToStream(addonId, string); - }, - - asyncConvertData(aFromType, aToType, aListener, aContext) { - this.checkTypes(aFromType, aToType); - this.addonId = this.getAddonId(aContext); - this.listener = aListener; - }, - - onStartRequest(aRequest, aContext) { - this.parts = []; - }, - - onDataAvailable(aRequest, aContext, aInputStream, aOffset, aCount) { - this.parts.push(NetUtil.readInputStreamToString(aInputStream, aCount)); - }, - - onStopRequest(aRequest, aContext, aStatusCode) { - try { - this.listener.onStartRequest(aRequest, null); - if (Components.isSuccessCode(aStatusCode)) { - let string = this.parts.join(""); - let stream = this.convertToStream(this.addonId, string); - - this.listener.onDataAvailable(aRequest, null, stream, 0, stream.data.length); - } - } catch (e) { - aStatusCode = e.result || Cr.NS_ERROR_FAILURE; - } - this.listener.onStopRequest(aRequest, null, aStatusCode); - }, -}; - -this.NSGetFactory = XPCOMUtils.generateNSGetFactory([RemoteTagServiceService, AddonPolicyService, - AddonLocalizationConverter]); +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([RemoteTagServiceService, AddonPolicyService]); diff --git a/toolkit/components/utils/utils.manifest b/toolkit/components/utils/utils.manifest index b2d30bd98db6..b08c5d519e13 100644 --- a/toolkit/components/utils/utils.manifest +++ b/toolkit/components/utils/utils.manifest @@ -2,5 +2,3 @@ component {dfd07380-6083-11e4-9803-0800200c9a66} simpleServices.js contract @mozilla.org/addons/remote-tag-service;1 {dfd07380-6083-11e4-9803-0800200c9a66} component {89560ed3-72e3-498d-a0e8-ffe50334d7c5} simpleServices.js contract @mozilla.org/addons/policy-service;1 {89560ed3-72e3-498d-a0e8-ffe50334d7c5} -component {ded150e3-c92e-4077-a396-0dba9953e39f} simpleServices.js -contract @mozilla.org/streamconv;1?from=application/vnd.mozilla.webext.unlocalized&to=text/css {ded150e3-c92e-4077-a396-0dba9953e39f} From e76f2ab0c8382d3656c7a50b08977f531d862443 Mon Sep 17 00:00:00 2001 From: Mark Finkle Date: Sat, 28 Nov 2015 12:52:22 -0500 Subject: [PATCH 144/153] Bug 1227997 - Make theme fallback actually work r=mossop --- toolkit/themes/moz.build | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/toolkit/themes/moz.build b/toolkit/themes/moz.build index 6d64d4aa52e1..69b1ac613942 100644 --- a/toolkit/themes/moz.build +++ b/toolkit/themes/moz.build @@ -23,11 +23,8 @@ if toolkit == 'cocoa': DIRS += ['osx'] elif toolkit in ('gtk2', 'gtk3', 'qt'): DIRS += ['linux'] -elif app == 'mobile/android': - if CONFIG['NIGHTLY_BUILD']: - DIRS += ['mobile'] - else: - DIRS += ['windows'] +elif app == 'mobile/android' and CONFIG['NIGHTLY_BUILD']: + DIRS += ['mobile'] else: DIRS += ['windows'] From 6a55d42f7c8be2930dcdf02afaa60173e5cfbbfa Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 29 Nov 2015 17:08:34 +0000 Subject: [PATCH 145/153] Bug 1223573 - Part 1. Move loop to browser/extensions/loop. r=mikedeboer --HG-- rename : browser/components/loop/.eslintignore => browser/extensions/loop/.eslintignore rename : browser/components/loop/.eslintrc => browser/extensions/loop/.eslintrc rename : browser/components/loop/.eslintrc-gecko => browser/extensions/loop/.eslintrc-gecko rename : browser/components/loop/.gitignore => browser/extensions/loop/.gitignore rename : browser/components/loop/README.txt => browser/extensions/loop/README.txt rename : browser/components/loop/build-jsx => browser/extensions/loop/build-jsx rename : browser/components/loop/modules/.eslintrc => browser/extensions/loop/content/modules/.eslintrc rename : browser/components/loop/modules/LoopRooms.jsm => browser/extensions/loop/content/modules/LoopRooms.jsm rename : browser/components/loop/modules/LoopRoomsCache.jsm => browser/extensions/loop/content/modules/LoopRoomsCache.jsm rename : browser/components/loop/modules/MozLoopAPI.jsm => browser/extensions/loop/content/modules/MozLoopAPI.jsm rename : browser/components/loop/modules/MozLoopPushHandler.jsm => browser/extensions/loop/content/modules/MozLoopPushHandler.jsm rename : browser/components/loop/modules/MozLoopService.jsm => browser/extensions/loop/content/modules/MozLoopService.jsm rename : browser/components/loop/modules/MozLoopWorker.js => browser/extensions/loop/content/modules/MozLoopWorker.js rename : browser/components/loop/content/conversation.html => browser/extensions/loop/content/panels/conversation.html rename : browser/components/loop/content/css/panel.css => browser/extensions/loop/content/panels/css/panel.css rename : browser/components/loop/content/js/.eslintrc => browser/extensions/loop/content/panels/js/.eslintrc rename : browser/components/loop/content/js/conversation.js => browser/extensions/loop/content/panels/js/conversation.js rename : browser/components/loop/content/js/conversation.jsx => browser/extensions/loop/content/panels/js/conversation.jsx rename : browser/components/loop/content/js/conversationAppStore.js => browser/extensions/loop/content/panels/js/conversationAppStore.js rename : browser/components/loop/content/js/feedbackViews.js => browser/extensions/loop/content/panels/js/feedbackViews.js rename : browser/components/loop/content/js/feedbackViews.jsx => browser/extensions/loop/content/panels/js/feedbackViews.jsx rename : browser/components/loop/content/js/otconfig.js => browser/extensions/loop/content/panels/js/otconfig.js rename : browser/components/loop/content/js/panel.js => browser/extensions/loop/content/panels/js/panel.js rename : browser/components/loop/content/js/panel.jsx => browser/extensions/loop/content/panels/js/panel.jsx rename : browser/components/loop/content/js/roomStore.js => browser/extensions/loop/content/panels/js/roomStore.js rename : browser/components/loop/content/js/roomViews.js => browser/extensions/loop/content/panels/js/roomViews.js rename : browser/components/loop/content/js/roomViews.jsx => browser/extensions/loop/content/panels/js/roomViews.jsx rename : browser/components/loop/content/panel.html => browser/extensions/loop/content/panels/panel.html rename : browser/components/loop/content/libs/l10n.js => browser/extensions/loop/content/panels/vendor/l10n.js rename : browser/components/loop/content/shared/README.md => browser/extensions/loop/content/shared/README.md rename : browser/components/loop/content/shared/css/common.css => browser/extensions/loop/content/shared/css/common.css rename : browser/components/loop/content/shared/css/conversation.css => browser/extensions/loop/content/shared/css/conversation.css rename : browser/components/loop/content/shared/css/reset.css => browser/extensions/loop/content/shared/css/reset.css rename : browser/components/loop/content/shared/img/02.png => browser/extensions/loop/content/shared/img/02.png rename : browser/components/loop/content/shared/img/02@2x.png => browser/extensions/loop/content/shared/img/02@2x.png rename : browser/components/loop/content/shared/img/animated-spinner.svg => browser/extensions/loop/content/shared/img/animated-spinner.svg rename : browser/components/loop/content/shared/img/audio-call-avatar.svg => browser/extensions/loop/content/shared/img/audio-call-avatar.svg rename : browser/components/loop/content/shared/img/audio-default-16x16@1.5x.png => browser/extensions/loop/content/shared/img/audio-default-16x16@1.5x.png rename : browser/components/loop/content/shared/img/audio-default-16x16@2x.png => browser/extensions/loop/content/shared/img/audio-default-16x16@2x.png rename : browser/components/loop/content/shared/img/svg/audio-hover.svg => browser/extensions/loop/content/shared/img/audio-hover.svg rename : browser/components/loop/content/shared/img/svg/audio-mute-hover.svg => browser/extensions/loop/content/shared/img/audio-mute-hover.svg rename : browser/components/loop/content/shared/img/svg/audio-mute.svg => browser/extensions/loop/content/shared/img/audio-mute.svg rename : browser/components/loop/content/shared/img/svg/audio.svg => browser/extensions/loop/content/shared/img/audio.svg rename : browser/components/loop/content/shared/img/avatars.svg => browser/extensions/loop/content/shared/img/avatars.svg rename : browser/components/loop/content/shared/img/beta-ribbon.svg => browser/extensions/loop/content/shared/img/beta-ribbon.svg rename : browser/components/loop/content/shared/img/svg/cam_audio-no.svg => browser/extensions/loop/content/shared/img/cam_audio-no.svg rename : browser/components/loop/content/shared/img/svg/cam_audio.svg => browser/extensions/loop/content/shared/img/cam_audio.svg rename : browser/components/loop/content/shared/img/svg/cam_audio_h.svg => browser/extensions/loop/content/shared/img/cam_audio_h.svg rename : browser/components/loop/content/shared/img/chatbubble-arrow-left.svg => browser/extensions/loop/content/shared/img/chatbubble-arrow-left.svg rename : browser/components/loop/content/shared/img/chatbubble-arrow-right.svg => browser/extensions/loop/content/shared/img/chatbubble-arrow-right.svg rename : browser/components/loop/content/shared/img/check.svg => browser/extensions/loop/content/shared/img/check.svg rename : browser/components/loop/content/shared/img/ellipsis-v.svg => browser/extensions/loop/content/shared/img/ellipsis-v.svg rename : browser/components/loop/content/shared/img/empty_conversations.svg => browser/extensions/loop/content/shared/img/empty_conversations.svg rename : browser/components/loop/content/shared/img/empty_search.svg => browser/extensions/loop/content/shared/img/empty_search.svg rename : browser/components/loop/content/shared/img/svg/exit.svg => browser/extensions/loop/content/shared/img/exit.svg rename : browser/components/loop/content/shared/img/facemute-14x14.png => browser/extensions/loop/content/shared/img/facemute-14x14.png rename : browser/components/loop/content/shared/img/facemute-14x14@2x.png => browser/extensions/loop/content/shared/img/facemute-14x14@2x.png rename : browser/components/loop/content/shared/img/firefox-avatar.svg => browser/extensions/loop/content/shared/img/firefox-avatar.svg rename : browser/components/loop/content/shared/img/firefox-logo.png => browser/extensions/loop/content/shared/img/firefox-logo.png rename : browser/components/loop/content/shared/img/svg/glyph-email-16x16.svg => browser/extensions/loop/content/shared/img/glyph-email-16x16.svg rename : browser/components/loop/content/shared/img/svg/glyph-facebook-16x16.svg => browser/extensions/loop/content/shared/img/glyph-facebook-16x16.svg rename : browser/components/loop/content/shared/img/svg/glyph-help-16x16.svg => browser/extensions/loop/content/shared/img/glyph-help-16x16.svg rename : browser/components/loop/content/shared/img/svg/glyph-link-16x16.svg => browser/extensions/loop/content/shared/img/glyph-link-16x16.svg rename : browser/components/loop/content/shared/img/svg/glyph-user-16x16.svg => browser/extensions/loop/content/shared/img/glyph-user-16x16.svg rename : browser/components/loop/content/shared/img/hangup-inverse-14x14.png => browser/extensions/loop/content/shared/img/hangup-inverse-14x14.png rename : browser/components/loop/content/shared/img/hangup-inverse-14x14@2x.png => browser/extensions/loop/content/shared/img/hangup-inverse-14x14@2x.png rename : browser/components/loop/content/shared/img/happy.png => browser/extensions/loop/content/shared/img/happy.png rename : browser/components/loop/content/shared/img/hello_logo.svg => browser/extensions/loop/content/shared/img/hello_logo.svg rename : browser/components/loop/content/shared/img/helloicon.svg => browser/extensions/loop/content/shared/img/helloicon.svg rename : browser/components/loop/content/shared/img/icon_32.png => browser/extensions/loop/content/shared/img/icon_32.png rename : browser/components/loop/content/shared/img/icon_64.png => browser/extensions/loop/content/shared/img/icon_64.png rename : browser/components/loop/content/shared/img/icons-10x10.svg => browser/extensions/loop/content/shared/img/icons-10x10.svg rename : browser/components/loop/content/shared/img/icons-14x14.svg => browser/extensions/loop/content/shared/img/icons-14x14.svg rename : browser/components/loop/content/shared/img/icons-16x16.svg => browser/extensions/loop/content/shared/img/icons-16x16.svg rename : browser/components/loop/content/shared/img/svg/media-group-left-hover.svg => browser/extensions/loop/content/shared/img/media-group-left-hover.svg rename : browser/components/loop/content/shared/img/svg/media-group-right-hover.svg => browser/extensions/loop/content/shared/img/media-group-right-hover.svg rename : browser/components/loop/content/shared/img/svg/media-group.svg => browser/extensions/loop/content/shared/img/media-group.svg rename : browser/components/loop/content/shared/img/movistar.png => browser/extensions/loop/content/shared/img/movistar.png rename : browser/components/loop/content/shared/img/movistar@2x.png => browser/extensions/loop/content/shared/img/movistar@2x.png rename : browser/components/loop/content/shared/img/mute-inverse-14x14.png => browser/extensions/loop/content/shared/img/mute-inverse-14x14.png rename : browser/components/loop/content/shared/img/mute-inverse-14x14@2x.png => browser/extensions/loop/content/shared/img/mute-inverse-14x14@2x.png rename : browser/components/loop/content/shared/img/pause-12x12.svg => browser/extensions/loop/content/shared/img/pause-12x12.svg rename : browser/components/loop/content/shared/img/play-12x12.svg => browser/extensions/loop/content/shared/img/play-12x12.svg rename : browser/components/loop/content/shared/img/sad.png => browser/extensions/loop/content/shared/img/sad.png rename : browser/components/loop/content/shared/img/sad_hello_icon_64x64.svg => browser/extensions/loop/content/shared/img/sad_hello_icon_64x64.svg rename : browser/components/loop/content/shared/img/svg/settings-hover.svg => browser/extensions/loop/content/shared/img/settings-hover.svg rename : browser/components/loop/content/shared/img/svg/settings.svg => browser/extensions/loop/content/shared/img/settings.svg rename : browser/components/loop/content/shared/img/svg/sharing-active.svg => browser/extensions/loop/content/shared/img/sharing-active.svg rename : browser/components/loop/content/shared/img/svg/sharing-hover.svg => browser/extensions/loop/content/shared/img/sharing-hover.svg rename : browser/components/loop/content/shared/img/svg/sharing-pending.svg => browser/extensions/loop/content/shared/img/sharing-pending.svg rename : browser/components/loop/content/shared/img/svg/sharing.svg => browser/extensions/loop/content/shared/img/sharing.svg rename : browser/components/loop/content/shared/img/spinner.png => browser/extensions/loop/content/shared/img/spinner.png rename : browser/components/loop/content/shared/img/spinner.svg => browser/extensions/loop/content/shared/img/spinner.svg rename : browser/components/loop/content/shared/img/spinner@2x.png => browser/extensions/loop/content/shared/img/spinner@2x.png rename : browser/components/loop/content/shared/img/stop-12x12.svg => browser/extensions/loop/content/shared/img/stop-12x12.svg rename : browser/components/loop/content/shared/img/telefonica.png => browser/extensions/loop/content/shared/img/telefonica.png rename : browser/components/loop/content/shared/img/telefonica@2x.png => browser/extensions/loop/content/shared/img/telefonica@2x.png rename : browser/components/loop/content/shared/img/svg/video-hover.svg => browser/extensions/loop/content/shared/img/video-hover.svg rename : browser/components/loop/content/shared/img/svg/video-mute-hover.svg => browser/extensions/loop/content/shared/img/video-mute-hover.svg rename : browser/components/loop/content/shared/img/svg/video-mute.svg => browser/extensions/loop/content/shared/img/video-mute.svg rename : browser/components/loop/content/shared/img/svg/video.svg => browser/extensions/loop/content/shared/img/video.svg rename : browser/components/loop/content/shared/img/vivo.png => browser/extensions/loop/content/shared/img/vivo.png rename : browser/components/loop/content/shared/img/vivo@2x.png => browser/extensions/loop/content/shared/img/vivo@2x.png rename : browser/components/loop/content/shared/js/actions.js => browser/extensions/loop/content/shared/js/actions.js rename : browser/components/loop/content/shared/js/activeRoomStore.js => browser/extensions/loop/content/shared/js/activeRoomStore.js rename : browser/components/loop/content/shared/js/crypto.js => browser/extensions/loop/content/shared/js/crypto.js rename : browser/components/loop/content/shared/js/dispatcher.js => browser/extensions/loop/content/shared/js/dispatcher.js rename : browser/components/loop/content/shared/js/linkifiedTextView.js => browser/extensions/loop/content/shared/js/linkifiedTextView.js rename : browser/components/loop/content/shared/js/linkifiedTextView.jsx => browser/extensions/loop/content/shared/js/linkifiedTextView.jsx rename : browser/components/loop/content/shared/js/loopapi-client.js => browser/extensions/loop/content/shared/js/loopapi-client.js rename : browser/components/loop/content/shared/js/mixins.js => browser/extensions/loop/content/shared/js/mixins.js rename : browser/components/loop/content/shared/js/models.js => browser/extensions/loop/content/shared/js/models.js rename : browser/components/loop/content/shared/js/otSdkDriver.js => browser/extensions/loop/content/shared/js/otSdkDriver.js rename : browser/components/loop/content/shared/js/store.js => browser/extensions/loop/content/shared/js/store.js rename : browser/components/loop/content/shared/js/textChatStore.js => browser/extensions/loop/content/shared/js/textChatStore.js rename : browser/components/loop/content/shared/js/textChatView.js => browser/extensions/loop/content/shared/js/textChatView.js rename : browser/components/loop/content/shared/js/textChatView.jsx => browser/extensions/loop/content/shared/js/textChatView.jsx rename : browser/components/loop/content/shared/js/urlRegExps.js => browser/extensions/loop/content/shared/js/urlRegExps.js rename : browser/components/loop/content/shared/js/utils.js => browser/extensions/loop/content/shared/js/utils.js rename : browser/components/loop/content/shared/js/validate.js => browser/extensions/loop/content/shared/js/validate.js rename : browser/components/loop/content/shared/js/views.js => browser/extensions/loop/content/shared/js/views.js rename : browser/components/loop/content/shared/js/views.jsx => browser/extensions/loop/content/shared/js/views.jsx rename : browser/components/loop/content/shared/sounds/connected.ogg => browser/extensions/loop/content/shared/sounds/connected.ogg rename : browser/components/loop/content/shared/sounds/connecting.ogg => browser/extensions/loop/content/shared/sounds/connecting.ogg rename : browser/components/loop/content/shared/sounds/failure.ogg => browser/extensions/loop/content/shared/sounds/failure.ogg rename : browser/components/loop/content/shared/sounds/message.ogg => browser/extensions/loop/content/shared/sounds/message.ogg rename : browser/components/loop/content/shared/sounds/ringtone.ogg => browser/extensions/loop/content/shared/sounds/ringtone.ogg rename : browser/components/loop/content/shared/sounds/room-joined-in.ogg => browser/extensions/loop/content/shared/sounds/room-joined-in.ogg rename : browser/components/loop/content/shared/sounds/room-joined.ogg => browser/extensions/loop/content/shared/sounds/room-joined.ogg rename : browser/components/loop/content/shared/sounds/room-left.ogg => browser/extensions/loop/content/shared/sounds/room-left.ogg rename : browser/components/loop/content/shared/sounds/terminated.ogg => browser/extensions/loop/content/shared/sounds/terminated.ogg rename : browser/components/loop/content/shared/libs/backbone-1.2.1.js => browser/extensions/loop/content/shared/vendor/backbone-1.2.1.js rename : browser/components/loop/content/shared/libs/classnames-2.2.0.js => browser/extensions/loop/content/shared/vendor/classnames-2.2.0.js rename : browser/components/loop/content/shared/libs/lodash-3.9.3.js => browser/extensions/loop/content/shared/vendor/lodash-3.9.3.js rename : browser/components/loop/content/shared/libs/react-0.13.3-prod.js => browser/extensions/loop/content/shared/vendor/react-0.13.3-prod.js rename : browser/components/loop/content/shared/libs/react-0.13.3.js => browser/extensions/loop/content/shared/vendor/react-0.13.3.js rename : browser/components/loop/content/shared/libs/sdk-content/css/ot.css => browser/extensions/loop/content/shared/vendor/sdk-content/css/ot.css rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-chrome.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-chrome.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-copy-firefox.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-copy-firefox.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-firefox.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-firefox.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-predenied-chrome.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-predenied-chrome.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-prompt-chrome.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-prompt-chrome.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-publisher.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-publisher.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-subscriber.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-subscriber.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/buttons.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/buttons.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/loader.gif => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/loader.gif rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-off.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-off.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-on.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-on.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-off.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-off.png rename : browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-on.png => browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-on.png rename : browser/components/loop/content/shared/libs/sdk-content/js/dynamic_config.min.js => browser/extensions/loop/content/shared/vendor/sdk-content/js/dynamic_config.min.js rename : browser/components/loop/content/shared/libs/sdk.js => browser/extensions/loop/content/shared/vendor/sdk.js rename : browser/components/loop/jar.mn => browser/extensions/loop/jar.mn rename : browser/components/loop/manifest.ini => browser/extensions/loop/manifest.ini rename : browser/components/loop/moz.build => browser/extensions/loop/moz.build rename : browser/components/loop/run-all-loop-tests.sh => browser/extensions/loop/run-all-loop-tests.sh rename : browser/components/loop/standalone/.gitignore => browser/extensions/loop/standalone/.gitignore rename : browser/components/loop/standalone/Makefile => browser/extensions/loop/standalone/Makefile rename : browser/components/loop/standalone/README.md => browser/extensions/loop/standalone/README.md rename : browser/components/loop/standalone/content/css/webapp.css => browser/extensions/loop/standalone/content/css/webapp.css rename : browser/components/loop/standalone/content/favicon.ico => browser/extensions/loop/standalone/content/favicon.ico rename : browser/components/loop/standalone/content/img/gum-chrome.svg => browser/extensions/loop/standalone/content/img/gum-chrome.svg rename : browser/components/loop/standalone/content/img/gum-firefox.svg => browser/extensions/loop/standalone/content/img/gum-firefox.svg rename : browser/components/loop/standalone/content/img/gum-opera.svg => browser/extensions/loop/standalone/content/img/gum-opera.svg rename : browser/components/loop/standalone/content/img/gum-others.svg => browser/extensions/loop/standalone/content/img/gum-others.svg rename : browser/components/loop/standalone/content/img/hello-logo-text.svg => browser/extensions/loop/standalone/content/img/hello-logo-text.svg rename : browser/components/loop/standalone/content/img/logo.png => browser/extensions/loop/standalone/content/img/logo.png rename : browser/components/loop/standalone/content/img/mozilla-logo.svg => browser/extensions/loop/standalone/content/img/mozilla-logo.svg rename : browser/components/loop/standalone/content/index.html => browser/extensions/loop/standalone/content/index.html rename : browser/components/loop/standalone/content/js/standaloneAppStore.js => browser/extensions/loop/standalone/content/js/standaloneAppStore.js rename : browser/components/loop/standalone/content/js/standaloneMetricsStore.js => browser/extensions/loop/standalone/content/js/standaloneMetricsStore.js rename : browser/components/loop/standalone/content/js/standaloneMozLoop.js => browser/extensions/loop/standalone/content/js/standaloneMozLoop.js rename : browser/components/loop/standalone/content/js/standaloneRoomViews.js => browser/extensions/loop/standalone/content/js/standaloneRoomViews.js rename : browser/components/loop/standalone/content/js/standaloneRoomViews.jsx => browser/extensions/loop/standalone/content/js/standaloneRoomViews.jsx rename : browser/components/loop/standalone/content/js/webapp.js => browser/extensions/loop/standalone/content/js/webapp.js rename : browser/components/loop/standalone/content/js/webapp.jsx => browser/extensions/loop/standalone/content/js/webapp.jsx rename : browser/components/loop/standalone/content/l10n/en-US/loop.properties => browser/extensions/loop/standalone/content/l10n/en-US/loop.properties rename : browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js => browser/extensions/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js rename : browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt => browser/extensions/loop/standalone/content/libs/l10n-gaia-upstream.txt rename : browser/components/loop/standalone/content/robots.txt => browser/extensions/loop/standalone/content/robots.txt rename : browser/components/loop/standalone/content/webappEntryPoint.js => browser/extensions/loop/standalone/content/webappEntryPoint.js rename : browser/components/loop/standalone/package.json => browser/extensions/loop/standalone/package.json rename : browser/components/loop/standalone/server.js => browser/extensions/loop/standalone/server.js rename : browser/components/loop/standalone/webpack.config.js => browser/extensions/loop/standalone/webpack.config.js rename : browser/components/loop/test/.eslintrc => browser/extensions/loop/test/.eslintrc rename : browser/components/loop/test/coverage/index.html => browser/extensions/loop/test/coverage/index.html rename : browser/components/loop/test/desktop-local/.eslintrc => browser/extensions/loop/test/desktop-local/.eslintrc rename : browser/components/loop/test/desktop-local/README.md => browser/extensions/loop/test/desktop-local/README.md rename : browser/components/loop/test/desktop-local/conversationAppStore_test.js => browser/extensions/loop/test/desktop-local/conversationAppStore_test.js rename : browser/components/loop/test/desktop-local/conversation_test.js => browser/extensions/loop/test/desktop-local/conversation_test.js rename : browser/components/loop/test/desktop-local/feedbackViews_test.js => browser/extensions/loop/test/desktop-local/feedbackViews_test.js rename : browser/components/loop/test/desktop-local/index.html => browser/extensions/loop/test/desktop-local/index.html rename : browser/components/loop/test/desktop-local/l10n_test.js => browser/extensions/loop/test/desktop-local/l10n_test.js rename : browser/components/loop/test/desktop-local/panel_test.js => browser/extensions/loop/test/desktop-local/panel_test.js rename : browser/components/loop/test/desktop-local/roomStore_test.js => browser/extensions/loop/test/desktop-local/roomStore_test.js rename : browser/components/loop/test/desktop-local/roomViews_test.js => browser/extensions/loop/test/desktop-local/roomViews_test.js rename : browser/components/loop/test/desktop-local/test_desktop_all.py => browser/extensions/loop/test/desktop-local/test_desktop_all.py rename : browser/components/loop/test/functional/config.py => browser/extensions/loop/test/functional/config.py rename : browser/components/loop/test/functional/hanging_threads.py => browser/extensions/loop/test/functional/hanging_threads.py rename : browser/components/loop/test/functional/manifest.ini => browser/extensions/loop/test/functional/manifest.ini rename : browser/components/loop/test/functional/serversetup.py => browser/extensions/loop/test/functional/serversetup.py rename : browser/components/loop/test/functional/test_1_browser_call.py => browser/extensions/loop/test/functional/test_1_browser_call.py rename : browser/components/loop/test/index.html => browser/extensions/loop/test/index.html rename : browser/components/loop/test/karma/head.js => browser/extensions/loop/test/karma/head.js rename : browser/components/loop/test/karma/karma.conf.base.js => browser/extensions/loop/test/karma/karma.conf.base.js rename : browser/components/loop/test/karma/karma.coverage.desktop.js => browser/extensions/loop/test/karma/karma.coverage.desktop.js rename : browser/components/loop/test/karma/karma.coverage.shared_standalone.js => browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js rename : browser/components/loop/test/mochitest/.eslintrc => browser/extensions/loop/test/mochitest/.eslintrc rename : browser/components/loop/test/mochitest/browser.ini => browser/extensions/loop/test/mochitest/browser.ini rename : browser/components/loop/test/mochitest/browser_LoopRooms_channel.js => browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js rename : browser/components/loop/test/mochitest/browser_fxa_login.js => browser/extensions/loop/test/mochitest/browser_fxa_login.js rename : browser/components/loop/test/mochitest/browser_loop_fxa_server.js => browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js rename : browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js => browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js rename : browser/components/loop/test/mochitest/browser_mozLoop_chat.js => browser/extensions/loop/test/mochitest/browser_mozLoop_chat.js rename : browser/components/loop/test/mochitest/browser_mozLoop_context.js => browser/extensions/loop/test/mochitest/browser_mozLoop_context.js rename : browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js => browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js rename : browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js => browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js rename : browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js => browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js rename : browser/components/loop/test/mochitest/browser_toolbarbutton.js => browser/extensions/loop/test/mochitest/browser_toolbarbutton.js rename : browser/components/loop/test/mochitest/head.js => browser/extensions/loop/test/mochitest/head.js rename : browser/components/loop/test/mochitest/loop_fxa.sjs => browser/extensions/loop/test/mochitest/loop_fxa.sjs rename : browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html => browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html rename : browser/components/loop/test/package.json => browser/extensions/loop/test/package.json rename : browser/components/loop/test/shared/activeRoomStore_test.js => browser/extensions/loop/test/shared/activeRoomStore_test.js rename : browser/components/loop/test/shared/crypto_test.js => browser/extensions/loop/test/shared/crypto_test.js rename : browser/components/loop/test/shared/dispatcher_test.js => browser/extensions/loop/test/shared/dispatcher_test.js rename : browser/components/loop/test/shared/frontend_tester.py => browser/extensions/loop/test/shared/frontend_tester.py rename : browser/components/loop/test/shared/index.html => browser/extensions/loop/test/shared/index.html rename : browser/components/loop/test/shared/linkifiedTextView_test.js => browser/extensions/loop/test/shared/linkifiedTextView_test.js rename : browser/components/loop/test/shared/loop_mocha_utils.js => browser/extensions/loop/test/shared/loop_mocha_utils.js rename : browser/components/loop/test/shared/loopapi-client_test.js => browser/extensions/loop/test/shared/loopapi-client_test.js rename : browser/components/loop/test/shared/mixins_test.js => browser/extensions/loop/test/shared/mixins_test.js rename : browser/components/loop/test/shared/models_test.js => browser/extensions/loop/test/shared/models_test.js rename : browser/components/loop/test/shared/otSdkDriver_test.js => browser/extensions/loop/test/shared/otSdkDriver_test.js rename : browser/components/loop/test/shared/sdk_mock.js => browser/extensions/loop/test/shared/sdk_mock.js rename : browser/components/loop/test/shared/store_test.js => browser/extensions/loop/test/shared/store_test.js rename : browser/components/loop/test/shared/test_shared_all.py => browser/extensions/loop/test/shared/test_shared_all.py rename : browser/components/loop/test/shared/textChatStore_test.js => browser/extensions/loop/test/shared/textChatStore_test.js rename : browser/components/loop/test/shared/textChatView_test.js => browser/extensions/loop/test/shared/textChatView_test.js rename : browser/components/loop/test/shared/utils_test.js => browser/extensions/loop/test/shared/utils_test.js rename : browser/components/loop/test/shared/validate_test.js => browser/extensions/loop/test/shared/validate_test.js rename : browser/components/loop/test/shared/vendor/chai-3.0.0.js => browser/extensions/loop/test/shared/vendor/chai-3.0.0.js rename : browser/components/loop/test/shared/vendor/chai-as-promised-5.1.0.js => browser/extensions/loop/test/shared/vendor/chai-as-promised-5.1.0.js rename : browser/components/loop/test/shared/vendor/mocha-2.2.5.css => browser/extensions/loop/test/shared/vendor/mocha-2.2.5.css rename : browser/components/loop/test/shared/vendor/mocha-2.2.5.js => browser/extensions/loop/test/shared/vendor/mocha-2.2.5.js rename : browser/components/loop/test/shared/vendor/sinon-1.16.1.js => browser/extensions/loop/test/shared/vendor/sinon-1.16.1.js rename : browser/components/loop/test/shared/views_test.js => browser/extensions/loop/test/shared/views_test.js rename : browser/components/loop/test/standalone/index.html => browser/extensions/loop/test/standalone/index.html rename : browser/components/loop/test/standalone/standaloneAppStore_test.js => browser/extensions/loop/test/standalone/standaloneAppStore_test.js rename : browser/components/loop/test/standalone/standaloneMetricsStore_test.js => browser/extensions/loop/test/standalone/standaloneMetricsStore_test.js rename : browser/components/loop/test/standalone/standaloneMozLoop_test.js => browser/extensions/loop/test/standalone/standaloneMozLoop_test.js rename : browser/components/loop/test/standalone/standaloneRoomViews_test.js => browser/extensions/loop/test/standalone/standaloneRoomViews_test.js rename : browser/components/loop/test/standalone/test_standalone_all.py => browser/extensions/loop/test/standalone/test_standalone_all.py rename : browser/components/loop/test/standalone/webapp_test.js => browser/extensions/loop/test/standalone/webapp_test.js rename : browser/components/loop/test/ui-showcase/test_ui-showcase.py => browser/extensions/loop/test/ui-showcase/test_ui-showcase.py rename : browser/components/loop/test/visual-regression/README.md => browser/extensions/loop/test/visual-regression/README.md rename : browser/components/loop/test/visual-regression/screenshot => browser/extensions/loop/test/visual-regression/screenshot rename : browser/components/loop/test/xpcshell/.eslintrc => browser/extensions/loop/test/xpcshell/.eslintrc rename : browser/components/loop/test/xpcshell/head.js => browser/extensions/loop/test/xpcshell/head.js rename : browser/components/loop/test/xpcshell/test_loopapi_doNotDisturb.js => browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js rename : browser/components/loop/test/xpcshell/test_loopapi_internal.js => browser/extensions/loop/test/xpcshell/test_loopapi_internal.js rename : browser/components/loop/test/xpcshell/test_loopapi_prefs.js => browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js rename : browser/components/loop/test/xpcshell/test_looppush_initialize.js => browser/extensions/loop/test/xpcshell/test_looppush_initialize.js rename : browser/components/loop/test/xpcshell/test_looprooms.js => browser/extensions/loop/test/xpcshell/test_looprooms.js rename : browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js => browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js rename : browser/components/loop/test/xpcshell/test_looprooms_first_notification.js => browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js rename : browser/components/loop/test/xpcshell/test_looprooms_getall.js => browser/extensions/loop/test/xpcshell/test_looprooms_getall.js rename : browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js => browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js rename : browser/components/loop/test/xpcshell/test_loopservice_dnd.js => browser/extensions/loop/test/xpcshell/test_loopservice_dnd.js rename : browser/components/loop/test/xpcshell/test_loopservice_encryptionkey.js => browser/extensions/loop/test/xpcshell/test_loopservice_encryptionkey.js rename : browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js => browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js rename : browser/components/loop/test/xpcshell/test_loopservice_hawk_request.js => browser/extensions/loop/test/xpcshell/test_loopservice_hawk_request.js rename : browser/components/loop/test/xpcshell/test_loopservice_initialize.js => browser/extensions/loop/test/xpcshell/test_loopservice_initialize.js rename : browser/components/loop/test/xpcshell/test_loopservice_locales.js => browser/extensions/loop/test/xpcshell/test_loopservice_locales.js rename : browser/components/loop/test/xpcshell/test_loopservice_loop_prefs.js => browser/extensions/loop/test/xpcshell/test_loopservice_loop_prefs.js rename : browser/components/loop/test/xpcshell/test_loopservice_registration.js => browser/extensions/loop/test/xpcshell/test_loopservice_registration.js rename : browser/components/loop/test/xpcshell/test_loopservice_registration_retry.js => browser/extensions/loop/test/xpcshell/test_loopservice_registration_retry.js rename : browser/components/loop/test/xpcshell/test_loopservice_restart.js => browser/extensions/loop/test/xpcshell/test_loopservice_restart.js rename : browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js => browser/extensions/loop/test/xpcshell/test_loopservice_token_invalid.js rename : browser/components/loop/test/xpcshell/test_loopservice_token_save.js => browser/extensions/loop/test/xpcshell/test_loopservice_token_save.js rename : browser/components/loop/test/xpcshell/test_loopservice_token_send.js => browser/extensions/loop/test/xpcshell/test_loopservice_token_send.js rename : browser/components/loop/test/xpcshell/test_loopservice_token_validation.js => browser/extensions/loop/test/xpcshell/test_loopservice_token_validation.js rename : browser/components/loop/test/xpcshell/xpcshell.ini => browser/extensions/loop/test/xpcshell/xpcshell.ini rename : browser/components/loop/ui/README.md => browser/extensions/loop/ui/README.md rename : browser/components/loop/ui/fake-l10n.js => browser/extensions/loop/ui/fake-l10n.js rename : browser/components/loop/ui/fake-mozLoop.js => browser/extensions/loop/ui/fake-mozLoop.js rename : browser/components/loop/ui/index.html => browser/extensions/loop/ui/index.html rename : browser/components/loop/ui/react-frame-component.js => browser/extensions/loop/ui/react-frame-component.js rename : browser/components/loop/ui/sample-img/video-screen-local.png => browser/extensions/loop/ui/sample-img/video-screen-local.png rename : browser/components/loop/ui/sample-img/video-screen-remote.png => browser/extensions/loop/ui/sample-img/video-screen-remote.png rename : browser/components/loop/ui/sample-img/video-screen-terminal.png => browser/extensions/loop/ui/sample-img/video-screen-terminal.png rename : browser/components/loop/ui/ui-showcase.css => browser/extensions/loop/ui/ui-showcase.css rename : browser/components/loop/ui/ui-showcase.js => browser/extensions/loop/ui/ui-showcase.js rename : browser/components/loop/ui/ui-showcase.jsx => browser/extensions/loop/ui/ui-showcase.jsx --- .../{components => extensions}/loop/.eslintignore | 0 browser/{components => extensions}/loop/.eslintrc | 0 .../{components => extensions}/loop/.eslintrc-gecko | 0 browser/{components => extensions}/loop/.gitignore | 0 browser/{components => extensions}/loop/README.txt | 0 browser/{components => extensions}/loop/build-jsx | 0 .../loop/content}/modules/.eslintrc | 0 .../loop/content}/modules/LoopRooms.jsm | 0 .../loop/content}/modules/LoopRoomsCache.jsm | 0 .../loop/content}/modules/MozLoopAPI.jsm | 0 .../loop/content}/modules/MozLoopPushHandler.jsm | 0 .../loop/content}/modules/MozLoopService.jsm | 0 .../loop/content}/modules/MozLoopWorker.js | 0 .../loop/content/panels}/conversation.html | 0 .../loop/content/panels}/css/panel.css | 0 .../loop/content/panels}/js/.eslintrc | 0 .../loop/content/panels}/js/conversation.js | 0 .../loop/content/panels}/js/conversation.jsx | 0 .../loop/content/panels}/js/conversationAppStore.js | 0 .../loop/content/panels}/js/feedbackViews.js | 0 .../loop/content/panels}/js/feedbackViews.jsx | 0 .../loop/content/panels}/js/otconfig.js | 0 .../loop/content/panels}/js/panel.js | 0 .../loop/content/panels}/js/panel.jsx | 0 .../loop/content/panels}/js/roomStore.js | 0 .../loop/content/panels}/js/roomViews.js | 0 .../loop/content/panels}/js/roomViews.jsx | 0 .../loop/content/panels}/panel.html | 0 .../loop/content/panels/vendor}/l10n.js | 0 .../loop/content/shared/README.md | 0 .../loop/content/shared/css/common.css | 0 .../loop/content/shared/css/conversation.css | 0 .../loop/content/shared/css/reset.css | 0 .../loop/content/shared/img/02.png | Bin .../loop/content/shared/img/02@2x.png | Bin .../loop/content/shared/img/animated-spinner.svg | 0 .../loop/content/shared/img/audio-call-avatar.svg | 0 .../content/shared/img/audio-default-16x16@1.5x.png | Bin .../content/shared/img/audio-default-16x16@2x.png | Bin .../loop/content/shared/img}/audio-hover.svg | 0 .../loop/content/shared/img}/audio-mute-hover.svg | 0 .../loop/content/shared/img}/audio-mute.svg | 0 .../loop/content/shared/img}/audio.svg | 0 .../loop/content/shared/img/avatars.svg | 0 .../loop/content/shared/img/beta-ribbon.svg | 0 .../loop/content/shared/img}/cam_audio-no.svg | 0 .../loop/content/shared/img}/cam_audio.svg | 0 .../loop/content/shared/img}/cam_audio_h.svg | 0 .../content/shared/img/chatbubble-arrow-left.svg | 0 .../content/shared/img/chatbubble-arrow-right.svg | 0 .../loop/content/shared/img/check.svg | 0 .../loop/content/shared/img/ellipsis-v.svg | 0 .../loop/content/shared/img/empty_conversations.svg | 0 .../loop/content/shared/img/empty_search.svg | 0 .../loop/content/shared/img}/exit.svg | 0 .../loop/content/shared/img/facemute-14x14.png | Bin .../loop/content/shared/img/facemute-14x14@2x.png | Bin .../loop/content/shared/img/firefox-avatar.svg | 0 .../loop/content/shared/img/firefox-logo.png | Bin .../loop/content/shared/img}/glyph-email-16x16.svg | 0 .../content/shared/img}/glyph-facebook-16x16.svg | 0 .../loop/content/shared/img}/glyph-help-16x16.svg | 0 .../loop/content/shared/img}/glyph-link-16x16.svg | 0 .../loop/content/shared/img}/glyph-user-16x16.svg | 0 .../content/shared/img/hangup-inverse-14x14.png | Bin .../content/shared/img/hangup-inverse-14x14@2x.png | Bin .../loop/content/shared/img/happy.png | Bin .../loop/content/shared/img/hello_logo.svg | 0 .../loop/content/shared/img/helloicon.svg | 0 .../loop/content/shared/img/icon_32.png | Bin .../loop/content/shared/img/icon_64.png | Bin .../loop/content/shared/img/icons-10x10.svg | 0 .../loop/content/shared/img/icons-14x14.svg | 0 .../loop/content/shared/img/icons-16x16.svg | 0 .../content/shared/img}/media-group-left-hover.svg | 0 .../content/shared/img}/media-group-right-hover.svg | 0 .../loop/content/shared/img}/media-group.svg | 0 .../loop/content/shared/img/movistar.png | Bin .../loop/content/shared/img/movistar@2x.png | Bin .../loop/content/shared/img/mute-inverse-14x14.png | Bin .../content/shared/img/mute-inverse-14x14@2x.png | Bin .../loop/content/shared/img/pause-12x12.svg | 0 .../loop/content/shared/img/play-12x12.svg | 0 .../loop/content/shared/img/sad.png | Bin .../content/shared/img/sad_hello_icon_64x64.svg | 0 .../loop/content/shared/img}/settings-hover.svg | 0 .../loop/content/shared/img}/settings.svg | 0 .../loop/content/shared/img}/sharing-active.svg | 0 .../loop/content/shared/img}/sharing-hover.svg | 0 .../loop/content/shared/img}/sharing-pending.svg | 0 .../loop/content/shared/img}/sharing.svg | 0 .../loop/content/shared/img/spinner.png | Bin .../loop/content/shared/img/spinner.svg | 0 .../loop/content/shared/img/spinner@2x.png | Bin .../loop/content/shared/img/stop-12x12.svg | 0 .../loop/content/shared/img/telefonica.png | Bin .../loop/content/shared/img/telefonica@2x.png | Bin .../loop/content/shared/img}/video-hover.svg | 0 .../loop/content/shared/img}/video-mute-hover.svg | 0 .../loop/content/shared/img}/video-mute.svg | 0 .../loop/content/shared/img}/video.svg | 0 .../loop/content/shared/img/vivo.png | Bin .../loop/content/shared/img/vivo@2x.png | Bin .../loop/content/shared/js/actions.js | 0 .../loop/content/shared/js/activeRoomStore.js | 0 .../loop/content/shared/js/crypto.js | 0 .../loop/content/shared/js/dispatcher.js | 0 .../loop/content/shared/js/linkifiedTextView.js | 0 .../loop/content/shared/js/linkifiedTextView.jsx | 0 .../loop/content/shared/js/loopapi-client.js | 0 .../loop/content/shared/js/mixins.js | 0 .../loop/content/shared/js/models.js | 0 .../loop/content/shared/js/otSdkDriver.js | 0 .../loop/content/shared/js/store.js | 0 .../loop/content/shared/js/textChatStore.js | 0 .../loop/content/shared/js/textChatView.js | 0 .../loop/content/shared/js/textChatView.jsx | 0 .../loop/content/shared/js/urlRegExps.js | 0 .../loop/content/shared/js/utils.js | 0 .../loop/content/shared/js/validate.js | 0 .../loop/content/shared/js/views.js | 0 .../loop/content/shared/js/views.jsx | 0 .../loop/content/shared/sounds/connected.ogg | Bin .../loop/content/shared/sounds/connecting.ogg | Bin .../loop/content/shared/sounds/failure.ogg | Bin .../loop/content/shared/sounds/message.ogg | Bin .../loop/content/shared/sounds/ringtone.ogg | Bin .../loop/content/shared/sounds/room-joined-in.ogg | Bin .../loop/content/shared/sounds/room-joined.ogg | Bin .../loop/content/shared/sounds/room-left.ogg | Bin .../loop/content/shared/sounds/terminated.ogg | Bin .../loop/content/shared/vendor}/backbone-1.2.1.js | 0 .../loop/content/shared/vendor}/classnames-2.2.0.js | 0 .../loop/content/shared/vendor}/lodash-3.9.3.js | 0 .../content/shared/vendor}/react-0.13.3-prod.js | 0 .../loop/content/shared/vendor}/react-0.13.3.js | 0 .../content/shared/vendor}/sdk-content/css/ot.css | 0 .../sdk-content/images/rtc/access-denied-chrome.png | Bin .../images/rtc/access-denied-copy-firefox.png | Bin .../images/rtc/access-denied-firefox.png | Bin .../images/rtc/access-predenied-chrome.png | Bin .../sdk-content/images/rtc/access-prompt-chrome.png | Bin .../sdk-content/images/rtc/audioonly-publisher.png | Bin .../sdk-content/images/rtc/audioonly-subscriber.png | Bin .../vendor}/sdk-content/images/rtc/buttons.png | Bin .../vendor}/sdk-content/images/rtc/loader.gif | Bin .../vendor}/sdk-content/images/rtc/mic-off.png | Bin .../vendor}/sdk-content/images/rtc/mic-on.png | Bin .../vendor}/sdk-content/images/rtc/speaker-off.png | Bin .../vendor}/sdk-content/images/rtc/speaker-on.png | Bin .../vendor}/sdk-content/js/dynamic_config.min.js | 0 .../loop/content/shared/vendor}/sdk.js | 0 browser/{components => extensions}/loop/jar.mn | 0 .../{components => extensions}/loop/manifest.ini | 0 browser/{components => extensions}/loop/moz.build | 0 .../loop/run-all-loop-tests.sh | 0 .../loop/standalone/.gitignore | 0 .../loop/standalone/Makefile | 0 .../loop/standalone/README.md | 0 .../loop/standalone/content/css/webapp.css | 0 .../loop/standalone/content/favicon.ico | Bin .../loop/standalone/content/img/gum-chrome.svg | 0 .../loop/standalone/content/img/gum-firefox.svg | 0 .../loop/standalone/content/img/gum-opera.svg | 0 .../loop/standalone/content/img/gum-others.svg | 0 .../loop/standalone/content/img/hello-logo-text.svg | 0 .../loop/standalone/content/img/logo.png | Bin .../loop/standalone/content/img/mozilla-logo.svg | 0 .../loop/standalone/content/index.html | 0 .../standalone/content/js/standaloneAppStore.js | 0 .../standalone/content/js/standaloneMetricsStore.js | 0 .../loop/standalone/content/js/standaloneMozLoop.js | 0 .../standalone/content/js/standaloneRoomViews.js | 0 .../standalone/content/js/standaloneRoomViews.jsx | 0 .../loop/standalone/content/js/webapp.js | 0 .../loop/standalone/content/js/webapp.jsx | 0 .../standalone/content/l10n/en-US/loop.properties | 0 .../content/libs/l10n-gaia-02ca67948fe8.js | 0 .../standalone/content/libs/l10n-gaia-upstream.txt | 0 .../loop/standalone/content/robots.txt | 0 .../loop/standalone/content/webappEntryPoint.js | 0 .../loop/standalone/package.json | 0 .../loop/standalone/server.js | 0 .../loop/standalone/webpack.config.js | 0 .../{components => extensions}/loop/test/.eslintrc | 0 .../loop/test/coverage/index.html | 0 .../loop/test/desktop-local/.eslintrc | 0 .../loop/test/desktop-local/README.md | 0 .../test/desktop-local/conversationAppStore_test.js | 0 .../loop/test/desktop-local/conversation_test.js | 0 .../loop/test/desktop-local/feedbackViews_test.js | 0 .../loop/test/desktop-local/index.html | 0 .../loop/test/desktop-local/l10n_test.js | 0 .../loop/test/desktop-local/panel_test.js | 0 .../loop/test/desktop-local/roomStore_test.js | 0 .../loop/test/desktop-local/roomViews_test.js | 0 .../loop/test/desktop-local/test_desktop_all.py | 0 .../loop/test/functional/config.py | 0 .../loop/test/functional/hanging_threads.py | 0 .../loop/test/functional/manifest.ini | 0 .../loop/test/functional/serversetup.py | 0 .../loop/test/functional/test_1_browser_call.py | 0 .../{components => extensions}/loop/test/index.html | 0 .../loop/test/karma/head.js | 0 .../loop/test/karma/karma.conf.base.js | 0 .../loop/test/karma/karma.coverage.desktop.js | 0 .../test/karma/karma.coverage.shared_standalone.js | 0 .../loop/test/mochitest/.eslintrc | 0 .../loop/test/mochitest/browser.ini | 0 .../test/mochitest/browser_LoopRooms_channel.js | 0 .../loop/test/mochitest/browser_fxa_login.js | 0 .../loop/test/mochitest/browser_loop_fxa_server.js | 0 .../mochitest/browser_mozLoop_appVersionInfo.js | 0 .../loop/test/mochitest/browser_mozLoop_chat.js | 0 .../loop/test/mochitest/browser_mozLoop_context.js | 0 .../mochitest/browser_mozLoop_sharingListeners.js | 0 .../test/mochitest/browser_mozLoop_socialShare.js | 0 .../test/mochitest/browser_mozLoop_telemetry.js | 0 .../loop/test/mochitest/browser_toolbarbutton.js | 0 .../loop/test/mochitest/head.js | 0 .../loop/test/mochitest/loop_fxa.sjs | 0 .../mochitest/test_loopLinkClicker_channel.html | 0 .../loop/test/package.json | 0 .../loop/test/shared/activeRoomStore_test.js | 0 .../loop/test/shared/crypto_test.js | 0 .../loop/test/shared/dispatcher_test.js | 0 .../loop/test/shared/frontend_tester.py | 0 .../loop/test/shared/index.html | 0 .../loop/test/shared/linkifiedTextView_test.js | 0 .../loop/test/shared/loop_mocha_utils.js | 0 .../loop/test/shared/loopapi-client_test.js | 0 .../loop/test/shared/mixins_test.js | 0 .../loop/test/shared/models_test.js | 0 .../loop/test/shared/otSdkDriver_test.js | 0 .../loop/test/shared/sdk_mock.js | 0 .../loop/test/shared/store_test.js | 0 .../loop/test/shared/test_shared_all.py | 0 .../loop/test/shared/textChatStore_test.js | 0 .../loop/test/shared/textChatView_test.js | 0 .../loop/test/shared/utils_test.js | 0 .../loop/test/shared/validate_test.js | 0 .../loop/test/shared/vendor/chai-3.0.0.js | 0 .../test/shared/vendor/chai-as-promised-5.1.0.js | 0 .../loop/test/shared/vendor/mocha-2.2.5.css | 0 .../loop/test/shared/vendor/mocha-2.2.5.js | 0 .../loop/test/shared/vendor/sinon-1.16.1.js | 0 .../loop/test/shared/views_test.js | 0 .../loop/test/standalone/index.html | 0 .../loop/test/standalone/standaloneAppStore_test.js | 0 .../test/standalone/standaloneMetricsStore_test.js | 0 .../loop/test/standalone/standaloneMozLoop_test.js | 0 .../test/standalone/standaloneRoomViews_test.js | 0 .../loop/test/standalone/test_standalone_all.py | 0 .../loop/test/standalone/webapp_test.js | 0 .../loop/test/ui-showcase/test_ui-showcase.py | 0 .../loop/test/visual-regression/README.md | 0 .../loop/test/visual-regression/screenshot | 0 .../loop/test/xpcshell/.eslintrc | 0 .../loop/test/xpcshell/head.js | 0 .../loop/test/xpcshell/test_loopapi_doNotDisturb.js | 0 .../loop/test/xpcshell/test_loopapi_internal.js | 0 .../loop/test/xpcshell/test_loopapi_prefs.js | 0 .../loop/test/xpcshell/test_looppush_initialize.js | 0 .../loop/test/xpcshell/test_looprooms.js | 0 .../xpcshell/test_looprooms_encryption_in_fxa.js | 0 .../xpcshell/test_looprooms_first_notification.js | 0 .../loop/test/xpcshell/test_looprooms_getall.js | 0 .../test_looprooms_upgrade_to_encryption.js | 0 .../loop/test/xpcshell/test_loopservice_dnd.js | 0 .../test/xpcshell/test_loopservice_encryptionkey.js | 0 .../test/xpcshell/test_loopservice_hawk_errors.js | 0 .../test/xpcshell/test_loopservice_hawk_request.js | 0 .../test/xpcshell/test_loopservice_initialize.js | 0 .../loop/test/xpcshell/test_loopservice_locales.js | 0 .../test/xpcshell/test_loopservice_loop_prefs.js | 0 .../test/xpcshell/test_loopservice_registration.js | 0 .../xpcshell/test_loopservice_registration_retry.js | 0 .../loop/test/xpcshell/test_loopservice_restart.js | 0 .../test/xpcshell/test_loopservice_token_invalid.js | 0 .../test/xpcshell/test_loopservice_token_save.js | 0 .../test/xpcshell/test_loopservice_token_send.js | 0 .../xpcshell/test_loopservice_token_validation.js | 0 .../loop/test/xpcshell/xpcshell.ini | 0 .../{components => extensions}/loop/ui/README.md | 0 .../{components => extensions}/loop/ui/fake-l10n.js | 0 .../loop/ui/fake-mozLoop.js | 0 .../{components => extensions}/loop/ui/index.html | 0 .../loop/ui/react-frame-component.js | 0 .../loop/ui/sample-img/video-screen-local.png | Bin .../loop/ui/sample-img/video-screen-remote.png | Bin .../loop/ui/sample-img/video-screen-terminal.png | Bin .../loop/ui/ui-showcase.css | 0 .../loop/ui/ui-showcase.js | 0 .../loop/ui/ui-showcase.jsx | 0 294 files changed, 0 insertions(+), 0 deletions(-) rename browser/{components => extensions}/loop/.eslintignore (100%) rename browser/{components => extensions}/loop/.eslintrc (100%) rename browser/{components => extensions}/loop/.eslintrc-gecko (100%) rename browser/{components => extensions}/loop/.gitignore (100%) rename browser/{components => extensions}/loop/README.txt (100%) rename browser/{components => extensions}/loop/build-jsx (100%) rename browser/{components/loop => extensions/loop/content}/modules/.eslintrc (100%) rename browser/{components/loop => extensions/loop/content}/modules/LoopRooms.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/LoopRoomsCache.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/MozLoopAPI.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/MozLoopPushHandler.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/MozLoopService.jsm (100%) rename browser/{components/loop => extensions/loop/content}/modules/MozLoopWorker.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/conversation.html (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/css/panel.css (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/.eslintrc (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/conversation.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/conversation.jsx (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/conversationAppStore.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/feedbackViews.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/feedbackViews.jsx (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/otconfig.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/panel.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/panel.jsx (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/roomStore.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/roomViews.js (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/js/roomViews.jsx (100%) rename browser/{components/loop/content => extensions/loop/content/panels}/panel.html (100%) rename browser/{components/loop/content/libs => extensions/loop/content/panels/vendor}/l10n.js (100%) rename browser/{components => extensions}/loop/content/shared/README.md (100%) rename browser/{components => extensions}/loop/content/shared/css/common.css (100%) rename browser/{components => extensions}/loop/content/shared/css/conversation.css (100%) rename browser/{components => extensions}/loop/content/shared/css/reset.css (100%) rename browser/{components => extensions}/loop/content/shared/img/02.png (100%) rename browser/{components => extensions}/loop/content/shared/img/02@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/animated-spinner.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/audio-call-avatar.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/audio-default-16x16@1.5x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/audio-default-16x16@2x.png (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/audio-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/audio-mute-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/audio-mute.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/audio.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/avatars.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/beta-ribbon.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/cam_audio-no.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/cam_audio.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/cam_audio_h.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/chatbubble-arrow-left.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/chatbubble-arrow-right.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/check.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/ellipsis-v.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/empty_conversations.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/empty_search.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/exit.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/facemute-14x14.png (100%) rename browser/{components => extensions}/loop/content/shared/img/facemute-14x14@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/firefox-avatar.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/firefox-logo.png (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-email-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-facebook-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-help-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-link-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/glyph-user-16x16.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/hangup-inverse-14x14.png (100%) rename browser/{components => extensions}/loop/content/shared/img/hangup-inverse-14x14@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/happy.png (100%) rename browser/{components => extensions}/loop/content/shared/img/hello_logo.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/helloicon.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/icon_32.png (100%) rename browser/{components => extensions}/loop/content/shared/img/icon_64.png (100%) rename browser/{components => extensions}/loop/content/shared/img/icons-10x10.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/icons-14x14.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/icons-16x16.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/media-group-left-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/media-group-right-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/media-group.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/movistar.png (100%) rename browser/{components => extensions}/loop/content/shared/img/movistar@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/mute-inverse-14x14.png (100%) rename browser/{components => extensions}/loop/content/shared/img/mute-inverse-14x14@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/pause-12x12.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/play-12x12.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/sad.png (100%) rename browser/{components => extensions}/loop/content/shared/img/sad_hello_icon_64x64.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/settings-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/settings.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/sharing-active.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/sharing-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/sharing-pending.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/sharing.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/spinner.png (100%) rename browser/{components => extensions}/loop/content/shared/img/spinner.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/spinner@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/img/stop-12x12.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/telefonica.png (100%) rename browser/{components => extensions}/loop/content/shared/img/telefonica@2x.png (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/video-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/video-mute-hover.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/video-mute.svg (100%) rename browser/{components/loop/content/shared/img/svg => extensions/loop/content/shared/img}/video.svg (100%) rename browser/{components => extensions}/loop/content/shared/img/vivo.png (100%) rename browser/{components => extensions}/loop/content/shared/img/vivo@2x.png (100%) rename browser/{components => extensions}/loop/content/shared/js/actions.js (100%) rename browser/{components => extensions}/loop/content/shared/js/activeRoomStore.js (100%) rename browser/{components => extensions}/loop/content/shared/js/crypto.js (100%) rename browser/{components => extensions}/loop/content/shared/js/dispatcher.js (100%) rename browser/{components => extensions}/loop/content/shared/js/linkifiedTextView.js (100%) rename browser/{components => extensions}/loop/content/shared/js/linkifiedTextView.jsx (100%) rename browser/{components => extensions}/loop/content/shared/js/loopapi-client.js (100%) rename browser/{components => extensions}/loop/content/shared/js/mixins.js (100%) rename browser/{components => extensions}/loop/content/shared/js/models.js (100%) rename browser/{components => extensions}/loop/content/shared/js/otSdkDriver.js (100%) rename browser/{components => extensions}/loop/content/shared/js/store.js (100%) rename browser/{components => extensions}/loop/content/shared/js/textChatStore.js (100%) rename browser/{components => extensions}/loop/content/shared/js/textChatView.js (100%) rename browser/{components => extensions}/loop/content/shared/js/textChatView.jsx (100%) rename browser/{components => extensions}/loop/content/shared/js/urlRegExps.js (100%) rename browser/{components => extensions}/loop/content/shared/js/utils.js (100%) rename browser/{components => extensions}/loop/content/shared/js/validate.js (100%) rename browser/{components => extensions}/loop/content/shared/js/views.js (100%) rename browser/{components => extensions}/loop/content/shared/js/views.jsx (100%) rename browser/{components => extensions}/loop/content/shared/sounds/connected.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/connecting.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/failure.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/message.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/ringtone.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/room-joined-in.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/room-joined.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/room-left.ogg (100%) rename browser/{components => extensions}/loop/content/shared/sounds/terminated.ogg (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/backbone-1.2.1.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/classnames-2.2.0.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/lodash-3.9.3.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/react-0.13.3-prod.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/react-0.13.3.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/css/ot.css (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-denied-chrome.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-denied-copy-firefox.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-denied-firefox.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-predenied-chrome.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/access-prompt-chrome.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/audioonly-publisher.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/audioonly-subscriber.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/buttons.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/loader.gif (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/mic-off.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/mic-on.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/speaker-off.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/images/rtc/speaker-on.png (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk-content/js/dynamic_config.min.js (100%) rename browser/{components/loop/content/shared/libs => extensions/loop/content/shared/vendor}/sdk.js (100%) rename browser/{components => extensions}/loop/jar.mn (100%) rename browser/{components => extensions}/loop/manifest.ini (100%) rename browser/{components => extensions}/loop/moz.build (100%) rename browser/{components => extensions}/loop/run-all-loop-tests.sh (100%) rename browser/{components => extensions}/loop/standalone/.gitignore (100%) rename browser/{components => extensions}/loop/standalone/Makefile (100%) rename browser/{components => extensions}/loop/standalone/README.md (100%) rename browser/{components => extensions}/loop/standalone/content/css/webapp.css (100%) rename browser/{components => extensions}/loop/standalone/content/favicon.ico (100%) rename browser/{components => extensions}/loop/standalone/content/img/gum-chrome.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/gum-firefox.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/gum-opera.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/gum-others.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/hello-logo-text.svg (100%) rename browser/{components => extensions}/loop/standalone/content/img/logo.png (100%) rename browser/{components => extensions}/loop/standalone/content/img/mozilla-logo.svg (100%) rename browser/{components => extensions}/loop/standalone/content/index.html (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneAppStore.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneMetricsStore.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneMozLoop.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneRoomViews.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/standaloneRoomViews.jsx (100%) rename browser/{components => extensions}/loop/standalone/content/js/webapp.js (100%) rename browser/{components => extensions}/loop/standalone/content/js/webapp.jsx (100%) rename browser/{components => extensions}/loop/standalone/content/l10n/en-US/loop.properties (100%) rename browser/{components => extensions}/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js (100%) rename browser/{components => extensions}/loop/standalone/content/libs/l10n-gaia-upstream.txt (100%) rename browser/{components => extensions}/loop/standalone/content/robots.txt (100%) rename browser/{components => extensions}/loop/standalone/content/webappEntryPoint.js (100%) rename browser/{components => extensions}/loop/standalone/package.json (100%) rename browser/{components => extensions}/loop/standalone/server.js (100%) rename browser/{components => extensions}/loop/standalone/webpack.config.js (100%) rename browser/{components => extensions}/loop/test/.eslintrc (100%) rename browser/{components => extensions}/loop/test/coverage/index.html (100%) rename browser/{components => extensions}/loop/test/desktop-local/.eslintrc (100%) rename browser/{components => extensions}/loop/test/desktop-local/README.md (100%) rename browser/{components => extensions}/loop/test/desktop-local/conversationAppStore_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/conversation_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/feedbackViews_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/index.html (100%) rename browser/{components => extensions}/loop/test/desktop-local/l10n_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/panel_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/roomStore_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/roomViews_test.js (100%) rename browser/{components => extensions}/loop/test/desktop-local/test_desktop_all.py (100%) rename browser/{components => extensions}/loop/test/functional/config.py (100%) rename browser/{components => extensions}/loop/test/functional/hanging_threads.py (100%) rename browser/{components => extensions}/loop/test/functional/manifest.ini (100%) rename browser/{components => extensions}/loop/test/functional/serversetup.py (100%) rename browser/{components => extensions}/loop/test/functional/test_1_browser_call.py (100%) rename browser/{components => extensions}/loop/test/index.html (100%) rename browser/{components => extensions}/loop/test/karma/head.js (100%) rename browser/{components => extensions}/loop/test/karma/karma.conf.base.js (100%) rename browser/{components => extensions}/loop/test/karma/karma.coverage.desktop.js (100%) rename browser/{components => extensions}/loop/test/karma/karma.coverage.shared_standalone.js (100%) rename browser/{components => extensions}/loop/test/mochitest/.eslintrc (100%) rename browser/{components => extensions}/loop/test/mochitest/browser.ini (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_LoopRooms_channel.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_fxa_login.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_loop_fxa_server.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_appVersionInfo.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_chat.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_context.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_sharingListeners.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_socialShare.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_mozLoop_telemetry.js (100%) rename browser/{components => extensions}/loop/test/mochitest/browser_toolbarbutton.js (100%) rename browser/{components => extensions}/loop/test/mochitest/head.js (100%) rename browser/{components => extensions}/loop/test/mochitest/loop_fxa.sjs (100%) rename browser/{components => extensions}/loop/test/mochitest/test_loopLinkClicker_channel.html (100%) rename browser/{components => extensions}/loop/test/package.json (100%) rename browser/{components => extensions}/loop/test/shared/activeRoomStore_test.js (100%) rename browser/{components => extensions}/loop/test/shared/crypto_test.js (100%) rename browser/{components => extensions}/loop/test/shared/dispatcher_test.js (100%) rename browser/{components => extensions}/loop/test/shared/frontend_tester.py (100%) rename browser/{components => extensions}/loop/test/shared/index.html (100%) rename browser/{components => extensions}/loop/test/shared/linkifiedTextView_test.js (100%) rename browser/{components => extensions}/loop/test/shared/loop_mocha_utils.js (100%) rename browser/{components => extensions}/loop/test/shared/loopapi-client_test.js (100%) rename browser/{components => extensions}/loop/test/shared/mixins_test.js (100%) rename browser/{components => extensions}/loop/test/shared/models_test.js (100%) rename browser/{components => extensions}/loop/test/shared/otSdkDriver_test.js (100%) rename browser/{components => extensions}/loop/test/shared/sdk_mock.js (100%) rename browser/{components => extensions}/loop/test/shared/store_test.js (100%) rename browser/{components => extensions}/loop/test/shared/test_shared_all.py (100%) rename browser/{components => extensions}/loop/test/shared/textChatStore_test.js (100%) rename browser/{components => extensions}/loop/test/shared/textChatView_test.js (100%) rename browser/{components => extensions}/loop/test/shared/utils_test.js (100%) rename browser/{components => extensions}/loop/test/shared/validate_test.js (100%) rename browser/{components => extensions}/loop/test/shared/vendor/chai-3.0.0.js (100%) rename browser/{components => extensions}/loop/test/shared/vendor/chai-as-promised-5.1.0.js (100%) rename browser/{components => extensions}/loop/test/shared/vendor/mocha-2.2.5.css (100%) rename browser/{components => extensions}/loop/test/shared/vendor/mocha-2.2.5.js (100%) rename browser/{components => extensions}/loop/test/shared/vendor/sinon-1.16.1.js (100%) rename browser/{components => extensions}/loop/test/shared/views_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/index.html (100%) rename browser/{components => extensions}/loop/test/standalone/standaloneAppStore_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/standaloneMetricsStore_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/standaloneMozLoop_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/standaloneRoomViews_test.js (100%) rename browser/{components => extensions}/loop/test/standalone/test_standalone_all.py (100%) rename browser/{components => extensions}/loop/test/standalone/webapp_test.js (100%) rename browser/{components => extensions}/loop/test/ui-showcase/test_ui-showcase.py (100%) rename browser/{components => extensions}/loop/test/visual-regression/README.md (100%) rename browser/{components => extensions}/loop/test/visual-regression/screenshot (100%) rename browser/{components => extensions}/loop/test/xpcshell/.eslintrc (100%) rename browser/{components => extensions}/loop/test/xpcshell/head.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopapi_doNotDisturb.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopapi_internal.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopapi_prefs.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looppush_initialize.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms_first_notification.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms_getall.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_dnd.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_encryptionkey.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_hawk_errors.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_hawk_request.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_initialize.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_locales.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_loop_prefs.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_registration.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_registration_retry.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_restart.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_token_invalid.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_token_save.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_token_send.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/test_loopservice_token_validation.js (100%) rename browser/{components => extensions}/loop/test/xpcshell/xpcshell.ini (100%) rename browser/{components => extensions}/loop/ui/README.md (100%) rename browser/{components => extensions}/loop/ui/fake-l10n.js (100%) rename browser/{components => extensions}/loop/ui/fake-mozLoop.js (100%) rename browser/{components => extensions}/loop/ui/index.html (100%) rename browser/{components => extensions}/loop/ui/react-frame-component.js (100%) rename browser/{components => extensions}/loop/ui/sample-img/video-screen-local.png (100%) rename browser/{components => extensions}/loop/ui/sample-img/video-screen-remote.png (100%) rename browser/{components => extensions}/loop/ui/sample-img/video-screen-terminal.png (100%) rename browser/{components => extensions}/loop/ui/ui-showcase.css (100%) rename browser/{components => extensions}/loop/ui/ui-showcase.js (100%) rename browser/{components => extensions}/loop/ui/ui-showcase.jsx (100%) diff --git a/browser/components/loop/.eslintignore b/browser/extensions/loop/.eslintignore similarity index 100% rename from browser/components/loop/.eslintignore rename to browser/extensions/loop/.eslintignore diff --git a/browser/components/loop/.eslintrc b/browser/extensions/loop/.eslintrc similarity index 100% rename from browser/components/loop/.eslintrc rename to browser/extensions/loop/.eslintrc diff --git a/browser/components/loop/.eslintrc-gecko b/browser/extensions/loop/.eslintrc-gecko similarity index 100% rename from browser/components/loop/.eslintrc-gecko rename to browser/extensions/loop/.eslintrc-gecko diff --git a/browser/components/loop/.gitignore b/browser/extensions/loop/.gitignore similarity index 100% rename from browser/components/loop/.gitignore rename to browser/extensions/loop/.gitignore diff --git a/browser/components/loop/README.txt b/browser/extensions/loop/README.txt similarity index 100% rename from browser/components/loop/README.txt rename to browser/extensions/loop/README.txt diff --git a/browser/components/loop/build-jsx b/browser/extensions/loop/build-jsx similarity index 100% rename from browser/components/loop/build-jsx rename to browser/extensions/loop/build-jsx diff --git a/browser/components/loop/modules/.eslintrc b/browser/extensions/loop/content/modules/.eslintrc similarity index 100% rename from browser/components/loop/modules/.eslintrc rename to browser/extensions/loop/content/modules/.eslintrc diff --git a/browser/components/loop/modules/LoopRooms.jsm b/browser/extensions/loop/content/modules/LoopRooms.jsm similarity index 100% rename from browser/components/loop/modules/LoopRooms.jsm rename to browser/extensions/loop/content/modules/LoopRooms.jsm diff --git a/browser/components/loop/modules/LoopRoomsCache.jsm b/browser/extensions/loop/content/modules/LoopRoomsCache.jsm similarity index 100% rename from browser/components/loop/modules/LoopRoomsCache.jsm rename to browser/extensions/loop/content/modules/LoopRoomsCache.jsm diff --git a/browser/components/loop/modules/MozLoopAPI.jsm b/browser/extensions/loop/content/modules/MozLoopAPI.jsm similarity index 100% rename from browser/components/loop/modules/MozLoopAPI.jsm rename to browser/extensions/loop/content/modules/MozLoopAPI.jsm diff --git a/browser/components/loop/modules/MozLoopPushHandler.jsm b/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm similarity index 100% rename from browser/components/loop/modules/MozLoopPushHandler.jsm rename to browser/extensions/loop/content/modules/MozLoopPushHandler.jsm diff --git a/browser/components/loop/modules/MozLoopService.jsm b/browser/extensions/loop/content/modules/MozLoopService.jsm similarity index 100% rename from browser/components/loop/modules/MozLoopService.jsm rename to browser/extensions/loop/content/modules/MozLoopService.jsm diff --git a/browser/components/loop/modules/MozLoopWorker.js b/browser/extensions/loop/content/modules/MozLoopWorker.js similarity index 100% rename from browser/components/loop/modules/MozLoopWorker.js rename to browser/extensions/loop/content/modules/MozLoopWorker.js diff --git a/browser/components/loop/content/conversation.html b/browser/extensions/loop/content/panels/conversation.html similarity index 100% rename from browser/components/loop/content/conversation.html rename to browser/extensions/loop/content/panels/conversation.html diff --git a/browser/components/loop/content/css/panel.css b/browser/extensions/loop/content/panels/css/panel.css similarity index 100% rename from browser/components/loop/content/css/panel.css rename to browser/extensions/loop/content/panels/css/panel.css diff --git a/browser/components/loop/content/js/.eslintrc b/browser/extensions/loop/content/panels/js/.eslintrc similarity index 100% rename from browser/components/loop/content/js/.eslintrc rename to browser/extensions/loop/content/panels/js/.eslintrc diff --git a/browser/components/loop/content/js/conversation.js b/browser/extensions/loop/content/panels/js/conversation.js similarity index 100% rename from browser/components/loop/content/js/conversation.js rename to browser/extensions/loop/content/panels/js/conversation.js diff --git a/browser/components/loop/content/js/conversation.jsx b/browser/extensions/loop/content/panels/js/conversation.jsx similarity index 100% rename from browser/components/loop/content/js/conversation.jsx rename to browser/extensions/loop/content/panels/js/conversation.jsx diff --git a/browser/components/loop/content/js/conversationAppStore.js b/browser/extensions/loop/content/panels/js/conversationAppStore.js similarity index 100% rename from browser/components/loop/content/js/conversationAppStore.js rename to browser/extensions/loop/content/panels/js/conversationAppStore.js diff --git a/browser/components/loop/content/js/feedbackViews.js b/browser/extensions/loop/content/panels/js/feedbackViews.js similarity index 100% rename from browser/components/loop/content/js/feedbackViews.js rename to browser/extensions/loop/content/panels/js/feedbackViews.js diff --git a/browser/components/loop/content/js/feedbackViews.jsx b/browser/extensions/loop/content/panels/js/feedbackViews.jsx similarity index 100% rename from browser/components/loop/content/js/feedbackViews.jsx rename to browser/extensions/loop/content/panels/js/feedbackViews.jsx diff --git a/browser/components/loop/content/js/otconfig.js b/browser/extensions/loop/content/panels/js/otconfig.js similarity index 100% rename from browser/components/loop/content/js/otconfig.js rename to browser/extensions/loop/content/panels/js/otconfig.js diff --git a/browser/components/loop/content/js/panel.js b/browser/extensions/loop/content/panels/js/panel.js similarity index 100% rename from browser/components/loop/content/js/panel.js rename to browser/extensions/loop/content/panels/js/panel.js diff --git a/browser/components/loop/content/js/panel.jsx b/browser/extensions/loop/content/panels/js/panel.jsx similarity index 100% rename from browser/components/loop/content/js/panel.jsx rename to browser/extensions/loop/content/panels/js/panel.jsx diff --git a/browser/components/loop/content/js/roomStore.js b/browser/extensions/loop/content/panels/js/roomStore.js similarity index 100% rename from browser/components/loop/content/js/roomStore.js rename to browser/extensions/loop/content/panels/js/roomStore.js diff --git a/browser/components/loop/content/js/roomViews.js b/browser/extensions/loop/content/panels/js/roomViews.js similarity index 100% rename from browser/components/loop/content/js/roomViews.js rename to browser/extensions/loop/content/panels/js/roomViews.js diff --git a/browser/components/loop/content/js/roomViews.jsx b/browser/extensions/loop/content/panels/js/roomViews.jsx similarity index 100% rename from browser/components/loop/content/js/roomViews.jsx rename to browser/extensions/loop/content/panels/js/roomViews.jsx diff --git a/browser/components/loop/content/panel.html b/browser/extensions/loop/content/panels/panel.html similarity index 100% rename from browser/components/loop/content/panel.html rename to browser/extensions/loop/content/panels/panel.html diff --git a/browser/components/loop/content/libs/l10n.js b/browser/extensions/loop/content/panels/vendor/l10n.js similarity index 100% rename from browser/components/loop/content/libs/l10n.js rename to browser/extensions/loop/content/panels/vendor/l10n.js diff --git a/browser/components/loop/content/shared/README.md b/browser/extensions/loop/content/shared/README.md similarity index 100% rename from browser/components/loop/content/shared/README.md rename to browser/extensions/loop/content/shared/README.md diff --git a/browser/components/loop/content/shared/css/common.css b/browser/extensions/loop/content/shared/css/common.css similarity index 100% rename from browser/components/loop/content/shared/css/common.css rename to browser/extensions/loop/content/shared/css/common.css diff --git a/browser/components/loop/content/shared/css/conversation.css b/browser/extensions/loop/content/shared/css/conversation.css similarity index 100% rename from browser/components/loop/content/shared/css/conversation.css rename to browser/extensions/loop/content/shared/css/conversation.css diff --git a/browser/components/loop/content/shared/css/reset.css b/browser/extensions/loop/content/shared/css/reset.css similarity index 100% rename from browser/components/loop/content/shared/css/reset.css rename to browser/extensions/loop/content/shared/css/reset.css diff --git a/browser/components/loop/content/shared/img/02.png b/browser/extensions/loop/content/shared/img/02.png similarity index 100% rename from browser/components/loop/content/shared/img/02.png rename to browser/extensions/loop/content/shared/img/02.png diff --git a/browser/components/loop/content/shared/img/02@2x.png b/browser/extensions/loop/content/shared/img/02@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/02@2x.png rename to browser/extensions/loop/content/shared/img/02@2x.png diff --git a/browser/components/loop/content/shared/img/animated-spinner.svg b/browser/extensions/loop/content/shared/img/animated-spinner.svg similarity index 100% rename from browser/components/loop/content/shared/img/animated-spinner.svg rename to browser/extensions/loop/content/shared/img/animated-spinner.svg diff --git a/browser/components/loop/content/shared/img/audio-call-avatar.svg b/browser/extensions/loop/content/shared/img/audio-call-avatar.svg similarity index 100% rename from browser/components/loop/content/shared/img/audio-call-avatar.svg rename to browser/extensions/loop/content/shared/img/audio-call-avatar.svg diff --git a/browser/components/loop/content/shared/img/audio-default-16x16@1.5x.png b/browser/extensions/loop/content/shared/img/audio-default-16x16@1.5x.png similarity index 100% rename from browser/components/loop/content/shared/img/audio-default-16x16@1.5x.png rename to browser/extensions/loop/content/shared/img/audio-default-16x16@1.5x.png diff --git a/browser/components/loop/content/shared/img/audio-default-16x16@2x.png b/browser/extensions/loop/content/shared/img/audio-default-16x16@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/audio-default-16x16@2x.png rename to browser/extensions/loop/content/shared/img/audio-default-16x16@2x.png diff --git a/browser/components/loop/content/shared/img/svg/audio-hover.svg b/browser/extensions/loop/content/shared/img/audio-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/audio-hover.svg rename to browser/extensions/loop/content/shared/img/audio-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/audio-mute-hover.svg b/browser/extensions/loop/content/shared/img/audio-mute-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/audio-mute-hover.svg rename to browser/extensions/loop/content/shared/img/audio-mute-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/audio-mute.svg b/browser/extensions/loop/content/shared/img/audio-mute.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/audio-mute.svg rename to browser/extensions/loop/content/shared/img/audio-mute.svg diff --git a/browser/components/loop/content/shared/img/svg/audio.svg b/browser/extensions/loop/content/shared/img/audio.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/audio.svg rename to browser/extensions/loop/content/shared/img/audio.svg diff --git a/browser/components/loop/content/shared/img/avatars.svg b/browser/extensions/loop/content/shared/img/avatars.svg similarity index 100% rename from browser/components/loop/content/shared/img/avatars.svg rename to browser/extensions/loop/content/shared/img/avatars.svg diff --git a/browser/components/loop/content/shared/img/beta-ribbon.svg b/browser/extensions/loop/content/shared/img/beta-ribbon.svg similarity index 100% rename from browser/components/loop/content/shared/img/beta-ribbon.svg rename to browser/extensions/loop/content/shared/img/beta-ribbon.svg diff --git a/browser/components/loop/content/shared/img/svg/cam_audio-no.svg b/browser/extensions/loop/content/shared/img/cam_audio-no.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/cam_audio-no.svg rename to browser/extensions/loop/content/shared/img/cam_audio-no.svg diff --git a/browser/components/loop/content/shared/img/svg/cam_audio.svg b/browser/extensions/loop/content/shared/img/cam_audio.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/cam_audio.svg rename to browser/extensions/loop/content/shared/img/cam_audio.svg diff --git a/browser/components/loop/content/shared/img/svg/cam_audio_h.svg b/browser/extensions/loop/content/shared/img/cam_audio_h.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/cam_audio_h.svg rename to browser/extensions/loop/content/shared/img/cam_audio_h.svg diff --git a/browser/components/loop/content/shared/img/chatbubble-arrow-left.svg b/browser/extensions/loop/content/shared/img/chatbubble-arrow-left.svg similarity index 100% rename from browser/components/loop/content/shared/img/chatbubble-arrow-left.svg rename to browser/extensions/loop/content/shared/img/chatbubble-arrow-left.svg diff --git a/browser/components/loop/content/shared/img/chatbubble-arrow-right.svg b/browser/extensions/loop/content/shared/img/chatbubble-arrow-right.svg similarity index 100% rename from browser/components/loop/content/shared/img/chatbubble-arrow-right.svg rename to browser/extensions/loop/content/shared/img/chatbubble-arrow-right.svg diff --git a/browser/components/loop/content/shared/img/check.svg b/browser/extensions/loop/content/shared/img/check.svg similarity index 100% rename from browser/components/loop/content/shared/img/check.svg rename to browser/extensions/loop/content/shared/img/check.svg diff --git a/browser/components/loop/content/shared/img/ellipsis-v.svg b/browser/extensions/loop/content/shared/img/ellipsis-v.svg similarity index 100% rename from browser/components/loop/content/shared/img/ellipsis-v.svg rename to browser/extensions/loop/content/shared/img/ellipsis-v.svg diff --git a/browser/components/loop/content/shared/img/empty_conversations.svg b/browser/extensions/loop/content/shared/img/empty_conversations.svg similarity index 100% rename from browser/components/loop/content/shared/img/empty_conversations.svg rename to browser/extensions/loop/content/shared/img/empty_conversations.svg diff --git a/browser/components/loop/content/shared/img/empty_search.svg b/browser/extensions/loop/content/shared/img/empty_search.svg similarity index 100% rename from browser/components/loop/content/shared/img/empty_search.svg rename to browser/extensions/loop/content/shared/img/empty_search.svg diff --git a/browser/components/loop/content/shared/img/svg/exit.svg b/browser/extensions/loop/content/shared/img/exit.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/exit.svg rename to browser/extensions/loop/content/shared/img/exit.svg diff --git a/browser/components/loop/content/shared/img/facemute-14x14.png b/browser/extensions/loop/content/shared/img/facemute-14x14.png similarity index 100% rename from browser/components/loop/content/shared/img/facemute-14x14.png rename to browser/extensions/loop/content/shared/img/facemute-14x14.png diff --git a/browser/components/loop/content/shared/img/facemute-14x14@2x.png b/browser/extensions/loop/content/shared/img/facemute-14x14@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/facemute-14x14@2x.png rename to browser/extensions/loop/content/shared/img/facemute-14x14@2x.png diff --git a/browser/components/loop/content/shared/img/firefox-avatar.svg b/browser/extensions/loop/content/shared/img/firefox-avatar.svg similarity index 100% rename from browser/components/loop/content/shared/img/firefox-avatar.svg rename to browser/extensions/loop/content/shared/img/firefox-avatar.svg diff --git a/browser/components/loop/content/shared/img/firefox-logo.png b/browser/extensions/loop/content/shared/img/firefox-logo.png similarity index 100% rename from browser/components/loop/content/shared/img/firefox-logo.png rename to browser/extensions/loop/content/shared/img/firefox-logo.png diff --git a/browser/components/loop/content/shared/img/svg/glyph-email-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-email-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-email-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-email-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/glyph-facebook-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-facebook-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-facebook-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-facebook-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/glyph-help-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-help-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-help-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-help-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/glyph-link-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-link-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-link-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-link-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/glyph-user-16x16.svg b/browser/extensions/loop/content/shared/img/glyph-user-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/glyph-user-16x16.svg rename to browser/extensions/loop/content/shared/img/glyph-user-16x16.svg diff --git a/browser/components/loop/content/shared/img/hangup-inverse-14x14.png b/browser/extensions/loop/content/shared/img/hangup-inverse-14x14.png similarity index 100% rename from browser/components/loop/content/shared/img/hangup-inverse-14x14.png rename to browser/extensions/loop/content/shared/img/hangup-inverse-14x14.png diff --git a/browser/components/loop/content/shared/img/hangup-inverse-14x14@2x.png b/browser/extensions/loop/content/shared/img/hangup-inverse-14x14@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/hangup-inverse-14x14@2x.png rename to browser/extensions/loop/content/shared/img/hangup-inverse-14x14@2x.png diff --git a/browser/components/loop/content/shared/img/happy.png b/browser/extensions/loop/content/shared/img/happy.png similarity index 100% rename from browser/components/loop/content/shared/img/happy.png rename to browser/extensions/loop/content/shared/img/happy.png diff --git a/browser/components/loop/content/shared/img/hello_logo.svg b/browser/extensions/loop/content/shared/img/hello_logo.svg similarity index 100% rename from browser/components/loop/content/shared/img/hello_logo.svg rename to browser/extensions/loop/content/shared/img/hello_logo.svg diff --git a/browser/components/loop/content/shared/img/helloicon.svg b/browser/extensions/loop/content/shared/img/helloicon.svg similarity index 100% rename from browser/components/loop/content/shared/img/helloicon.svg rename to browser/extensions/loop/content/shared/img/helloicon.svg diff --git a/browser/components/loop/content/shared/img/icon_32.png b/browser/extensions/loop/content/shared/img/icon_32.png similarity index 100% rename from browser/components/loop/content/shared/img/icon_32.png rename to browser/extensions/loop/content/shared/img/icon_32.png diff --git a/browser/components/loop/content/shared/img/icon_64.png b/browser/extensions/loop/content/shared/img/icon_64.png similarity index 100% rename from browser/components/loop/content/shared/img/icon_64.png rename to browser/extensions/loop/content/shared/img/icon_64.png diff --git a/browser/components/loop/content/shared/img/icons-10x10.svg b/browser/extensions/loop/content/shared/img/icons-10x10.svg similarity index 100% rename from browser/components/loop/content/shared/img/icons-10x10.svg rename to browser/extensions/loop/content/shared/img/icons-10x10.svg diff --git a/browser/components/loop/content/shared/img/icons-14x14.svg b/browser/extensions/loop/content/shared/img/icons-14x14.svg similarity index 100% rename from browser/components/loop/content/shared/img/icons-14x14.svg rename to browser/extensions/loop/content/shared/img/icons-14x14.svg diff --git a/browser/components/loop/content/shared/img/icons-16x16.svg b/browser/extensions/loop/content/shared/img/icons-16x16.svg similarity index 100% rename from browser/components/loop/content/shared/img/icons-16x16.svg rename to browser/extensions/loop/content/shared/img/icons-16x16.svg diff --git a/browser/components/loop/content/shared/img/svg/media-group-left-hover.svg b/browser/extensions/loop/content/shared/img/media-group-left-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/media-group-left-hover.svg rename to browser/extensions/loop/content/shared/img/media-group-left-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/media-group-right-hover.svg b/browser/extensions/loop/content/shared/img/media-group-right-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/media-group-right-hover.svg rename to browser/extensions/loop/content/shared/img/media-group-right-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/media-group.svg b/browser/extensions/loop/content/shared/img/media-group.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/media-group.svg rename to browser/extensions/loop/content/shared/img/media-group.svg diff --git a/browser/components/loop/content/shared/img/movistar.png b/browser/extensions/loop/content/shared/img/movistar.png similarity index 100% rename from browser/components/loop/content/shared/img/movistar.png rename to browser/extensions/loop/content/shared/img/movistar.png diff --git a/browser/components/loop/content/shared/img/movistar@2x.png b/browser/extensions/loop/content/shared/img/movistar@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/movistar@2x.png rename to browser/extensions/loop/content/shared/img/movistar@2x.png diff --git a/browser/components/loop/content/shared/img/mute-inverse-14x14.png b/browser/extensions/loop/content/shared/img/mute-inverse-14x14.png similarity index 100% rename from browser/components/loop/content/shared/img/mute-inverse-14x14.png rename to browser/extensions/loop/content/shared/img/mute-inverse-14x14.png diff --git a/browser/components/loop/content/shared/img/mute-inverse-14x14@2x.png b/browser/extensions/loop/content/shared/img/mute-inverse-14x14@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/mute-inverse-14x14@2x.png rename to browser/extensions/loop/content/shared/img/mute-inverse-14x14@2x.png diff --git a/browser/components/loop/content/shared/img/pause-12x12.svg b/browser/extensions/loop/content/shared/img/pause-12x12.svg similarity index 100% rename from browser/components/loop/content/shared/img/pause-12x12.svg rename to browser/extensions/loop/content/shared/img/pause-12x12.svg diff --git a/browser/components/loop/content/shared/img/play-12x12.svg b/browser/extensions/loop/content/shared/img/play-12x12.svg similarity index 100% rename from browser/components/loop/content/shared/img/play-12x12.svg rename to browser/extensions/loop/content/shared/img/play-12x12.svg diff --git a/browser/components/loop/content/shared/img/sad.png b/browser/extensions/loop/content/shared/img/sad.png similarity index 100% rename from browser/components/loop/content/shared/img/sad.png rename to browser/extensions/loop/content/shared/img/sad.png diff --git a/browser/components/loop/content/shared/img/sad_hello_icon_64x64.svg b/browser/extensions/loop/content/shared/img/sad_hello_icon_64x64.svg similarity index 100% rename from browser/components/loop/content/shared/img/sad_hello_icon_64x64.svg rename to browser/extensions/loop/content/shared/img/sad_hello_icon_64x64.svg diff --git a/browser/components/loop/content/shared/img/svg/settings-hover.svg b/browser/extensions/loop/content/shared/img/settings-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/settings-hover.svg rename to browser/extensions/loop/content/shared/img/settings-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/settings.svg b/browser/extensions/loop/content/shared/img/settings.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/settings.svg rename to browser/extensions/loop/content/shared/img/settings.svg diff --git a/browser/components/loop/content/shared/img/svg/sharing-active.svg b/browser/extensions/loop/content/shared/img/sharing-active.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/sharing-active.svg rename to browser/extensions/loop/content/shared/img/sharing-active.svg diff --git a/browser/components/loop/content/shared/img/svg/sharing-hover.svg b/browser/extensions/loop/content/shared/img/sharing-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/sharing-hover.svg rename to browser/extensions/loop/content/shared/img/sharing-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/sharing-pending.svg b/browser/extensions/loop/content/shared/img/sharing-pending.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/sharing-pending.svg rename to browser/extensions/loop/content/shared/img/sharing-pending.svg diff --git a/browser/components/loop/content/shared/img/svg/sharing.svg b/browser/extensions/loop/content/shared/img/sharing.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/sharing.svg rename to browser/extensions/loop/content/shared/img/sharing.svg diff --git a/browser/components/loop/content/shared/img/spinner.png b/browser/extensions/loop/content/shared/img/spinner.png similarity index 100% rename from browser/components/loop/content/shared/img/spinner.png rename to browser/extensions/loop/content/shared/img/spinner.png diff --git a/browser/components/loop/content/shared/img/spinner.svg b/browser/extensions/loop/content/shared/img/spinner.svg similarity index 100% rename from browser/components/loop/content/shared/img/spinner.svg rename to browser/extensions/loop/content/shared/img/spinner.svg diff --git a/browser/components/loop/content/shared/img/spinner@2x.png b/browser/extensions/loop/content/shared/img/spinner@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/spinner@2x.png rename to browser/extensions/loop/content/shared/img/spinner@2x.png diff --git a/browser/components/loop/content/shared/img/stop-12x12.svg b/browser/extensions/loop/content/shared/img/stop-12x12.svg similarity index 100% rename from browser/components/loop/content/shared/img/stop-12x12.svg rename to browser/extensions/loop/content/shared/img/stop-12x12.svg diff --git a/browser/components/loop/content/shared/img/telefonica.png b/browser/extensions/loop/content/shared/img/telefonica.png similarity index 100% rename from browser/components/loop/content/shared/img/telefonica.png rename to browser/extensions/loop/content/shared/img/telefonica.png diff --git a/browser/components/loop/content/shared/img/telefonica@2x.png b/browser/extensions/loop/content/shared/img/telefonica@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/telefonica@2x.png rename to browser/extensions/loop/content/shared/img/telefonica@2x.png diff --git a/browser/components/loop/content/shared/img/svg/video-hover.svg b/browser/extensions/loop/content/shared/img/video-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/video-hover.svg rename to browser/extensions/loop/content/shared/img/video-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/video-mute-hover.svg b/browser/extensions/loop/content/shared/img/video-mute-hover.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/video-mute-hover.svg rename to browser/extensions/loop/content/shared/img/video-mute-hover.svg diff --git a/browser/components/loop/content/shared/img/svg/video-mute.svg b/browser/extensions/loop/content/shared/img/video-mute.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/video-mute.svg rename to browser/extensions/loop/content/shared/img/video-mute.svg diff --git a/browser/components/loop/content/shared/img/svg/video.svg b/browser/extensions/loop/content/shared/img/video.svg similarity index 100% rename from browser/components/loop/content/shared/img/svg/video.svg rename to browser/extensions/loop/content/shared/img/video.svg diff --git a/browser/components/loop/content/shared/img/vivo.png b/browser/extensions/loop/content/shared/img/vivo.png similarity index 100% rename from browser/components/loop/content/shared/img/vivo.png rename to browser/extensions/loop/content/shared/img/vivo.png diff --git a/browser/components/loop/content/shared/img/vivo@2x.png b/browser/extensions/loop/content/shared/img/vivo@2x.png similarity index 100% rename from browser/components/loop/content/shared/img/vivo@2x.png rename to browser/extensions/loop/content/shared/img/vivo@2x.png diff --git a/browser/components/loop/content/shared/js/actions.js b/browser/extensions/loop/content/shared/js/actions.js similarity index 100% rename from browser/components/loop/content/shared/js/actions.js rename to browser/extensions/loop/content/shared/js/actions.js diff --git a/browser/components/loop/content/shared/js/activeRoomStore.js b/browser/extensions/loop/content/shared/js/activeRoomStore.js similarity index 100% rename from browser/components/loop/content/shared/js/activeRoomStore.js rename to browser/extensions/loop/content/shared/js/activeRoomStore.js diff --git a/browser/components/loop/content/shared/js/crypto.js b/browser/extensions/loop/content/shared/js/crypto.js similarity index 100% rename from browser/components/loop/content/shared/js/crypto.js rename to browser/extensions/loop/content/shared/js/crypto.js diff --git a/browser/components/loop/content/shared/js/dispatcher.js b/browser/extensions/loop/content/shared/js/dispatcher.js similarity index 100% rename from browser/components/loop/content/shared/js/dispatcher.js rename to browser/extensions/loop/content/shared/js/dispatcher.js diff --git a/browser/components/loop/content/shared/js/linkifiedTextView.js b/browser/extensions/loop/content/shared/js/linkifiedTextView.js similarity index 100% rename from browser/components/loop/content/shared/js/linkifiedTextView.js rename to browser/extensions/loop/content/shared/js/linkifiedTextView.js diff --git a/browser/components/loop/content/shared/js/linkifiedTextView.jsx b/browser/extensions/loop/content/shared/js/linkifiedTextView.jsx similarity index 100% rename from browser/components/loop/content/shared/js/linkifiedTextView.jsx rename to browser/extensions/loop/content/shared/js/linkifiedTextView.jsx diff --git a/browser/components/loop/content/shared/js/loopapi-client.js b/browser/extensions/loop/content/shared/js/loopapi-client.js similarity index 100% rename from browser/components/loop/content/shared/js/loopapi-client.js rename to browser/extensions/loop/content/shared/js/loopapi-client.js diff --git a/browser/components/loop/content/shared/js/mixins.js b/browser/extensions/loop/content/shared/js/mixins.js similarity index 100% rename from browser/components/loop/content/shared/js/mixins.js rename to browser/extensions/loop/content/shared/js/mixins.js diff --git a/browser/components/loop/content/shared/js/models.js b/browser/extensions/loop/content/shared/js/models.js similarity index 100% rename from browser/components/loop/content/shared/js/models.js rename to browser/extensions/loop/content/shared/js/models.js diff --git a/browser/components/loop/content/shared/js/otSdkDriver.js b/browser/extensions/loop/content/shared/js/otSdkDriver.js similarity index 100% rename from browser/components/loop/content/shared/js/otSdkDriver.js rename to browser/extensions/loop/content/shared/js/otSdkDriver.js diff --git a/browser/components/loop/content/shared/js/store.js b/browser/extensions/loop/content/shared/js/store.js similarity index 100% rename from browser/components/loop/content/shared/js/store.js rename to browser/extensions/loop/content/shared/js/store.js diff --git a/browser/components/loop/content/shared/js/textChatStore.js b/browser/extensions/loop/content/shared/js/textChatStore.js similarity index 100% rename from browser/components/loop/content/shared/js/textChatStore.js rename to browser/extensions/loop/content/shared/js/textChatStore.js diff --git a/browser/components/loop/content/shared/js/textChatView.js b/browser/extensions/loop/content/shared/js/textChatView.js similarity index 100% rename from browser/components/loop/content/shared/js/textChatView.js rename to browser/extensions/loop/content/shared/js/textChatView.js diff --git a/browser/components/loop/content/shared/js/textChatView.jsx b/browser/extensions/loop/content/shared/js/textChatView.jsx similarity index 100% rename from browser/components/loop/content/shared/js/textChatView.jsx rename to browser/extensions/loop/content/shared/js/textChatView.jsx diff --git a/browser/components/loop/content/shared/js/urlRegExps.js b/browser/extensions/loop/content/shared/js/urlRegExps.js similarity index 100% rename from browser/components/loop/content/shared/js/urlRegExps.js rename to browser/extensions/loop/content/shared/js/urlRegExps.js diff --git a/browser/components/loop/content/shared/js/utils.js b/browser/extensions/loop/content/shared/js/utils.js similarity index 100% rename from browser/components/loop/content/shared/js/utils.js rename to browser/extensions/loop/content/shared/js/utils.js diff --git a/browser/components/loop/content/shared/js/validate.js b/browser/extensions/loop/content/shared/js/validate.js similarity index 100% rename from browser/components/loop/content/shared/js/validate.js rename to browser/extensions/loop/content/shared/js/validate.js diff --git a/browser/components/loop/content/shared/js/views.js b/browser/extensions/loop/content/shared/js/views.js similarity index 100% rename from browser/components/loop/content/shared/js/views.js rename to browser/extensions/loop/content/shared/js/views.js diff --git a/browser/components/loop/content/shared/js/views.jsx b/browser/extensions/loop/content/shared/js/views.jsx similarity index 100% rename from browser/components/loop/content/shared/js/views.jsx rename to browser/extensions/loop/content/shared/js/views.jsx diff --git a/browser/components/loop/content/shared/sounds/connected.ogg b/browser/extensions/loop/content/shared/sounds/connected.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/connected.ogg rename to browser/extensions/loop/content/shared/sounds/connected.ogg diff --git a/browser/components/loop/content/shared/sounds/connecting.ogg b/browser/extensions/loop/content/shared/sounds/connecting.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/connecting.ogg rename to browser/extensions/loop/content/shared/sounds/connecting.ogg diff --git a/browser/components/loop/content/shared/sounds/failure.ogg b/browser/extensions/loop/content/shared/sounds/failure.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/failure.ogg rename to browser/extensions/loop/content/shared/sounds/failure.ogg diff --git a/browser/components/loop/content/shared/sounds/message.ogg b/browser/extensions/loop/content/shared/sounds/message.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/message.ogg rename to browser/extensions/loop/content/shared/sounds/message.ogg diff --git a/browser/components/loop/content/shared/sounds/ringtone.ogg b/browser/extensions/loop/content/shared/sounds/ringtone.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/ringtone.ogg rename to browser/extensions/loop/content/shared/sounds/ringtone.ogg diff --git a/browser/components/loop/content/shared/sounds/room-joined-in.ogg b/browser/extensions/loop/content/shared/sounds/room-joined-in.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/room-joined-in.ogg rename to browser/extensions/loop/content/shared/sounds/room-joined-in.ogg diff --git a/browser/components/loop/content/shared/sounds/room-joined.ogg b/browser/extensions/loop/content/shared/sounds/room-joined.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/room-joined.ogg rename to browser/extensions/loop/content/shared/sounds/room-joined.ogg diff --git a/browser/components/loop/content/shared/sounds/room-left.ogg b/browser/extensions/loop/content/shared/sounds/room-left.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/room-left.ogg rename to browser/extensions/loop/content/shared/sounds/room-left.ogg diff --git a/browser/components/loop/content/shared/sounds/terminated.ogg b/browser/extensions/loop/content/shared/sounds/terminated.ogg similarity index 100% rename from browser/components/loop/content/shared/sounds/terminated.ogg rename to browser/extensions/loop/content/shared/sounds/terminated.ogg diff --git a/browser/components/loop/content/shared/libs/backbone-1.2.1.js b/browser/extensions/loop/content/shared/vendor/backbone-1.2.1.js similarity index 100% rename from browser/components/loop/content/shared/libs/backbone-1.2.1.js rename to browser/extensions/loop/content/shared/vendor/backbone-1.2.1.js diff --git a/browser/components/loop/content/shared/libs/classnames-2.2.0.js b/browser/extensions/loop/content/shared/vendor/classnames-2.2.0.js similarity index 100% rename from browser/components/loop/content/shared/libs/classnames-2.2.0.js rename to browser/extensions/loop/content/shared/vendor/classnames-2.2.0.js diff --git a/browser/components/loop/content/shared/libs/lodash-3.9.3.js b/browser/extensions/loop/content/shared/vendor/lodash-3.9.3.js similarity index 100% rename from browser/components/loop/content/shared/libs/lodash-3.9.3.js rename to browser/extensions/loop/content/shared/vendor/lodash-3.9.3.js diff --git a/browser/components/loop/content/shared/libs/react-0.13.3-prod.js b/browser/extensions/loop/content/shared/vendor/react-0.13.3-prod.js similarity index 100% rename from browser/components/loop/content/shared/libs/react-0.13.3-prod.js rename to browser/extensions/loop/content/shared/vendor/react-0.13.3-prod.js diff --git a/browser/components/loop/content/shared/libs/react-0.13.3.js b/browser/extensions/loop/content/shared/vendor/react-0.13.3.js similarity index 100% rename from browser/components/loop/content/shared/libs/react-0.13.3.js rename to browser/extensions/loop/content/shared/vendor/react-0.13.3.js diff --git a/browser/components/loop/content/shared/libs/sdk-content/css/ot.css b/browser/extensions/loop/content/shared/vendor/sdk-content/css/ot.css similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/css/ot.css rename to browser/extensions/loop/content/shared/vendor/sdk-content/css/ot.css diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-chrome.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-chrome.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-chrome.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-chrome.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-copy-firefox.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-copy-firefox.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-copy-firefox.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-copy-firefox.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-firefox.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-firefox.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-firefox.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-denied-firefox.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-predenied-chrome.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-predenied-chrome.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-predenied-chrome.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-predenied-chrome.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-prompt-chrome.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-prompt-chrome.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-prompt-chrome.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/access-prompt-chrome.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-publisher.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-publisher.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-publisher.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-publisher.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-subscriber.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-subscriber.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-subscriber.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/audioonly-subscriber.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/buttons.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/buttons.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/buttons.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/buttons.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/loader.gif b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/loader.gif similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/loader.gif rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/loader.gif diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-off.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-off.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-off.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-off.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-on.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-on.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-on.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/mic-on.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-off.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-off.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-off.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-off.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-on.png b/browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-on.png similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-on.png rename to browser/extensions/loop/content/shared/vendor/sdk-content/images/rtc/speaker-on.png diff --git a/browser/components/loop/content/shared/libs/sdk-content/js/dynamic_config.min.js b/browser/extensions/loop/content/shared/vendor/sdk-content/js/dynamic_config.min.js similarity index 100% rename from browser/components/loop/content/shared/libs/sdk-content/js/dynamic_config.min.js rename to browser/extensions/loop/content/shared/vendor/sdk-content/js/dynamic_config.min.js diff --git a/browser/components/loop/content/shared/libs/sdk.js b/browser/extensions/loop/content/shared/vendor/sdk.js similarity index 100% rename from browser/components/loop/content/shared/libs/sdk.js rename to browser/extensions/loop/content/shared/vendor/sdk.js diff --git a/browser/components/loop/jar.mn b/browser/extensions/loop/jar.mn similarity index 100% rename from browser/components/loop/jar.mn rename to browser/extensions/loop/jar.mn diff --git a/browser/components/loop/manifest.ini b/browser/extensions/loop/manifest.ini similarity index 100% rename from browser/components/loop/manifest.ini rename to browser/extensions/loop/manifest.ini diff --git a/browser/components/loop/moz.build b/browser/extensions/loop/moz.build similarity index 100% rename from browser/components/loop/moz.build rename to browser/extensions/loop/moz.build diff --git a/browser/components/loop/run-all-loop-tests.sh b/browser/extensions/loop/run-all-loop-tests.sh similarity index 100% rename from browser/components/loop/run-all-loop-tests.sh rename to browser/extensions/loop/run-all-loop-tests.sh diff --git a/browser/components/loop/standalone/.gitignore b/browser/extensions/loop/standalone/.gitignore similarity index 100% rename from browser/components/loop/standalone/.gitignore rename to browser/extensions/loop/standalone/.gitignore diff --git a/browser/components/loop/standalone/Makefile b/browser/extensions/loop/standalone/Makefile similarity index 100% rename from browser/components/loop/standalone/Makefile rename to browser/extensions/loop/standalone/Makefile diff --git a/browser/components/loop/standalone/README.md b/browser/extensions/loop/standalone/README.md similarity index 100% rename from browser/components/loop/standalone/README.md rename to browser/extensions/loop/standalone/README.md diff --git a/browser/components/loop/standalone/content/css/webapp.css b/browser/extensions/loop/standalone/content/css/webapp.css similarity index 100% rename from browser/components/loop/standalone/content/css/webapp.css rename to browser/extensions/loop/standalone/content/css/webapp.css diff --git a/browser/components/loop/standalone/content/favicon.ico b/browser/extensions/loop/standalone/content/favicon.ico similarity index 100% rename from browser/components/loop/standalone/content/favicon.ico rename to browser/extensions/loop/standalone/content/favicon.ico diff --git a/browser/components/loop/standalone/content/img/gum-chrome.svg b/browser/extensions/loop/standalone/content/img/gum-chrome.svg similarity index 100% rename from browser/components/loop/standalone/content/img/gum-chrome.svg rename to browser/extensions/loop/standalone/content/img/gum-chrome.svg diff --git a/browser/components/loop/standalone/content/img/gum-firefox.svg b/browser/extensions/loop/standalone/content/img/gum-firefox.svg similarity index 100% rename from browser/components/loop/standalone/content/img/gum-firefox.svg rename to browser/extensions/loop/standalone/content/img/gum-firefox.svg diff --git a/browser/components/loop/standalone/content/img/gum-opera.svg b/browser/extensions/loop/standalone/content/img/gum-opera.svg similarity index 100% rename from browser/components/loop/standalone/content/img/gum-opera.svg rename to browser/extensions/loop/standalone/content/img/gum-opera.svg diff --git a/browser/components/loop/standalone/content/img/gum-others.svg b/browser/extensions/loop/standalone/content/img/gum-others.svg similarity index 100% rename from browser/components/loop/standalone/content/img/gum-others.svg rename to browser/extensions/loop/standalone/content/img/gum-others.svg diff --git a/browser/components/loop/standalone/content/img/hello-logo-text.svg b/browser/extensions/loop/standalone/content/img/hello-logo-text.svg similarity index 100% rename from browser/components/loop/standalone/content/img/hello-logo-text.svg rename to browser/extensions/loop/standalone/content/img/hello-logo-text.svg diff --git a/browser/components/loop/standalone/content/img/logo.png b/browser/extensions/loop/standalone/content/img/logo.png similarity index 100% rename from browser/components/loop/standalone/content/img/logo.png rename to browser/extensions/loop/standalone/content/img/logo.png diff --git a/browser/components/loop/standalone/content/img/mozilla-logo.svg b/browser/extensions/loop/standalone/content/img/mozilla-logo.svg similarity index 100% rename from browser/components/loop/standalone/content/img/mozilla-logo.svg rename to browser/extensions/loop/standalone/content/img/mozilla-logo.svg diff --git a/browser/components/loop/standalone/content/index.html b/browser/extensions/loop/standalone/content/index.html similarity index 100% rename from browser/components/loop/standalone/content/index.html rename to browser/extensions/loop/standalone/content/index.html diff --git a/browser/components/loop/standalone/content/js/standaloneAppStore.js b/browser/extensions/loop/standalone/content/js/standaloneAppStore.js similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneAppStore.js rename to browser/extensions/loop/standalone/content/js/standaloneAppStore.js diff --git a/browser/components/loop/standalone/content/js/standaloneMetricsStore.js b/browser/extensions/loop/standalone/content/js/standaloneMetricsStore.js similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneMetricsStore.js rename to browser/extensions/loop/standalone/content/js/standaloneMetricsStore.js diff --git a/browser/components/loop/standalone/content/js/standaloneMozLoop.js b/browser/extensions/loop/standalone/content/js/standaloneMozLoop.js similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneMozLoop.js rename to browser/extensions/loop/standalone/content/js/standaloneMozLoop.js diff --git a/browser/components/loop/standalone/content/js/standaloneRoomViews.js b/browser/extensions/loop/standalone/content/js/standaloneRoomViews.js similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneRoomViews.js rename to browser/extensions/loop/standalone/content/js/standaloneRoomViews.js diff --git a/browser/components/loop/standalone/content/js/standaloneRoomViews.jsx b/browser/extensions/loop/standalone/content/js/standaloneRoomViews.jsx similarity index 100% rename from browser/components/loop/standalone/content/js/standaloneRoomViews.jsx rename to browser/extensions/loop/standalone/content/js/standaloneRoomViews.jsx diff --git a/browser/components/loop/standalone/content/js/webapp.js b/browser/extensions/loop/standalone/content/js/webapp.js similarity index 100% rename from browser/components/loop/standalone/content/js/webapp.js rename to browser/extensions/loop/standalone/content/js/webapp.js diff --git a/browser/components/loop/standalone/content/js/webapp.jsx b/browser/extensions/loop/standalone/content/js/webapp.jsx similarity index 100% rename from browser/components/loop/standalone/content/js/webapp.jsx rename to browser/extensions/loop/standalone/content/js/webapp.jsx diff --git a/browser/components/loop/standalone/content/l10n/en-US/loop.properties b/browser/extensions/loop/standalone/content/l10n/en-US/loop.properties similarity index 100% rename from browser/components/loop/standalone/content/l10n/en-US/loop.properties rename to browser/extensions/loop/standalone/content/l10n/en-US/loop.properties diff --git a/browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js b/browser/extensions/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js similarity index 100% rename from browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js rename to browser/extensions/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js diff --git a/browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt b/browser/extensions/loop/standalone/content/libs/l10n-gaia-upstream.txt similarity index 100% rename from browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt rename to browser/extensions/loop/standalone/content/libs/l10n-gaia-upstream.txt diff --git a/browser/components/loop/standalone/content/robots.txt b/browser/extensions/loop/standalone/content/robots.txt similarity index 100% rename from browser/components/loop/standalone/content/robots.txt rename to browser/extensions/loop/standalone/content/robots.txt diff --git a/browser/components/loop/standalone/content/webappEntryPoint.js b/browser/extensions/loop/standalone/content/webappEntryPoint.js similarity index 100% rename from browser/components/loop/standalone/content/webappEntryPoint.js rename to browser/extensions/loop/standalone/content/webappEntryPoint.js diff --git a/browser/components/loop/standalone/package.json b/browser/extensions/loop/standalone/package.json similarity index 100% rename from browser/components/loop/standalone/package.json rename to browser/extensions/loop/standalone/package.json diff --git a/browser/components/loop/standalone/server.js b/browser/extensions/loop/standalone/server.js similarity index 100% rename from browser/components/loop/standalone/server.js rename to browser/extensions/loop/standalone/server.js diff --git a/browser/components/loop/standalone/webpack.config.js b/browser/extensions/loop/standalone/webpack.config.js similarity index 100% rename from browser/components/loop/standalone/webpack.config.js rename to browser/extensions/loop/standalone/webpack.config.js diff --git a/browser/components/loop/test/.eslintrc b/browser/extensions/loop/test/.eslintrc similarity index 100% rename from browser/components/loop/test/.eslintrc rename to browser/extensions/loop/test/.eslintrc diff --git a/browser/components/loop/test/coverage/index.html b/browser/extensions/loop/test/coverage/index.html similarity index 100% rename from browser/components/loop/test/coverage/index.html rename to browser/extensions/loop/test/coverage/index.html diff --git a/browser/components/loop/test/desktop-local/.eslintrc b/browser/extensions/loop/test/desktop-local/.eslintrc similarity index 100% rename from browser/components/loop/test/desktop-local/.eslintrc rename to browser/extensions/loop/test/desktop-local/.eslintrc diff --git a/browser/components/loop/test/desktop-local/README.md b/browser/extensions/loop/test/desktop-local/README.md similarity index 100% rename from browser/components/loop/test/desktop-local/README.md rename to browser/extensions/loop/test/desktop-local/README.md diff --git a/browser/components/loop/test/desktop-local/conversationAppStore_test.js b/browser/extensions/loop/test/desktop-local/conversationAppStore_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/conversationAppStore_test.js rename to browser/extensions/loop/test/desktop-local/conversationAppStore_test.js diff --git a/browser/components/loop/test/desktop-local/conversation_test.js b/browser/extensions/loop/test/desktop-local/conversation_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/conversation_test.js rename to browser/extensions/loop/test/desktop-local/conversation_test.js diff --git a/browser/components/loop/test/desktop-local/feedbackViews_test.js b/browser/extensions/loop/test/desktop-local/feedbackViews_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/feedbackViews_test.js rename to browser/extensions/loop/test/desktop-local/feedbackViews_test.js diff --git a/browser/components/loop/test/desktop-local/index.html b/browser/extensions/loop/test/desktop-local/index.html similarity index 100% rename from browser/components/loop/test/desktop-local/index.html rename to browser/extensions/loop/test/desktop-local/index.html diff --git a/browser/components/loop/test/desktop-local/l10n_test.js b/browser/extensions/loop/test/desktop-local/l10n_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/l10n_test.js rename to browser/extensions/loop/test/desktop-local/l10n_test.js diff --git a/browser/components/loop/test/desktop-local/panel_test.js b/browser/extensions/loop/test/desktop-local/panel_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/panel_test.js rename to browser/extensions/loop/test/desktop-local/panel_test.js diff --git a/browser/components/loop/test/desktop-local/roomStore_test.js b/browser/extensions/loop/test/desktop-local/roomStore_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/roomStore_test.js rename to browser/extensions/loop/test/desktop-local/roomStore_test.js diff --git a/browser/components/loop/test/desktop-local/roomViews_test.js b/browser/extensions/loop/test/desktop-local/roomViews_test.js similarity index 100% rename from browser/components/loop/test/desktop-local/roomViews_test.js rename to browser/extensions/loop/test/desktop-local/roomViews_test.js diff --git a/browser/components/loop/test/desktop-local/test_desktop_all.py b/browser/extensions/loop/test/desktop-local/test_desktop_all.py similarity index 100% rename from browser/components/loop/test/desktop-local/test_desktop_all.py rename to browser/extensions/loop/test/desktop-local/test_desktop_all.py diff --git a/browser/components/loop/test/functional/config.py b/browser/extensions/loop/test/functional/config.py similarity index 100% rename from browser/components/loop/test/functional/config.py rename to browser/extensions/loop/test/functional/config.py diff --git a/browser/components/loop/test/functional/hanging_threads.py b/browser/extensions/loop/test/functional/hanging_threads.py similarity index 100% rename from browser/components/loop/test/functional/hanging_threads.py rename to browser/extensions/loop/test/functional/hanging_threads.py diff --git a/browser/components/loop/test/functional/manifest.ini b/browser/extensions/loop/test/functional/manifest.ini similarity index 100% rename from browser/components/loop/test/functional/manifest.ini rename to browser/extensions/loop/test/functional/manifest.ini diff --git a/browser/components/loop/test/functional/serversetup.py b/browser/extensions/loop/test/functional/serversetup.py similarity index 100% rename from browser/components/loop/test/functional/serversetup.py rename to browser/extensions/loop/test/functional/serversetup.py diff --git a/browser/components/loop/test/functional/test_1_browser_call.py b/browser/extensions/loop/test/functional/test_1_browser_call.py similarity index 100% rename from browser/components/loop/test/functional/test_1_browser_call.py rename to browser/extensions/loop/test/functional/test_1_browser_call.py diff --git a/browser/components/loop/test/index.html b/browser/extensions/loop/test/index.html similarity index 100% rename from browser/components/loop/test/index.html rename to browser/extensions/loop/test/index.html diff --git a/browser/components/loop/test/karma/head.js b/browser/extensions/loop/test/karma/head.js similarity index 100% rename from browser/components/loop/test/karma/head.js rename to browser/extensions/loop/test/karma/head.js diff --git a/browser/components/loop/test/karma/karma.conf.base.js b/browser/extensions/loop/test/karma/karma.conf.base.js similarity index 100% rename from browser/components/loop/test/karma/karma.conf.base.js rename to browser/extensions/loop/test/karma/karma.conf.base.js diff --git a/browser/components/loop/test/karma/karma.coverage.desktop.js b/browser/extensions/loop/test/karma/karma.coverage.desktop.js similarity index 100% rename from browser/components/loop/test/karma/karma.coverage.desktop.js rename to browser/extensions/loop/test/karma/karma.coverage.desktop.js diff --git a/browser/components/loop/test/karma/karma.coverage.shared_standalone.js b/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js similarity index 100% rename from browser/components/loop/test/karma/karma.coverage.shared_standalone.js rename to browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js diff --git a/browser/components/loop/test/mochitest/.eslintrc b/browser/extensions/loop/test/mochitest/.eslintrc similarity index 100% rename from browser/components/loop/test/mochitest/.eslintrc rename to browser/extensions/loop/test/mochitest/.eslintrc diff --git a/browser/components/loop/test/mochitest/browser.ini b/browser/extensions/loop/test/mochitest/browser.ini similarity index 100% rename from browser/components/loop/test/mochitest/browser.ini rename to browser/extensions/loop/test/mochitest/browser.ini diff --git a/browser/components/loop/test/mochitest/browser_LoopRooms_channel.js b/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_LoopRooms_channel.js rename to browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js diff --git a/browser/components/loop/test/mochitest/browser_fxa_login.js b/browser/extensions/loop/test/mochitest/browser_fxa_login.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_fxa_login.js rename to browser/extensions/loop/test/mochitest/browser_fxa_login.js diff --git a/browser/components/loop/test/mochitest/browser_loop_fxa_server.js b/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_loop_fxa_server.js rename to browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_chat.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_chat.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_chat.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_chat.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_context.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_context.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_context.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js rename to browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js diff --git a/browser/components/loop/test/mochitest/browser_toolbarbutton.js b/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js similarity index 100% rename from browser/components/loop/test/mochitest/browser_toolbarbutton.js rename to browser/extensions/loop/test/mochitest/browser_toolbarbutton.js diff --git a/browser/components/loop/test/mochitest/head.js b/browser/extensions/loop/test/mochitest/head.js similarity index 100% rename from browser/components/loop/test/mochitest/head.js rename to browser/extensions/loop/test/mochitest/head.js diff --git a/browser/components/loop/test/mochitest/loop_fxa.sjs b/browser/extensions/loop/test/mochitest/loop_fxa.sjs similarity index 100% rename from browser/components/loop/test/mochitest/loop_fxa.sjs rename to browser/extensions/loop/test/mochitest/loop_fxa.sjs diff --git a/browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html b/browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html similarity index 100% rename from browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html rename to browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html diff --git a/browser/components/loop/test/package.json b/browser/extensions/loop/test/package.json similarity index 100% rename from browser/components/loop/test/package.json rename to browser/extensions/loop/test/package.json diff --git a/browser/components/loop/test/shared/activeRoomStore_test.js b/browser/extensions/loop/test/shared/activeRoomStore_test.js similarity index 100% rename from browser/components/loop/test/shared/activeRoomStore_test.js rename to browser/extensions/loop/test/shared/activeRoomStore_test.js diff --git a/browser/components/loop/test/shared/crypto_test.js b/browser/extensions/loop/test/shared/crypto_test.js similarity index 100% rename from browser/components/loop/test/shared/crypto_test.js rename to browser/extensions/loop/test/shared/crypto_test.js diff --git a/browser/components/loop/test/shared/dispatcher_test.js b/browser/extensions/loop/test/shared/dispatcher_test.js similarity index 100% rename from browser/components/loop/test/shared/dispatcher_test.js rename to browser/extensions/loop/test/shared/dispatcher_test.js diff --git a/browser/components/loop/test/shared/frontend_tester.py b/browser/extensions/loop/test/shared/frontend_tester.py similarity index 100% rename from browser/components/loop/test/shared/frontend_tester.py rename to browser/extensions/loop/test/shared/frontend_tester.py diff --git a/browser/components/loop/test/shared/index.html b/browser/extensions/loop/test/shared/index.html similarity index 100% rename from browser/components/loop/test/shared/index.html rename to browser/extensions/loop/test/shared/index.html diff --git a/browser/components/loop/test/shared/linkifiedTextView_test.js b/browser/extensions/loop/test/shared/linkifiedTextView_test.js similarity index 100% rename from browser/components/loop/test/shared/linkifiedTextView_test.js rename to browser/extensions/loop/test/shared/linkifiedTextView_test.js diff --git a/browser/components/loop/test/shared/loop_mocha_utils.js b/browser/extensions/loop/test/shared/loop_mocha_utils.js similarity index 100% rename from browser/components/loop/test/shared/loop_mocha_utils.js rename to browser/extensions/loop/test/shared/loop_mocha_utils.js diff --git a/browser/components/loop/test/shared/loopapi-client_test.js b/browser/extensions/loop/test/shared/loopapi-client_test.js similarity index 100% rename from browser/components/loop/test/shared/loopapi-client_test.js rename to browser/extensions/loop/test/shared/loopapi-client_test.js diff --git a/browser/components/loop/test/shared/mixins_test.js b/browser/extensions/loop/test/shared/mixins_test.js similarity index 100% rename from browser/components/loop/test/shared/mixins_test.js rename to browser/extensions/loop/test/shared/mixins_test.js diff --git a/browser/components/loop/test/shared/models_test.js b/browser/extensions/loop/test/shared/models_test.js similarity index 100% rename from browser/components/loop/test/shared/models_test.js rename to browser/extensions/loop/test/shared/models_test.js diff --git a/browser/components/loop/test/shared/otSdkDriver_test.js b/browser/extensions/loop/test/shared/otSdkDriver_test.js similarity index 100% rename from browser/components/loop/test/shared/otSdkDriver_test.js rename to browser/extensions/loop/test/shared/otSdkDriver_test.js diff --git a/browser/components/loop/test/shared/sdk_mock.js b/browser/extensions/loop/test/shared/sdk_mock.js similarity index 100% rename from browser/components/loop/test/shared/sdk_mock.js rename to browser/extensions/loop/test/shared/sdk_mock.js diff --git a/browser/components/loop/test/shared/store_test.js b/browser/extensions/loop/test/shared/store_test.js similarity index 100% rename from browser/components/loop/test/shared/store_test.js rename to browser/extensions/loop/test/shared/store_test.js diff --git a/browser/components/loop/test/shared/test_shared_all.py b/browser/extensions/loop/test/shared/test_shared_all.py similarity index 100% rename from browser/components/loop/test/shared/test_shared_all.py rename to browser/extensions/loop/test/shared/test_shared_all.py diff --git a/browser/components/loop/test/shared/textChatStore_test.js b/browser/extensions/loop/test/shared/textChatStore_test.js similarity index 100% rename from browser/components/loop/test/shared/textChatStore_test.js rename to browser/extensions/loop/test/shared/textChatStore_test.js diff --git a/browser/components/loop/test/shared/textChatView_test.js b/browser/extensions/loop/test/shared/textChatView_test.js similarity index 100% rename from browser/components/loop/test/shared/textChatView_test.js rename to browser/extensions/loop/test/shared/textChatView_test.js diff --git a/browser/components/loop/test/shared/utils_test.js b/browser/extensions/loop/test/shared/utils_test.js similarity index 100% rename from browser/components/loop/test/shared/utils_test.js rename to browser/extensions/loop/test/shared/utils_test.js diff --git a/browser/components/loop/test/shared/validate_test.js b/browser/extensions/loop/test/shared/validate_test.js similarity index 100% rename from browser/components/loop/test/shared/validate_test.js rename to browser/extensions/loop/test/shared/validate_test.js diff --git a/browser/components/loop/test/shared/vendor/chai-3.0.0.js b/browser/extensions/loop/test/shared/vendor/chai-3.0.0.js similarity index 100% rename from browser/components/loop/test/shared/vendor/chai-3.0.0.js rename to browser/extensions/loop/test/shared/vendor/chai-3.0.0.js diff --git a/browser/components/loop/test/shared/vendor/chai-as-promised-5.1.0.js b/browser/extensions/loop/test/shared/vendor/chai-as-promised-5.1.0.js similarity index 100% rename from browser/components/loop/test/shared/vendor/chai-as-promised-5.1.0.js rename to browser/extensions/loop/test/shared/vendor/chai-as-promised-5.1.0.js diff --git a/browser/components/loop/test/shared/vendor/mocha-2.2.5.css b/browser/extensions/loop/test/shared/vendor/mocha-2.2.5.css similarity index 100% rename from browser/components/loop/test/shared/vendor/mocha-2.2.5.css rename to browser/extensions/loop/test/shared/vendor/mocha-2.2.5.css diff --git a/browser/components/loop/test/shared/vendor/mocha-2.2.5.js b/browser/extensions/loop/test/shared/vendor/mocha-2.2.5.js similarity index 100% rename from browser/components/loop/test/shared/vendor/mocha-2.2.5.js rename to browser/extensions/loop/test/shared/vendor/mocha-2.2.5.js diff --git a/browser/components/loop/test/shared/vendor/sinon-1.16.1.js b/browser/extensions/loop/test/shared/vendor/sinon-1.16.1.js similarity index 100% rename from browser/components/loop/test/shared/vendor/sinon-1.16.1.js rename to browser/extensions/loop/test/shared/vendor/sinon-1.16.1.js diff --git a/browser/components/loop/test/shared/views_test.js b/browser/extensions/loop/test/shared/views_test.js similarity index 100% rename from browser/components/loop/test/shared/views_test.js rename to browser/extensions/loop/test/shared/views_test.js diff --git a/browser/components/loop/test/standalone/index.html b/browser/extensions/loop/test/standalone/index.html similarity index 100% rename from browser/components/loop/test/standalone/index.html rename to browser/extensions/loop/test/standalone/index.html diff --git a/browser/components/loop/test/standalone/standaloneAppStore_test.js b/browser/extensions/loop/test/standalone/standaloneAppStore_test.js similarity index 100% rename from browser/components/loop/test/standalone/standaloneAppStore_test.js rename to browser/extensions/loop/test/standalone/standaloneAppStore_test.js diff --git a/browser/components/loop/test/standalone/standaloneMetricsStore_test.js b/browser/extensions/loop/test/standalone/standaloneMetricsStore_test.js similarity index 100% rename from browser/components/loop/test/standalone/standaloneMetricsStore_test.js rename to browser/extensions/loop/test/standalone/standaloneMetricsStore_test.js diff --git a/browser/components/loop/test/standalone/standaloneMozLoop_test.js b/browser/extensions/loop/test/standalone/standaloneMozLoop_test.js similarity index 100% rename from browser/components/loop/test/standalone/standaloneMozLoop_test.js rename to browser/extensions/loop/test/standalone/standaloneMozLoop_test.js diff --git a/browser/components/loop/test/standalone/standaloneRoomViews_test.js b/browser/extensions/loop/test/standalone/standaloneRoomViews_test.js similarity index 100% rename from browser/components/loop/test/standalone/standaloneRoomViews_test.js rename to browser/extensions/loop/test/standalone/standaloneRoomViews_test.js diff --git a/browser/components/loop/test/standalone/test_standalone_all.py b/browser/extensions/loop/test/standalone/test_standalone_all.py similarity index 100% rename from browser/components/loop/test/standalone/test_standalone_all.py rename to browser/extensions/loop/test/standalone/test_standalone_all.py diff --git a/browser/components/loop/test/standalone/webapp_test.js b/browser/extensions/loop/test/standalone/webapp_test.js similarity index 100% rename from browser/components/loop/test/standalone/webapp_test.js rename to browser/extensions/loop/test/standalone/webapp_test.js diff --git a/browser/components/loop/test/ui-showcase/test_ui-showcase.py b/browser/extensions/loop/test/ui-showcase/test_ui-showcase.py similarity index 100% rename from browser/components/loop/test/ui-showcase/test_ui-showcase.py rename to browser/extensions/loop/test/ui-showcase/test_ui-showcase.py diff --git a/browser/components/loop/test/visual-regression/README.md b/browser/extensions/loop/test/visual-regression/README.md similarity index 100% rename from browser/components/loop/test/visual-regression/README.md rename to browser/extensions/loop/test/visual-regression/README.md diff --git a/browser/components/loop/test/visual-regression/screenshot b/browser/extensions/loop/test/visual-regression/screenshot similarity index 100% rename from browser/components/loop/test/visual-regression/screenshot rename to browser/extensions/loop/test/visual-regression/screenshot diff --git a/browser/components/loop/test/xpcshell/.eslintrc b/browser/extensions/loop/test/xpcshell/.eslintrc similarity index 100% rename from browser/components/loop/test/xpcshell/.eslintrc rename to browser/extensions/loop/test/xpcshell/.eslintrc diff --git a/browser/components/loop/test/xpcshell/head.js b/browser/extensions/loop/test/xpcshell/head.js similarity index 100% rename from browser/components/loop/test/xpcshell/head.js rename to browser/extensions/loop/test/xpcshell/head.js diff --git a/browser/components/loop/test/xpcshell/test_loopapi_doNotDisturb.js b/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopapi_doNotDisturb.js rename to browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js diff --git a/browser/components/loop/test/xpcshell/test_loopapi_internal.js b/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopapi_internal.js rename to browser/extensions/loop/test/xpcshell/test_loopapi_internal.js diff --git a/browser/components/loop/test/xpcshell/test_loopapi_prefs.js b/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopapi_prefs.js rename to browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js diff --git a/browser/components/loop/test/xpcshell/test_looppush_initialize.js b/browser/extensions/loop/test/xpcshell/test_looppush_initialize.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looppush_initialize.js rename to browser/extensions/loop/test/xpcshell/test_looppush_initialize.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms.js b/browser/extensions/loop/test/xpcshell/test_looprooms.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms.js rename to browser/extensions/loop/test/xpcshell/test_looprooms.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js b/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js rename to browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms_first_notification.js b/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms_first_notification.js rename to browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms_getall.js b/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms_getall.js rename to browser/extensions/loop/test/xpcshell/test_looprooms_getall.js diff --git a/browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js b/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js rename to browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_dnd.js b/browser/extensions/loop/test/xpcshell/test_loopservice_dnd.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_dnd.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_dnd.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_encryptionkey.js b/browser/extensions/loop/test/xpcshell/test_loopservice_encryptionkey.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_encryptionkey.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_encryptionkey.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js b/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_hawk_request.js b/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_request.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_hawk_request.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_hawk_request.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_initialize.js b/browser/extensions/loop/test/xpcshell/test_loopservice_initialize.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_initialize.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_initialize.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_locales.js b/browser/extensions/loop/test/xpcshell/test_loopservice_locales.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_locales.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_locales.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_loop_prefs.js b/browser/extensions/loop/test/xpcshell/test_loopservice_loop_prefs.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_loop_prefs.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_loop_prefs.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_registration.js b/browser/extensions/loop/test/xpcshell/test_loopservice_registration.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_registration.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_registration.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_registration_retry.js b/browser/extensions/loop/test/xpcshell/test_loopservice_registration_retry.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_registration_retry.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_registration_retry.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_restart.js b/browser/extensions/loop/test/xpcshell/test_loopservice_restart.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_restart.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_restart.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js b/browser/extensions/loop/test/xpcshell/test_loopservice_token_invalid.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_token_invalid.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_save.js b/browser/extensions/loop/test/xpcshell/test_loopservice_token_save.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_token_save.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_token_save.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_send.js b/browser/extensions/loop/test/xpcshell/test_loopservice_token_send.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_token_send.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_token_send.js diff --git a/browser/components/loop/test/xpcshell/test_loopservice_token_validation.js b/browser/extensions/loop/test/xpcshell/test_loopservice_token_validation.js similarity index 100% rename from browser/components/loop/test/xpcshell/test_loopservice_token_validation.js rename to browser/extensions/loop/test/xpcshell/test_loopservice_token_validation.js diff --git a/browser/components/loop/test/xpcshell/xpcshell.ini b/browser/extensions/loop/test/xpcshell/xpcshell.ini similarity index 100% rename from browser/components/loop/test/xpcshell/xpcshell.ini rename to browser/extensions/loop/test/xpcshell/xpcshell.ini diff --git a/browser/components/loop/ui/README.md b/browser/extensions/loop/ui/README.md similarity index 100% rename from browser/components/loop/ui/README.md rename to browser/extensions/loop/ui/README.md diff --git a/browser/components/loop/ui/fake-l10n.js b/browser/extensions/loop/ui/fake-l10n.js similarity index 100% rename from browser/components/loop/ui/fake-l10n.js rename to browser/extensions/loop/ui/fake-l10n.js diff --git a/browser/components/loop/ui/fake-mozLoop.js b/browser/extensions/loop/ui/fake-mozLoop.js similarity index 100% rename from browser/components/loop/ui/fake-mozLoop.js rename to browser/extensions/loop/ui/fake-mozLoop.js diff --git a/browser/components/loop/ui/index.html b/browser/extensions/loop/ui/index.html similarity index 100% rename from browser/components/loop/ui/index.html rename to browser/extensions/loop/ui/index.html diff --git a/browser/components/loop/ui/react-frame-component.js b/browser/extensions/loop/ui/react-frame-component.js similarity index 100% rename from browser/components/loop/ui/react-frame-component.js rename to browser/extensions/loop/ui/react-frame-component.js diff --git a/browser/components/loop/ui/sample-img/video-screen-local.png b/browser/extensions/loop/ui/sample-img/video-screen-local.png similarity index 100% rename from browser/components/loop/ui/sample-img/video-screen-local.png rename to browser/extensions/loop/ui/sample-img/video-screen-local.png diff --git a/browser/components/loop/ui/sample-img/video-screen-remote.png b/browser/extensions/loop/ui/sample-img/video-screen-remote.png similarity index 100% rename from browser/components/loop/ui/sample-img/video-screen-remote.png rename to browser/extensions/loop/ui/sample-img/video-screen-remote.png diff --git a/browser/components/loop/ui/sample-img/video-screen-terminal.png b/browser/extensions/loop/ui/sample-img/video-screen-terminal.png similarity index 100% rename from browser/components/loop/ui/sample-img/video-screen-terminal.png rename to browser/extensions/loop/ui/sample-img/video-screen-terminal.png diff --git a/browser/components/loop/ui/ui-showcase.css b/browser/extensions/loop/ui/ui-showcase.css similarity index 100% rename from browser/components/loop/ui/ui-showcase.css rename to browser/extensions/loop/ui/ui-showcase.css diff --git a/browser/components/loop/ui/ui-showcase.js b/browser/extensions/loop/ui/ui-showcase.js similarity index 100% rename from browser/components/loop/ui/ui-showcase.js rename to browser/extensions/loop/ui/ui-showcase.js diff --git a/browser/components/loop/ui/ui-showcase.jsx b/browser/extensions/loop/ui/ui-showcase.jsx similarity index 100% rename from browser/components/loop/ui/ui-showcase.jsx rename to browser/extensions/loop/ui/ui-showcase.jsx From e592c31023cb30302efc3b0319924844c43fc6aa Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 29 Nov 2015 17:08:34 +0000 Subject: [PATCH 146/153] Bug 1223573 - Part 2. Move prefs and css into the new Loop system add-on. r=mikedeboer --HG-- rename : browser/themes/windows/loop/menuPanel.png => browser/extensions/loop/skin/linux/menuPanel.png rename : browser/themes/windows/loop/menuPanel@2x.png => browser/extensions/loop/skin/linux/menuPanel@2x.png rename : browser/themes/windows/loop/toolbar-inverted.png => browser/extensions/loop/skin/linux/toolbar-inverted.png rename : browser/themes/windows/loop/toolbar-inverted@2x.png => browser/extensions/loop/skin/linux/toolbar-inverted@2x.png rename : browser/themes/linux/loop/toolbar.png => browser/extensions/loop/skin/linux/toolbar.png rename : browser/themes/linux/loop/toolbar@2x.png => browser/extensions/loop/skin/linux/toolbar@2x.png rename : browser/themes/osx/loop/menuPanel-yosemite.png => browser/extensions/loop/skin/osx/menuPanel-yosemite.png rename : browser/themes/osx/loop/menuPanel-yosemite@2x.png => browser/extensions/loop/skin/osx/menuPanel-yosemite@2x.png rename : browser/themes/osx/loop/menuPanel.png => browser/extensions/loop/skin/osx/menuPanel.png rename : browser/themes/osx/loop/menuPanel@2x.png => browser/extensions/loop/skin/osx/menuPanel@2x.png rename : browser/themes/osx/loop/toolbar-inverted.png => browser/extensions/loop/skin/osx/toolbar-inverted.png rename : browser/themes/osx/loop/toolbar-inverted@2x.png => browser/extensions/loop/skin/osx/toolbar-inverted@2x.png rename : browser/themes/osx/loop/toolbar-yosemite.png => browser/extensions/loop/skin/osx/toolbar-yosemite.png rename : browser/themes/osx/loop/toolbar-yosemite@2x.png => browser/extensions/loop/skin/osx/toolbar-yosemite@2x.png rename : browser/themes/osx/loop/toolbar.png => browser/extensions/loop/skin/osx/toolbar.png rename : browser/themes/osx/loop/toolbar@2x.png => browser/extensions/loop/skin/osx/toolbar@2x.png rename : browser/themes/windows/loop/menuPanel-aero.png => browser/extensions/loop/skin/windows/menuPanel-aero.png rename : browser/themes/windows/loop/menuPanel-aero@2x.png => browser/extensions/loop/skin/windows/menuPanel-aero@2x.png rename : browser/themes/linux/loop/menuPanel.png => browser/extensions/loop/skin/windows/menuPanel.png rename : browser/themes/linux/loop/menuPanel@2x.png => browser/extensions/loop/skin/windows/menuPanel@2x.png rename : browser/themes/windows/loop/toolbar-XP.png => browser/extensions/loop/skin/windows/toolbar-XP.png rename : browser/themes/windows/loop/toolbar-XP@2x.png => browser/extensions/loop/skin/windows/toolbar-XP@2x.png rename : browser/themes/windows/loop/toolbar-aero.png => browser/extensions/loop/skin/windows/toolbar-aero.png rename : browser/themes/windows/loop/toolbar-aero@2x.png => browser/extensions/loop/skin/windows/toolbar-aero@2x.png rename : browser/themes/linux/loop/toolbar-inverted.png => browser/extensions/loop/skin/windows/toolbar-inverted.png rename : browser/themes/linux/loop/toolbar-inverted@2x.png => browser/extensions/loop/skin/windows/toolbar-inverted@2x.png rename : browser/themes/windows/loop/toolbar-lunaSilver.png => browser/extensions/loop/skin/windows/toolbar-lunaSilver.png rename : browser/themes/windows/loop/toolbar-lunaSilver@2x.png => browser/extensions/loop/skin/windows/toolbar-lunaSilver@2x.png rename : browser/themes/windows/loop/toolbar-win8.png => browser/extensions/loop/skin/windows/toolbar-win8.png rename : browser/themes/windows/loop/toolbar-win8@2x.png => browser/extensions/loop/skin/windows/toolbar-win8@2x.png rename : browser/themes/windows/loop/toolbar.png => browser/extensions/loop/skin/windows/toolbar.png rename : browser/themes/windows/loop/toolbar@2x.png => browser/extensions/loop/skin/windows/toolbar@2x.png --- browser/app/profile/firefox.js | 36 --- browser/base/content/browser.css | 5 - .../loop/content/preferences/prefs.js | 33 +++ .../loop/skin/linux}/menuPanel.png | Bin .../loop/skin/linux}/menuPanel@2x.png | Bin .../loop/skin/linux}/toolbar-inverted.png | Bin .../loop/skin/linux}/toolbar-inverted@2x.png | Bin .../loop/skin/linux}/toolbar.png | Bin .../loop/skin/linux}/toolbar@2x.png | Bin .../loop/skin/osx}/menuPanel-yosemite.png | Bin .../loop/skin/osx}/menuPanel-yosemite@2x.png | Bin .../loop/skin/osx}/menuPanel.png | Bin .../loop/skin/osx}/menuPanel@2x.png | Bin browser/extensions/loop/skin/osx/platform.css | 39 +++ .../loop/skin/osx}/toolbar-inverted.png | Bin .../loop/skin/osx}/toolbar-inverted@2x.png | Bin .../loop/skin/osx}/toolbar-yosemite.png | Bin .../loop/skin/osx}/toolbar-yosemite@2x.png | Bin .../loop/skin/osx}/toolbar.png | Bin .../loop/skin/osx}/toolbar@2x.png | Bin browser/extensions/loop/skin/shared/loop.css | 280 ++++++++++++++++++ .../loop/skin/windows}/menuPanel-aero.png | Bin .../loop/skin/windows}/menuPanel-aero@2x.png | Bin .../loop/skin/windows}/menuPanel.png | Bin .../loop/skin/windows}/menuPanel@2x.png | Bin .../extensions/loop/skin/windows/platform.css | 18 ++ .../loop/skin/windows}/toolbar-XP.png | Bin .../loop/skin/windows}/toolbar-XP@2x.png | Bin .../loop/skin/windows}/toolbar-aero.png | Bin .../loop/skin/windows}/toolbar-aero@2x.png | Bin .../loop/skin/windows}/toolbar-inverted.png | Bin .../skin/windows}/toolbar-inverted@2x.png | Bin .../loop/skin/windows}/toolbar-lunaSilver.png | Bin .../skin/windows}/toolbar-lunaSilver@2x.png | Bin .../loop/skin/windows}/toolbar-win8.png | Bin .../loop/skin/windows}/toolbar-win8@2x.png | Bin .../loop/skin/windows}/toolbar.png | Bin .../loop/skin/windows}/toolbar@2x.png | Bin browser/themes/osx/browser.css | 34 --- browser/themes/shared/browser.inc | 2 +- browser/themes/shared/menupanel.inc.css | 72 ----- .../themes/shared/notification-icons.inc.css | 80 ----- browser/themes/shared/social/chat.inc.css | 35 --- browser/themes/shared/toolbarbuttons.inc.css | 68 ----- browser/themes/windows/browser.css | 10 - 45 files changed, 371 insertions(+), 341 deletions(-) create mode 100644 browser/extensions/loop/content/preferences/prefs.js rename browser/{themes/linux/loop => extensions/loop/skin/linux}/menuPanel.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/menuPanel@2x.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/toolbar-inverted.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/toolbar-inverted@2x.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/toolbar.png (100%) rename browser/{themes/linux/loop => extensions/loop/skin/linux}/toolbar@2x.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/menuPanel-yosemite.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/menuPanel-yosemite@2x.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/menuPanel.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/menuPanel@2x.png (100%) create mode 100644 browser/extensions/loop/skin/osx/platform.css rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar-inverted.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar-inverted@2x.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar-yosemite.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar-yosemite@2x.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar.png (100%) rename browser/{themes/osx/loop => extensions/loop/skin/osx}/toolbar@2x.png (100%) create mode 100644 browser/extensions/loop/skin/shared/loop.css rename browser/{themes/windows/loop => extensions/loop/skin/windows}/menuPanel-aero.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/menuPanel-aero@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/menuPanel.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/menuPanel@2x.png (100%) create mode 100644 browser/extensions/loop/skin/windows/platform.css rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-XP.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-XP@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-aero.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-aero@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-inverted.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-inverted@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-lunaSilver.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-lunaSilver@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-win8.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar-win8@2x.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar.png (100%) rename browser/{themes/windows/loop => extensions/loop/skin/windows}/toolbar@2x.png (100%) diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index a2136ae41269..fbdfe7bba396 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1376,42 +1376,6 @@ pref("shumway.disabled", true); // (This is intentionally on the high side; see bug 746055.) pref("image.mem.max_decoded_image_kb", 256000); -pref("loop.enabled", true); -pref("loop.textChat.enabled", true); -pref("loop.server", "https://loop.services.mozilla.com/v0"); -pref("loop.linkClicker.url", "https://hello.firefox.com/"); -pref("loop.gettingStarted.seen", false); -pref("loop.gettingStarted.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/hello/start/"); -pref("loop.gettingStarted.resumeOnFirstJoin", false); -pref("loop.learnMoreUrl", "https://www.firefox.com/hello/"); -pref("loop.legal.ToS_url", "https://www.mozilla.org/about/legal/terms/firefox-hello/"); -pref("loop.legal.privacy_url", "https://www.mozilla.org/privacy/firefox-hello/"); -pref("loop.do_not_disturb", false); -pref("loop.ringtone", "chrome://browser/content/loop/shared/sounds/ringtone.ogg"); -pref("loop.retry_delay.start", 60000); -pref("loop.retry_delay.limit", 300000); -pref("loop.ping.interval", 1800000); -pref("loop.ping.timeout", 10000); -pref("loop.feedback.baseUrl", "https://input.mozilla.org/api/v1/feedback"); -pref("loop.feedback.product", "Loop"); -pref("loop.debug.loglevel", "Error"); -pref("loop.debug.dispatcher", false); -pref("loop.debug.sdk", false); -pref("loop.debug.twoWayMediaTelemetry", false); -pref("loop.feedback.dateLastSeenSec", 0); -pref("loop.feedback.periodSec", 15770000); // 6 months. -pref("loop.feedback.formURL", "https://www.mozilla.org/firefox/hello/npssurvey/"); -pref("loop.feedback.manualFormURL", "https://www.mozilla.org/firefox/hello/feedbacksurvey/"); -#ifdef DEBUG -pref("loop.CSP", "default-src 'self' about: file: chrome: http://localhost:*; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net http://localhost:* ws://localhost:*; media-src blob:"); -#else -pref("loop.CSP", "default-src 'self' about: file: chrome:; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net; media-src blob:"); -#endif -pref("loop.fxa_oauth.tokendata", ""); -pref("loop.fxa_oauth.profile", ""); -pref("loop.support_url", "https://support.mozilla.org/kb/group-conversations-firefox-hello-webrtc"); -pref("loop.browserSharing.showInfoBar", true); - pref("social.sidebar.unload_timeout_ms", 10000); // Activation from inside of share panel is possible if activationPanelEnabled diff --git a/browser/base/content/browser.css b/browser/base/content/browser.css index 58b764277e91..876f117ae152 100644 --- a/browser/base/content/browser.css +++ b/browser/base/content/browser.css @@ -902,11 +902,6 @@ notification[value="translation"] { -moz-binding: url("chrome://browser/content/translation-infobar.xml#translationbar"); } -/* Loop/ Hello */ -notification[value="loop-sharing-notification"] .close-icon { - display: none; -} - /* Social */ /* Note the chatbox 'width' values are duplicated in socialchat.xml */ chatbox { diff --git a/browser/extensions/loop/content/preferences/prefs.js b/browser/extensions/loop/content/preferences/prefs.js new file mode 100644 index 000000000000..67ff6255c705 --- /dev/null +++ b/browser/extensions/loop/content/preferences/prefs.js @@ -0,0 +1,33 @@ +pref("loop.enabled", true); +pref("loop.textChat.enabled", true); +pref("loop.server", "https://loop.services.mozilla.com/v0"); +pref("loop.linkClicker.url", "https://hello.firefox.com/"); +pref("loop.gettingStarted.seen", false); +pref("loop.gettingStarted.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/hello/start/"); +pref("loop.gettingStarted.resumeOnFirstJoin", false); +pref("loop.learnMoreUrl", "https://www.firefox.com/hello/"); +pref("loop.legal.ToS_url", "https://www.mozilla.org/about/legal/terms/firefox-hello/"); +pref("loop.legal.privacy_url", "https://www.mozilla.org/privacy/firefox-hello/"); +pref("loop.do_not_disturb", false); +pref("loop.ringtone", "chrome://browser/content/loop/shared/sounds/ringtone.ogg"); +pref("loop.retry_delay.start", 60000); +pref("loop.retry_delay.limit", 300000); +pref("loop.ping.interval", 1800000); +pref("loop.ping.timeout", 10000); +pref("loop.debug.loglevel", "Error"); +pref("loop.debug.dispatcher", false); +pref("loop.debug.sdk", false); +pref("loop.debug.twoWayMediaTelemetry", false); +pref("loop.feedback.dateLastSeenSec", 0); +pref("loop.feedback.periodSec", 15770000); // 6 months. +pref("loop.feedback.formURL", "https://www.mozilla.org/firefox/hello/npssurvey/"); +pref("loop.feedback.manualFormURL", "https://www.mozilla.org/firefox/hello/feedbacksurvey/"); +#ifdef DEBUG +pref("loop.CSP", "default-src 'self' about: file: chrome: http://localhost:*; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net http://localhost:* ws://localhost:*; media-src blob:"); +#else +pref("loop.CSP", "default-src 'self' about: file: chrome:; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net; media-src blob:"); +#endif +pref("loop.fxa_oauth.tokendata", ""); +pref("loop.fxa_oauth.profile", ""); +pref("loop.support_url", "https://support.mozilla.org/kb/group-conversations-firefox-hello-webrtc"); +pref("loop.browserSharing.showInfoBar", true); diff --git a/browser/themes/linux/loop/menuPanel.png b/browser/extensions/loop/skin/linux/menuPanel.png similarity index 100% rename from browser/themes/linux/loop/menuPanel.png rename to browser/extensions/loop/skin/linux/menuPanel.png diff --git a/browser/themes/linux/loop/menuPanel@2x.png b/browser/extensions/loop/skin/linux/menuPanel@2x.png similarity index 100% rename from browser/themes/linux/loop/menuPanel@2x.png rename to browser/extensions/loop/skin/linux/menuPanel@2x.png diff --git a/browser/themes/linux/loop/toolbar-inverted.png b/browser/extensions/loop/skin/linux/toolbar-inverted.png similarity index 100% rename from browser/themes/linux/loop/toolbar-inverted.png rename to browser/extensions/loop/skin/linux/toolbar-inverted.png diff --git a/browser/themes/linux/loop/toolbar-inverted@2x.png b/browser/extensions/loop/skin/linux/toolbar-inverted@2x.png similarity index 100% rename from browser/themes/linux/loop/toolbar-inverted@2x.png rename to browser/extensions/loop/skin/linux/toolbar-inverted@2x.png diff --git a/browser/themes/linux/loop/toolbar.png b/browser/extensions/loop/skin/linux/toolbar.png similarity index 100% rename from browser/themes/linux/loop/toolbar.png rename to browser/extensions/loop/skin/linux/toolbar.png diff --git a/browser/themes/linux/loop/toolbar@2x.png b/browser/extensions/loop/skin/linux/toolbar@2x.png similarity index 100% rename from browser/themes/linux/loop/toolbar@2x.png rename to browser/extensions/loop/skin/linux/toolbar@2x.png diff --git a/browser/themes/osx/loop/menuPanel-yosemite.png b/browser/extensions/loop/skin/osx/menuPanel-yosemite.png similarity index 100% rename from browser/themes/osx/loop/menuPanel-yosemite.png rename to browser/extensions/loop/skin/osx/menuPanel-yosemite.png diff --git a/browser/themes/osx/loop/menuPanel-yosemite@2x.png b/browser/extensions/loop/skin/osx/menuPanel-yosemite@2x.png similarity index 100% rename from browser/themes/osx/loop/menuPanel-yosemite@2x.png rename to browser/extensions/loop/skin/osx/menuPanel-yosemite@2x.png diff --git a/browser/themes/osx/loop/menuPanel.png b/browser/extensions/loop/skin/osx/menuPanel.png similarity index 100% rename from browser/themes/osx/loop/menuPanel.png rename to browser/extensions/loop/skin/osx/menuPanel.png diff --git a/browser/themes/osx/loop/menuPanel@2x.png b/browser/extensions/loop/skin/osx/menuPanel@2x.png similarity index 100% rename from browser/themes/osx/loop/menuPanel@2x.png rename to browser/extensions/loop/skin/osx/menuPanel@2x.png diff --git a/browser/extensions/loop/skin/osx/platform.css b/browser/extensions/loop/skin/osx/platform.css new file mode 100644 index 000000000000..49691b879c38 --- /dev/null +++ b/browser/extensions/loop/skin/osx/platform.css @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); + +notification[value="loop-sharing-notification"] { + background: #00a9dc; + padding: 0; + border: 0; +} + +notification[value="loop-sharing-notification"].paused { + background: #ebebeb; +} + +notification[value="loop-sharing-notification"] .notification-button { + background: #fff; + border-radius: 0; +} + +notification[value="loop-sharing-notification"].paused .notification-button { + background: #57bd35; +} + +notification[value="loop-sharing-notification"].paused .notification-button:hover { + background: #39a017; +} + +notification[value="loop-sharing-notification"] .notification-button:hover, +notification[value="loop-sharing-notification"].paused .notification-button-default:hover { + background: #ebebeb; +} + +notification[value="loop-sharing-notification"] .notification-button-default, +notification[value="loop-sharing-notification"].paused .notification-button-default { + background: #fff; +} + diff --git a/browser/themes/osx/loop/toolbar-inverted.png b/browser/extensions/loop/skin/osx/toolbar-inverted.png similarity index 100% rename from browser/themes/osx/loop/toolbar-inverted.png rename to browser/extensions/loop/skin/osx/toolbar-inverted.png diff --git a/browser/themes/osx/loop/toolbar-inverted@2x.png b/browser/extensions/loop/skin/osx/toolbar-inverted@2x.png similarity index 100% rename from browser/themes/osx/loop/toolbar-inverted@2x.png rename to browser/extensions/loop/skin/osx/toolbar-inverted@2x.png diff --git a/browser/themes/osx/loop/toolbar-yosemite.png b/browser/extensions/loop/skin/osx/toolbar-yosemite.png similarity index 100% rename from browser/themes/osx/loop/toolbar-yosemite.png rename to browser/extensions/loop/skin/osx/toolbar-yosemite.png diff --git a/browser/themes/osx/loop/toolbar-yosemite@2x.png b/browser/extensions/loop/skin/osx/toolbar-yosemite@2x.png similarity index 100% rename from browser/themes/osx/loop/toolbar-yosemite@2x.png rename to browser/extensions/loop/skin/osx/toolbar-yosemite@2x.png diff --git a/browser/themes/osx/loop/toolbar.png b/browser/extensions/loop/skin/osx/toolbar.png similarity index 100% rename from browser/themes/osx/loop/toolbar.png rename to browser/extensions/loop/skin/osx/toolbar.png diff --git a/browser/themes/osx/loop/toolbar@2x.png b/browser/extensions/loop/skin/osx/toolbar@2x.png similarity index 100% rename from browser/themes/osx/loop/toolbar@2x.png rename to browser/extensions/loop/skin/osx/toolbar@2x.png diff --git a/browser/extensions/loop/skin/shared/loop.css b/browser/extensions/loop/skin/shared/loop.css new file mode 100644 index 000000000000..3a81e96a6fc4 --- /dev/null +++ b/browser/extensions/loop/skin/shared/loop.css @@ -0,0 +1,280 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); + +/* Only apply to browser.xul documents */ +@-moz-document url("chrome://browser/content/browser.xul") { + /* + XXX Copied from browser/themes//browser.css. Should really be + changing the sizes of icons in files to 16px x 16px and no borders. + */ + :-moz-any(toolbar, .widget-overflow-list) #loop-button > .toolbarbutton-icon, + :-moz-any(toolbar, .widget-overflow-list) #loop-button > :-moz-any(.toolbarbutton-menubutton-button, .toolbarbutton-badge-stack) > .toolbarbutton-icon { + max-width: 18px; + margin: 0; + } + + #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar.png); + -moz-image-region: rect(0, 18px, 18px, 0); + } + + toolbar[brighttext] #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar-inverted.png); + } + + #loop-button[state="disabled"], + #loop-button[disabled="true"] { + -moz-image-region: rect(0, 36px, 18px, 18px); + } + + #loop-button:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 54px, 18px, 36px); + } + + #loop-button:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 72px, 18px, 54px); + } + + #loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 90px, 18px, 72px); + } + + #loop-button:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 108px, 18px, 90px); + } + + #loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 126px, 18px, 108px); + } + + @media (min-resolution: 1.1dppx) { + #loop-button { + list-style-image: url("chrome://browser/skin/loop/toolbar@2x.png"); + -moz-image-region: rect(0, 36px, 36px, 0); + } + + toolbar[brighttext] #loop-button { + list-style-image: url("chrome://browser/skin/loop/toolbar-inverted@2x.png"); + } + + #loop-button[state="disabled"], + #loop-button[disabled="true"] { + -moz-image-region: rect(0, 72px, 36px, 36px); + } + + #loop-button:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 108px, 36px, 72px); + } + + #loop-button:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 144px, 36px, 108px); + } + + #loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 180px, 36px, 144px); + } + + #loop-button:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 216px, 36px, 180px); + } + + #loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 252px, 36px, 216px); + } + + #loop-button[cui-areatype="menu-panel"], + toolbarpaletteitem[place="palette"] > #loop-button { + list-style-image: url(chrome://browser/skin/loop/menuPanel@2x.png); + -moz-image-region: rect(0, 64px, 64px, 0); + } + + /* Make sure that the state icons are not shown in the customization palette. */ + toolbarpaletteitem[place="palette"] > #loop-button { + -moz-image-region: rect(0, 64px, 64px, 0) !important; + } + + #loop-button[cui-areatype="menu-panel"][state="disabled"], + #loop-button[cui-areatype="menu-panel"][disabled="true"] { + -moz-image-region: rect(0, 128px, 64px, 64px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 192px, 64px, 128px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 256px, 64px, 192px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 320px, 64px, 256px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 384px, 64px, 320px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 448px, 64px, 384px); + } + } + + @media not all and (min-resolution: 1.1dppx) { + #loop-button[cui-areatype="menu-panel"], + toolbarpaletteitem[place="palette"] > #loop-button { + list-style-image: url(chrome://browser/skin/loop/menuPanel.png); + -moz-image-region: rect(0, 32px, 32px, 0); + } + + /* Make sure that the state icons are not shown in the customization palette. */ + toolbarpaletteitem[place="palette"] > #loop-button { + -moz-image-region: rect(0, 32px, 32px, 0) !important; + } + + #loop-button[cui-areatype="menu-panel"][state="disabled"], + #loop-button[cui-areatype="menu-panel"][disabled="true"] { + -moz-image-region: rect(0, 64px, 32px, 32px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { + -moz-image-region: rect(0, 96px, 32px, 64px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { + -moz-image-region: rect(0, 128px, 32px, 96px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 160px, 32px, 128px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { + -moz-image-region: rect(0, 192px, 32px, 160px); + } + + #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { + -moz-image-region: rect(0, 224px, 32px, 192px); + } + } + + notification[value="loop-sharing-notification"] { + -moz-appearance: none; + height: 40px; + background-color: #00a9dc; + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; + } + + notification[value="loop-sharing-notification"].paused { + background-color: #ebebeb; + } + + notification[value="loop-sharing-notification"] .notification-inner { + color: #fff; + padding: 0; + } + + notification[value="loop-sharing-notification"].paused .notification-inner { + color: #00a9dc; + } + + notification[value="loop-sharing-notification"] .notification-button { + -moz-appearance: none; + background-color: #fff; + border: 0; + border-right: solid 1px #ebebeb; + width: 100px; + height: 40px; + margin: 0; + list-style-image: url(chrome://browser/content/loop/shared/img/pause-12x12.svg); + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; + text-shadow: none; + } + + notification[value="loop-sharing-notification"] .notification-button:-moz-locale-dir(rtl) { + border-right: 0; + border-left: solid 1px #ebebeb; + } + + notification[value="loop-sharing-notification"].paused .notification-button { + background-color: #57bd35; + color: #fff; + list-style-image: url(chrome://browser/content/loop/shared/img/play-12x12.svg); + } + + notification[value="loop-sharing-notification"].paused .notification-button:hover { + background-color: #39a017; + } + + notification[value="loop-sharing-notification"] .notification-button:hover, + notification[value="loop-sharing-notification"].paused .notification-button-default:hover { + background-color: #ebebeb; + } + + notification[value="loop-sharing-notification"] .notification-button-default, + notification[value="loop-sharing-notification"].paused .notification-button-default { + color: #d92215; + background-color: #fff; + border-right: 0; + list-style-image: url(chrome://browser/content/loop/shared/img/stop-12x12.svg); + } + + notification[value="loop-sharing-notification"] .notification-button .button-icon { + display: block; + -moz-margin-end: 6px; + } + + notification[value="loop-sharing-notification"] .button-menubutton-button { + min-width: 0; + } + + notification[value="loop-sharing-notification"] .messageImage { + list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-white); + margin-inline-start: 14px; + } + + notification[value="loop-sharing-notification"].paused .messageImage { + list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-still); + } + + notification[value="loop-sharing-notification"] .close-icon { + display: none; + } + + chatbox[src^="about:loopconversation#"] > .chat-titlebar { + background-color: #00a9dc; + border-color: #00a9dc; + } + + chatbox[src^="about:loopconversation#"] .chat-title { + color: white; + } + + chatbox[src^="about:loopconversation#"] .chat-minimize-button { + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white"); + } + + chatbox[src^="about:loopconversation#"] .chat-swap-button { + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white"); + } + + .chat-loop-hangup { + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white"); + background-color: #d13f1a; + border: 1px solid #d13f1a; + border-top-right-radius: 4px; + width: 32px; + height: 26px; + margin-top: -6px; + margin-bottom: -5px; + -moz-margin-start: 6px; + -moz-margin-end: -5px; + } + + .chat-toolbarbutton.chat-loop-hangup:-moz-any(:hover,:hover:active) { + background-color: #ef6745; + border-color: #ef6745; + } +} diff --git a/browser/themes/windows/loop/menuPanel-aero.png b/browser/extensions/loop/skin/windows/menuPanel-aero.png similarity index 100% rename from browser/themes/windows/loop/menuPanel-aero.png rename to browser/extensions/loop/skin/windows/menuPanel-aero.png diff --git a/browser/themes/windows/loop/menuPanel-aero@2x.png b/browser/extensions/loop/skin/windows/menuPanel-aero@2x.png similarity index 100% rename from browser/themes/windows/loop/menuPanel-aero@2x.png rename to browser/extensions/loop/skin/windows/menuPanel-aero@2x.png diff --git a/browser/themes/windows/loop/menuPanel.png b/browser/extensions/loop/skin/windows/menuPanel.png similarity index 100% rename from browser/themes/windows/loop/menuPanel.png rename to browser/extensions/loop/skin/windows/menuPanel.png diff --git a/browser/themes/windows/loop/menuPanel@2x.png b/browser/extensions/loop/skin/windows/menuPanel@2x.png similarity index 100% rename from browser/themes/windows/loop/menuPanel@2x.png rename to browser/extensions/loop/skin/windows/menuPanel@2x.png diff --git a/browser/extensions/loop/skin/windows/platform.css b/browser/extensions/loop/skin/windows/platform.css new file mode 100644 index 000000000000..e90639bbd434 --- /dev/null +++ b/browser/extensions/loop/skin/windows/platform.css @@ -0,0 +1,18 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); + +@media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) { + #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver.png) + } +} + +@media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { + #loop-button { + list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver@2x.png) + } +} + diff --git a/browser/themes/windows/loop/toolbar-XP.png b/browser/extensions/loop/skin/windows/toolbar-XP.png similarity index 100% rename from browser/themes/windows/loop/toolbar-XP.png rename to browser/extensions/loop/skin/windows/toolbar-XP.png diff --git a/browser/themes/windows/loop/toolbar-XP@2x.png b/browser/extensions/loop/skin/windows/toolbar-XP@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-XP@2x.png rename to browser/extensions/loop/skin/windows/toolbar-XP@2x.png diff --git a/browser/themes/windows/loop/toolbar-aero.png b/browser/extensions/loop/skin/windows/toolbar-aero.png similarity index 100% rename from browser/themes/windows/loop/toolbar-aero.png rename to browser/extensions/loop/skin/windows/toolbar-aero.png diff --git a/browser/themes/windows/loop/toolbar-aero@2x.png b/browser/extensions/loop/skin/windows/toolbar-aero@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-aero@2x.png rename to browser/extensions/loop/skin/windows/toolbar-aero@2x.png diff --git a/browser/themes/windows/loop/toolbar-inverted.png b/browser/extensions/loop/skin/windows/toolbar-inverted.png similarity index 100% rename from browser/themes/windows/loop/toolbar-inverted.png rename to browser/extensions/loop/skin/windows/toolbar-inverted.png diff --git a/browser/themes/windows/loop/toolbar-inverted@2x.png b/browser/extensions/loop/skin/windows/toolbar-inverted@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-inverted@2x.png rename to browser/extensions/loop/skin/windows/toolbar-inverted@2x.png diff --git a/browser/themes/windows/loop/toolbar-lunaSilver.png b/browser/extensions/loop/skin/windows/toolbar-lunaSilver.png similarity index 100% rename from browser/themes/windows/loop/toolbar-lunaSilver.png rename to browser/extensions/loop/skin/windows/toolbar-lunaSilver.png diff --git a/browser/themes/windows/loop/toolbar-lunaSilver@2x.png b/browser/extensions/loop/skin/windows/toolbar-lunaSilver@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-lunaSilver@2x.png rename to browser/extensions/loop/skin/windows/toolbar-lunaSilver@2x.png diff --git a/browser/themes/windows/loop/toolbar-win8.png b/browser/extensions/loop/skin/windows/toolbar-win8.png similarity index 100% rename from browser/themes/windows/loop/toolbar-win8.png rename to browser/extensions/loop/skin/windows/toolbar-win8.png diff --git a/browser/themes/windows/loop/toolbar-win8@2x.png b/browser/extensions/loop/skin/windows/toolbar-win8@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar-win8@2x.png rename to browser/extensions/loop/skin/windows/toolbar-win8@2x.png diff --git a/browser/themes/windows/loop/toolbar.png b/browser/extensions/loop/skin/windows/toolbar.png similarity index 100% rename from browser/themes/windows/loop/toolbar.png rename to browser/extensions/loop/skin/windows/toolbar.png diff --git a/browser/themes/windows/loop/toolbar@2x.png b/browser/extensions/loop/skin/windows/toolbar@2x.png similarity index 100% rename from browser/themes/windows/loop/toolbar@2x.png rename to browser/extensions/loop/skin/windows/toolbar@2x.png diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css index 8ab1b90fa505..9fd2f5435881 100644 --- a/browser/themes/osx/browser.css +++ b/browser/themes/osx/browser.css @@ -3211,40 +3211,6 @@ menulist.translate-infobar-element > .menulist-dropmarker { } } -/* Loop/ Hello browser styles */ -notification[value="loop-sharing-notification"] { - background: #00a9dc; - padding: 0; - border: 0; -} - -notification[value="loop-sharing-notification"].paused { - background: #ebebeb; -} - -notification[value="loop-sharing-notification"] .notification-button { - background: #fff; - border-radius: 0; -} - -notification[value="loop-sharing-notification"].paused .notification-button { - background: #57bd35; -} - -notification[value="loop-sharing-notification"].paused .notification-button:hover { - background: #39a017; -} - -notification[value="loop-sharing-notification"] .notification-button:hover, -notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background: #ebebeb; -} - -notification[value="loop-sharing-notification"] .notification-button-default, -notification[value="loop-sharing-notification"].paused .notification-button-default { - background: #fff; -} - .popup-notification-body[popupid="addon-progress"], .popup-notification-body[popupid="addon-install-confirmation"] { width: 28em; diff --git a/browser/themes/shared/browser.inc b/browser/themes/shared/browser.inc index 52bf968c13f7..904488a75030 100644 --- a/browser/themes/shared/browser.inc +++ b/browser/themes/shared/browser.inc @@ -2,7 +2,7 @@ % Note that zoom-reset-button is a bit different since it doesn't use an image and thus has the image with display: none. %define nestedButtons #zoom-out-button, #zoom-reset-button, #zoom-in-button, #cut-button, #copy-button, #paste-button -%define primaryToolbarButtons #back-button, #forward-button, #home-button, #print-button, #downloads-button, #bookmarks-menu-button, #new-tab-button, #new-window-button, #fullscreen-button, #sync-button, #feed-button, #tabview-button, #social-share-button, #open-file-button, #find-button, #developer-button, #preferences-button, #privatebrowsing-button, #save-page-button, #add-ons-button, #history-panelmenu, #nav-bar-overflow-button, #PanelUI-menu-button, #characterencoding-button, #email-link-button, #sidebar-button, @nestedButtons@, #e10s-button, #panic-button, #web-apps-button, #webide-button, #loop-button, #pocket-button +%define primaryToolbarButtons #back-button, #forward-button, #home-button, #print-button, #downloads-button, #bookmarks-menu-button, #new-tab-button, #new-window-button, #fullscreen-button, #sync-button, #feed-button, #tabview-button, #social-share-button, #open-file-button, #find-button, #developer-button, #preferences-button, #privatebrowsing-button, #save-page-button, #add-ons-button, #history-panelmenu, #nav-bar-overflow-button, #PanelUI-menu-button, #characterencoding-button, #email-link-button, #sidebar-button, @nestedButtons@, #e10s-button, #panic-button, #web-apps-button, #webide-button, #pocket-button %ifdef XP_MACOSX % Prior to 10.7 there wasn't a native fullscreen button so we use #restore-button to exit fullscreen diff --git a/browser/themes/shared/menupanel.inc.css b/browser/themes/shared/menupanel.inc.css index 785d0fac2d84..c47973560d4a 100644 --- a/browser/themes/shared/menupanel.inc.css +++ b/browser/themes/shared/menupanel.inc.css @@ -191,42 +191,6 @@ -moz-image-region: rect(0, 832px, 32px, 800px); } - #loop-button[cui-areatype="menu-panel"], - toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://browser/skin/loop/menuPanel.png); - -moz-image-region: rect(0, 32px, 32px, 0); - } - - /* Make sure that the state icons are not shown in the customization palette. */ - toolbarpaletteitem[place="palette"] > #loop-button { - -moz-image-region: rect(0, 32px, 32px, 0) !important; - } - - #loop-button[cui-areatype="menu-panel"][state="disabled"], - #loop-button[cui-areatype="menu-panel"][disabled="true"] { - -moz-image-region: rect(0, 64px, 32px, 32px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 96px, 32px, 64px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 128px, 32px, 96px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 160px, 32px, 128px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 192px, 32px, 160px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 224px, 32px, 192px); - } - /* Wide panel control icons */ #edit-controls@inAnyPanel@ > toolbarbutton, @@ -375,42 +339,6 @@ -moz-image-region: rect(64px, 1984px, 128px, 1920px); } - #loop-button[cui-areatype="menu-panel"], - toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://browser/skin/loop/menuPanel@2x.png); - -moz-image-region: rect(0, 64px, 64px, 0); - } - - /* Make sure that the state icons are not shown in the customization palette. */ - toolbarpaletteitem[place="palette"] > #loop-button { - -moz-image-region: rect(0, 64px, 64px, 0) !important; - } - - #loop-button[cui-areatype="menu-panel"][state="disabled"], - #loop-button[cui-areatype="menu-panel"][disabled="true"] { - -moz-image-region: rect(0, 128px, 64px, 64px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 192px, 64px, 128px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 256px, 64px, 192px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 320px, 64px, 256px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 384px, 64px, 320px); - } - - #loop-button[cui-areatype="menu-panel"]:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 448px, 64px, 384px); - } - #new-tab-button[cui-areatype="menu-panel"], toolbarpaletteitem[place="palette"] > #new-tab-button { -moz-image-region: rect(0px, 1088px, 64px, 1024px); diff --git a/browser/themes/shared/notification-icons.inc.css b/browser/themes/shared/notification-icons.inc.css index 09e74f8829d7..adfc829618a2 100644 --- a/browser/themes/shared/notification-icons.inc.css +++ b/browser/themes/shared/notification-icons.inc.css @@ -445,83 +445,3 @@ } %endif } - -/* Loop notification */ -notification[value="loop-sharing-notification"] { - -moz-appearance: none; - height: 40px; - background-color: #00a9dc; - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; -} - -notification[value="loop-sharing-notification"].paused { - background-color: #ebebeb; -} - -notification[value="loop-sharing-notification"] .notification-inner { - color: #fff; - padding: 0; -} - -notification[value="loop-sharing-notification"].paused .notification-inner { - color: #00a9dc; -} - -notification[value="loop-sharing-notification"] .notification-button { - -moz-appearance: none; - background-color: #fff; - border: 0; - border-right: solid 1px #ebebeb; - width: 100px; - height: 40px; - margin: 0; - list-style-image: url(chrome://browser/content/loop/shared/img/pause-12x12.svg); - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; - text-shadow: none; -} - -notification[value="loop-sharing-notification"] .notification-button:-moz-locale-dir(rtl) { - border-right: 0; - border-left: solid 1px #ebebeb; -} - -notification[value="loop-sharing-notification"].paused .notification-button { - background-color: #57bd35; - color: #fff; - list-style-image: url(chrome://browser/content/loop/shared/img/play-12x12.svg); -} - -notification[value="loop-sharing-notification"].paused .notification-button:hover { - background-color: #39a017; -} - -notification[value="loop-sharing-notification"] .notification-button:hover, -notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background-color: #ebebeb; -} - -notification[value="loop-sharing-notification"] .notification-button-default, -notification[value="loop-sharing-notification"].paused .notification-button-default { - color: #d92215; - background-color: #fff; - border-right: 0; - list-style-image: url(chrome://browser/content/loop/shared/img/stop-12x12.svg); -} - -notification[value="loop-sharing-notification"] .notification-button .button-icon { - display: block; - -moz-margin-end: 6px; -} - -notification[value="loop-sharing-notification"] .button-menubutton-button { - min-width: 0; -} - -notification[value="loop-sharing-notification"] .messageImage { - list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-white); - margin-inline-start: 14px; -} - -notification[value="loop-sharing-notification"].paused .messageImage { - list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-still); -} \ No newline at end of file diff --git a/browser/themes/shared/social/chat.inc.css b/browser/themes/shared/social/chat.inc.css index 2d32b8ed54a3..b7fe906cd284 100644 --- a/browser/themes/shared/social/chat.inc.css +++ b/browser/themes/shared/social/chat.inc.css @@ -105,42 +105,12 @@ chatbar > chatbox > .chat-titlebar > .chat-swap-button { transform: none; } -chatbox[src^="about:loopconversation#"] .chat-minimize-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white"); -} - -chatbox[src^="about:loopconversation#"] .chat-swap-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white"); -} - -.chat-loop-hangup { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white"); - background-color: #d13f1a; - border: 1px solid #d13f1a; - border-top-right-radius: 4px; - width: 32px; - height: 26px; - margin-top: -6px; - margin-bottom: -5px; - -moz-margin-start: 6px; - -moz-margin-end: -5px; -} - -.chat-toolbarbutton.chat-loop-hangup:-moz-any(:hover,:hover:active) { - background-color: #ef6745; - border-color: #ef6745; -} - .chat-title { color: #666; text-shadow: none; cursor: inherit; } -chatbox[src^="about:loopconversation#"] .chat-title { - color: white; -} - .chat-titlebar { height: 26px; min-height: 26px; @@ -159,11 +129,6 @@ chatbox[src^="about:loopconversation#"] .chat-title { background-color: #f0f0f0; } -chatbox[src^="about:loopconversation#"] > .chat-titlebar { - background-color: #00a9dc; - border-color: #00a9dc; -} - .chat-titlebar > .notification-anchor-icon { margin-left: 2px; margin-right: 2px; diff --git a/browser/themes/shared/toolbarbuttons.inc.css b/browser/themes/shared/toolbarbuttons.inc.css index 4cafa3d117d3..a899571fda43 100644 --- a/browser/themes/shared/toolbarbuttons.inc.css +++ b/browser/themes/shared/toolbarbuttons.inc.css @@ -184,40 +184,6 @@ toolbar[brighttext] #sync-button[status="active"] { -moz-image-region: rect(0, 720px, 18px, 702px); } -#loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar.png); - -moz-image-region: rect(0, 18px, 18px, 0); -} - -toolbar[brighttext] #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-inverted.png); -} - -#loop-button[state="disabled"], -#loop-button[disabled="true"] { - -moz-image-region: rect(0, 36px, 18px, 18px); -} - -#loop-button:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 54px, 18px, 36px); -} - -#loop-button:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 72px, 18px, 54px); -} - -#loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 90px, 18px, 72px); -} - -#loop-button:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 108px, 18px, 90px); -} - -#loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 126px, 18px, 108px); -} - #webide-button[cui-areatype="toolbar"] { -moz-image-region: rect(0, 738px, 18px, 720px); } @@ -429,39 +395,5 @@ toolbar[brighttext] #loop-button { -moz-image-region: rect(36px, 1548px, 72px, 1512px); %endif } - - #loop-button { - list-style-image: url("chrome://browser/skin/loop/toolbar@2x.png"); - -moz-image-region: rect(0, 36px, 36px, 0); - } - - toolbar[brighttext] #loop-button { - list-style-image: url("chrome://browser/skin/loop/toolbar-inverted@2x.png"); - } - - #loop-button[state="disabled"], - #loop-button[disabled="true"] { - -moz-image-region: rect(0, 72px, 36px, 36px); - } - - #loop-button:not([disabled="true"])[state="error"] { - -moz-image-region: rect(0, 108px, 36px, 72px); - } - - #loop-button:not([disabled="true"])[state="action"] { - -moz-image-region: rect(0, 144px, 36px, 108px); - } - - #loop-button:not([disabled="true"])[state="action"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 180px, 36px, 144px); - } - - #loop-button:not([disabled="true"])[state="active"] { - -moz-image-region: rect(0, 216px, 36px, 180px); - } - - #loop-button:not([disabled="true"])[state="active"]:-moz-any(:hover,:hover:active,[open]) { - -moz-image-region: rect(0, 252px, 36px, 216px); - } } %endif diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css index 2e1066f3bd84..ddf756c7ebeb 100644 --- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css @@ -652,16 +652,6 @@ menuitem.bookmark-item { #bookmarks-menu-button.toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon { list-style-image: url("chrome://browser/skin/Toolbar-lunaSilver.png"); } - - #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver.png) - } -} - -@media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { - #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver@2x.png) - } } #main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-icon, From e400bfb7ac3165a64386deb81f43dcd7e77de95c Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 29 Nov 2015 17:08:34 +0000 Subject: [PATCH 147/153] Bug 1223573 - Part 3. Move browser-loop.js to begin forming bootstrap.js. r=mikedeboer --- browser/base/content/browser-loop.js | 613 -------------------------- browser/base/content/browser.js | 4 - browser/extensions/loop/bootstrap.js | 619 +++++++++++++++++++++++++++ 3 files changed, 619 insertions(+), 617 deletions(-) delete mode 100644 browser/base/content/browser-loop.js create mode 100644 browser/extensions/loop/bootstrap.js diff --git a/browser/base/content/browser-loop.js b/browser/base/content/browser-loop.js deleted file mode 100644 index 40e48eccc4b0..000000000000 --- a/browser/base/content/browser-loop.js +++ /dev/null @@ -1,613 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// the "exported" symbols -var LoopUI; - -(function() { - const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - const kBrowserSharingNotificationId = "loop-sharing-notification"; - const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar"; - - LoopUI = { - /** - * @var {XULWidgetSingleWrapper} toolbarButton Getter for the Loop toolbarbutton - * instance for this window. - */ - get toolbarButton() { - delete this.toolbarButton; - return this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window); - }, - - /** - * @var {XULElement} panel Getter for the Loop panel element. - */ - get panel() { - delete this.panel; - return this.panel = document.getElementById("loop-notification-panel"); - }, - - /** - * @var {XULElement|null} browser Getter for the Loop panel browser element. - * Will be NULL if the panel hasn't loaded yet. - */ - get browser() { - let browser = document.querySelector("#loop-notification-panel > #loop-panel-iframe"); - if (browser) { - delete this.browser; - this.browser = browser; - } - return browser; - }, - - /** - * @var {String|null} selectedTab Getter for the name of the currently selected - * tab inside the Loop panel. Will be NULL if - * the panel hasn't loaded yet. - */ - get selectedTab() { - if (!this.browser) { - return null; - } - - let selectedTab = this.browser.contentDocument.querySelector(".tab-view > .selected"); - return selectedTab && selectedTab.getAttribute("data-tab-name"); - }, - - /** - * @return {Promise} - */ - promiseDocumentVisible(aDocument) { - if (!aDocument.hidden) { - return Promise.resolve(aDocument); - } - - return new Promise((resolve) => { - aDocument.addEventListener("visibilitychange", function onVisibilityChanged() { - aDocument.removeEventListener("visibilitychange", onVisibilityChanged); - resolve(aDocument); - }); - }); - }, - - /** - * Toggle between opening or hiding the Loop panel. - * - * @param {DOMEvent} [event] Optional event that triggered the call to this - * function. - * @param {String} [tabId] Optional name of the tab to select after the panel - * has opened. Does nothing when the panel is hidden. - * @return {Promise} - */ - togglePanel: function(event, tabId = null) { - if (!this.panel) { - // We're on the hidden window! What fun! - let obs = win => { - Services.obs.removeObserver(obs, "browser-delayed-startup-finished"); - win.LoopUI.togglePanel(event, tabId); - }; - Services.obs.addObserver(obs, "browser-delayed-startup-finished", false); - return OpenBrowserWindow(); - } - if (this.panel.state == "open") { - return new Promise(resolve => { - this.panel.hidePopup(); - resolve(); - }); - } - - return this.openCallPanel(event, tabId).then(doc => { - let fm = Services.focus; - fm.moveFocus(doc.defaultView, null, fm.MOVEFOCUS_FIRST, fm.FLAG_NOSCROLL); - }).catch(err => { - Cu.reportError(x); - }); - }, - - /** - * Opens the panel for Loop and sizes it appropriately. - * - * @param {event} event The event opening the panel, used to anchor - * the panel to the button which triggers it. - * @param {String} [tabId] Identifier of the tab to select when the panel is - * opened. Example: 'rooms', 'contacts', etc. - * @return {Promise} - */ - openCallPanel: function(event, tabId = null) { - return new Promise((resolve) => { - let callback = iframe => { - // Helper function to show a specific tab view in the panel. - function showTab() { - if (!tabId) { - resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); - return; - } - - let win = iframe.contentWindow; - let ev = new win.CustomEvent("UIAction", Cu.cloneInto({ - detail: { - action: "selectTab", - tab: tabId - } - }, win)); - win.dispatchEvent(ev); - resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); - } - - // If the panel has been opened and initialized before, we can skip waiting - // for the content to load - because it's already there. - if (("contentWindow" in iframe) && iframe.contentWindow.document.readyState == "complete") { - showTab(); - return; - } - - let documentDOMLoaded = () => { - iframe.removeEventListener("DOMContentLoaded", documentDOMLoaded, true); - // Handle window.close correctly on the panel. - this.hookWindowCloseForPanelClose(iframe.contentWindow); - iframe.contentWindow.addEventListener("loopPanelInitialized", function loopPanelInitialized() { - iframe.contentWindow.removeEventListener("loopPanelInitialized", - loopPanelInitialized); - showTab(); - }); - }; - iframe.addEventListener("DOMContentLoaded", documentDOMLoaded, true); - }; - - // Used to clear the temporary "login" state from the button. - Services.obs.notifyObservers(null, "loop-status-changed", null); - - this.shouldResumeTour().then((resume) => { - if (resume) { - // Assume the conversation with the visitor wasn't open since we would - // have resumed the tour as soon as the visitor joined if it was (and - // the pref would have been set to false already. - this.MozLoopService.resumeTour("waiting"); - resolve(); - return; - } - - this.LoopAPI.initialize(); - - let anchor = event ? event.target : this.toolbarButton.anchor; - let setHeight = 410; - if (gBrowser.selectedBrowser.getAttribute("remote") === "true") { - setHeight = 262; - } - this.PanelFrame.showPopup(window, anchor, - "loop", null, "about:looppanel", - // Loop wants a fixed size for the panel. This also stops it dynamically resizing. - { width: 330, height: setHeight }, - callback); - }); - }); - }, - - /** - * Method to know whether actions to open the panel should instead resume the tour. - * - * We need the panel to be opened via UITour so that it gets @noautohide. - * - * @return {Promise} resolving with a {Boolean} of whether the tour should be resumed instead of - * opening the panel. - */ - shouldResumeTour: Task.async(function* () { - // Resume the FTU tour if this is the first time a room was joined by - // someone else since the tour. - if (!Services.prefs.getBoolPref("loop.gettingStarted.resumeOnFirstJoin")) { - return false; - } - - if (!this.LoopRooms.participantsCount) { - // Nobody is in the rooms - return false; - } - - let roomsWithNonOwners = yield this.roomsWithNonOwners(); - if (!roomsWithNonOwners.length) { - // We were the only one in a room but we want to know about someone else joining. - return false; - } - - return true; - }), - - /** - * @return {Promise} resolved with an array of Rooms with participants (excluding owners) - */ - roomsWithNonOwners: function() { - return new Promise(resolve => { - this.LoopRooms.getAll((error, rooms) => { - let roomsWithNonOwners = []; - for (let room of rooms) { - if (!("participants" in room)) { - continue; - } - let numNonOwners = room.participants.filter(participant => !participant.owner).length; - if (!numNonOwners) { - continue; - } - roomsWithNonOwners.push(room); - } - resolve(roomsWithNonOwners); - }); - }); - }, - - /** - * Triggers the initialization of the loop service. Called by - * delayedStartup. - */ - init: function() { - // Add observer notifications before the service is initialized - Services.obs.addObserver(this, "loop-status-changed", false); - - // This is a promise for test purposes, but we don't want to be logging - // expected errors to the console, so we catch them here. - this.MozLoopService.initialize().catch(ex => { - if (!ex.message || - (!ex.message.contains("not enabled") && - !ex.message.contains("not needed"))) { - console.error(ex); - } - }); - this.updateToolbarState(); - }, - - uninit: function() { - Services.obs.removeObserver(this, "loop-status-changed"); - }, - - // Implements nsIObserver - observe: function(subject, topic, data) { - if (topic != "loop-status-changed") { - return; - } - this.updateToolbarState(data); - }, - - /** - * Updates the toolbar/menu-button state to reflect Loop status. - * - * @param {string} [aReason] Some states are only shown if - * a related reason is provided. - * - * aReason="login": Used after a login is completed - * successfully. This is used so the state can be - * temporarily shown until the next state change. - */ - updateToolbarState: function(aReason = null) { - if (!this.toolbarButton.node) { - return; - } - let state = ""; - let mozL10nId = "loop-call-button3"; - let suffix = ".tooltiptext"; - if (this.MozLoopService.errors.size) { - state = "error"; - mozL10nId += "-error"; - } else if (this.MozLoopService.screenShareActive) { - state = "action"; - mozL10nId += "-screensharing"; - } else if (aReason == "login" && this.MozLoopService.userProfile) { - state = "active"; - mozL10nId += "-active"; - suffix += "2"; - } else if (this.MozLoopService.doNotDisturb) { - state = "disabled"; - mozL10nId += "-donotdisturb"; - } else if (this.MozLoopService.roomsParticipantsCount > 0) { - state = "active"; - this.roomsWithNonOwners().then(roomsWithNonOwners => { - if (roomsWithNonOwners.length > 0) { - mozL10nId += "-participantswaiting"; - } else { - mozL10nId += "-active"; - } - - suffix += "2"; - this.updateTooltiptext(mozL10nId + suffix); - this.toolbarButton.node.setAttribute("state", state); - }); - return; - } else { - suffix += "2"; - } - - this.toolbarButton.node.setAttribute("state", state); - this.updateTooltiptext(mozL10nId + suffix); - }, - - /** - * Updates the tootltiptext to reflect Loop status. - * - * @param {string} [mozL10nId] l10n ID that refelct the current - * Loop status. - */ - updateTooltiptext: function(mozL10nId) { - this.toolbarButton.node.setAttribute("tooltiptext", mozL10nId); - var tooltiptext = CustomizableUI.getLocalizedProperty(this.toolbarButton, "tooltiptext"); - this.toolbarButton.node.setAttribute("tooltiptext", tooltiptext); - }, - - /** - * Show a desktop notification when 'do not disturb' isn't enabled. - * - * @param {Object} options Set of options that may tweak the appearance and - * behavior of the notification. - * Option params: - * - {String} title Notification title message - * - {String} [message] Notification body text - * - {String} [icon] Notification icon - * - {String} [sound] Sound to play - * - {String} [selectTab] Tab to select when the panel - * opens - * - {Function} [onclick] Callback to invoke when - * the notification is clicked. - * Opens the panel by default. - */ - showNotification: function(options) { - if (this.MozLoopService.doNotDisturb) { - return; - } - - if (!options.title) { - throw new Error("Missing title, can not display notification"); - } - - let notificationOptions = { - body: options.message || "" - }; - if (options.icon) { - notificationOptions.icon = options.icon; - } - if (options.sound) { - // This will not do anything, until bug bug 1105222 is resolved. - notificationOptions.mozbehavior = { - soundFile: "" - }; - this.playSound(options.sound); - } - - let notification = new window.Notification(options.title, notificationOptions); - notification.addEventListener("click", e => { - if (window.closed) { - return; - } - - try { - window.focus(); - } catch (ex) {} - - // We need a setTimeout here, otherwise the panel won't show after the - // window received focus. - window.setTimeout(() => { - if (typeof options.onclick == "function") { - options.onclick(); - } else { - // Open the Loop panel as a default action. - this.openCallPanel(null, options.selectTab || null); - } - }, 0); - }); - }, - - /** - * Play a sound in this window IF there's no sound playing yet. - * - * @param {String} name Name of the sound, like 'ringtone' or 'room-joined' - */ - playSound: function(name) { - if (this.ActiveSound || this.MozLoopService.doNotDisturb) { - return; - } - - this.activeSound = new window.Audio(); - this.activeSound.src = `chrome://browser/content/loop/shared/sounds/${name}.ogg`; - this.activeSound.load(); - this.activeSound.play(); - - this.activeSound.addEventListener("ended", () => this.activeSound = undefined, false); - }, - - /** - * Start listening to selected tab changes and notify any content page that's - * listening to 'BrowserSwitch' push messages. - * - * Push message parameters: - * - {Integer} windowId The new windowId for the browser. - */ - startBrowserSharing: function() { - if (!this._listeningToTabSelect) { - gBrowser.tabContainer.addEventListener("TabSelect", this); - this._listeningToTabSelect = true; - } - - this._maybeShowBrowserSharingInfoBar(); - - // Get the first window Id for the listener. - this.LoopAPI.broadcastPushMessage("BrowserSwitch", - gBrowser.selectedBrowser.outerWindowID); - }, - - /** - * Stop listening to selected tab changes. - */ - stopBrowserSharing: function() { - if (!this._listeningToTabSelect) { - return; - } - - this._hideBrowserSharingInfoBar(); - gBrowser.tabContainer.removeEventListener("TabSelect", this); - this._listeningToTabSelect = false; - }, - - /** - * Helper function to fetch a localized string via the MozLoopService API. - * It's currently inconveniently wrapped inside a string of stringified JSON. - * - * @param {String} key The element id to get strings for. - * @return {String} - */ - _getString: function(key) { - let str = this.MozLoopService.getStrings(key); - if (str) { - str = JSON.parse(str).textContent; - } - return str; - }, - - /** - * Shows an infobar notification at the top of the browser window that warns - * the user that their browser tabs are being broadcasted through the current - * conversation. - */ - _maybeShowBrowserSharingInfoBar: function() { - this._hideBrowserSharingInfoBar(); - - // Don't show the infobar if it's been permanently disabled from the menu. - if (!this.MozLoopService.getLoopPref(kPrefBrowserSharingInfoBar)) { - return; - } - - let box = gBrowser.getNotificationBox(); - let paused = false; - let bar = box.appendNotification( - this._getString("infobar_screenshare_browser_message"), - kBrowserSharingNotificationId, - // Icon is defined in browser theme CSS. - null, - box.PRIORITY_WARNING_LOW, - [{ - label: this._getString("infobar_button_pause_label"), - accessKey: this._getString("infobar_button_pause_accesskey"), - isDefault: false, - callback: (event, buttonInfo, buttonNode) => { - paused = !paused; - bar.label = paused ? this._getString("infobar_screenshare_paused_browser_message") : - this._getString("infobar_screenshare_browser_message"); - bar.classList.toggle("paused", paused); - buttonNode.label = paused ? this._getString("infobar_button_resume_label") : - this._getString("infobar_button_pause_label"); - buttonNode.accessKey = paused ? this._getString("infobar_button_resume_accesskey") : - this._getString("infobar_button_pause_accesskey"); - return true; - } - }, - { - label: this._getString("infobar_button_stop_label"), - accessKey: this._getString("infobar_button_stop_accesskey"), - isDefault: true, - callback: () => { - this._hideBrowserSharingInfoBar(); - LoopUI.MozLoopService.hangupAllChatWindows(); - } - }] - ); - - // Keep showing the notification bar until the user explicitly closes it. - bar.persistence = -1; - }, - - /** - * Hides the infobar, permanantly if requested. - * - * @param {Boolean} permanently Flag that determines if the infobar will never - * been shown again. Defaults to `false`. - * @return {Boolean} |true| if the infobar was hidden here. - */ - _hideBrowserSharingInfoBar: function(permanently = false, browser) { - browser = browser || gBrowser.selectedBrowser; - let box = gBrowser.getNotificationBox(browser); - let notification = box.getNotificationWithValue(kBrowserSharingNotificationId); - let removed = false; - if (notification) { - box.removeNotification(notification); - removed = true; - } - - if (permanently) { - this.MozLoopService.setLoopPref(kPrefBrowserSharingInfoBar, false); - } - - return removed; - }, - - /** - * Handles events from gBrowser. - */ - handleEvent: function(event) { - // We only should get "select" events. - if (event.type != "TabSelect") { - return; - } - - let wasVisible = false; - // Hide the infobar from the previous tab. - if (event.detail.previousTab) { - wasVisible = this._hideBrowserSharingInfoBar(false, - event.detail.previousTab.linkedBrowser); - } - - // We've changed the tab, so get the new window id. - this.LoopAPI.broadcastPushMessage("BrowserSwitch", - gBrowser.selectedBrowser.outerWindowID); - - if (wasVisible) { - // If the infobar was visible before, we should show it again after the - // switch. - this._maybeShowBrowserSharingInfoBar(); - } - }, - - /** - * Fetch the favicon of the currently selected tab in the format of a data-uri. - * - * @param {Function} callback Function to be invoked with an error object as - * its first argument when an error occurred or - * a string as second argument when the favicon - * has been fetched. - */ - getFavicon: function(callback) { - let pageURI = gBrowser.selectedTab.linkedBrowser.currentURI.spec; - // If the tab page’s url starts with http(s), fetch icon. - if (!/^https?:/.test(pageURI)) { - callback(); - return; - } - - this.PlacesUtils.promiseFaviconLinkUrl(pageURI).then(uri => { - // We XHR the favicon to get a File object, which we can pass to the FileReader - // object. The FileReader turns the File object into a data-uri. - let xhr = new XMLHttpRequest(); - xhr.open("get", uri.spec, true); - xhr.responseType = "blob"; - xhr.overrideMimeType("image/x-icon"); - xhr.onload = () => { - if (xhr.status != 200) { - callback(new Error("Invalid status code received for favicon XHR: " + xhr.status)); - return; - } - - let reader = new FileReader(); - reader.onload = reader.onload = () => callback(null, reader.result); - reader.onerror = callback; - reader.readAsDataURL(xhr.response); - }; - xhr.onerror = callback; - xhr.send(); - }).catch(err => { - callback(err || new Error("No favicon found")); - }); - } - }; -})(); - -XPCOMUtils.defineLazyModuleGetter(LoopUI, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopAPI", "resource:///modules/loop/MozLoopAPI.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopRooms", "resource:///modules/loop/LoopRooms.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "resource:///modules/loop/MozLoopService.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); -XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 61df291af60d..6174a0baf893 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -274,7 +274,6 @@ var gInitialPages = [ #include browser-fullScreen.js #include browser-fullZoom.js #include browser-gestureSupport.js -#include browser-loop.js #include browser-places.js #include browser-plugins.js #include browser-safebrowsing.js @@ -1357,8 +1356,6 @@ var gBrowserInit = { gDataNotificationInfoBar.init(); #endif - LoopUI.init(); - gBrowserThumbnails.init(); // Add Devtools menuitems and listeners @@ -1540,7 +1537,6 @@ var gBrowserInit = { TabView.uninit(); SocialUI.uninit(); gBrowserThumbnails.uninit(); - LoopUI.uninit(); FullZoom.destroy(); Services.obs.removeObserver(gSessionHistoryObserver, "browser:purge-session-history"); diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js new file mode 100644 index 000000000000..90be7de3e68a --- /dev/null +++ b/browser/extensions/loop/bootstrap.js @@ -0,0 +1,619 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var WindowListener = { + + setupBrowserUI: function(window) { + const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; + const kBrowserSharingNotificationId = "loop-sharing-notification"; + const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar"; + + let document = window.document; + let gBrowser = window.gBrowser; + let xhrClass = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]; + let FileReader = window.FileReader; + + // the "exported" symbols + var LoopUI = { + /** + * @var {XULWidgetSingleWrapper} toolbarButton Getter for the Loop toolbarbutton + * instance for this window. + */ + get toolbarButton() { + delete this.toolbarButton; + return this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window); + }, + + /** + * @var {XULElement} panel Getter for the Loop panel element. + */ + get panel() { + delete this.panel; + return this.panel = document.getElementById("loop-notification-panel"); + }, + + /** + * @var {XULElement|null} browser Getter for the Loop panel browser element. + * Will be NULL if the panel hasn't loaded yet. + */ + get browser() { + let browser = document.querySelector("#loop-notification-panel > #loop-panel-iframe"); + if (browser) { + delete this.browser; + this.browser = browser; + } + return browser; + }, + + /** + * @var {String|null} selectedTab Getter for the name of the currently selected + * tab inside the Loop panel. Will be NULL if + * the panel hasn't loaded yet. + */ + get selectedTab() { + if (!this.browser) { + return null; + } + + let selectedTab = this.browser.contentDocument.querySelector(".tab-view > .selected"); + return selectedTab && selectedTab.getAttribute("data-tab-name"); + }, + + /** + * @return {Promise} + */ + promiseDocumentVisible(aDocument) { + if (!aDocument.hidden) { + return Promise.resolve(aDocument); + } + + return new Promise((resolve) => { + aDocument.addEventListener("visibilitychange", function onVisibilityChanged() { + aDocument.removeEventListener("visibilitychange", onVisibilityChanged); + resolve(aDocument); + }); + }); + }, + + /** + * Toggle between opening or hiding the Loop panel. + * + * @param {DOMEvent} [event] Optional event that triggered the call to this + * function. + * @param {String} [tabId] Optional name of the tab to select after the panel + * has opened. Does nothing when the panel is hidden. + * @return {Promise} + */ + togglePanel: function(event, tabId = null) { + if (!this.panel) { + // We're on the hidden window! What fun! + let obs = win => { + Services.obs.removeObserver(obs, "browser-delayed-startup-finished"); + win.LoopUI.togglePanel(event, tabId); + }; + Services.obs.addObserver(obs, "browser-delayed-startup-finished", false); + return OpenBrowserWindow(); + } + if (this.panel.state == "open") { + return new Promise(resolve => { + this.panel.hidePopup(); + resolve(); + }); + } + + return this.openCallPanel(event, tabId).then(doc => { + let fm = Services.focus; + fm.moveFocus(doc.defaultView, null, fm.MOVEFOCUS_FIRST, fm.FLAG_NOSCROLL); + }).catch(err => { + Cu.reportError(x); + }); + }, + + /** + * Opens the panel for Loop and sizes it appropriately. + * + * @param {event} event The event opening the panel, used to anchor + * the panel to the button which triggers it. + * @param {String} [tabId] Identifier of the tab to select when the panel is + * opened. Example: 'rooms', 'contacts', etc. + * @return {Promise} + */ + openCallPanel: function(event, tabId = null) { + return new Promise((resolve) => { + let callback = iframe => { + // Helper function to show a specific tab view in the panel. + function showTab() { + if (!tabId) { + resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); + return; + } + + let win = iframe.contentWindow; + let ev = new win.CustomEvent("UIAction", Cu.cloneInto({ + detail: { + action: "selectTab", + tab: tabId + } + }, win)); + win.dispatchEvent(ev); + resolve(LoopUI.promiseDocumentVisible(iframe.contentDocument)); + } + + // If the panel has been opened and initialized before, we can skip waiting + // for the content to load - because it's already there. + if (("contentWindow" in iframe) && iframe.contentWindow.document.readyState == "complete") { + showTab(); + return; + } + + let documentDOMLoaded = () => { + iframe.removeEventListener("DOMContentLoaded", documentDOMLoaded, true); + // Handle window.close correctly on the panel. + this.hookWindowCloseForPanelClose(iframe.contentWindow); + iframe.contentWindow.addEventListener("loopPanelInitialized", function loopPanelInitialized() { + iframe.contentWindow.removeEventListener("loopPanelInitialized", + loopPanelInitialized); + showTab(); + }); + }; + iframe.addEventListener("DOMContentLoaded", documentDOMLoaded, true); + }; + + // Used to clear the temporary "login" state from the button. + Services.obs.notifyObservers(null, "loop-status-changed", null); + + this.shouldResumeTour().then((resume) => { + if (resume) { + // Assume the conversation with the visitor wasn't open since we would + // have resumed the tour as soon as the visitor joined if it was (and + // the pref would have been set to false already. + this.MozLoopService.resumeTour("waiting"); + resolve(); + return; + } + + this.LoopAPI.initialize(); + + let anchor = event ? event.target : this.toolbarButton.anchor; + let setHeight = 410; + if (gBrowser.selectedBrowser.getAttribute("remote") === "true") { + setHeight = 262; + } + this.PanelFrame.showPopup(window, anchor, + "loop", null, "about:looppanel", + // Loop wants a fixed size for the panel. This also stops it dynamically resizing. + { width: 330, height: setHeight }, + callback); + }); + }); + }, + + /** + * Method to know whether actions to open the panel should instead resume the tour. + * + * We need the panel to be opened via UITour so that it gets @noautohide. + * + * @return {Promise} resolving with a {Boolean} of whether the tour should be resumed instead of + * opening the panel. + */ + shouldResumeTour: Task.async(function* () { + // Resume the FTU tour if this is the first time a room was joined by + // someone else since the tour. + if (!Services.prefs.getBoolPref("loop.gettingStarted.resumeOnFirstJoin")) { + return false; + } + + if (!this.LoopRooms.participantsCount) { + // Nobody is in the rooms + return false; + } + + let roomsWithNonOwners = yield this.roomsWithNonOwners(); + if (!roomsWithNonOwners.length) { + // We were the only one in a room but we want to know about someone else joining. + return false; + } + + return true; + }), + + /** + * @return {Promise} resolved with an array of Rooms with participants (excluding owners) + */ + roomsWithNonOwners: function() { + return new Promise(resolve => { + this.LoopRooms.getAll((error, rooms) => { + let roomsWithNonOwners = []; + for (let room of rooms) { + if (!("participants" in room)) { + continue; + } + let numNonOwners = room.participants.filter(participant => !participant.owner).length; + if (!numNonOwners) { + continue; + } + roomsWithNonOwners.push(room); + } + resolve(roomsWithNonOwners); + }); + }); + }, + + /** + * Triggers the initialization of the loop service. Called by + * delayedStartup. + */ + init: function() { + // Add observer notifications before the service is initialized + Services.obs.addObserver(this, "loop-status-changed", false); + + // This is a promise for test purposes, but we don't want to be logging + // expected errors to the console, so we catch them here. + this.MozLoopService.initialize().catch(ex => { + if (!ex.message || + (!ex.message.contains("not enabled") && + !ex.message.contains("not needed"))) { + console.error(ex); + } + }); + this.updateToolbarState(); + }, + + uninit: function() { + Services.obs.removeObserver(this, "loop-status-changed"); + }, + + // Implements nsIObserver + observe: function(subject, topic, data) { + if (topic != "loop-status-changed") { + return; + } + this.updateToolbarState(data); + }, + + /** + * Updates the toolbar/menu-button state to reflect Loop status. + * + * @param {string} [aReason] Some states are only shown if + * a related reason is provided. + * + * aReason="login": Used after a login is completed + * successfully. This is used so the state can be + * temporarily shown until the next state change. + */ + updateToolbarState: function(aReason = null) { + if (!this.toolbarButton.node) { + return; + } + let state = ""; + let mozL10nId = "loop-call-button3"; + let suffix = ".tooltiptext"; + if (this.MozLoopService.errors.size) { + state = "error"; + mozL10nId += "-error"; + } else if (this.MozLoopService.screenShareActive) { + state = "action"; + mozL10nId += "-screensharing"; + } else if (aReason == "login" && this.MozLoopService.userProfile) { + state = "active"; + mozL10nId += "-active"; + suffix += "2"; + } else if (this.MozLoopService.doNotDisturb) { + state = "disabled"; + mozL10nId += "-donotdisturb"; + } else if (this.MozLoopService.roomsParticipantsCount > 0) { + state = "active"; + this.roomsWithNonOwners().then(roomsWithNonOwners => { + if (roomsWithNonOwners.length > 0) { + mozL10nId += "-participantswaiting"; + } else { + mozL10nId += "-active"; + } + + suffix += "2"; + this.updateTooltiptext(mozL10nId + suffix); + this.toolbarButton.node.setAttribute("state", state); + }); + return; + } else { + suffix += "2"; + } + + this.toolbarButton.node.setAttribute("state", state); + this.updateTooltiptext(mozL10nId + suffix); + }, + + /** + * Updates the tootltiptext to reflect Loop status. + * + * @param {string} [mozL10nId] l10n ID that refelct the current + * Loop status. + */ + updateTooltiptext: function(mozL10nId) { + this.toolbarButton.node.setAttribute("tooltiptext", mozL10nId); + var tooltiptext = CustomizableUI.getLocalizedProperty(this.toolbarButton, "tooltiptext"); + this.toolbarButton.node.setAttribute("tooltiptext", tooltiptext); + }, + + /** + * Show a desktop notification when 'do not disturb' isn't enabled. + * + * @param {Object} options Set of options that may tweak the appearance and + * behavior of the notification. + * Option params: + * - {String} title Notification title message + * - {String} [message] Notification body text + * - {String} [icon] Notification icon + * - {String} [sound] Sound to play + * - {String} [selectTab] Tab to select when the panel + * opens + * - {Function} [onclick] Callback to invoke when + * the notification is clicked. + * Opens the panel by default. + */ + showNotification: function(options) { + if (this.MozLoopService.doNotDisturb) { + return; + } + + if (!options.title) { + throw new Error("Missing title, can not display notification"); + } + + let notificationOptions = { + body: options.message || "" + }; + if (options.icon) { + notificationOptions.icon = options.icon; + } + if (options.sound) { + // This will not do anything, until bug bug 1105222 is resolved. + notificationOptions.mozbehavior = { + soundFile: "" + }; + this.playSound(options.sound); + } + + let notification = new window.Notification(options.title, notificationOptions); + notification.addEventListener("click", e => { + if (window.closed) { + return; + } + + try { + window.focus(); + } catch (ex) {} + + // We need a setTimeout here, otherwise the panel won't show after the + // window received focus. + window.setTimeout(() => { + if (typeof options.onclick == "function") { + options.onclick(); + } else { + // Open the Loop panel as a default action. + this.openCallPanel(null, options.selectTab || null); + } + }, 0); + }); + }, + + /** + * Play a sound in this window IF there's no sound playing yet. + * + * @param {String} name Name of the sound, like 'ringtone' or 'room-joined' + */ + playSound: function(name) { + if (this.ActiveSound || this.MozLoopService.doNotDisturb) { + return; + } + + this.activeSound = new window.Audio(); + this.activeSound.src = `chrome://browser/content/loop/shared/sounds/${name}.ogg`; + this.activeSound.load(); + this.activeSound.play(); + + this.activeSound.addEventListener("ended", () => this.activeSound = undefined, false); + }, + + /** + * Start listening to selected tab changes and notify any content page that's + * listening to 'BrowserSwitch' push messages. + * + * Push message parameters: + * - {Integer} windowId The new windowId for the browser. + */ + startBrowserSharing: function() { + if (!this._listeningToTabSelect) { + gBrowser.tabContainer.addEventListener("TabSelect", this); + this._listeningToTabSelect = true; + } + + this._maybeShowBrowserSharingInfoBar(); + + // Get the first window Id for the listener. + this.LoopAPI.broadcastPushMessage("BrowserSwitch", + gBrowser.selectedBrowser.outerWindowID); + }, + + /** + * Stop listening to selected tab changes. + */ + stopBrowserSharing: function() { + if (!this._listeningToTabSelect) { + return; + } + + this._hideBrowserSharingInfoBar(); + gBrowser.tabContainer.removeEventListener("TabSelect", this); + this._listeningToTabSelect = false; + }, + + /** + * Helper function to fetch a localized string via the MozLoopService API. + * It's currently inconveniently wrapped inside a string of stringified JSON. + * + * @param {String} key The element id to get strings for. + * @return {String} + */ + _getString: function(key) { + let str = this.MozLoopService.getStrings(key); + if (str) { + str = JSON.parse(str).textContent; + } + return str; + }, + + /** + * Shows an infobar notification at the top of the browser window that warns + * the user that their browser tabs are being broadcasted through the current + * conversation. + */ + _maybeShowBrowserSharingInfoBar: function() { + this._hideBrowserSharingInfoBar(); + + // Don't show the infobar if it's been permanently disabled from the menu. + if (!this.MozLoopService.getLoopPref(kPrefBrowserSharingInfoBar)) { + return; + } + + let box = gBrowser.getNotificationBox(); + let paused = false; + let bar = box.appendNotification( + this._getString("infobar_screenshare_browser_message"), + kBrowserSharingNotificationId, + // Icon is defined in browser theme CSS. + null, + box.PRIORITY_WARNING_LOW, + [{ + label: this._getString("infobar_button_pause_label"), + accessKey: this._getString("infobar_button_pause_accesskey"), + isDefault: false, + callback: (event, buttonInfo, buttonNode) => { + paused = !paused; + bar.label = paused ? this._getString("infobar_screenshare_paused_browser_message") : + this._getString("infobar_screenshare_browser_message"); + bar.classList.toggle("paused", paused); + buttonNode.label = paused ? this._getString("infobar_button_resume_label") : + this._getString("infobar_button_pause_label"); + buttonNode.accessKey = paused ? this._getString("infobar_button_resume_accesskey") : + this._getString("infobar_button_pause_accesskey"); + return true; + } + }, + { + label: this._getString("infobar_button_stop_label"), + accessKey: this._getString("infobar_button_stop_accesskey"), + isDefault: true, + callback: () => { + this._hideBrowserSharingInfoBar(); + LoopUI.MozLoopService.hangupAllChatWindows(); + } + }] + ); + + // Keep showing the notification bar until the user explicitly closes it. + bar.persistence = -1; + }, + + /** + * Hides the infobar, permanantly if requested. + * + * @param {Boolean} permanently Flag that determines if the infobar will never + * been shown again. Defaults to `false`. + * @return {Boolean} |true| if the infobar was hidden here. + */ + _hideBrowserSharingInfoBar: function(permanently = false, browser) { + browser = browser || gBrowser.selectedBrowser; + let box = gBrowser.getNotificationBox(browser); + let notification = box.getNotificationWithValue(kBrowserSharingNotificationId); + let removed = false; + if (notification) { + box.removeNotification(notification); + removed = true; + } + + if (permanently) { + this.MozLoopService.setLoopPref(kPrefBrowserSharingInfoBar, false); + } + + return removed; + }, + + /** + * Handles events from gBrowser. + */ + handleEvent: function(event) { + // We only should get "select" events. + if (event.type != "TabSelect") { + return; + } + + let wasVisible = false; + // Hide the infobar from the previous tab. + if (event.detail.previousTab) { + wasVisible = this._hideBrowserSharingInfoBar(false, + event.detail.previousTab.linkedBrowser); + } + + // We've changed the tab, so get the new window id. + this.LoopAPI.broadcastPushMessage("BrowserSwitch", + gBrowser.selectedBrowser.outerWindowID); + + if (wasVisible) { + // If the infobar was visible before, we should show it again after the + // switch. + this._maybeShowBrowserSharingInfoBar(); + } + }, + + /** + * Fetch the favicon of the currently selected tab in the format of a data-uri. + * + * @param {Function} callback Function to be invoked with an error object as + * its first argument when an error occurred or + * a string as second argument when the favicon + * has been fetched. + */ + getFavicon: function(callback) { + let pageURI = gBrowser.selectedTab.linkedBrowser.currentURI.spec; + // If the tab page’s url starts with http(s), fetch icon. + if (!/^https?:/.test(pageURI)) { + callback(); + return; + } + + this.PlacesUtils.promiseFaviconLinkUrl(pageURI).then(uri => { + // We XHR the favicon to get a File object, which we can pass to the FileReader + // object. The FileReader turns the File object into a data-uri. + let xhr = new XMLHttpRequest(); + xhr.open("get", uri.spec, true); + xhr.responseType = "blob"; + xhr.overrideMimeType("image/x-icon"); + xhr.onload = () => { + if (xhr.status != 200) { + callback(new Error("Invalid status code received for favicon XHR: " + xhr.status)); + return; + } + + let reader = new FileReader(); + reader.onload = reader.onload = () => callback(null, reader.result); + reader.onerror = callback; + reader.readAsDataURL(xhr.response); + }; + xhr.onerror = callback; + xhr.send(); + }).catch(err => { + callback(err || new Error("No favicon found")); + }); + } + }; + + XPCOMUtils.defineLazyModuleGetter(LoopUI, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopAPI", "resource:///modules/loop/MozLoopAPI.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopRooms", "resource:///modules/loop/LoopRooms.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "resource:///modules/loop/MozLoopService.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); + } +} From beed8bdb19f3f89c2f410e6a2c3165c09f1626e6 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 29 Nov 2015 17:08:35 +0000 Subject: [PATCH 148/153] Bug 1223573 - Part 4. Build system changes for Loop as a system add-on. r=mikedeboer,r=glandium --- .hgignore | 10 +- browser/components/moz.build | 1 - browser/extensions/loop/.eslintignore | 22 +- browser/extensions/loop/.eslintrc-gecko | 3 +- .../extensions/loop/content/modules/.eslintrc | 2 +- browser/extensions/loop/install.rdf.in | 39 +++ browser/extensions/loop/jar.mn | 248 ++++++++++-------- browser/extensions/loop/moz.build | 21 +- browser/extensions/loop/run-all-loop-tests.sh | 4 +- browser/extensions/moz.build | 1 + browser/installer/package-manifest.in | 1 + browser/themes/linux/jar.mn | 6 - browser/themes/osx/jar.mn | 14 - browser/themes/windows/jar.mn | 31 --- .../client/marionette/tests/unit-tests.ini | 2 +- 15 files changed, 216 insertions(+), 189 deletions(-) create mode 100644 browser/extensions/loop/install.rdf.in diff --git a/.hgignore b/.hgignore index 28f5bf8b43cc..0682c531c12e 100644 --- a/.hgignore +++ b/.hgignore @@ -80,9 +80,15 @@ GRTAGS GSYMS GPATH -# Unit tests for Loop +# Various items for Loop ^browser/components/loop/standalone/content/config\.js$ -^browser/components/loop/standalone/node_modules/ +^browser/extensions/loop/.*/node_modules/ +^browser/extensions/loop/.*\.module-cache +^browser/extensions/loop/test/coverage/desktop +^browser/extensions/loop/test/coverage/shared_standalone +^browser/extensions/loop/test/visual-regression/diff +^browser/extensions/loop/test/visual-regression/new +^browser/extensions/loop/test/visual-regression/refs # Git clone directory for updating web-platform-tests ^testing/web-platform/sync/ diff --git a/browser/components/moz.build b/browser/components/moz.build index 8e0d3cbd0c3f..74461650a938 100644 --- a/browser/components/moz.build +++ b/browser/components/moz.build @@ -11,7 +11,6 @@ DIRS += [ 'downloads', 'extensions', 'feeds', - 'loop', 'migration', 'newtab', 'places', diff --git a/browser/extensions/loop/.eslintignore b/browser/extensions/loop/.eslintignore index 64397d1db3d2..b5c8be673540 100644 --- a/browser/extensions/loop/.eslintignore +++ b/browser/extensions/loop/.eslintignore @@ -1,12 +1,16 @@ # This file currently uses a non-standard (and not on a standards track) # if statement within catch. -modules/MozLoopWorker.js +content/modules/MozLoopWorker.js # This file currently uses es7 features eslint issue: # https://github.com/eslint/espree/issues/125 -modules/MozLoopAPI.jsm +content/modules/MozLoopAPI.jsm +# Need to fix the configuration for this. +bootstrap.js +# Need to drop the preprocessing (bug 1212428) +content/preferences/prefs.js # Libs we don't need to check -content/libs -content/shared/libs +content/panels/vendor +content/shared/vendor standalone/content/libs standalone/node_modules # Libs we don't need to check @@ -15,11 +19,11 @@ test/shared/vendor test/coverage test/node_modules # These are generated react files that we don't need to check -content/js/conversation.js -content/js/conversationViews.js -content/js/panel.js -content/js/roomViews.js -content/js/feedbackViews.js +content/panels/js/conversation.js +content/panels/js/conversationViews.js +content/panels/js/panel.js +content/panels/js/roomViews.js +content/panels/js/feedbackViews.js content/shared/js/textChatView.js content/shared/js/linkifiedTextView.js content/shared/js/views.js diff --git a/browser/extensions/loop/.eslintrc-gecko b/browser/extensions/loop/.eslintrc-gecko index e4f17cb773cf..3fda68491412 100644 --- a/browser/extensions/loop/.eslintrc-gecko +++ b/browser/extensions/loop/.eslintrc-gecko @@ -7,9 +7,10 @@ "blockBindings": true, "destructuring": true, "generators": true, + "objectLiteralShorthandMethods": true, "restParams": true, "spread": true, - "objectLiteralShorthandMethods": true, + "templateStrings": true, }, "globals": { // Gecko + Loop Globals. diff --git a/browser/extensions/loop/content/modules/.eslintrc b/browser/extensions/loop/content/modules/.eslintrc index de960d6e5eec..5c7868e56d0f 100644 --- a/browser/extensions/loop/content/modules/.eslintrc +++ b/browser/extensions/loop/content/modules/.eslintrc @@ -1,3 +1,3 @@ { - "extends": "../.eslintrc-gecko" + "extends": "../../.eslintrc-gecko" } diff --git a/browser/extensions/loop/install.rdf.in b/browser/extensions/loop/install.rdf.in new file mode 100644 index 000000000000..2b09874541e4 --- /dev/null +++ b/browser/extensions/loop/install.rdf.in @@ -0,0 +1,39 @@ + + + +#filter substitution + + + + loop@mozilla.org + true + 0.1 + 2 + + + + + {ec8030f7-c20a-464f-9b0e-13a3a9e97384} + 45.0a1 + @FIREFOX_VERSION@ + + + + + + + xpcshell@tests.mozilla.org + 0 + 10 + + + + + Firefox Hello + Web sharing for Firefox + Mozilla + + diff --git a/browser/extensions/loop/jar.mn b/browser/extensions/loop/jar.mn index 3532277924e4..e7ebe3d4ea9b 100644 --- a/browser/extensions/loop/jar.mn +++ b/browser/extensions/loop/jar.mn @@ -2,135 +2,163 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -browser.jar: - # Desktop html files - content/browser/loop/conversation.html (content/conversation.html) - content/browser/loop/panel.html (content/panel.html) +[.] chrome.jar: +% content loop %content/ contentaccessible=yes +% skin loop classic/1.0 %skin/linux/ os=Linux +% skin loop classic/1.0 %skin/osx/ os=Darwin +% skin loop classic/1.0 %skin/windows/ os=WINNT +% skin loop-shared classic/1.0 %skin/shared/ +% override chrome://loop/skin/menuPanel.png chrome://loop/skin/menuPanel-yosemite.png os=Darwin osversion>=10.10 +% override chrome://loop/skin/menuPanel@2x.png chrome://loop/skin/menuPanel-yosemite@2x.png os=Darwin osversion>=10.10 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-yosemite.png os=Darwin osversion>=10.10 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-yosemite@2x.png os=Darwin osversion>=10.10 +% override chrome://loop/skin/menuPanel.png chrome://loop/skin/menuPanel-aero.png os=WINNT osversion=6 +% override chrome://loop/skin/menuPanel.png chrome://loop/skin/menuPanel-aero.png os=WINNT osversion=6.1 +% override chrome://loop/skin/menuPanel@2x.png chrome://loop/skin/menuPanel-aero@2x.png os=WINNT osversion=6 +% override chrome://loop/skin/menuPanel@2x.png chrome://loop/skin/menuPanel-aero@2x.png os=WINNT osversion=6.1 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-XP.png os=WINNT osversion<6 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-aero.png os=WINNT osversion=6 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-aero.png os=WINNT osversion=6.1 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-win8.png os=WINNT osversion=6.2 +% override chrome://loop/skin/toolbar.png chrome://loop/skin/toolbar-win8.png os=WINNT osversion=6.3 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-XP@2x.png os=WINNT osversion<6 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-aero@2x.png os=WINNT osversion=6 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-aero@2x.png os=WINNT osversion=6.1 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-win8@2x.png os=WINNT osversion=6.2 +% override chrome://loop/skin/toolbar@2x.png chrome://loop/skin/toolbar-win8@2x.png os=WINNT osversion=6.3 + skin/ (skin/*) + content/modules/ (content/modules/*) +* content/preferences/prefs.js (content/preferences/prefs.js) - # Desktop libs (see bottom of this file for TokBox sdk assets) - content/browser/loop/libs/l10n.js (content/libs/l10n.js) + # Desktop html files + content/panels/conversation.html (content/panels/conversation.html) + content/panels/panel.html (content/panels/panel.html) + + # Desktop vendor (see bottom of this file for TokBox sdk assets) + content/panels/vendor/l10n.js (content/panels/vendor/l10n.js) # Desktop script - content/browser/loop/js/conversation.js (content/js/conversation.js) - content/browser/loop/js/conversationAppStore.js (content/js/conversationAppStore.js) - content/browser/loop/js/otconfig.js (content/js/otconfig.js) - content/browser/loop/js/panel.js (content/js/panel.js) - content/browser/loop/js/roomStore.js (content/js/roomStore.js) - content/browser/loop/js/roomViews.js (content/js/roomViews.js) - content/browser/loop/js/feedbackViews.js (content/js/feedbackViews.js) + content/panels/js/conversation.js (content/panels/js/conversation.js) + content/panels/js/conversationAppStore.js (content/panels/js/conversationAppStore.js) + content/panels/js/otconfig.js (content/panels/js/otconfig.js) + content/panels/js/panel.js (content/panels/js/panel.js) + content/panels/js/roomStore.js (content/panels/js/roomStore.js) + content/panels/js/roomViews.js (content/panels/js/roomViews.js) + content/panels/js/feedbackViews.js (content/panels/js/feedbackViews.js) # Desktop styles - content/browser/loop/css/panel.css (content/css/panel.css) + content/panels/css/panel.css (content/panels/css/panel.css) # Shared styles - content/browser/loop/shared/css/reset.css (content/shared/css/reset.css) - content/browser/loop/shared/css/common.css (content/shared/css/common.css) - content/browser/loop/shared/css/conversation.css (content/shared/css/conversation.css) + content/shared/css/reset.css (content/shared/css/reset.css) + content/shared/css/common.css (content/shared/css/common.css) + content/shared/css/conversation.css (content/shared/css/conversation.css) # Shared images - content/browser/loop/shared/img/helloicon.svg (content/shared/img/helloicon.svg) - content/browser/loop/shared/img/icon_32.png (content/shared/img/icon_32.png) - content/browser/loop/shared/img/icon_64.png (content/shared/img/icon_64.png) - content/browser/loop/shared/img/spinner.svg (content/shared/img/spinner.svg) + content/shared/img/helloicon.svg (content/shared/img/helloicon.svg) + content/shared/img/icon_32.png (content/shared/img/icon_32.png) + content/shared/img/icon_64.png (content/shared/img/icon_64.png) + content/shared/img/spinner.svg (content/shared/img/spinner.svg) # XXX could get rid of the png spinner usages and replace them with the svg # one? - content/browser/loop/shared/img/spinner.png (content/shared/img/spinner.png) - content/browser/loop/shared/img/spinner@2x.png (content/shared/img/spinner@2x.png) - content/browser/loop/shared/img/sad_hello_icon_64x64.svg (content/shared/img/sad_hello_icon_64x64.svg) - content/browser/loop/shared/img/chatbubble-arrow-left.svg (content/shared/img/chatbubble-arrow-left.svg) - content/browser/loop/shared/img/chatbubble-arrow-right.svg (content/shared/img/chatbubble-arrow-right.svg) - content/browser/loop/shared/img/facemute-14x14.png (content/shared/img/facemute-14x14.png) - content/browser/loop/shared/img/facemute-14x14@2x.png (content/shared/img/facemute-14x14@2x.png) - content/browser/loop/shared/img/hangup-inverse-14x14.png (content/shared/img/hangup-inverse-14x14.png) - content/browser/loop/shared/img/hangup-inverse-14x14@2x.png (content/shared/img/hangup-inverse-14x14@2x.png) - content/browser/loop/shared/img/mute-inverse-14x14.png (content/shared/img/mute-inverse-14x14.png) - content/browser/loop/shared/img/mute-inverse-14x14@2x.png (content/shared/img/mute-inverse-14x14@2x.png) - content/browser/loop/shared/img/svg/glyph-email-16x16.svg (content/shared/img/svg/glyph-email-16x16.svg) - content/browser/loop/shared/img/svg/glyph-facebook-16x16.svg (content/shared/img/svg/glyph-facebook-16x16.svg) - content/browser/loop/shared/img/svg/glyph-help-16x16.svg (content/shared/img/svg/glyph-help-16x16.svg) - content/browser/loop/shared/img/svg/glyph-link-16x16.svg (content/shared/img/svg/glyph-link-16x16.svg) - content/browser/loop/shared/img/svg/glyph-user-16x16.svg (content/shared/img/svg/glyph-user-16x16.svg) - content/browser/loop/shared/img/svg/exit.svg (content/shared/img/svg/exit.svg) - content/browser/loop/shared/img/svg/audio.svg (content/shared/img/svg/audio.svg) - content/browser/loop/shared/img/svg/audio-hover.svg (content/shared/img/svg/audio-hover.svg) - content/browser/loop/shared/img/svg/audio-mute.svg (content/shared/img/svg/audio-mute.svg) - content/browser/loop/shared/img/svg/audio-mute-hover.svg (content/shared/img/svg/audio-mute-hover.svg) - content/browser/loop/shared/img/svg/video.svg (content/shared/img/svg/video.svg) - content/browser/loop/shared/img/svg/video-hover.svg (content/shared/img/svg/video-hover.svg) - content/browser/loop/shared/img/svg/video-mute.svg (content/shared/img/svg/video-mute.svg) - content/browser/loop/shared/img/svg/video-mute-hover.svg (content/shared/img/svg/video-mute-hover.svg) - content/browser/loop/shared/img/svg/settings.svg (content/shared/img/svg/settings.svg) - content/browser/loop/shared/img/svg/settings-hover.svg (content/shared/img/svg/settings-hover.svg) - content/browser/loop/shared/img/svg/sharing.svg (content/shared/img/svg/sharing.svg) - content/browser/loop/shared/img/svg/sharing-active.svg (content/shared/img/svg/sharing-active.svg) - content/browser/loop/shared/img/svg/sharing-pending.svg (content/shared/img/svg/sharing-pending.svg) - content/browser/loop/shared/img/svg/sharing-hover.svg (content/shared/img/svg/sharing-hover.svg) - content/browser/loop/shared/img/svg/media-group.svg (content/shared/img/svg/media-group.svg) - content/browser/loop/shared/img/svg/media-group-left-hover.svg (content/shared/img/svg/media-group-left-hover.svg) - content/browser/loop/shared/img/svg/media-group-right-hover.svg (content/shared/img/svg/media-group-right-hover.svg) - content/browser/loop/shared/img/audio-call-avatar.svg (content/shared/img/audio-call-avatar.svg) - content/browser/loop/shared/img/beta-ribbon.svg (content/shared/img/beta-ribbon.svg) - content/browser/loop/shared/img/check.svg (content/shared/img/check.svg) - content/browser/loop/shared/img/icons-10x10.svg (content/shared/img/icons-10x10.svg) - content/browser/loop/shared/img/icons-14x14.svg (content/shared/img/icons-14x14.svg) - content/browser/loop/shared/img/icons-16x16.svg (content/shared/img/icons-16x16.svg) - content/browser/loop/shared/img/movistar.png (content/shared/img/movistar.png) - content/browser/loop/shared/img/movistar@2x.png (content/shared/img/movistar@2x.png) - content/browser/loop/shared/img/vivo.png (content/shared/img/vivo.png) - content/browser/loop/shared/img/vivo@2x.png (content/shared/img/vivo@2x.png) - content/browser/loop/shared/img/02.png (content/shared/img/02.png) - content/browser/loop/shared/img/02@2x.png (content/shared/img/02@2x.png) - content/browser/loop/shared/img/telefonica.png (content/shared/img/telefonica.png) - content/browser/loop/shared/img/hello_logo.svg (content/shared/img/hello_logo.svg) - content/browser/loop/shared/img/telefonica@2x.png (content/shared/img/telefonica@2x.png) - content/browser/loop/shared/img/ellipsis-v.svg (content/shared/img/ellipsis-v.svg) - content/browser/loop/shared/img/empty_conversations.svg (content/shared/img/empty_conversations.svg) - content/browser/loop/shared/img/empty_search.svg (content/shared/img/empty_search.svg) - content/browser/loop/shared/img/animated-spinner.svg (content/shared/img/animated-spinner.svg) - content/browser/loop/shared/img/avatars.svg (content/shared/img/avatars.svg) - content/browser/loop/shared/img/firefox-avatar.svg (content/shared/img/firefox-avatar.svg) - content/browser/loop/shared/img/pause-12x12.svg (content/shared/img/pause-12x12.svg) - content/browser/loop/shared/img/play-12x12.svg (content/shared/img/play-12x12.svg) - content/browser/loop/shared/img/stop-12x12.svg (content/shared/img/stop-12x12.svg) + content/shared/img/spinner.png (content/shared/img/spinner.png) + content/shared/img/spinner@2x.png (content/shared/img/spinner@2x.png) + content/shared/img/sad_hello_icon_64x64.svg (content/shared/img/sad_hello_icon_64x64.svg) + content/shared/img/chatbubble-arrow-left.svg (content/shared/img/chatbubble-arrow-left.svg) + content/shared/img/chatbubble-arrow-right.svg (content/shared/img/chatbubble-arrow-right.svg) + content/shared/img/facemute-14x14.png (content/shared/img/facemute-14x14.png) + content/shared/img/facemute-14x14@2x.png (content/shared/img/facemute-14x14@2x.png) + content/shared/img/hangup-inverse-14x14.png (content/shared/img/hangup-inverse-14x14.png) + content/shared/img/hangup-inverse-14x14@2x.png (content/shared/img/hangup-inverse-14x14@2x.png) + content/shared/img/mute-inverse-14x14.png (content/shared/img/mute-inverse-14x14.png) + content/shared/img/mute-inverse-14x14@2x.png (content/shared/img/mute-inverse-14x14@2x.png) + content/shared/img/glyph-email-16x16.svg (content/shared/img/glyph-email-16x16.svg) + content/shared/img/glyph-facebook-16x16.svg (content/shared/img/glyph-facebook-16x16.svg) + content/shared/img/glyph-help-16x16.svg (content/shared/img/glyph-help-16x16.svg) + content/shared/img/glyph-link-16x16.svg (content/shared/img/glyph-link-16x16.svg) + content/shared/img/glyph-user-16x16.svg (content/shared/img/glyph-user-16x16.svg) + content/shared/img/exit.svg (content/shared/img/exit.svg) + content/shared/img/audio.svg (content/shared/img/audio.svg) + content/shared/img/audio-hover.svg (content/shared/img/audio-hover.svg) + content/shared/img/audio-mute.svg (content/shared/img/audio-mute.svg) + content/shared/img/audio-mute-hover.svg (content/shared/img/audio-mute-hover.svg) + content/shared/img/video.svg (content/shared/img/video.svg) + content/shared/img/video-hover.svg (content/shared/img/video-hover.svg) + content/shared/img/video-mute.svg (content/shared/img/video-mute.svg) + content/shared/img/video-mute-hover.svg (content/shared/img/video-mute-hover.svg) + content/shared/img/settings.svg (content/shared/img/settings.svg) + content/shared/img/settings-hover.svg (content/shared/img/settings-hover.svg) + content/shared/img/sharing.svg (content/shared/img/sharing.svg) + content/shared/img/sharing-active.svg (content/shared/img/sharing-active.svg) + content/shared/img/sharing-pending.svg (content/shared/img/sharing-pending.svg) + content/shared/img/sharing-hover.svg (content/shared/img/sharing-hover.svg) + content/shared/img/media-group.svg (content/shared/img/media-group.svg) + content/shared/img/media-group-left-hover.svg (content/shared/img/media-group-left-hover.svg) + content/shared/img/media-group-right-hover.svg (content/shared/img/media-group-right-hover.svg) + content/shared/img/audio-call-avatar.svg (content/shared/img/audio-call-avatar.svg) + content/shared/img/beta-ribbon.svg (content/shared/img/beta-ribbon.svg) + content/shared/img/check.svg (content/shared/img/check.svg) + content/shared/img/icons-10x10.svg (content/shared/img/icons-10x10.svg) + content/shared/img/icons-14x14.svg (content/shared/img/icons-14x14.svg) + content/shared/img/icons-16x16.svg (content/shared/img/icons-16x16.svg) + content/shared/img/movistar.png (content/shared/img/movistar.png) + content/shared/img/movistar@2x.png (content/shared/img/movistar@2x.png) + content/shared/img/vivo.png (content/shared/img/vivo.png) + content/shared/img/vivo@2x.png (content/shared/img/vivo@2x.png) + content/shared/img/02.png (content/shared/img/02.png) + content/shared/img/02@2x.png (content/shared/img/02@2x.png) + content/shared/img/telefonica.png (content/shared/img/telefonica.png) + content/shared/img/hello_logo.svg (content/shared/img/hello_logo.svg) + content/shared/img/telefonica@2x.png (content/shared/img/telefonica@2x.png) + content/shared/img/ellipsis-v.svg (content/shared/img/ellipsis-v.svg) + content/shared/img/empty_conversations.svg (content/shared/img/empty_conversations.svg) + content/shared/img/empty_search.svg (content/shared/img/empty_search.svg) + content/shared/img/animated-spinner.svg (content/shared/img/animated-spinner.svg) + content/shared/img/avatars.svg (content/shared/img/avatars.svg) + content/shared/img/firefox-avatar.svg (content/shared/img/firefox-avatar.svg) + content/shared/img/pause-12x12.svg (content/shared/img/pause-12x12.svg) + content/shared/img/play-12x12.svg (content/shared/img/play-12x12.svg) + content/shared/img/stop-12x12.svg (content/shared/img/stop-12x12.svg) # Shared scripts - content/browser/loop/shared/js/actions.js (content/shared/js/actions.js) - content/browser/loop/shared/js/store.js (content/shared/js/store.js) - content/browser/loop/shared/js/activeRoomStore.js (content/shared/js/activeRoomStore.js) - content/browser/loop/shared/js/dispatcher.js (content/shared/js/dispatcher.js) - content/browser/loop/shared/js/linkifiedTextView.js (content/shared/js/linkifiedTextView.js) - content/browser/loop/shared/js/loopapi-client.js (content/shared/js/loopapi-client.js) - content/browser/loop/shared/js/models.js (content/shared/js/models.js) - content/browser/loop/shared/js/mixins.js (content/shared/js/mixins.js) - content/browser/loop/shared/js/otSdkDriver.js (content/shared/js/otSdkDriver.js) - content/browser/loop/shared/js/views.js (content/shared/js/views.js) - content/browser/loop/shared/js/textChatStore.js (content/shared/js/textChatStore.js) - content/browser/loop/shared/js/textChatView.js (content/shared/js/textChatView.js) - content/browser/loop/shared/js/urlRegExps.js (content/shared/js/urlRegExps.js) - content/browser/loop/shared/js/utils.js (content/shared/js/utils.js) - content/browser/loop/shared/js/validate.js (content/shared/js/validate.js) + content/shared/js/actions.js (content/shared/js/actions.js) + content/shared/js/crypto.js (content/shared/js/crypto.js) + content/shared/js/store.js (content/shared/js/store.js) + content/shared/js/activeRoomStore.js (content/shared/js/activeRoomStore.js) + content/shared/js/dispatcher.js (content/shared/js/dispatcher.js) + content/shared/js/linkifiedTextView.js (content/shared/js/linkifiedTextView.js) + content/shared/js/loopapi-client.js (content/shared/js/loopapi-client.js) + content/shared/js/models.js (content/shared/js/models.js) + content/shared/js/mixins.js (content/shared/js/mixins.js) + content/shared/js/otSdkDriver.js (content/shared/js/otSdkDriver.js) + content/shared/js/views.js (content/shared/js/views.js) + content/shared/js/textChatStore.js (content/shared/js/textChatStore.js) + content/shared/js/textChatView.js (content/shared/js/textChatView.js) + content/shared/js/urlRegExps.js (content/shared/js/urlRegExps.js) + content/shared/js/utils.js (content/shared/js/utils.js) + content/shared/js/validate.js (content/shared/js/validate.js) # Shared libs #ifdef DEBUG - content/browser/loop/shared/libs/react-0.13.3.js (content/shared/libs/react-0.13.3.js) + content/shared/vendor/react-0.13.3.js (content/shared/vendor/react-0.13.3.js) #else - content/browser/loop/shared/libs/react-0.13.3.js (content/shared/libs/react-0.13.3-prod.js) + content/shared/vendor/react-0.13.3.js (content/shared/vendor/react-0.13.3-prod.js) #endif - content/browser/loop/shared/libs/lodash-3.9.3.js (content/shared/libs/lodash-3.9.3.js) - content/browser/loop/shared/libs/backbone-1.2.1.js (content/shared/libs/backbone-1.2.1.js) - content/browser/loop/shared/libs/classnames-2.2.0.js (content/shared/libs/classnames-2.2.0.js) + content/shared/vendor/lodash-3.9.3.js (content/shared/vendor/lodash-3.9.3.js) + content/shared/vendor/backbone-1.2.1.js (content/shared/vendor/backbone-1.2.1.js) + content/shared/vendor/classnames-2.2.0.js (content/shared/vendor/classnames-2.2.0.js) # Shared sounds - content/browser/loop/shared/sounds/ringtone.ogg (content/shared/sounds/ringtone.ogg) - content/browser/loop/shared/sounds/connecting.ogg (content/shared/sounds/connecting.ogg) - content/browser/loop/shared/sounds/connected.ogg (content/shared/sounds/connected.ogg) - content/browser/loop/shared/sounds/terminated.ogg (content/shared/sounds/terminated.ogg) - content/browser/loop/shared/sounds/room-joined.ogg (content/shared/sounds/room-joined.ogg) - content/browser/loop/shared/sounds/room-joined-in.ogg (content/shared/sounds/room-joined-in.ogg) - content/browser/loop/shared/sounds/room-left.ogg (content/shared/sounds/room-left.ogg) - content/browser/loop/shared/sounds/failure.ogg (content/shared/sounds/failure.ogg) - content/browser/loop/shared/sounds/message.ogg (content/shared/sounds/message.ogg) + content/shared/sounds/ringtone.ogg (content/shared/sounds/ringtone.ogg) + content/shared/sounds/connecting.ogg (content/shared/sounds/connecting.ogg) + content/shared/sounds/connected.ogg (content/shared/sounds/connected.ogg) + content/shared/sounds/terminated.ogg (content/shared/sounds/terminated.ogg) + content/shared/sounds/room-joined.ogg (content/shared/sounds/room-joined.ogg) + content/shared/sounds/room-joined-in.ogg (content/shared/sounds/room-joined-in.ogg) + content/shared/sounds/room-left.ogg (content/shared/sounds/room-left.ogg) + content/shared/sounds/failure.ogg (content/shared/sounds/failure.ogg) + content/shared/sounds/message.ogg (content/shared/sounds/message.ogg) # Partner SDK assets - content/browser/loop/libs/sdk.js (content/shared/libs/sdk.js) - content/browser/loop/sdk-content/js/dynamic_config.min.js (content/shared/libs/sdk-content/js/dynamic_config.min.js) + content/shared/vendor/sdk.js (content/shared/vendor/sdk.js) + content/sdk-content/js/dynamic_config.min.js (content/shared/vendor/sdk-content/js/dynamic_config.min.js) diff --git a/browser/extensions/loop/moz.build b/browser/extensions/loop/moz.build index b76d562ec638..f9124ef2fe21 100644 --- a/browser/extensions/loop/moz.build +++ b/browser/extensions/loop/moz.build @@ -4,6 +4,16 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +FINAL_TARGET = 'dist/bin/browser/features/loop@test.mozilla.org' + +FINAL_TARGET_FILES += [ + 'bootstrap.js' +] + +DIST_FILES += [ + 'install.rdf.in' +] + JAR_MANIFESTS += ['jar.mn'] XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell/xpcshell.ini'] @@ -12,16 +22,5 @@ BROWSER_CHROME_MANIFESTS += [ 'test/mochitest/browser.ini', ] -EXTRA_JS_MODULES.loop += [ - 'content/shared/js/crypto.js', - 'content/shared/js/utils.js', - 'modules/LoopRooms.jsm', - 'modules/LoopRoomsCache.jsm', - 'modules/MozLoopAPI.jsm', - 'modules/MozLoopPushHandler.jsm', - 'modules/MozLoopService.jsm', - 'modules/MozLoopWorker.js', -] - with Files('**'): BUG_COMPONENT = ('Loop', 'Client') diff --git a/browser/extensions/loop/run-all-loop-tests.sh b/browser/extensions/loop/run-all-loop-tests.sh index 2628c0b1aed2..dee165708fc5 100755 --- a/browser/extensions/loop/run-all-loop-tests.sh +++ b/browser/extensions/loop/run-all-loop-tests.sh @@ -12,7 +12,7 @@ set -e # Main tests -LOOPDIR=browser/components/loop +LOOPDIR=browser/extensions/loop ESLINT=standalone/node_modules/.bin/eslint if [ -x "${LOOPDIR}/${ESLINT}" ]; then echo 'running eslint; see http://eslint.org/docs/rules/ for error info' @@ -25,7 +25,7 @@ fi # Build tests coverage. MISSINGDEPSMSG="\nMake sure all dependencies are up to date by running -'npm install' inside the 'browser/components/loop/test/' directory.\n" +'npm install' inside the 'browser/extensions/loop/test/' directory.\n" ( cd ${LOOPDIR}/test if ! npm run-script build-coverage ; then diff --git a/browser/extensions/moz.build b/browser/extensions/moz.build index cf19e7519aae..7d54e6e2f045 100644 --- a/browser/extensions/moz.build +++ b/browser/extensions/moz.build @@ -5,6 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. DIRS += [ + 'loop', 'pdfjs', 'shumway', ] diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index 0e3771f7872e..35bccc54d340 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -676,6 +676,7 @@ @RESPATH@/browser/chrome/icons/default/default32.png @RESPATH@/browser/chrome/icons/default/default48.png #endif +@RESPATH@/browser/features/* ; [Webide Files] @RESPATH@/browser/chrome/webide@JAREXT@ diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn index 6e70af6af79e..bb09979e74d1 100644 --- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -47,12 +47,6 @@ browser.jar: skin/classic/browser/Toolbar-inverted.png skin/classic/browser/Toolbar-small.png skin/classic/browser/webRTC-indicator.css - skin/classic/browser/loop/menuPanel.png (loop/menuPanel.png) - skin/classic/browser/loop/menuPanel@2x.png (loop/menuPanel@2x.png) - skin/classic/browser/loop/toolbar.png (loop/toolbar.png) - skin/classic/browser/loop/toolbar@2x.png (loop/toolbar@2x.png) - skin/classic/browser/loop/toolbar-inverted.png (loop/toolbar-inverted.png) - skin/classic/browser/loop/toolbar-inverted@2x.png (loop/toolbar-inverted@2x.png) * skin/classic/browser/controlcenter/panel.css (controlcenter/panel.css) skin/classic/browser/customizableui/background-noise-toolbar.png (customizableui/background-noise-toolbar.png) skin/classic/browser/customizableui/customizeMode-gridTexture.png (customizableui/customizeMode-gridTexture.png) diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn index 067270e3d4ca..48911ec4ac93 100644 --- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -73,16 +73,6 @@ browser.jar: skin/classic/browser/webRTC-sharingScreen-menubar.png skin/classic/browser/webRTC-sharingScreen-menubar@2x.png skin/classic/browser/webRTC-indicator.css - skin/classic/browser/loop/menuPanel.png (loop/menuPanel.png) - skin/classic/browser/loop/menuPanel@2x.png (loop/menuPanel@2x.png) - skin/classic/browser/loop/toolbar.png (loop/toolbar.png) - skin/classic/browser/loop/toolbar@2x.png (loop/toolbar@2x.png) - skin/classic/browser/loop/toolbar-inverted.png (loop/toolbar-inverted.png) - skin/classic/browser/loop/toolbar-inverted@2x.png (loop/toolbar-inverted@2x.png) - skin/classic/browser/yosemite/loop/menuPanel.png (loop/menuPanel-yosemite.png) - skin/classic/browser/yosemite/loop/menuPanel@2x.png (loop/menuPanel-yosemite@2x.png) - skin/classic/browser/yosemite/loop/toolbar.png (loop/toolbar-yosemite.png) - skin/classic/browser/yosemite/loop/toolbar@2x.png (loop/toolbar-yosemite@2x.png) * skin/classic/browser/controlcenter/panel.css (controlcenter/panel.css) skin/classic/browser/customizableui/background-noise-toolbar.png (customizableui/background-noise-toolbar.png) skin/classic/browser/customizableui/customize-titleBar-toggle.png (customizableui/customize-titleBar-toggle.png) @@ -280,10 +270,6 @@ browser.jar: % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/yosemite/Toolbar@2x.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel.png chrome://browser/skin/yosemite/menuPanel.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel@2x.png chrome://browser/skin/yosemite/menuPanel@2x.png os=Darwin osversion>=10.10 -% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/yosemite/loop/menuPanel.png os=Darwin osversion>=10.10 -% override chrome://browser/skin/loop/menuPanel@2x.png chrome://browser/skin/yosemite/loop/menuPanel@2x.png os=Darwin osversion>=10.10 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/yosemite/loop/toolbar.png os=Darwin osversion>=10.10 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/yosemite/loop/toolbar@2x.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel-customize.png chrome://browser/skin/yosemite/menuPanel-customize.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel-customize@2x.png chrome://browser/skin/yosemite/menuPanel-customize@2x.png os=Darwin osversion>=10.10 % override chrome://browser/skin/menuPanel-exit.png chrome://browser/skin/yosemite/menuPanel-exit.png os=Darwin osversion>=10.10 diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn index 6006c67bfb2c..43cc06470123 100644 --- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -83,22 +83,6 @@ browser.jar: skin/classic/browser/urlbar-history-dropmarker-XPVista7.png skin/classic/browser/urlbar-history-dropmarker-XPVista7@2x.png skin/classic/browser/webRTC-indicator.css - skin/classic/browser/loop/menuPanel.png (loop/menuPanel.png) - skin/classic/browser/loop/menuPanel@2x.png (loop/menuPanel@2x.png) - skin/classic/browser/loop/menuPanel-aero.png (loop/menuPanel-aero.png) - skin/classic/browser/loop/menuPanel-aero@2x.png (loop/menuPanel-aero@2x.png) - skin/classic/browser/loop/toolbar.png (loop/toolbar.png) - skin/classic/browser/loop/toolbar@2x.png (loop/toolbar@2x.png) - skin/classic/browser/loop/toolbar-aero.png (loop/toolbar-aero.png) - skin/classic/browser/loop/toolbar-aero@2x.png (loop/toolbar-aero@2x.png) - skin/classic/browser/loop/toolbar-inverted.png (loop/toolbar-inverted.png) - skin/classic/browser/loop/toolbar-inverted@2x.png (loop/toolbar-inverted@2x.png) - skin/classic/browser/loop/toolbar-lunaSilver.png (loop/toolbar-lunaSilver.png) - skin/classic/browser/loop/toolbar-lunaSilver@2x.png (loop/toolbar-lunaSilver@2x.png) - skin/classic/browser/loop/toolbar-win8.png (loop/toolbar-win8.png) - skin/classic/browser/loop/toolbar-win8@2x.png (loop/toolbar-win8@2x.png) - skin/classic/browser/loop/toolbar-XP.png (loop/toolbar-XP.png) - skin/classic/browser/loop/toolbar-XP@2x.png (loop/toolbar-XP@2x.png) * skin/classic/browser/controlcenter/panel.css (controlcenter/panel.css) skin/classic/browser/customizableui/background-noise-toolbar.png (customizableui/background-noise-toolbar.png) skin/classic/browser/customizableui/customize-titleBar-toggle.png (customizableui/customize-titleBar-toggle.png) @@ -325,26 +309,11 @@ browser.jar: % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/Toolbar-aero@2x.png os=WINNT osversion=6.1 % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/Toolbar-win8@2x.png os=WINNT osversion=6.2 % override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/Toolbar-win8@2x.png os=WINNT osversion=6.3 -% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/loop/menuPanel-aero.png os=WINNT osversion=6 -% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/loop/menuPanel-aero.png os=WINNT osversion=6.1 -% override chrome://browser/skin/loop/menuPanel@2x.png chrome://browser/skin/loop/menuPanel-aero@2x.png os=WINNT osversion=6 -% override chrome://browser/skin/loop/menuPanel@2x.png chrome://browser/skin/loop/menuPanel-aero@2x.png os=WINNT osversion=6.1 - % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-XP.png os=WINNT osversion<6 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-aero.png os=WINNT osversion=6 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-aero.png os=WINNT osversion=6.1 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-win8.png os=WINNT osversion=6.2 % override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-win8.png os=WINNT osversion=6.3 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-XP.png os=WINNT osversion<6 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-aero.png os=WINNT osversion=6 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-aero.png os=WINNT osversion=6.1 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-win8.png os=WINNT osversion=6.2 -% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-win8.png os=WINNT osversion=6.3 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-XP@2x.png os=WINNT osversion<6 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-aero@2x.png os=WINNT osversion=6 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-aero@2x.png os=WINNT osversion=6.1 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-win8@2x.png os=WINNT osversion=6.2 -% override chrome://browser/skin/loop/toolbar@2x.png chrome://browser/skin/loop/toolbar-win8@2x.png os=WINNT osversion=6.3 % override chrome://browser/skin/preferences/checkbox.png chrome://browser/skin/preferences/checkbox-aero.png os=WINNT osversion=6 % override chrome://browser/skin/preferences/checkbox.png chrome://browser/skin/preferences/checkbox-aero.png os=WINNT osversion=6.1 % override chrome://browser/skin/preferences/checkbox.png chrome://browser/skin/preferences/checkbox-xp.png os=WINNT osversion<6 diff --git a/testing/marionette/client/marionette/tests/unit-tests.ini b/testing/marionette/client/marionette/tests/unit-tests.ini index aa9e73058eda..5786ad6835f5 100644 --- a/testing/marionette/client/marionette/tests/unit-tests.ini +++ b/testing/marionette/client/marionette/tests/unit-tests.ini @@ -19,4 +19,4 @@ test_container = true [include:../../../../../layout/base/tests/marionette/manifest.ini] ; loop tests -[include:../../../../../browser/components/loop/manifest.ini] +[include:../../../../../browser/extensions/loop/manifest.ini] From 90adb8582b3973ba87e7d4366bcfa0795060da19 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 29 Nov 2015 17:08:35 +0000 Subject: [PATCH 149/153] Bug 1223573 - Part 5. Update uris and paths for files in Loop's system add-on. r=mikedeboer --- .../uitour/test/browser_UITour_loop.js | 4 +- browser/extensions/loop/README.txt | 10 ++-- browser/extensions/loop/bootstrap.js | 8 +-- browser/extensions/loop/build-jsx | 4 +- .../loop/content/modules/LoopRooms.jsm | 8 +-- .../loop/content/modules/LoopRoomsCache.jsm | 2 +- .../loop/content/modules/MozLoopAPI.jsm | 4 +- .../content/modules/MozLoopPushHandler.jsm | 2 +- .../loop/content/modules/MozLoopService.jsm | 12 ++-- .../loop/content/panels/conversation.html | 59 ++++++++++--------- .../loop/content/panels/css/panel.css | 36 +++++------ .../loop/content/panels/js/panel.js | 10 ++-- .../loop/content/panels/js/panel.jsx | 10 ++-- .../loop/content/panels/js/roomViews.js | 6 +- .../loop/content/panels/js/roomViews.jsx | 6 +- .../extensions/loop/content/panels/panel.html | 41 ++++++------- .../loop/content/shared/css/conversation.css | 40 ++++++------- .../loop/content/shared/js/crypto.js | 2 +- .../loop/content/shared/js/views.js | 2 +- .../loop/content/shared/js/views.jsx | 2 +- browser/extensions/loop/moz.build | 2 +- browser/extensions/loop/skin/shared/loop.css | 12 ++-- .../extensions/loop/skin/windows/platform.css | 4 +- .../loop/standalone/content/css/webapp.css | 4 +- .../standalone/content/webappEntryPoint.js | 10 ++-- browser/extensions/loop/standalone/server.js | 4 ++ .../loop/test/desktop-local/README.md | 2 +- .../loop/test/desktop-local/index.html | 22 +++---- .../loop/test/karma/karma.coverage.desktop.js | 22 +++---- .../karma/karma.coverage.shared_standalone.js | 10 ++-- .../mochitest/browser_LoopRooms_channel.js | 2 +- .../loop/test/mochitest/browser_fxa_login.js | 2 +- .../test/mochitest/browser_loop_fxa_server.js | 2 +- .../browser_mozLoop_appVersionInfo.js | 2 +- .../test/mochitest/browser_mozLoop_context.js | 2 +- .../browser_mozLoop_sharingListeners.js | 2 +- .../mochitest/browser_mozLoop_socialShare.js | 2 +- .../mochitest/browser_mozLoop_telemetry.js | 2 +- .../test/mochitest/browser_toolbarbutton.js | 2 +- .../extensions/loop/test/mochitest/head.js | 8 +-- .../extensions/loop/test/shared/index.html | 8 +-- .../extensions/loop/test/shared/views_test.js | 2 +- .../loop/test/standalone/index.html | 8 +-- .../extensions/loop/test/xpcshell/.eslintrc | 4 +- browser/extensions/loop/test/xpcshell/head.js | 10 ++-- .../xpcshell/test_loopapi_doNotDisturb.js | 2 +- .../test/xpcshell/test_loopapi_internal.js | 2 +- .../loop/test/xpcshell/test_loopapi_prefs.js | 2 +- .../loop/test/xpcshell/test_looprooms.js | 2 +- .../test_looprooms_encryption_in_fxa.js | 2 +- .../test_looprooms_first_notification.js | 2 +- .../test/xpcshell/test_looprooms_getall.js | 1 - .../test_looprooms_upgrade_to_encryption.js | 4 +- .../xpcshell/test_loopservice_hawk_errors.js | 2 +- browser/extensions/loop/ui/README.md | 2 +- browser/extensions/loop/ui/index.html | 20 +++---- 56 files changed, 233 insertions(+), 226 deletions(-) diff --git a/browser/components/uitour/test/browser_UITour_loop.js b/browser/components/uitour/test/browser_UITour_loop.js index 0f6a6ba38c11..97b4093a4e89 100644 --- a/browser/components/uitour/test/browser_UITour_loop.js +++ b/browser/components/uitour/test/browser_UITour_loop.js @@ -9,8 +9,8 @@ var gContentWindow; var loopButton; var loopPanel = document.getElementById("loop-notification-panel"); -const { LoopRooms } = Components.utils.import("resource:///modules/loop/LoopRooms.jsm", {}); -const { MozLoopServiceInternal } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); +const { LoopRooms } = Components.utils.import("chrome://loop/content/modules/LoopRooms.jsm", {}); +const { MozLoopServiceInternal } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); function test() { UITourTest(); diff --git a/browser/extensions/loop/README.txt b/browser/extensions/loop/README.txt index 4903e0866a1d..7b23f46e2e20 100644 --- a/browser/extensions/loop/README.txt +++ b/browser/extensions/loop/README.txt @@ -22,9 +22,9 @@ using npm in order to compile the .jsx files into regular .js ones: npm install -g react-tools@0.12.2 Once installed, run build-jsx with the --watch option from -browser/components/loop, eg.: +browser/extensions/loop, eg.: - cd browser/components/loop + cd browser/extensions/loop ./build-jsx --watch build-jsx can also be do a one-time compile pass instead of watching if @@ -36,7 +36,7 @@ Hacking ======= Please be sure to execute - browser/components/loop/run-all-loop-tests.sh + browser/extensions/loop/run-all-loop-tests.sh from the top level before requesting review on a patch. @@ -52,7 +52,7 @@ If you install eslint and the react plugin globally: npm install -g eslint npm install -g eslint-plugin-react -You can also run it by hand in the browser/components/loop directory: +You can also run it by hand in the browser/extensions/loop directory: eslint --ext .js --ext .jsx --ext .jsm . @@ -88,7 +88,7 @@ install that is properly configured. From the top-level gecko directory, execute: export LOOP_SERVER=/Users/larry/src/loop-server - ./mach marionette-test browser/components/loop/test/functional/manifest.ini + ./mach marionette-test browser/extensions/loop/test/functional/manifest.ini Once the automation is complete, we'll include this in run-all-loop-tests.sh as well. diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js index 90be7de3e68a..3626102d6a29 100644 --- a/browser/extensions/loop/bootstrap.js +++ b/browser/extensions/loop/bootstrap.js @@ -409,7 +409,7 @@ var WindowListener = { } this.activeSound = new window.Audio(); - this.activeSound.src = `chrome://browser/content/loop/shared/sounds/${name}.ogg`; + this.activeSound.src = `chrome://loop/content/shared/sounds/${name}.ogg`; this.activeSound.load(); this.activeSound.play(); @@ -610,9 +610,9 @@ var WindowListener = { }; XPCOMUtils.defineLazyModuleGetter(LoopUI, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopAPI", "resource:///modules/loop/MozLoopAPI.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopRooms", "resource:///modules/loop/LoopRooms.jsm"); - XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "resource:///modules/loop/MozLoopService.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopAPI", "chrome://loop/content/modules/MozLoopAPI.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "LoopRooms", "chrome://loop/content/modules/LoopRooms.jsm"); + XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "chrome://loop/content/modules/MozLoopService.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); } diff --git a/browser/extensions/loop/build-jsx b/browser/extensions/loop/build-jsx index be95fd1a06bb..e8bc48012297 100755 --- a/browser/extensions/loop/build-jsx +++ b/browser/extensions/loop/build-jsx @@ -74,7 +74,7 @@ def find_react_command(): return [node, jsx_path] -SHARED_LIBS_DIR=os.path.join(os.path.dirname(__file__), "content", "shared", "libs") +SHARED_LIBS_DIR=os.path.join(os.path.dirname(__file__), "content", "shared", "vendor") REACT_VERSION=find_react_version(SHARED_LIBS_DIR) src_files = [] # files to be compiled @@ -99,7 +99,7 @@ else: # parse the CLI arguments description = 'Loop build tool for JSX files. ' + \ 'Will scan entire loop directory and compile them in place. ' + \ - 'Must be executed from browser/components/loop directory.' + 'Must be executed from browser/extensions/loop directory.' parser = argparse.ArgumentParser(description=description) parser.add_argument('--watch', '-w', action='store_true', help='continuous' + diff --git a/browser/extensions/loop/content/modules/LoopRooms.jsm b/browser/extensions/loop/content/modules/LoopRooms.jsm index 22b5541e270f..7665ef5e9616 100644 --- a/browser/extensions/loop/content/modules/LoopRooms.jsm +++ b/browser/extensions/loop/content/modules/LoopRooms.jsm @@ -10,7 +10,7 @@ Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Task.jsm"); Cu.import("resource://gre/modules/Timer.jsm"); -const { MozLoopService, LOOP_SESSION_TYPE } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); +const { MozLoopService, LOOP_SESSION_TYPE } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); XPCOMUtils.defineLazyModuleGetter(this, "Promise", "resource://gre/modules/Promise.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "CommonUtils", @@ -27,11 +27,11 @@ XPCOMUtils.defineLazyGetter(this, "gLoopBundle", function() { }); XPCOMUtils.defineLazyModuleGetter(this, "LoopRoomsCache", - "resource:///modules/loop/LoopRoomsCache.jsm"); + "chrome://loop/content/modules/LoopRoomsCache.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "loopUtils", - "resource:///modules/loop/utils.js", "utils"); + "chrome://loop/content/modules/utils.js", "utils"); XPCOMUtils.defineLazyModuleGetter(this, "loopCrypto", - "resource:///modules/loop/crypto.js", "LoopCrypto"); + "chrome://loop/content/shared/js/crypto.js", "LoopCrypto"); XPCOMUtils.defineLazyModuleGetter(this, "ObjectUtils", "resource://gre/modules/ObjectUtils.jsm"); diff --git a/browser/extensions/loop/content/modules/LoopRoomsCache.jsm b/browser/extensions/loop/content/modules/LoopRoomsCache.jsm index f1265a6611b6..de123d2e3d6b 100644 --- a/browser/extensions/loop/content/modules/LoopRoomsCache.jsm +++ b/browser/extensions/loop/content/modules/LoopRoomsCache.jsm @@ -9,7 +9,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Task.jsm"); const { MozLoopService, LOOP_SESSION_TYPE } = - Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); + Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); XPCOMUtils.defineLazyModuleGetter(this, "CommonUtils", "resource://services-common/utils.js"); XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm"); diff --git a/browser/extensions/loop/content/modules/MozLoopAPI.jsm b/browser/extensions/loop/content/modules/MozLoopAPI.jsm index 70638ee9fe3e..49f4a30b2604 100644 --- a/browser/extensions/loop/content/modules/MozLoopAPI.jsm +++ b/browser/extensions/loop/content/modules/MozLoopAPI.jsm @@ -9,8 +9,8 @@ const { classes: Cc, interfaces: Ci, utils: Cu } = Components; Cu.import("resource://services-common/utils.js"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource:///modules/loop/MozLoopService.jsm"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); +Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); +Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); Cu.importGlobalProperties(["Blob"]); XPCOMUtils.defineLazyModuleGetter(this, "PageMetadata", diff --git a/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm b/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm index 8be93ff80f7c..cb10cea3f6ad 100644 --- a/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm +++ b/browser/extensions/loop/content/modules/MozLoopPushHandler.jsm @@ -10,7 +10,7 @@ Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Timer.jsm"); -const { MozLoopService } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); +const { MozLoopService } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); const consoleLog = MozLoopService.log; this.EXPORTED_SYMBOLS = ["MozLoopPushHandler"]; diff --git a/browser/extensions/loop/content/modules/MozLoopService.jsm b/browser/extensions/loop/content/modules/MozLoopService.jsm index 15c8bae30773..43e3c5609370 100644 --- a/browser/extensions/loop/content/modules/MozLoopService.jsm +++ b/browser/extensions/loop/content/modules/MozLoopService.jsm @@ -121,14 +121,14 @@ XPCOMUtils.defineConstant(this, "ROOM_DELETE", ROOM_DELETE); XPCOMUtils.defineConstant(this, "ROOM_CONTEXT_ADD", ROOM_CONTEXT_ADD); XPCOMUtils.defineLazyModuleGetter(this, "LoopAPI", - "resource:///modules/loop/MozLoopAPI.jsm"); + "chrome://loop/content/modules/MozLoopAPI.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "convertToRTCStatsReport", "resource://gre/modules/media/RTCStatsReport.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "loopUtils", - "resource:///modules/loop/utils.js", "utils"); + "chrome://loop/content/modules/utils.js", "utils"); XPCOMUtils.defineLazyModuleGetter(this, "loopCrypto", - "resource:///modules/loop/crypto.js", "LoopCrypto"); + "chrome://loop/content/shared/js/crypto.js", "LoopCrypto"); XPCOMUtils.defineLazyModuleGetter(this, "Chat", "resource:///modules/Chat.jsm"); @@ -151,13 +151,13 @@ XPCOMUtils.defineLazyModuleGetter(this, "hookWindowCloseForPanelClose", "resource://gre/modules/MozSocialAPI.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "LoopRooms", - "resource:///modules/loop/LoopRooms.jsm"); + "chrome://loop/content/modules/LoopRooms.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "roomsPushNotification", - "resource:///modules/loop/LoopRooms.jsm"); + "chrome://loop/content/modules/LoopRooms.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "MozLoopPushHandler", - "resource:///modules/loop/MozLoopPushHandler.jsm"); + "chrome://loop/content/modules/MozLoopPushHandler.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "UITour", "resource:///modules/UITour.jsm"); diff --git a/browser/extensions/loop/content/panels/conversation.html b/browser/extensions/loop/content/panels/conversation.html index dfc2c8715f9d..7cbb81835f2c 100644 --- a/browser/extensions/loop/content/panels/conversation.html +++ b/browser/extensions/loop/content/panels/conversation.html @@ -7,9 +7,10 @@ - - - + + + + @@ -17,32 +18,32 @@
- - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/browser/extensions/loop/content/panels/css/panel.css b/browser/extensions/loop/content/panels/css/panel.css index 374d86543028..f875d502bae5 100644 --- a/browser/extensions/loop/content/panels/css/panel.css +++ b/browser/extensions/loop/content/panels/css/panel.css @@ -12,7 +12,7 @@ body { /* Beta Ribbon */ .beta-ribbon { - background: url("../shared/img/beta-ribbon.svg") no-repeat; + background: url("../../shared/img/beta-ribbon.svg") no-repeat; background-size: 30px; width: 30px; height: 30px; @@ -158,7 +158,7 @@ body { transform: translateY(-50%); padding-top: 11rem; padding-bottom: 1rem; - background-image: url("../shared/img/empty_conversations.svg"); + background-image: url("../../shared/img/empty_conversations.svg"); background-repeat: no-repeat; background-position: top center; } @@ -324,11 +324,11 @@ body { } .room-list > .room-entry:hover > h2 > .copy-link { - background-image: url(../shared/img/icons-16x16.svg#copy); + background-image: url(../../shared/img/icons-16x16.svg#copy); } .room-list > .room-entry:hover > h2 > .delete-link { - background-image: url(../shared/img/icons-16x16.svg#trash); + background-image: url(../../shared/img/icons-16x16.svg#trash); } /* scale this up to 1.1x and then back to the original size */ @@ -338,7 +338,7 @@ body { } .room-list > .room-entry > h2 > .copy-link.checked { - background: transparent url(../shared/img/icons-16x16.svg#checkmark); + background: transparent url(../../shared/img/icons-16x16.svg#checkmark); animation: pulse .150s; animation-timing-function: ease-in-out; top: 0; @@ -362,7 +362,7 @@ body { /* Room entry edit button */ .room-entry-context-edit-btn { - background-image: url("../shared/img/icons-10x10.svg#edit-darkgrey"); + background-image: url("../../shared/img/icons-10x10.svg#edit-darkgrey"); background-position: center; background-repeat: no-repeat; background-size: 12px; @@ -399,7 +399,7 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu { .button-close { background-color: transparent; - background-image: url(../shared/img/icons-10x10.svg#close); + background-image: url(../../shared/img/icons-10x10.svg#close); background-repeat: no-repeat; background-size: 8px 8px; border: none; @@ -428,7 +428,7 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu { } .spinner.busy { - background-image: url(../shared/img/spinner.png); + background-image: url(../../shared/img/spinner.png); animation-name: spinnerRotate; animation-duration: 1s; animation-timing-function: linear; @@ -437,7 +437,7 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu { @media (min-resolution: 2dppx) { .spinner.busy { - background-image: url(../shared/img/spinner@2x.png); + background-image: url(../../shared/img/spinner@2x.png); } } @@ -502,7 +502,7 @@ html[dir="rtl"] .generate-url-spinner { margin-left: 10px; margin-right: 10px; vertical-align: middle; - background-image: url("../shared/img/telefonica.png"); + background-image: url("../../shared/img/telefonica.png"); background-size: 72px 20px; width: 72px; height: 20px; @@ -510,21 +510,21 @@ html[dir="rtl"] .generate-url-spinner { #powered-by-logo.en-GB, #powered-by-logo.de { - background-image: url("../shared/img/02.png"); + background-image: url("../../shared/img/02.png"); background-size: 21px 20px; width: 21px; height: 20px; } #powered-by-logo.pt-BR { - background-image: url("../shared/img/vivo.png"); + background-image: url("../../shared/img/vivo.png"); background-size: 53px 26px; width: 53px; height: 26px; } #powered-by-logo[class^="es-"] { - background-image: url("../shared/img/movistar.png"); + background-image: url("../../shared/img/movistar.png"); background-size: 92px 20px; width: 92px; height: 20px; @@ -532,20 +532,20 @@ html[dir="rtl"] .generate-url-spinner { @media (min-resolution: 2dppx) { #powered-by-logo { - background-image: url("../shared/img/telefonica@2x.png"); + background-image: url("../../shared/img/telefonica@2x.png"); } #powered-by-logo.en-GB, #powered-by-logo.de { - background-image: url("../shared/img/02@2x.png"); + background-image: url("../../shared/img/02@2x.png"); } #powered-by-logo.pt-BR { - background-image: url("../shared/img/vivo@2x.png"); + background-image: url("../../shared/img/vivo@2x.png"); } #powered-by-logo[class^="es-"] { - background-image: url("../shared/img/movistar@2x.png"); + background-image: url("../../shared/img/movistar@2x.png"); } } @@ -594,7 +594,7 @@ html[dir="rtl"] .generate-url-spinner { border: none; cursor: pointer; vertical-align: middle; - background: transparent url("../shared/img/icons-10x10.svg#settings-cog"); + background: transparent url("../../shared/img/icons-10x10.svg#settings-cog"); background-position: center; background-repeat: no-repeat; background-size: cover; diff --git a/browser/extensions/loop/content/panels/js/panel.js b/browser/extensions/loop/content/panels/js/panel.js index ff4ca198eb3a..e5c41a08ceb6 100644 --- a/browser/extensions/loop/content/panels/js/panel.js +++ b/browser/extensions/loop/content/panels/js/panel.js @@ -29,7 +29,7 @@ loop.panel = (function(_, mozL10n) { return ( React.createElement("div", {className: "fte-get-started-content"}, React.createElement("header", {className: "fte-title"}, - React.createElement("img", {src: "loop/shared/img/hello_logo.svg"}), + React.createElement("img", {src: "shared/img/hello_logo.svg"}), React.createElement("div", {className: "fte-subheader"}, mozL10n.get("first_time_experience_subheading") ) @@ -379,7 +379,7 @@ loop.panel = (function(_, mozL10n) { _renderDefaultIcon: function() { return ( React.createElement("div", {className: "room-entry-context-item"}, - React.createElement("img", {src: "loop/shared/img/icons-16x16.svg#globe"}) + React.createElement("img", {src: "shared/img/icons-16x16.svg#globe"}) ) ); }, @@ -390,7 +390,7 @@ loop.panel = (function(_, mozL10n) { React.createElement("a", {href: roomUrl.location, onClick: this.handleClick, title: roomUrl.description}, - React.createElement("img", {src: roomUrl.thumbnail || "loop/shared/img/icons-16x16.svg#globe"}) + React.createElement("img", {src: roomUrl.thumbnail || "shared/img/icons-16x16.svg#globe"}) ) ) ); @@ -717,7 +717,7 @@ loop.panel = (function(_, mozL10n) { React.createElement("div", {className: "room-list"}, this._renderNewRoomButton(), React.createElement("div", {className: "room-list-loading"}, - React.createElement("img", {src: "loop/shared/img/animated-spinner.svg"}) + React.createElement("img", {src: "shared/img/animated-spinner.svg"}) ) ) ); @@ -884,7 +884,7 @@ loop.panel = (function(_, mozL10n) { return ( React.createElement("div", {className: "error-content"}, React.createElement("header", {className: "error-title"}, - React.createElement("img", {src: "loop/shared/img/sad_hello_icon_64x64.svg"}), + React.createElement("img", {src: "shared/img/sad_hello_icon_64x64.svg"}), React.createElement("p", {className: "error-subheader"}, mozL10n.get("e10s_not_supported_subheading", { brandShortname: mozL10n.get("clientShortname2") diff --git a/browser/extensions/loop/content/panels/js/panel.jsx b/browser/extensions/loop/content/panels/js/panel.jsx index fb14776745f8..d2c11eca60a5 100644 --- a/browser/extensions/loop/content/panels/js/panel.jsx +++ b/browser/extensions/loop/content/panels/js/panel.jsx @@ -29,7 +29,7 @@ loop.panel = (function(_, mozL10n) { return (
- +
{mozL10n.get("first_time_experience_subheading")}
@@ -379,7 +379,7 @@ loop.panel = (function(_, mozL10n) { _renderDefaultIcon: function() { return (
- +
); }, @@ -390,7 +390,7 @@ loop.panel = (function(_, mozL10n) { - +
); @@ -717,7 +717,7 @@ loop.panel = (function(_, mozL10n) {
{this._renderNewRoomButton()}
- +
); @@ -884,7 +884,7 @@ loop.panel = (function(_, mozL10n) { return (
- +

{mozL10n.get("e10s_not_supported_subheading", { brandShortname: mozL10n.get("clientShortname2") diff --git a/browser/extensions/loop/content/panels/js/roomViews.js b/browser/extensions/loop/content/panels/js/roomViews.js index 5f49fdbf1f61..67e02207c999 100644 --- a/browser/extensions/loop/content/panels/js/roomViews.js +++ b/browser/extensions/loop/content/panels/js/roomViews.js @@ -346,14 +346,14 @@ loop.roomViews = (function(mozL10n) { "triggered": this.state.copiedUrl }), onClick: this.handleCopyButtonClick}, - React.createElement("img", {src: "loop/shared/img/svg/glyph-link-16x16.svg"}), + React.createElement("img", {src: "shared/img/glyph-link-16x16.svg"}), React.createElement("p", null, mozL10n.get(this.state.copiedUrl ? "invite_copied_link_button" : "invite_copy_link_button")) ), React.createElement("div", {className: "btn-email invite-button", onClick: this.handleEmailButtonClick, onMouseOver: this.resetTriggeredButtons}, - React.createElement("img", {src: "loop/shared/img/svg/glyph-email-16x16.svg"}), + React.createElement("img", {src: "shared/img/glyph-email-16x16.svg"}), React.createElement("p", null, mozL10n.get("invite_email_link_button")) ) ), @@ -536,7 +536,7 @@ loop.roomViews = (function(mozL10n) { } var url = this._getURL(); - var thumbnail = url && url.thumbnail || "loop/shared/img/icons-16x16.svg#globe"; + var thumbnail = url && url.thumbnail || "shared/img/icons-16x16.svg#globe"; var urlDescription = url && url.description || ""; var location = url && url.location || ""; diff --git a/browser/extensions/loop/content/panels/js/roomViews.jsx b/browser/extensions/loop/content/panels/js/roomViews.jsx index 7f5d66f7a6dc..5bbbd0fb2765 100644 --- a/browser/extensions/loop/content/panels/js/roomViews.jsx +++ b/browser/extensions/loop/content/panels/js/roomViews.jsx @@ -346,14 +346,14 @@ loop.roomViews = (function(mozL10n) { "triggered": this.state.copiedUrl })} onClick={this.handleCopyButtonClick}> - +

{mozL10n.get(this.state.copiedUrl ? "invite_copied_link_button" : "invite_copy_link_button")}

- +

{mozL10n.get("invite_email_link_button")}

@@ -536,7 +536,7 @@ loop.roomViews = (function(mozL10n) { } var url = this._getURL(); - var thumbnail = url && url.thumbnail || "loop/shared/img/icons-16x16.svg#globe"; + var thumbnail = url && url.thumbnail || "shared/img/icons-16x16.svg#globe"; var urlDescription = url && url.description || ""; var location = url && url.location || ""; diff --git a/browser/extensions/loop/content/panels/panel.html b/browser/extensions/loop/content/panels/panel.html index 87fb62711b2c..982006f70846 100644 --- a/browser/extensions/loop/content/panels/panel.html +++ b/browser/extensions/loop/content/panels/panel.html @@ -5,31 +5,32 @@ - - - + + + +
- - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/browser/extensions/loop/content/shared/css/conversation.css b/browser/extensions/loop/content/shared/css/conversation.css index b56876429489..aacca74062f4 100644 --- a/browser/extensions/loop/content/shared/css/conversation.css +++ b/browser/extensions/loop/content/shared/css/conversation.css @@ -65,7 +65,7 @@ html[dir="rtl"] .conversation-toolbar > li { background-position: center; background-repeat: no-repeat; background-color: transparent; - background-image: url("../img/svg/media-group.svg"); + background-image: url("../img/media-group.svg"); background-size: cover; height: 28px; width: 67px; @@ -73,25 +73,25 @@ html[dir="rtl"] .conversation-toolbar > li { .conversation-toolbar-media-btn-group-box > button:last-child:active, .conversation-toolbar-media-btn-group-box > button:last-child:hover { - background-image: url("../img/svg/media-group-right-hover.svg"); + background-image: url("../img/media-group-right-hover.svg"); background-size: cover; } html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:last-child:active, html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:last-child:hover { - background-image: url("../img/svg/media-group-left-hover.svg"); + background-image: url("../img/media-group-left-hover.svg"); background-size: cover; } .conversation-toolbar-media-btn-group-box > button:first-child:active, .conversation-toolbar-media-btn-group-box > button:first-child:hover { - background-image: url("../img/svg/media-group-left-hover.svg"); + background-image: url("../img/media-group-left-hover.svg"); background-size: cover; } html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:first-child:active, html[dir="rtl"] .conversation-toolbar-media-btn-group-box > button:first-child:hover { - background-image: url("../img/svg/media-group-right-hover.svg"); + background-image: url("../img/media-group-right-hover.svg"); background-size: cover; } @@ -106,76 +106,76 @@ html[dir="rtl"] .conversation-toolbar-btn-box.btn-edit-entry { /* conversationViews.jsx */ .conversation-toolbar .btn-hangup { - background-image: url("../img/svg/exit.svg"); + background-image: url("../img/exit.svg"); border: 0; } /* Audio mute button */ .btn-mute-audio:after { - content: url("../img/svg/audio.svg"); + content: url("../img/audio.svg"); } .btn-mute-audio.muted:after { - content: url("../img/svg/audio-mute.svg"); + content: url("../img/audio-mute.svg"); } .btn-mute-audio:hover:after, .btn-mute-audio:active:after { - content: url("../img/svg/audio-hover.svg"); + content: url("../img/audio-hover.svg"); } .btn-mute-audio.muted:hover:after, .btn-mute-audio.muted:active:after { - content: url("../img/svg/audio-mute-hover.svg"); + content: url("../img/audio-mute-hover.svg"); } /* Video mute button */ .btn-mute-video:after { - content: url("../img/svg/video.svg"); + content: url("../img/video.svg"); } .btn-mute-video:active:after, .btn-mute-video:hover:after { - content: url("../img/svg/video-hover.svg"); + content: url("../img/video-hover.svg"); } .btn-mute-video.muted:after { - content: url("../img/svg/video-mute.svg"); + content: url("../img/video-mute.svg"); } .btn-mute-video.muted:hover:after, .btn-mute-video.muted:active:after { - content: url("../img/svg/video-mute-hover.svg"); + content: url("../img/video-mute-hover.svg"); } .btn-settings { width: 28px; height: 28px; background-size: 28px; - background-image: url("../img/svg/settings.svg"); + background-image: url("../img/settings.svg"); background-color: transparent; } .btn-settings:hover, .btn-settings:active { - background-image: url("../img/svg/settings-hover.svg"); + background-image: url("../img/settings-hover.svg"); } .btn-screen-share { - background-image: url("../img/svg/sharing.svg"); + background-image: url("../img/sharing.svg"); } .btn-screen-share:hover, .btn-screen-share:active { - background-image: url("../img/svg/sharing-hover.svg"); + background-image: url("../img/sharing-hover.svg"); } .btn-screen-share.active { - background-image: url("../img/svg/sharing-active.svg"); + background-image: url("../img/sharing-active.svg"); } .btn-screen-share.disabled { /* The screen share button is in its pending state when its disabled. */ - background-image: url("../img/svg/sharing-pending.svg"); + background-image: url("../img/sharing-pending.svg"); } /* General Call (incoming or outgoing). */ diff --git a/browser/extensions/loop/content/shared/js/crypto.js b/browser/extensions/loop/content/shared/js/crypto.js index b067698f44d1..22b0616d2451 100644 --- a/browser/extensions/loop/content/shared/js/crypto.js +++ b/browser/extensions/loop/content/shared/js/crypto.js @@ -18,7 +18,7 @@ var inChrome = typeof Components != "undefined" && "utils" in Components; rootObject = { crypto: crypto }; - sharedUtils = Cu.import("resource:///modules/loop/utils.js", {}).utils; + sharedUtils = Cu.import("chrome://loop/content/shared/js/utils.js", {}).utils; } else { sharedUtils = this.shared.utils; } diff --git a/browser/extensions/loop/content/shared/js/views.js b/browser/extensions/loop/content/shared/js/views.js index 34cbc45c5fe9..bdb6caea01d4 100644 --- a/browser/extensions/loop/content/shared/js/views.js +++ b/browser/extensions/loop/content/shared/js/views.js @@ -854,7 +854,7 @@ loop.shared.views = (function(_, mozL10n) { if (!thumbnail) { thumbnail = this.props.useDesktopPaths ? - "loop/shared/img/icons-16x16.svg#globe" : + "shared/img/icons-16x16.svg#globe" : "shared/img/icons-16x16.svg#globe"; } diff --git a/browser/extensions/loop/content/shared/js/views.jsx b/browser/extensions/loop/content/shared/js/views.jsx index 9eb26b42e6e3..723e739f29b4 100644 --- a/browser/extensions/loop/content/shared/js/views.jsx +++ b/browser/extensions/loop/content/shared/js/views.jsx @@ -854,7 +854,7 @@ loop.shared.views = (function(_, mozL10n) { if (!thumbnail) { thumbnail = this.props.useDesktopPaths ? - "loop/shared/img/icons-16x16.svg#globe" : + "shared/img/icons-16x16.svg#globe" : "shared/img/icons-16x16.svg#globe"; } diff --git a/browser/extensions/loop/moz.build b/browser/extensions/loop/moz.build index f9124ef2fe21..f53a007a2cab 100644 --- a/browser/extensions/loop/moz.build +++ b/browser/extensions/loop/moz.build @@ -4,7 +4,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -FINAL_TARGET = 'dist/bin/browser/features/loop@test.mozilla.org' +FINAL_TARGET = 'dist/bin/browser/features/loop@mozilla.org' FINAL_TARGET_FILES += [ 'bootstrap.js' diff --git a/browser/extensions/loop/skin/shared/loop.css b/browser/extensions/loop/skin/shared/loop.css index 3a81e96a6fc4..e83219f68df6 100644 --- a/browser/extensions/loop/skin/shared/loop.css +++ b/browser/extensions/loop/skin/shared/loop.css @@ -17,12 +17,12 @@ } #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar.png); + list-style-image: url(chrome://loop/skin/toolbar.png); -moz-image-region: rect(0, 18px, 18px, 0); } toolbar[brighttext] #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-inverted.png); + list-style-image: url(chrome://loop/skin/toolbar-inverted.png); } #loop-button[state="disabled"], @@ -52,12 +52,12 @@ @media (min-resolution: 1.1dppx) { #loop-button { - list-style-image: url("chrome://browser/skin/loop/toolbar@2x.png"); + list-style-image: url("chrome://loop/skin/toolbar@2x.png"); -moz-image-region: rect(0, 36px, 36px, 0); } toolbar[brighttext] #loop-button { - list-style-image: url("chrome://browser/skin/loop/toolbar-inverted@2x.png"); + list-style-image: url("chrome://loop/skin/toolbar-inverted@2x.png"); } #loop-button[state="disabled"], @@ -87,7 +87,7 @@ #loop-button[cui-areatype="menu-panel"], toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://browser/skin/loop/menuPanel@2x.png); + list-style-image: url(chrome://loop/skin/menuPanel@2x.png); -moz-image-region: rect(0, 64px, 64px, 0); } @@ -125,7 +125,7 @@ @media not all and (min-resolution: 1.1dppx) { #loop-button[cui-areatype="menu-panel"], toolbarpaletteitem[place="palette"] > #loop-button { - list-style-image: url(chrome://browser/skin/loop/menuPanel.png); + list-style-image: url(chrome://loop/skin/menuPanel.png); -moz-image-region: rect(0, 32px, 32px, 0); } diff --git a/browser/extensions/loop/skin/windows/platform.css b/browser/extensions/loop/skin/windows/platform.css index e90639bbd434..417dc6c615ea 100644 --- a/browser/extensions/loop/skin/windows/platform.css +++ b/browser/extensions/loop/skin/windows/platform.css @@ -6,13 +6,13 @@ @media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) { #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver.png) + list-style-image: url(chrome://loop/skin/toolbar-lunaSilver.png) } } @media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { #loop-button { - list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver@2x.png) + list-style-image: url(chrome://loop/skin/toolbar-lunaSilver@2x.png) } } diff --git a/browser/extensions/loop/standalone/content/css/webapp.css b/browser/extensions/loop/standalone/content/css/webapp.css index bc46ed3d9e9d..525608decf9b 100644 --- a/browser/extensions/loop/standalone/content/css/webapp.css +++ b/browser/extensions/loop/standalone/content/css/webapp.css @@ -87,7 +87,7 @@ html[dir="rtl"] .standalone-overlay-wrapper > .general-support-url { background-size: contain; width: 16px; height: 16px; - background: transparent url("../shared/img/svg/glyph-help-16x16.svg") no-repeat; + background: transparent url("../shared/img/glyph-help-16x16.svg") no-repeat; } .standalone-overlay-wrapper > .standalone-moz-logo { @@ -271,7 +271,7 @@ html[dir="rtl"] .standalone-overlay-wrapper > .standalone-moz-logo { } .room-inner-info-area > .room-waiting-area > a >.room-waiting-help { - background: transparent url("../shared/img/svg/glyph-help-16x16.svg") no-repeat; + background: transparent url("../shared/img/glyph-help-16x16.svg") no-repeat; display: inline-block; height: 16px; margin-left: 5px; diff --git a/browser/extensions/loop/standalone/content/webappEntryPoint.js b/browser/extensions/loop/standalone/content/webappEntryPoint.js index 73f7eeec03ce..526e3708fe6f 100644 --- a/browser/extensions/loop/standalone/content/webappEntryPoint.js +++ b/browser/extensions/loop/standalone/content/webappEntryPoint.js @@ -17,20 +17,20 @@ // The OpenTok SDK tries to do some heuristic detection of require and // assumes a node environment if it's present, which confuses webpack, so // we turn that off by forcing require to false in that context. -require("imports?require=>false!shared/libs/sdk.js"); +require("imports?require=>false!shared/vendor/sdk.js"); // Ultimately, we'll likely want to pull the vendor libraries from npm, as that // makes upgrading easier, and it's generally better practice to minify the // "source" versions of libraries rather than built artifacts. We probably do // want to minify them ourselves since this allows for better dead-code // elimination, but that can be a bit of judgement call. -require("exports?_!shared/libs/lodash-3.9.3.js"); +require("exports?_!shared/vendor/lodash-3.9.3.js"); // Disable Backbone's AMD auto-detection, as described at: // // https://github.com/jashkenas/backbone/wiki/Using-Backbone-without-jQuery // -require("expose?Backbone!imports?define=>false!shared/libs/backbone-1.2.1.js"); +require("expose?Backbone!imports?define=>false!shared/vendor/backbone-1.2.1.js"); /* global: __PROD__ */ if (typeof __PROD__ !== "undefined") { @@ -41,8 +41,8 @@ if (typeof __PROD__ !== "undefined") { require("expose?classNames!classnames"); } else { // our development server setup doesn't yet handle real modules, so for now... - require("shared/libs/react-0.13.3.js"); - require("shared/libs/classnames-2.2.0.js"); + require("shared/vendor/react-0.13.3.js"); + require("shared/vendor/classnames-2.2.0.js"); } diff --git a/browser/extensions/loop/standalone/server.js b/browser/extensions/loop/standalone/server.js index 5c178c34ea7f..3c6cb09f4b40 100644 --- a/browser/extensions/loop/standalone/server.js +++ b/browser/extensions/loop/standalone/server.js @@ -90,6 +90,10 @@ app.use("/content/c", express.static(path.join(__dirname, "..", "content"))); // Two lines for the same reason as /content above. app.use("/test", express.static(path.join(__dirname, "test"))); app.use("/test", express.static(path.join(__dirname, "..", "test"))); +// Hacks for desktop to stop errors being raised in the tests for content loading. +app.use("/test/shared/shared", express.static(path.join(__dirname, "..", "content/shared"))); +app.use("/test/desktop-local/shared", express.static(path.join(__dirname, "..", "content/shared"))); + // As we don't have hashes on the urls, the best way to serve the index files // appears to be to be to closely filter the url and match appropriately. diff --git a/browser/extensions/loop/test/desktop-local/README.md b/browser/extensions/loop/test/desktop-local/README.md index 5f459e32fc4a..43dc73c5c315 100644 --- a/browser/extensions/loop/test/desktop-local/README.md +++ b/browser/extensions/loop/test/desktop-local/README.md @@ -11,7 +11,7 @@ a file: or HTTP URL to run the tests. Alternately, from the top-level of your Gecko source directory, execute: ``` -./mach marionette-test browser/components/loop/test/manifest.ini +./mach marionette-test browser/extensions/loop/test/manifest.ini ``` Next steps: diff --git a/browser/extensions/loop/test/desktop-local/index.html b/browser/extensions/loop/test/desktop-local/index.html index d5108f264576..f434148925e3 100644 --- a/browser/extensions/loop/test/desktop-local/index.html +++ b/browser/extensions/loop/test/desktop-local/index.html @@ -14,17 +14,17 @@
- + - - - - + + + + @@ -50,12 +50,12 @@ - - - - - - + + + + + + diff --git a/browser/extensions/loop/test/karma/karma.coverage.desktop.js b/browser/extensions/loop/test/karma/karma.coverage.desktop.js index 6863e06041e7..67f43865cf92 100644 --- a/browser/extensions/loop/test/karma/karma.coverage.desktop.js +++ b/browser/extensions/loop/test/karma/karma.coverage.desktop.js @@ -10,11 +10,11 @@ module.exports = function(config) { // List of files / patterns to load in the browser. baseConfig.files = baseConfig.files.concat([ - "content/libs/l10n.js", - "content/shared/libs/react-0.13.3.js", - "content/shared/libs/classnames-2.2.0.js", - "content/shared/libs/lodash-3.9.3.js", - "content/shared/libs/backbone-1.2.1.js", + "content/panels/vendor/l10n.js", + "content/shared/vendor/react-0.13.3.js", + "content/shared/vendor/classnames-2.2.0.js", + "content/shared/vendor/lodash-3.9.3.js", + "content/shared/vendor/backbone-1.2.1.js", "test/shared/vendor/*.js", "test/shared/loop_mocha_utils.js", "test/karma/head.js", // Stub out DOM event listener due to races. @@ -31,11 +31,11 @@ module.exports = function(config) { "content/shared/js/views.js", "content/shared/js/textChatStore.js", "content/shared/js/textChatView.js", - "content/js/feedbackViews.js", - "content/js/conversationAppStore.js", - "content/js/roomStore.js", - "content/js/roomViews.js", - "content/js/conversation.js", + "content/panels/js/feedbackViews.js", + "content/panels/js/conversationAppStore.js", + "content/panels/js/roomStore.js", + "content/panels/js/roomViews.js", + "content/panels/js/conversation.js", "test/desktop-local/*.js" ]); @@ -47,7 +47,7 @@ module.exports = function(config) { // Preprocess matching files before serving them to the browser. // Available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor . baseConfig.preprocessors = { - "content/js/*.js": ["coverage"] + "content/panels/js/*.js": ["coverage"] }; baseConfig.coverageReporter.dir = "test/coverage/desktop"; diff --git a/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js b/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js index 7bd346cbf178..299c44f2185d 100644 --- a/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js +++ b/browser/extensions/loop/test/karma/karma.coverage.shared_standalone.js @@ -11,11 +11,11 @@ module.exports = function(config) { // List of files / patterns to load in the browser. baseConfig.files = baseConfig.files.concat([ "standalone/content/libs/l10n-gaia-02ca67948fe8.js", - "content/shared/libs/lodash-3.9.3.js", - "content/shared/libs/backbone-1.2.1.js", - "content/shared/libs/react-0.13.3.js", - "content/shared/libs/classnames-2.2.0.js", - "content/shared/libs/sdk.js", + "content/shared/vendor/lodash-3.9.3.js", + "content/shared/vendor/backbone-1.2.1.js", + "content/shared/vendor/react-0.13.3.js", + "content/shared/vendor/classnames-2.2.0.js", + "content/shared/vendor/sdk.js", "test/shared/vendor/*.js", "test/shared/loop_mocha_utils.js", "test/karma/head.js", // Add test fixture container diff --git a/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js b/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js index ae693218ebc9..0ef65728b599 100644 --- a/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js +++ b/browser/extensions/loop/test/mochitest/browser_LoopRooms_channel.js @@ -12,7 +12,7 @@ var { WebChannel } = Cu.import("resource://gre/modules/WebChannel.jsm", {}); var { Chat } = Cu.import("resource:///modules/Chat.jsm", {}); const TEST_URI = - "example.com/browser/browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html"; + "example.com/browser/browser/extensions/loop/test/mochitest/test_loopLinkClicker_channel.html"; const TEST_URI_GOOD = Services.io.newURI("https://" + TEST_URI, null, null); const TEST_URI_BAD = Services.io.newURI("http://" + TEST_URI, null, null); diff --git a/browser/extensions/loop/test/mochitest/browser_fxa_login.js b/browser/extensions/loop/test/mochitest/browser_fxa_login.js index 9036c06ad98d..0d5e359aff27 100644 --- a/browser/extensions/loop/test/mochitest/browser_fxa_login.js +++ b/browser/extensions/loop/test/mochitest/browser_fxa_login.js @@ -8,7 +8,7 @@ "use strict"; const BASE_URL = Services.prefs.getCharPref("loop.server"); -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); function* checkFxA401() { let err = MozLoopService.errors.get("login"); diff --git a/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js b/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js index ae7f6eeaee1e..62c30531b6ad 100644 --- a/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js +++ b/browser/extensions/loop/test/mochitest/browser_loop_fxa_server.js @@ -7,7 +7,7 @@ "use strict"; -const BASE_URL = "http://mochi.test:8888/browser/browser/components/loop/test/mochitest/loop_fxa.sjs?"; +const BASE_URL = "http://mochi.test:8888/browser/browser/extensions/loop/test/mochitest/loop_fxa.sjs?"; registerCleanupFunction(function* () { yield promiseDeletedOAuthParams(BASE_URL); diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js index 5528f9036dd5..6c96ebef236b 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_appVersionInfo.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); add_task(function* test_mozLoop_appVersionInfo() { diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js index e5b3bd9563b3..424de044dbf8 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_context.js @@ -7,7 +7,7 @@ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); function promiseGetMetadata() { diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js index 04dc02256089..78aa1428199b 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_sharingListeners.js @@ -6,7 +6,7 @@ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); var handlers = [ diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js index 0347ed9d936c..21c416962d20 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_socialShare.js @@ -4,7 +4,7 @@ Cu.import("resource://gre/modules/Promise.jsm"); const { SocialService } = Cu.import("resource://gre/modules/SocialService.jsm", {}); -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); diff --git a/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js b/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js index 8746c2ca579a..7a2b42190613 100644 --- a/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js +++ b/browser/extensions/loop/test/mochitest/browser_mozLoop_telemetry.js @@ -7,7 +7,7 @@ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); var gConstants; gHandlers.GetAllConstants({}, constants => gConstants = constants); diff --git a/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js b/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js index 4023ce9db724..707212e5a99c 100644 --- a/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js +++ b/browser/extensions/loop/test/mochitest/browser_toolbarbutton.js @@ -8,7 +8,7 @@ "use strict"; Components.utils.import("resource://gre/modules/Promise.jsm", this); -const { LoopRoomsInternal } = Components.utils.import("resource:///modules/loop/LoopRooms.jsm", {}); +const { LoopRoomsInternal } = Components.utils.import("chrome://loop/content/modules/LoopRooms.jsm", {}); Services.prefs.setBoolPref("loop.gettingStarted.seen", true); const fxASampleToken = { diff --git a/browser/extensions/loop/test/mochitest/head.js b/browser/extensions/loop/test/mochitest/head.js index 5f6baa274fe1..ba0315b1b919 100644 --- a/browser/extensions/loop/test/mochitest/head.js +++ b/browser/extensions/loop/test/mochitest/head.js @@ -8,8 +8,8 @@ const { LOOP_SESSION_TYPE, MozLoopServiceInternal, MozLoopService -} = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); -const { LoopRooms } = Cu.import("resource:///modules/loop/LoopRooms.jsm", {}); +} = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); +const { LoopRooms } = Cu.import("chrome://loop/content/modules/LoopRooms.jsm", {}); // Cache this value only once, at the beginning of a // test run, so that it doesn't pick up the offline=true @@ -133,7 +133,7 @@ function promiseOAuthParamsSetup(baseURL, params) { } function* resetFxA() { - let global = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); + let global = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); global.gHawkClient = null; global.gFxAOAuthClientPromise = null; global.gFxAOAuthClient = null; @@ -152,7 +152,7 @@ function checkFxAOAuthTokenData(aValue) { } function checkLoggedOutState() { - let global = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); + let global = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); is(global.gFxAOAuthClientPromise, null, "gFxAOAuthClientPromise should be cleared"); is(MozLoopService.userProfile, null, "fxAOAuthProfile should be cleared"); is(global.gFxAOAuthClient, null, "gFxAOAuthClient should be cleared"); diff --git a/browser/extensions/loop/test/shared/index.html b/browser/extensions/loop/test/shared/index.html index 6489871738e5..95f94ad1b1f8 100644 --- a/browser/extensions/loop/test/shared/index.html +++ b/browser/extensions/loop/test/shared/index.html @@ -14,16 +14,16 @@
- + - - - + + + diff --git a/browser/extensions/loop/test/shared/views_test.js b/browser/extensions/loop/test/shared/views_test.js index 3cf0188aeba5..b71ccbcb09b3 100644 --- a/browser/extensions/loop/test/shared/views_test.js +++ b/browser/extensions/loop/test/shared/views_test.js @@ -840,7 +840,7 @@ describe("loop.shared.views", function() { }); expect(view.getDOMNode().querySelector(".context-preview").getAttribute("src")) - .eql("loop/shared/img/icons-16x16.svg#globe"); + .eql("shared/img/icons-16x16.svg#globe"); }); it("should not display a title if by default", function() { diff --git a/browser/extensions/loop/test/standalone/index.html b/browser/extensions/loop/test/standalone/index.html index 5af0462cf562..a8ffd06fa7a1 100644 --- a/browser/extensions/loop/test/standalone/index.html +++ b/browser/extensions/loop/test/standalone/index.html @@ -14,16 +14,16 @@
- + - - - + + + diff --git a/browser/extensions/loop/test/xpcshell/.eslintrc b/browser/extensions/loop/test/xpcshell/.eslintrc index e61193d5f6c3..7732b0d1ce76 100644 --- a/browser/extensions/loop/test/xpcshell/.eslintrc +++ b/browser/extensions/loop/test/xpcshell/.eslintrc @@ -17,6 +17,7 @@ "do_timeout": false, "run_next_test": false, // head.js items. + "FileUtils": false, "MockWebSocketChannel": false, "extend": true, "getLoopString": false, @@ -27,7 +28,8 @@ "mockPushHandler": true, "setupFakeFxAUserProfile": false, "setupFakeLoopServer": false, - "timerHandlers", + "timerHandlers": false, + "updateAppInfo": false, "waitForCondition": true, // Loop specific items "MozLoopServiceInternal": true, diff --git a/browser/extensions/loop/test/xpcshell/head.js b/browser/extensions/loop/test/xpcshell/head.js index 820510ce0d51..3f8f1e008021 100644 --- a/browser/extensions/loop/test/xpcshell/head.js +++ b/browser/extensions/loop/test/xpcshell/head.js @@ -12,15 +12,15 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Http.jsm"); Cu.import("resource://testing-common/httpd.js"); -Cu.import("resource:///modules/loop/MozLoopService.jsm"); +Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); +Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); Cu.import("resource://gre/modules/osfile.jsm"); -const { MozLoopServiceInternal } = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}); -const { LoopRoomsInternal, timerHandlers } = Cu.import("resource:///modules/loop/LoopRooms.jsm", {}); +const { MozLoopServiceInternal } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm", {}); +const { LoopRoomsInternal, timerHandlers } = Cu.import("chrome://loop/content/modules/LoopRooms.jsm", {}); XPCOMUtils.defineLazyModuleGetter(this, "MozLoopPushHandler", - "resource:///modules/loop/MozLoopPushHandler.jsm"); + "chrome://loop/content/modules/MozLoopPushHandler.jsm"); const kMockWebSocketChannelName = "Mock WebSocket Channel"; const kWebSocketChannelContractID = "@mozilla.org/network/protocol;1?name=wss"; diff --git a/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js b/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js index bb32bfb1034e..5a86540b1d3c 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js +++ b/browser/extensions/loop/test/xpcshell/test_loopapi_doNotDisturb.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); add_task(function* test_mozLoop_doNotDisturb() { diff --git a/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js b/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js index 313b06d82fa6..17066b85c27d 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js +++ b/browser/extensions/loop/test/xpcshell/test_loopapi_internal.js @@ -3,7 +3,7 @@ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); const [LoopAPIInternal] = LoopAPI.inspect(); add_test(function test_intialize() { diff --git a/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js b/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js index 2d84a94a3df4..1142acfbdb05 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js +++ b/browser/extensions/loop/test/xpcshell/test_loopapi_prefs.js @@ -2,7 +2,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -const { LoopAPI } = Cu.import("resource:///modules/loop/MozLoopAPI.jsm", {}); +const { LoopAPI } = Cu.import("chrome://loop/content/modules/MozLoopAPI.jsm", {}); var [, gHandlers] = LoopAPI.inspect(); add_task(function* test_mozLoop_charPref() { diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms.js b/browser/extensions/loop/test/xpcshell/test_looprooms.js index 2ead43579f2f..6930b3cf07d2 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms.js @@ -5,7 +5,7 @@ "use strict"; Cu.import("resource://services-common/utils.js"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); +Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); Cu.import("resource:///modules/Chat.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js b/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js index 23ef34e64ee9..1d2eb38c0d4c 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js @@ -7,7 +7,7 @@ timerHandlers.startTimer = callback => callback(); Cu.import("resource://services-common/utils.js"); -const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("resource:///modules/loop/LoopRoomsCache.jsm", {}); +const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("chrome://loop/content/modules/LoopRoomsCache.jsm", {}); const kContextEnabledPref = "loop.contextInConverations.enabled"; diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js b/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js index daaa6cd8f599..d32321f26a1b 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms_first_notification.js @@ -4,7 +4,7 @@ "use strict"; Cu.import("resource://services-common/utils.js"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); +Cu.import("chrome://loop/content/modules/LoopRooms.jsm"); Cu.import("resource:///modules/Chat.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js b/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js index 534ec287f1a4..b4351e16a7eb 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms_getall.js @@ -4,7 +4,6 @@ "use strict"; Cu.import("resource://services-common/utils.js"); -Cu.import("resource:///modules/loop/LoopRooms.jsm"); Cu.import("resource:///modules/Chat.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); diff --git a/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js b/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js index 36fdac465fb6..acd73e23950e 100644 --- a/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js +++ b/browser/extensions/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js @@ -6,8 +6,8 @@ Cu.import("resource://services-common/utils.js"); -const loopCrypto = Cu.import("resource:///modules/loop/crypto.js", {}).LoopCrypto; -const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("resource:///modules/loop/LoopRoomsCache.jsm", {}); +const loopCrypto = Cu.import("chrome://loop/content/shared/js/crypto.js", {}).LoopCrypto; +const { LOOP_ROOMS_CACHE_FILENAME } = Cu.import("chrome://loop/content/modules/LoopRoomsCache.jsm", {}); var gTimerArgs = []; diff --git a/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js b/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js index 9cbe314ff0e9..96d2f298c219 100644 --- a/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js +++ b/browser/extensions/loop/test/xpcshell/test_loopservice_hawk_errors.js @@ -10,7 +10,7 @@ "use strict"; -const { INVALID_AUTH_TOKEN } = Cu.import("resource:///modules/loop/MozLoopService.jsm"); +const { INVALID_AUTH_TOKEN } = Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); /** * An HTTP request for /NNN responds with a request with a status of NNN. diff --git a/browser/extensions/loop/ui/README.md b/browser/extensions/loop/ui/README.md index a0025bb5cff9..f3912bc0090b 100644 --- a/browser/extensions/loop/ui/README.md +++ b/browser/extensions/loop/ui/README.md @@ -5,6 +5,6 @@ This app file showcases all Loop's view components. If you want to modify the app, launch the following command: - browser/components/loop/build-jsx --watch + browser/extensions/loop/build-jsx --watch And start editing the `ui-showcase.jsx` file. diff --git a/browser/extensions/loop/ui/index.html b/browser/extensions/loop/ui/index.html index 1ea6254e3277..b0581de67d22 100644 --- a/browser/extensions/loop/ui/index.html +++ b/browser/extensions/loop/ui/index.html @@ -10,7 +10,7 @@ + href="../content/panels/css/panel.css"> @@ -25,10 +25,10 @@
- - - - + + + + @@ -43,16 +43,16 @@ - + - - + + - - + + From cd24cc24cedda99aa33e36182a33559589ff0989 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 29 Nov 2015 17:08:35 +0000 Subject: [PATCH 150/153] Bug 1223573 - Part 6. Tidy up bootstrap.js add enough setup to get xpcshell-tests passing again. r=mikedeboer --- browser/extensions/loop/bootstrap.js | 51 ++++++++++++++++--- browser/extensions/loop/test/xpcshell/head.js | 37 ++++++++++++++ 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js index 3626102d6a29..342800e74d60 100644 --- a/browser/extensions/loop/bootstrap.js +++ b/browser/extensions/loop/bootstrap.js @@ -1,9 +1,18 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +const { utils: Cu, classes: Cc } = Components; + +Cu.import("resource://gre/modules/Services.jsm"); var WindowListener = { - + /** + * Sets up the chrome integration within browser windows for Loop. + * + * @param {Object} window The window to inject the integration into. + */ setupBrowserUI: function(window) { const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; const kBrowserSharingNotificationId = "loop-sharing-notification"; @@ -22,7 +31,7 @@ var WindowListener = { */ get toolbarButton() { delete this.toolbarButton; - return this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window); + return (this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window)); }, /** @@ -30,7 +39,7 @@ var WindowListener = { */ get panel() { delete this.panel; - return this.panel = document.getElementById("loop-notification-panel"); + return (this.panel = document.getElementById("loop-notification-panel")); }, /** @@ -93,7 +102,7 @@ var WindowListener = { win.LoopUI.togglePanel(event, tabId); }; Services.obs.addObserver(obs, "browser-delayed-startup-finished", false); - return OpenBrowserWindow(); + return window.OpenBrowserWindow(); } if (this.panel.state == "open") { return new Promise(resolve => { @@ -106,7 +115,7 @@ var WindowListener = { let fm = Services.focus; fm.moveFocus(doc.defaultView, null, fm.MOVEFOCUS_FIRST, fm.FLAG_NOSCROLL); }).catch(err => { - Cu.reportError(x); + Cu.reportError(err); }); }, @@ -383,7 +392,9 @@ var WindowListener = { try { window.focus(); - } catch (ex) {} + } catch (ex) { + // Do nothing. + } // We need a setTimeout here, otherwise the panel won't show after the // window received focus. @@ -616,4 +627,32 @@ var WindowListener = { XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); } +}; + +/** + * Loads the default preferences from the prefs file. This loads the preferences + * into the default branch, so they don't appear as user preferences. + */ +function loadDefaultPrefs() { + var branch = Services.prefs.getDefaultBranch(""); + Services.scriptloader.loadSubScript("chrome://loop/content/preferences/prefs.js", { + pref: (key, val) => { + switch (typeof val) { + case "boolean": + branch.setBoolPref(key, val); + break; + case "number": + branch.setIntPref(key, val); + break; + case "string": + branch.setCharPref(key, val); + break; + } + } + }); +} + + +function startup(data, reason) { + loadDefaultPrefs(); } diff --git a/browser/extensions/loop/test/xpcshell/head.js b/browser/extensions/loop/test/xpcshell/head.js index 3f8f1e008021..31378fafdf36 100644 --- a/browser/extensions/loop/test/xpcshell/head.js +++ b/browser/extensions/loop/test/xpcshell/head.js @@ -10,6 +10,43 @@ do_get_profile(); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); + +// Setup the add-ons manager for this test. +Cu.import("resource://gre/modules/FileUtils.jsm"); + +function registerDirectory(key, dir) { + let dirProvider = { + getFile: function(prop, persistent) { + persistent.value = false; + if (prop == key) { + return dir.clone(); + } + return null; + }, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsIDirectoryServiceProvider, + Ci.nsISupports]) + }; + Services.dirsvc.registerProvider(dirProvider); +} + +// As we're not running in application, we need to setup the features directory +// manually. +const distroDir = FileUtils.getDir("GreD", ["browser", "features"], true); +registerDirectory("XREAppFeat", distroDir); + +// Set up application info - xpcshell doesn't have this by default. +Cu.import("resource://testing-common/AppInfo.jsm"); +updateAppInfo(); + +// Now trigger the addons-startup, and hence startup the manager itself. This +// should load the manager correctly. +var gInternalManager = Cc["@mozilla.org/addons/integration;1"] + .getService(Ci.nsIObserver) + .QueryInterface(Ci.nsITimerCallback); + +gInternalManager.observe(null, "addons-startup", null); + Cu.import("resource://gre/modules/Http.jsm"); Cu.import("resource://testing-common/httpd.js"); Cu.import("chrome://loop/content/modules/MozLoopService.jsm"); From e6eca0f818f023dffa1e0aafb11b84b5cc18b2ad Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 29 Nov 2015 17:08:35 +0000 Subject: [PATCH 151/153] Bug 1223573 - Part 7. Add support in bootstrap.js for starting Loop and displaying the button. Also get all tests passing again. r=mikedeboer --- browser/components/about/AboutRedirector.cpp | 4 +- .../customizableui/CustomizableWidgets.jsm | 36 --- browser/extensions/loop/.eslintrc-gecko | 1 + browser/extensions/loop/bootstrap.js | 205 +++++++++++++++++- testing/profiles/prefs_general.js | 2 +- 5 files changed, 200 insertions(+), 48 deletions(-) diff --git a/browser/components/about/AboutRedirector.cpp b/browser/components/about/AboutRedirector.cpp index e9a60346fe65..78f55c9b64c1 100644 --- a/browser/components/about/AboutRedirector.cpp +++ b/browser/components/about/AboutRedirector.cpp @@ -108,12 +108,12 @@ static RedirEntry kRedirMap[] = { { "debugging", "chrome://devtools/content/aboutdebugging/aboutdebugging.xhtml", nsIAboutModule::ALLOW_SCRIPT }, - { "loopconversation", "chrome://browser/content/loop/conversation.html", + { "loopconversation", "chrome://loop/content/panels/conversation.html", nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT | nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::HIDE_FROM_ABOUTABOUT | nsIAboutModule::ENABLE_INDEXED_DB }, - { "looppanel", "chrome://browser/content/loop/panel.html", + { "looppanel", "chrome://loop/content/panels/panel.html", nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT | nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::HIDE_FROM_ABOUTABOUT | diff --git a/browser/components/customizableui/CustomizableWidgets.jsm b/browser/components/customizableui/CustomizableWidgets.jsm index 82c6f2bf4d33..b7a1fc9d0aab 100644 --- a/browser/components/customizableui/CustomizableWidgets.jsm +++ b/browser/components/customizableui/CustomizableWidgets.jsm @@ -950,42 +950,6 @@ const CustomizableWidgets = [ let win = aEvent.view; win.MailIntegration.sendLinkForBrowser(win.gBrowser.selectedBrowser) } - }, { - id: "loop-button", - type: "custom", - label: "loop-call-button3.label", - tooltiptext: "loop-call-button3.tooltiptext2", - privateBrowsingTooltiptext: "loop-call-button3-pb.tooltiptext", - defaultArea: CustomizableUI.AREA_NAVBAR, - introducedInVersion: 4, - onBuild: function(aDocument) { - // If we're not supposed to see the button, return zip. - if (!Services.prefs.getBoolPref("loop.enabled")) { - return null; - } - - let isWindowPrivate = PrivateBrowsingUtils.isWindowPrivate(aDocument.defaultView); - - let node = aDocument.createElementNS(kNSXUL, "toolbarbutton"); - node.setAttribute("id", this.id); - node.classList.add("toolbarbutton-1"); - node.classList.add("chromeclass-toolbar-additional"); - node.classList.add("badged-button"); - node.setAttribute("label", CustomizableUI.getLocalizedProperty(this, "label")); - if (isWindowPrivate) - node.setAttribute("disabled", "true"); - let tooltiptext = isWindowPrivate ? - CustomizableUI.getLocalizedProperty(this, "privateBrowsingTooltiptext", - [CustomizableUI.getLocalizedProperty(this, "label")]) : - CustomizableUI.getLocalizedProperty(this, "tooltiptext"); - node.setAttribute("tooltiptext", tooltiptext); - node.setAttribute("removable", "true"); - node.addEventListener("command", function(event) { - aDocument.defaultView.LoopUI.togglePanel(event); - }); - - return node; - } }, { id: "web-apps-button", label: "web-apps-button.label", diff --git a/browser/extensions/loop/.eslintrc-gecko b/browser/extensions/loop/.eslintrc-gecko index 3fda68491412..5c377481cb82 100644 --- a/browser/extensions/loop/.eslintrc-gecko +++ b/browser/extensions/loop/.eslintrc-gecko @@ -42,6 +42,7 @@ "MozLoopPushHandler": true, "MozLoopService": true, "OS": false, + "PrivateBrowsingUtils": false, "roomsPushNotification": true, "Services": false, "Social": false, diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js index 342800e74d60..360257149182 100644 --- a/browser/extensions/loop/bootstrap.js +++ b/browser/extensions/loop/bootstrap.js @@ -3,10 +3,26 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -const { utils: Cu, classes: Cc } = Components; +const { interfaces: Ci, utils: Cu, classes: Cc } = Components; + +const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; +const kBrowserSharingNotificationId = "loop-sharing-notification"; +const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar"; Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", + "resource://gre/modules/PrivateBrowsingUtils.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI", + "resource:///modules/CustomizableUI.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Task", + "resource://gre/modules/Task.jsm"); + +/** + * This window listener gets loaded into each browser.xul window and is used + * to provide the required loop functions for the window. + */ var WindowListener = { /** * Sets up the chrome integration within browser windows for Loop. @@ -14,10 +30,6 @@ var WindowListener = { * @param {Object} window The window to inject the integration into. */ setupBrowserUI: function(window) { - const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - const kBrowserSharingNotificationId = "loop-sharing-notification"; - const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar"; - let document = window.document; let gBrowser = window.gBrowser; let xhrClass = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]; @@ -254,6 +266,11 @@ var WindowListener = { * delayedStartup. */ init: function() { + // Cleanup when the window unloads. + window.addEventListener("unload", () => { + this.uninit(); + }); + // Add observer notifications before the service is initialized Services.obs.addObserver(this, "loop-status-changed", false); @@ -597,7 +614,7 @@ var WindowListener = { this.PlacesUtils.promiseFaviconLinkUrl(pageURI).then(uri => { // We XHR the favicon to get a File object, which we can pass to the FileReader // object. The FileReader turns the File object into a data-uri. - let xhr = new XMLHttpRequest(); + let xhr = xhrClass.createInstance(Ci.nsIXMLHttpRequest); xhr.open("get", uri.spec, true); xhr.responseType = "blob"; xhr.overrideMimeType("image/x-icon"); @@ -626,9 +643,89 @@ var WindowListener = { XPCOMUtils.defineLazyModuleGetter(LoopUI, "MozLoopService", "chrome://loop/content/modules/MozLoopService.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PanelFrame", "resource:///modules/PanelFrame.jsm"); XPCOMUtils.defineLazyModuleGetter(LoopUI, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"); + + LoopUI.init(); + window.LoopUI = LoopUI; + }, + + tearDownBrowserUI: function(window) { + let document = window.document; + + // Take any steps to remove UI or anything from the browser window + // document.getElementById() etc. will work here + // XXX Add in tear-down of the panel. + }, + + // nsIWindowMediatorListener functions. + onOpenWindow: function(xulWindow) { + // A new window has opened. + let domWindow = xulWindow.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindow); + + // Wait for it to finish loading. + domWindow.addEventListener("load", function listener() { + domWindow.removeEventListener("load", listener, false); + + // If this is a browser window then setup its UI. + if (domWindow.document.documentElement.getAttribute("windowtype") == "navigator:browser") { + WindowListener.setupBrowserUI(domWindow); + } + }, false); + }, + + onCloseWindow: function(xulWindow) { + }, + + onWindowTitleChange: function(xulWindow, newTitle) { } }; +/** + * Creates the loop button on the toolbar. Due to loop being a system-addon + * CustomizableUI already has a placement location for the button, so that + * we can be on the toolbar. + */ +function createLoopButton() { + CustomizableUI.createWidget({ + id: "loop-button", + type: "custom", + label: "loop-call-button3.label", + tooltiptext: "loop-call-button3.tooltiptext2", + privateBrowsingTooltiptext: "loop-call-button3-pb.tooltiptext", + defaultArea: CustomizableUI.AREA_NAVBAR, + removable: true, + onBuild: function(aDocument) { + // If we're not supposed to see the button, return zip. + if (!Services.prefs.getBoolPref("loop.enabled")) { + return null; + } + + let isWindowPrivate = PrivateBrowsingUtils.isWindowPrivate(aDocument.defaultView); + + let node = aDocument.createElementNS(kNSXUL, "toolbarbutton"); + node.setAttribute("id", this.id); + node.classList.add("toolbarbutton-1"); + node.classList.add("chromeclass-toolbar-additional"); + node.classList.add("badged-button"); + node.setAttribute("label", CustomizableUI.getLocalizedProperty(this, "label")); + if (isWindowPrivate) { + node.setAttribute("disabled", "true"); + } + let tooltiptext = isWindowPrivate ? + CustomizableUI.getLocalizedProperty(this, "privateBrowsingTooltiptext", + [CustomizableUI.getLocalizedProperty(this, "label")]) : + CustomizableUI.getLocalizedProperty(this, "tooltiptext"); + node.setAttribute("tooltiptext", tooltiptext); + node.setAttribute("removable", "true"); + node.addEventListener("command", function(event) { + aDocument.defaultView.LoopUI.togglePanel(event); + }); + + return node; + } + }); +} + /** * Loads the default preferences from the prefs file. This loads the preferences * into the default branch, so they don't appear as user preferences. @@ -646,13 +743,103 @@ function loadDefaultPrefs() { break; case "string": branch.setCharPref(key, val); - break; + break; } } }); } - -function startup(data, reason) { +/** + * Called when the add-on is started, e.g. when installed or when Firefox starts. + */ +function startup() { loadDefaultPrefs(); + + createLoopButton(); + + // Attach to hidden window (for OS X). + try { + WindowListener.setupBrowserUI(Services.appShell.hiddenDOMWindow); + } catch (ex) { + // Hidden window didn't exist, so wait until startup is done. + let topic = "browser-delayed-startup-finished"; + Services.obs.addObserver(function observer() { + Services.obs.removeObserver(observer, topic); + WindowListener.setupBrowserUI(Services.appShell.hiddenDOMWindow); + }, topic, false); + } + + // Attach to existing browser windows, for modifying UI. + let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); + let windows = wm.getEnumerator("navigator:browser"); + while (windows.hasMoreElements()) { + let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); + WindowListener.setupBrowserUI(domWindow); + } + + // Wait for any new browser windows to open. + wm.addListener(WindowListener); + + // Load our stylesheets. + let styleSheetService = Cc["@mozilla.org/content/style-sheet-service;1"] + .getService(Components.interfaces.nsIStyleSheetService); + let sheets = ["chrome://loop-shared/skin/loop.css", + "chrome://loop/skin/platform.css"]; + for (let sheet of sheets) { + let styleSheetURI = Services.io.newURI(sheet, null, null); + styleSheetService.loadAndRegisterSheet(styleSheetURI, + styleSheetService.AUTHOR_SHEET); + } } + +/** + * Called when the add-on is shutting down, could be for re-installation + * or just uninstall. + */ +function shutdown() { + // Close any open chat windows + Cu.import("resource:///modules/Chat.jsm"); + let isLoopURL = ({ src }) => /^about:loopconversation#/.test(src); + [...Chat.chatboxes].filter(isLoopURL).forEach(chatbox => { + chatbox.content.contentWindow.close(); + }); + + // Detach from hidden window (for OS X). + WindowListener.tearDownBrowserUI(Services.appShell.hiddenDOMWindow); + + // Detach from browser windows. + let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); + let windows = wm.getEnumerator("navigator:browser"); + while (windows.hasMoreElements()) { + let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); + WindowListener.tearDownBrowserUI(domWindow); + } + + // Stop waiting for browser windows to open. + wm.removeListener(WindowListener); + + CustomizableUI.destroyWidget("loop-button"); + + // Unload stylesheets. + let styleSheetService = Cc["@mozilla.org/content/style-sheet-service;1"] + .getService(Components.interfaces.nsIStyleSheetService); + let sheets = ["chrome://loop/content/addon/css/loop.css", + "chrome://loop/skin/platform.css"]; + for (let sheet of sheets) { + let styleSheetURI = Services.io.newURI(sheet, null, null); + if (styleSheetService.sheetRegistered(styleSheetURI, + styleSheetService.USER_SHEET)) { + styleSheetService.unregisterSheet(styleSheetURI, + styleSheetService.USER_SHEET); + } + } + + // Unload modules. + Cu.unload("chrome://loop/content/modules/MozLoopAPI.jsm"); + Cu.unload("chrome://loop/content/modules/LoopRooms.jsm"); + Cu.unload("chrome://loop/content/modules/MozLoopService.jsm"); +} + +function install() {} + +function uninstall() {} diff --git a/testing/profiles/prefs_general.js b/testing/profiles/prefs_general.js index 637b4e4704f2..949414856781 100644 --- a/testing/profiles/prefs_general.js +++ b/testing/profiles/prefs_general.js @@ -286,7 +286,7 @@ user_pref("browser.newtabpage.directory.ping", ""); user_pref("loop.debug.loglevel", "All"); user_pref("loop.enabled", true); user_pref("loop.throttled", false); -user_pref("loop.server", "http://%(server)s/browser/browser/components/loop/test/mochitest/loop_fxa.sjs?"); +user_pref("loop.server", "http://%(server)s/browser/browser/extensions/loop/test/mochitest/loop_fxa.sjs?"); user_pref("loop.CSP","default-src 'self' about: file: chrome: data: wss://* http://* https://*"); // Ensure UITour won't hit the network From d012991dded5913279e8282f26387fe40fd1a10f Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 29 Nov 2015 17:08:35 +0000 Subject: [PATCH 152/153] Bug 1223573 - Part 8. Work around assertions caused by attempting to load the style sheets as author sheets - load them as user sheets for now. r=mikedeboer --- browser/extensions/loop/bootstrap.js | 6 +- browser/extensions/loop/skin/osx/platform.css | 60 +++++---- browser/extensions/loop/skin/shared/loop.css | 116 +++++++++--------- .../extensions/loop/skin/windows/platform.css | 28 +++-- 4 files changed, 118 insertions(+), 92 deletions(-) diff --git a/browser/extensions/loop/bootstrap.js b/browser/extensions/loop/bootstrap.js index 360257149182..85c28beb062a 100644 --- a/browser/extensions/loop/bootstrap.js +++ b/browser/extensions/loop/bootstrap.js @@ -787,8 +787,12 @@ function startup() { "chrome://loop/skin/platform.css"]; for (let sheet of sheets) { let styleSheetURI = Services.io.newURI(sheet, null, null); + // XXX We would love to specify AUTHOR_SHEET here and in shutdown, however + // bug 1228542 prevents us from doing that as we'd cause a lot of assertions + // in debug mode for tests. Once that is fixed, we should be able to change + // this, and remove the !important attributes from our syle sheets. styleSheetService.loadAndRegisterSheet(styleSheetURI, - styleSheetService.AUTHOR_SHEET); + styleSheetService.USER_SHEET); } } diff --git a/browser/extensions/loop/skin/osx/platform.css b/browser/extensions/loop/skin/osx/platform.css index 49691b879c38..f4ba1617c299 100644 --- a/browser/extensions/loop/skin/osx/platform.css +++ b/browser/extensions/loop/skin/osx/platform.css @@ -4,36 +4,44 @@ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); -notification[value="loop-sharing-notification"] { - background: #00a9dc; - padding: 0; - border: 0; -} +/* Only apply to browser.xul documents */ +@-moz-document url("chrome://browser/content/browser.xul") { + /** + * XXX Due to bug 1228542, anything in this file that overrides a browser style + * must specify !important. Otherwise the style won't get applied correctly + * due to the limitations caused by the bug. + */ -notification[value="loop-sharing-notification"].paused { - background: #ebebeb; -} + notification[value="loop-sharing-notification"] { + background: #00a9dc !important; + padding: 0 !important; + border: 0 !important; + } -notification[value="loop-sharing-notification"] .notification-button { - background: #fff; - border-radius: 0; -} + notification[value="loop-sharing-notification"].paused { + background: #ebebeb !important; + } -notification[value="loop-sharing-notification"].paused .notification-button { - background: #57bd35; -} + notification[value="loop-sharing-notification"] .notification-button { + background: #fff !important; + border-radius: 0 !important; + } -notification[value="loop-sharing-notification"].paused .notification-button:hover { - background: #39a017; -} + notification[value="loop-sharing-notification"].paused .notification-button { + background: #57bd35 !important; + } -notification[value="loop-sharing-notification"] .notification-button:hover, -notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background: #ebebeb; -} + notification[value="loop-sharing-notification"].paused .notification-button:hover { + background: #39a017 !important; + } -notification[value="loop-sharing-notification"] .notification-button-default, -notification[value="loop-sharing-notification"].paused .notification-button-default { - background: #fff; -} + notification[value="loop-sharing-notification"] .notification-button:hover, + notification[value="loop-sharing-notification"].paused .notification-button-default:hover { + background: #ebebeb !important; + } + notification[value="loop-sharing-notification"] .notification-button-default, + notification[value="loop-sharing-notification"].paused .notification-button-default { + background: #fff !important; + } +} diff --git a/browser/extensions/loop/skin/shared/loop.css b/browser/extensions/loop/skin/shared/loop.css index e83219f68df6..14bc6062bf61 100644 --- a/browser/extensions/loop/skin/shared/loop.css +++ b/browser/extensions/loop/skin/shared/loop.css @@ -6,14 +6,20 @@ /* Only apply to browser.xul documents */ @-moz-document url("chrome://browser/content/browser.xul") { + /** + * XXX Due to bug 1228542, anything in this file that overrides a browser style + * must specify !important. Otherwise the style won't get applied correctly + * due to the limitations caused by the bug. + */ + /* XXX Copied from browser/themes//browser.css. Should really be changing the sizes of icons in files to 16px x 16px and no borders. */ :-moz-any(toolbar, .widget-overflow-list) #loop-button > .toolbarbutton-icon, :-moz-any(toolbar, .widget-overflow-list) #loop-button > :-moz-any(.toolbarbutton-menubutton-button, .toolbarbutton-badge-stack) > .toolbarbutton-icon { - max-width: 18px; - margin: 0; + max-width: 18px !important; + margin: 0 !important; } #loop-button { @@ -161,120 +167,120 @@ } notification[value="loop-sharing-notification"] { - -moz-appearance: none; - height: 40px; - background-color: #00a9dc; - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; + -moz-appearance: none !important; + height: 40px !important; + background-color: #00a9dc !important; + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset !important; } notification[value="loop-sharing-notification"].paused { - background-color: #ebebeb; + background-color: #ebebeb !important; } notification[value="loop-sharing-notification"] .notification-inner { - color: #fff; - padding: 0; + color: #fff !important; + padding: 0 !important; } notification[value="loop-sharing-notification"].paused .notification-inner { - color: #00a9dc; + color: #00a9dc !important; } notification[value="loop-sharing-notification"] .notification-button { - -moz-appearance: none; - background-color: #fff; - border: 0; - border-right: solid 1px #ebebeb; - width: 100px; - height: 40px; - margin: 0; - list-style-image: url(chrome://browser/content/loop/shared/img/pause-12x12.svg); - box-shadow: 0 40px 1px rgba(0,0,0,.5) inset; - text-shadow: none; + -moz-appearance: none !important; + background-color: #fff !important; + border: 0 !important; + border-right: solid 1px #ebebeb !important; + width: 100px !important; + height: 40px !important; + margin: 0 !important; + list-style-image: url(chrome://loop/content/shared/img/pause-12x12.svg) !important; + box-shadow: 0 40px 1px rgba(0,0,0,.5) inset !important; + text-shadow: none !important; } notification[value="loop-sharing-notification"] .notification-button:-moz-locale-dir(rtl) { - border-right: 0; - border-left: solid 1px #ebebeb; + border-right: 0 !important; + border-left: solid 1px #ebebeb !important; } notification[value="loop-sharing-notification"].paused .notification-button { - background-color: #57bd35; - color: #fff; - list-style-image: url(chrome://browser/content/loop/shared/img/play-12x12.svg); + background-color: #57bd35 !important; + color: #fff !important; + list-style-image: url(chrome://loop/content/shared/img/play-12x12.svg) !important; } notification[value="loop-sharing-notification"].paused .notification-button:hover { - background-color: #39a017; + background-color: #39a017 !important; } notification[value="loop-sharing-notification"] .notification-button:hover, notification[value="loop-sharing-notification"].paused .notification-button-default:hover { - background-color: #ebebeb; + background-color: #ebebeb !important; } notification[value="loop-sharing-notification"] .notification-button-default, notification[value="loop-sharing-notification"].paused .notification-button-default { - color: #d92215; - background-color: #fff; - border-right: 0; - list-style-image: url(chrome://browser/content/loop/shared/img/stop-12x12.svg); + color: #d92215 !important; + background-color: #fff !important; + border-right: 0 !important; + list-style-image: url(chrome://loop/content/shared/img/stop-12x12.svg) !important; } notification[value="loop-sharing-notification"] .notification-button .button-icon { - display: block; - -moz-margin-end: 6px; + display: block !important; + -moz-margin-end: 6px !important; } notification[value="loop-sharing-notification"] .button-menubutton-button { - min-width: 0; + min-width: 0 !important; } notification[value="loop-sharing-notification"] .messageImage { - list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-white); - margin-inline-start: 14px; + list-style-image: url(chrome://loop/content/shared/img/icons-16x16.svg#loop-icon-white) !important; + margin-inline-start: 14px !important; } notification[value="loop-sharing-notification"].paused .messageImage { - list-style-image: url(chrome://browser/content/loop/shared/img/icons-16x16.svg#loop-icon-still); + list-style-image: url(chrome://loop/content/shared/img/icons-16x16.svg#loop-icon-still) !important; } notification[value="loop-sharing-notification"] .close-icon { - display: none; + display: none !important; } chatbox[src^="about:loopconversation#"] > .chat-titlebar { - background-color: #00a9dc; - border-color: #00a9dc; + background-color: #00a9dc !important; + border-color: #00a9dc !important; } chatbox[src^="about:loopconversation#"] .chat-title { - color: white; + color: white !important; } chatbox[src^="about:loopconversation#"] .chat-minimize-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white"); + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#minimize-white") !important; } chatbox[src^="about:loopconversation#"] .chat-swap-button { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white"); + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#expand-white") !important; } .chat-loop-hangup { - list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white"); - background-color: #d13f1a; - border: 1px solid #d13f1a; - border-top-right-radius: 4px; - width: 32px; - height: 26px; - margin-top: -6px; - margin-bottom: -5px; - -moz-margin-start: 6px; - -moz-margin-end: -5px; + list-style-image: url("chrome://browser/skin/social/chat-icons.svg#exit-white") !important; + background-color: #d13f1a !important; + border: 1px solid #d13f1a !important; + border-top-right-radius: 4px !important; + width: 32px !important; + height: 26px !important; + margin-top: -6px !important; + margin-bottom: -5px !important; + -moz-margin-start: 6px !important; + -moz-margin-end: -5px !important; } .chat-toolbarbutton.chat-loop-hangup:-moz-any(:hover,:hover:active) { - background-color: #ef6745; - border-color: #ef6745; + background-color: #ef6745 !important; + border-color: #ef6745 !important; } } diff --git a/browser/extensions/loop/skin/windows/platform.css b/browser/extensions/loop/skin/windows/platform.css index 417dc6c615ea..6f0c7610e9af 100644 --- a/browser/extensions/loop/skin/windows/platform.css +++ b/browser/extensions/loop/skin/windows/platform.css @@ -4,15 +4,23 @@ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); -@media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) { - #loop-button { - list-style-image: url(chrome://loop/skin/toolbar-lunaSilver.png) +/* Only apply to browser.xul documents */ +@-moz-document url("chrome://browser/content/browser.xul") { + /** + * XXX Due to bug 1228542, anything in this file that overrides a browser style + * must specify !important. Otherwise the style won't get applied correctly + * due to the limitations caused by the bug. + */ + + @media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) { + #loop-button { + list-style-image: url(chrome://loop/skin/toolbar-lunaSilver.png) + } + } + + @media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { + #loop-button { + list-style-image: url(chrome://loop/skin/toolbar-lunaSilver@2x.png) + } } } - -@media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) { - #loop-button { - list-style-image: url(chrome://loop/skin/toolbar-lunaSilver@2x.png) - } -} - From adaa137713143c5001ef18f15343f7c3b7dad739 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Sun, 29 Nov 2015 17:08:35 +0000 Subject: [PATCH 153/153] Bug 1223573 - Part 9. Add Loop's new xpi to the talos read whitelist. r=mikedeboer,r=jmaher --- testing/talos/talos/xtalos/xperf_whitelist.json | 1 + 1 file changed, 1 insertion(+) diff --git a/testing/talos/talos/xtalos/xperf_whitelist.json b/testing/talos/talos/xtalos/xperf_whitelist.json index 6aa1928204ce..7f8110806f3b 100644 --- a/testing/talos/talos/xtalos/xperf_whitelist.json +++ b/testing/talos/talos/xtalos/xperf_whitelist.json @@ -6,6 +6,7 @@ "C:\\$logfile": {"ignore": true}, "{firefox}\\omni.ja": {"mincount": 0, "maxcount": 46, "minbytes": 0, "maxbytes": 3014656}, "{firefox}\\browser\\omni.ja": {"mincount": 0, "maxcount": 28, "minbytes": 0, "maxbytes": 1835008}, + "{firefox}\\browser\\features\\loop@mozilla.org.xpi": {"mincount": 0, "maxcount": 100, "minbytes": 0, "maxbytes": 10000000}, "{talos}\\tests\\tp5n\\tp5n.manifest": {"mincount": 0, "maxcount": 8, "minbytes": 0, "maxbytes": 32786}, "{talos}\\talos\\tests\\tp5n\\tp5n.manifest": {"mincount": 0, "maxcount": 8, "minbytes": 0, "maxbytes": 32786}, "{talos}\\tests\\tp5n\\tp5n.manifest.develop": {"mincount": 0, "maxcount": 8, "minbytes": 0, "maxbytes": 32786},