diff --git a/browser/base/content/browser-loop.js b/browser/base/content/browser-loop.js index 40f1cd6b53a5..bf971356e60b 100644 --- a/browser/base/content/browser-loop.js +++ b/browser/base/content/browser-loop.js @@ -60,13 +60,13 @@ var LoopUI; */ promiseDocumentVisible(aDocument) { if (!aDocument.hidden) { - return Promise.resolve(); + return Promise.resolve(aDocument); } return new Promise((resolve) => { aDocument.addEventListener("visibilitychange", function onVisibilityChanged() { aDocument.removeEventListener("visibilitychange", onVisibilityChanged); - resolve(); + resolve(aDocument); }); }); }, @@ -81,6 +81,15 @@ var LoopUI; * @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(); @@ -88,7 +97,12 @@ var LoopUI; }); } - return this.openCallPanel(event, tabId); + 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); + }); }, /** @@ -130,14 +144,14 @@ var LoopUI; let documentDOMLoaded = () => { iframe.removeEventListener("DOMContentLoaded", documentDOMLoaded, true); - this.injectLoopAPI(iframe.contentWindow); - iframe.contentWindow.addEventListener("loopPanelInitialized", function loopPanelInitialized() { + this.injectLoopAPI(iframe.contentWindow); + iframe.contentWindow.addEventListener("loopPanelInitialized", function loopPanelInitialized() { iframe.contentWindow.removeEventListener("loopPanelInitialized", - loopPanelInitialized); + loopPanelInitialized); showTab(); - }); - }; - iframe.addEventListener("DOMContentLoaded", documentDOMLoaded, true); + }); + }; + iframe.addEventListener("DOMContentLoaded", documentDOMLoaded, true); }; // Used to clear the temporary "login" state from the button. @@ -153,7 +167,9 @@ var LoopUI; return; } - this.PanelFrame.showPopup(window, event ? event.target : this.toolbarButton.node, + let anchor = event ? event.target : this.toolbarButton.anchor; + + 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: 410 }, diff --git a/browser/base/content/browser-menubar.inc b/browser/base/content/browser-menubar.inc index 4c66c38a1b6d..4cfdc3cf9bd4 100644 --- a/browser/base/content/browser-menubar.inc +++ b/browser/base/content/browser-menubar.inc @@ -507,6 +507,12 @@ label="&webapps.label;" accesskey="&webapps.accesskey;" oncommand="BrowserOpenApps();"/> + + + #ifdef MOZ_SERVICES_SYNC + +