diff --git a/browser/base/content/browser.css b/browser/base/content/browser.css
index 799fc51696ab..926700fcfade 100644
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -494,6 +494,27 @@ toolbar:not(#TabsToolbar) > #personal-bookmarks {
-moz-binding: url(chrome://browser/content/urlbarBindings.xml#urlbar);
}
+/*
+ * Display visual cue that browser is under remote control by Marionette.
+ * This is to help users visually distinguish a user agent session that
+ * is under remote control from those used for normal browsing sessions.
+ *
+ * Attribute is controlled by browser.js:/gRemoteControl.
+ */
+#main-window[remotecontrol] #urlbar {
+ background: repeating-linear-gradient(
+ -45deg,
+ transparent,
+ transparent 25px,
+ rgba(255,255,255,.3) 25px,
+ rgba(255,255,255,.3) 50px);
+ background-color: rgba(255,170,68,.8);
+ color: black;
+}
+#main-window[remotecontrol] #urlbar #identity-box {
+ background: white;
+}
+
/* Fade out URL on overflow */
html|input.urlbar-input[textoverflow]:not([focused]) {
/* Don't need to worry about RTL here since we use direction:ltr for the
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 7c17833c3c13..06959b2a9f50 100755
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -33,7 +33,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "Preferences",
Social:false, TabCrashHandler:false, Task:false, TelemetryStopwatch:false,
Translation:false, UITour:false, UpdateUtils:false, Weave:false,
WebNavigationFrames: false, fxAccounts:false, gDevTools:false,
- gDevToolsBrowser:false, webrtcUI:false, FullZoomUI:false
+ gDevToolsBrowser:false, webrtcUI:false, FullZoomUI:false,
+ Marionette:false,
*/
/**
@@ -106,9 +107,10 @@ if (AppConstants.MOZ_CRASHREPORTER) {
*/
[
["Favicons", "@mozilla.org/browser/favicon-service;1", "mozIAsyncFavicons"],
- ["WindowsUIUtils", "@mozilla.org/windows-ui-utils;1", "nsIWindowsUIUtils"],
["gAboutNewTabService", "@mozilla.org/browser/aboutnewtab-service;1", "nsIAboutNewTabService"],
["gDNSService", "@mozilla.org/network/dns-service;1", "nsIDNSService"],
+ ["Marionette", "@mozilla.org/remote/marionette;1", "nsIMarionette"],
+ ["WindowsUIUtils", "@mozilla.org/windows-ui-utils;1", "nsIWindowsUIUtils"],
].forEach(([name, cc, ci]) => XPCOMUtils.defineLazyServiceGetter(this, name, cc, ci));
if (AppConstants.MOZ_CRASHREPORTER) {
@@ -1255,6 +1257,8 @@ var gBrowserInit = {
ToolbarIconColor.init();
+ gRemoteControl.updateVisualCue(Marionette.running);
+
// Wait until chrome is painted before executing code not critical to making the window visible
this._boundDelayedStartup = this._delayedStartup.bind(this);
window.addEventListener("MozAfterPaint", this._boundDelayedStartup);
@@ -1393,6 +1397,7 @@ var gBrowserInit = {
setTimeout(function() { SafeBrowsing.init(); }, 2000);
Services.obs.addObserver(gIdentityHandler, "perm-changed");
+ Services.obs.addObserver(gRemoteControl, "remote-active");
Services.obs.addObserver(gSessionHistoryObserver, "browser:purge-session-history");
Services.obs.addObserver(gStoragePressureObserver, "QuotaManager::StoragePressure");
Services.obs.addObserver(gXPInstallObserver, "addon-install-disabled");
@@ -1713,6 +1718,7 @@ var gBrowserInit = {
FullZoom.destroy();
Services.obs.removeObserver(gIdentityHandler, "perm-changed");
+ Services.obs.removeObserver(gRemoteControl, "remote-active");
Services.obs.removeObserver(gSessionHistoryObserver, "browser:purge-session-history");
Services.obs.removeObserver(gStoragePressureObserver, "QuotaManager::StoragePressure");
Services.obs.removeObserver(gXPInstallObserver, "addon-install-disabled");
@@ -7817,7 +7823,6 @@ var gIdentityHandler = {
}
};
-
var gPageActionButton = {
get button() {
delete this.button;
@@ -7861,6 +7866,25 @@ var gPageActionButton = {
},
};
+/**
+ * Fired on the "marionette-remote-control" system notification,
+ * indicating if the browser session is under remote control.
+ */
+const gRemoteControl = {
+ observe(subject, topic, data) {
+ gRemoteControl.updateVisualCue(data);
+ },
+
+ updateVisualCue(enabled) {
+ const mainWindow = document.documentElement;
+ if (enabled) {
+ mainWindow.setAttribute("remotecontrol", "true");
+ } else {
+ mainWindow.removeAttribute("remotecontrol");
+ }
+ },
+};
+
function getNotificationBox(aWindow) {
var foundBrowser = gBrowser.getBrowserForDocument(aWindow.document);
if (foundBrowser)
diff --git a/browser/base/content/browser.xul b/browser/base/content/browser.xul
index da2ffd2e9f38..ee0e8d07ca2a 100644
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -846,6 +846,8 @@
tooltiptext="&urlbar.persistentStorageNotificationAnchor.tooltip;"/>
+
diff --git a/browser/locales/en-US/chrome/browser/browser.dtd b/browser/locales/en-US/chrome/browser/browser.dtd
index 9c4db829ff77..1cfaae2275b7 100644
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -214,6 +214,7 @@ These should match what Safari and other Apple applications use on OS X Lion. --
+
diff --git a/browser/themes/shared/identity-block/identity-block.inc.css b/browser/themes/shared/identity-block/identity-block.inc.css
index 9ca0bc589ed5..8b92f5c3562e 100644
--- a/browser/themes/shared/identity-block/identity-block.inc.css
+++ b/browser/themes/shared/identity-block/identity-block.inc.css
@@ -164,3 +164,13 @@
visibility: collapse;
}
+
+/* REMOTE CONTROL ICON */
+
+#main-window[remotecontrol] #remote-control-icon {
+ list-style-image: url(chrome://browser/content/robot.ico);
+ visibility: visible;
+ width: 16px;
+ height: 16px;
+ margin-inline-start: 2px;
+}