--- a/browser/components/extensions/.eslintrc
+++ b/browser/components/extensions/.eslintrc
@@ -1,18 +1,18 @@
{
"extends": "../../../toolkit/components/extensions/.eslintrc",
"globals": {
"AllWindowEvents": true,
"currentWindow": true,
"EventEmitter": true,
+ "IconDetails": true,
"makeWidgetId": true,
"pageActionFor": true,
- "IconDetails": true,
"PanelPopup": true,
"TabContext": true,
"ViewPopup": true,
"WindowEventManager": true,
"WindowListManager": true,
"WindowManager": true,
},
}
--- a/browser/components/extensions/ext-browserAction.js
+++ b/browser/components/extensions/ext-browserAction.js
@@ -1,15 +1,19 @@
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
"resource:///modules/CustomizableUI.jsm");
+XPCOMUtils.defineLazyGetter(this, "colorUtils", () => {
+ return require("devtools/shared/css-color").colorUtils;
+});
+
Cu.import("resource://devtools/shared/event-emitter.js");
Cu.import("resource://gre/modules/ExtensionUtils.jsm");
var {
EventManager,
IconDetails,
} = ExtensionUtils;
@@ -137,18 +141,18 @@ BrowserAction.prototype = {
} else {
node.setAttribute("disabled", "true");
}
let badgeNode = node.ownerDocument.getAnonymousElementByAttribute(node,
"class", "toolbarbutton-badge");
if (badgeNode) {
let color = tabData.badgeBackgroundColor;
- if (Array.isArray(color)) {
- color = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ if (color) {
+ color = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3] / 255})`;
}
badgeNode.style.backgroundColor = color || "";
}
const LEGACY_CLASS = "toolbarbutton-legacy-addon";
node.classList.remove(LEGACY_CLASS);
let baseSize = 16;
@@ -328,19 +332,24 @@ extensions.registerSchemaAPI("browserAct
getPopup: function(details) {
let tab = details.tabId !== null ? TabManager.getTab(details.tabId) : null;
let popup = BrowserAction.for(extension).getProperty(tab, "popup");
return Promise.resolve(popup);
},
setBadgeBackgroundColor: function(details) {
let tab = details.tabId !== null ? TabManager.getTab(details.tabId) : null;
- BrowserAction.for(extension).setProperty(tab, "badgeBackgroundColor", details.color);
+ let color = details.color;
+ if (!Array.isArray(color)) {
+ let col = colorUtils.colorToRGBA(color);
+ color = col && [col.r, col.g, col.b, Math.round(col.a * 255)];
+ }
+ BrowserAction.for(extension).setProperty(tab, "badgeBackgroundColor", color);
},
getBadgeBackgroundColor: function(details, callback) {
let tab = details.tabId !== null ? TabManager.getTab(details.tabId) : null;
let color = BrowserAction.for(extension).getProperty(tab, "badgeBackgroundColor");
- return Promise.resolve(color);
+ return Promise.resolve(color || [0xd9, 0, 0, 255]);
},
},
};
});
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_context.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_context.js
@@ -166,39 +166,41 @@ add_task(function* testTabSwitchContext(
"default.png": imageBuffer,
"default-2.png": imageBuffer,
"1.png": imageBuffer,
"2.png": imageBuffer,
},
getTests(tabs, expectDefaults) {
+ const DEFAULT_BADGE_COLOR = [0xd9, 0, 0, 255];
+
let details = [
{"icon": browser.runtime.getURL("default.png"),
"popup": browser.runtime.getURL("default.html"),
"title": "Default Title",
"badge": "",
- "badgeBackgroundColor": null},
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR},
{"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default.html"),
"title": "Default Title",
"badge": "",
- "badgeBackgroundColor": null},
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR},
{"icon": browser.runtime.getURL("2.png"),
"popup": browser.runtime.getURL("2.html"),
"title": "Title 2",
"badge": "2",
"badgeBackgroundColor": [0xff, 0, 0, 0xff],
- "disabled": true},
+ "disabled": true},
{"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default-2.html"),
"title": "Default Title 2",
"badge": "d2",
"badgeBackgroundColor": [0, 0xff, 0, 0xff],
- "disabled": true},
+ "disabled": true},
{"icon": browser.runtime.getURL("1.png"),
"popup": browser.runtime.getURL("default-2.html"),
"title": "Default Title 2",
"badge": "d2",
"badgeBackgroundColor": [0, 0xff, 0, 0xff],
"disabled": false},
{"icon": browser.runtime.getURL("default-2.png"),
"popup": browser.runtime.getURL("default-2.html"),
@@ -232,17 +234,17 @@ add_task(function* testTabSwitchContext(
},
expect => {
browser.test.log("Change properties. Expect new properties.");
let tabId = tabs[1];
browser.browserAction.setIcon({tabId, path: "2.png"});
browser.browserAction.setPopup({tabId, popup: "2.html"});
browser.browserAction.setTitle({tabId, title: "Title 2"});
browser.browserAction.setBadgeText({tabId, text: "2"});
- browser.browserAction.setBadgeBackgroundColor({tabId, color: [0xff, 0, 0, 0xff]});
+ browser.browserAction.setBadgeBackgroundColor({tabId, color: "#ff0000"});
browser.browserAction.disable(tabId);
expectDefaults(details[0]).then(() => {
expect(details[2]);
});
},
expect => {
browser.test.log("Navigate to a new page. Expect no changes.");
@@ -327,36 +329,38 @@ add_task(function* testDefaultTitle() {
"permissions": ["tabs"],
},
files: {
"icon.png": imageBuffer,
},
getTests(tabs, expectDefaults) {
+ const DEFAULT_BADGE_COLOR = [0xd9, 0, 0, 255];
+
let details = [
{"title": "Foo Extension",
"popup": "",
"badge": "",
- "badgeBackgroundColor": null,
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR,
"icon": browser.runtime.getURL("icon.png")},
{"title": "Foo Title",
"popup": "",
"badge": "",
- "badgeBackgroundColor": null,
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR,
"icon": browser.runtime.getURL("icon.png")},
{"title": "Bar Title",
"popup": "",
"badge": "",
- "badgeBackgroundColor": null,
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR,
"icon": browser.runtime.getURL("icon.png")},
{"title": "",
"popup": "",
"badge": "",
- "badgeBackgroundColor": null,
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR,
"icon": browser.runtime.getURL("icon.png")},
];
return [
expect => {
browser.test.log("Initial state. Expect extension title as default title.");
expectDefaults(details[0]).then(() => {
expect(details[0]);
--- a/toolkit/components/extensions/.eslintrc
+++ b/toolkit/components/extensions/.eslintrc
@@ -6,27 +6,28 @@
"Ci": true,
"Components": true,
"Cr": true,
"Cu": true,
"dump": true,
"TextDecoder": false,
"TextEncoder": false,
// Specific to WebExtensions:
+ "Extension": true,
+ "ExtensionContext": true,
+ "ExtensionManagement": true,
"extensions": true,
"global": true,
- "Extension": true,
- "ExtensionManagement": true,
- "ExtensionContext": true,
"GlobalManager": true,
+ "NetUtil": true,
"openOptionsPage": true,
+ "require": false,
"runSafe": true,
"runSafeSync": true,
"runSafeSyncWithoutClone": true,
- "NetUtil": true,
"Services": true,
"TabManager": true,
"XPCOMUtils": true,
},
"rules": {
// Rules from the mozilla plugin
"mozilla/balanced-listeners": 2,
--- a/toolkit/components/extensions/Extension.jsm
+++ b/toolkit/components/extensions/Extension.jsm
@@ -51,16 +51,22 @@ XPCOMUtils.defineLazyModuleGetter(this,
"resource://gre/modules/Task.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
"resource://gre/modules/AppConstants.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "MessageChannel",
"resource://gre/modules/MessageChannel.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "AddonManager",
"resource://gre/modules/AddonManager.jsm");
+XPCOMUtils.defineLazyGetter(this, "require", () => {
+ let obj = {};
+ Cu.import("resource://devtools/shared/Loader.jsm", obj);
+ return obj.require;
+});
+
Cu.import("resource://gre/modules/ExtensionContent.jsm");
Cu.import("resource://gre/modules/ExtensionManagement.jsm");
const BASE_SCHEMA = "chrome://extensions/content/schemas/manifest.json";
const CATEGORY_EXTENSION_SCHEMAS = "webextension-schemas";
const CATEGORY_EXTENSION_SCRIPTS = "webextension-scripts";
Cu.import("resource://gre/modules/ExtensionUtils.jsm");
@@ -114,20 +120,21 @@ var Management = {
for (let [/* name */, value] of XPCOMUtils.enumerateCategoryEntries(CATEGORY_EXTENSION_SCHEMAS)) {
promises.push(Schemas.load(value));
}
return Promise.all(promises);
});
for (let [/* name */, value] of XPCOMUtils.enumerateCategoryEntries(CATEGORY_EXTENSION_SCRIPTS)) {
let scope = {
+ ExtensionContext,
extensions: this,
global: scriptScope,
- ExtensionContext: ExtensionContext,
- GlobalManager: GlobalManager,
+ GlobalManager,
+ require,
};
Services.scriptloader.loadSubScript(value, scope, "UTF-8");
// Save the scope to avoid it being garbage collected.
this.scopes.push(scope);
}
this.initialized = promise;
@@ -667,17 +674,16 @@ GlobalManager = {
_initializeBackgroundPage(contentWindow) {
// Override the `alert()` method inside background windows;
// we alias it to console.log().
// See: https://bugzilla.mozilla.org/show_bug.cgi?id=1203394
let alertDisplayedWarning = false;
let alertOverwrite = text => {
if (!alertDisplayedWarning) {
- let {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
require("devtools/client/framework/devtools-browser");
let hudservice = require("devtools/client/webconsole/hudservice");
hudservice.openBrowserConsoleOrFocus();
contentWindow.console.warn("alert() is not supported in background windows; please use console.log instead.");
alertDisplayedWarning = true;