diff options
Diffstat (limited to 'mobile/android/components/TabSource.js')
-rw-r--r-- | mobile/android/components/TabSource.js | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/mobile/android/components/TabSource.js b/mobile/android/components/TabSource.js new file mode 100644 index 000000000..c35a54438 --- /dev/null +++ b/mobile/android/components/TabSource.js @@ -0,0 +1,91 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- + * 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 { classes: Cc, interfaces: Ci, manager: Cm, utils: Cu, results: Cr } = Components; + +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "Prompt", + "resource://gre/modules/Prompt.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "Messaging", + "resource://gre/modules/Messaging.jsm"); + +function TabSource() { +} + +TabSource.prototype = { + classID: Components.ID("{5850c76e-b916-4218-b99a-31f004e0a7e7}"), + classDescription: "Fennec Tab Source", + contractID: "@mozilla.org/tab-source-service;1", + QueryInterface: XPCOMUtils.generateQI([Ci.nsITabSource]), + + getTabToStream: function() { + let app = Services.wm.getMostRecentWindow("navigator:browser").BrowserApp; + let tabs = app.tabs; + if (tabs == null || tabs.length == 0) { + Services.console.logStringMessage("ERROR: No tabs"); + return null; + } + + let bundle = Services.strings.createBundle("chrome://browser/locale/browser.properties"); + let title = bundle.GetStringFromName("tabshare.title") + + let prompt = new Prompt({ + title: title, + window: null + }).setSingleChoiceItems(tabs.map(function(tab) { + let label; + if (tab.browser.contentTitle) + label = tab.browser.contentTitle; + else if (tab.browser.contentURI) + label = tab.browser.contentURI.spec; + else + label = tab.originalURI.spec; + return { label: label, + icon: "thumbnail:" + tab.id } + })); + + let result = null; + prompt.show(function(data) { + result = data.button; + }); + + // Spin this thread while we wait for a result. + let thread = Services.tm.currentThread; + while (result == null) { + thread.processNextEvent(true); + } + + if (result == -1) { + return null; + } + return tabs[result].browser.contentWindow; + }, + + notifyStreamStart: function(window) { + let app = Services.wm.getMostRecentWindow("navigator:browser").BrowserApp; + let tabs = app.tabs; + for (var i in tabs) { + if (tabs[i].browser.contentWindow == window) { + Messaging.sendRequest({ type: "Tab:StreamStart", tabID: tabs[i].id }); + } + } + }, + + notifyStreamStop: function(window) { + let app = Services.wm.getMostRecentWindow("navigator:browser").BrowserApp; + let tabs = app.tabs; + for (let i in tabs) { + if (tabs[i].browser.contentWindow == window) { + Messaging.sendRequest({ type: "Tab:StreamStop", tabID: tabs[i].id }); + } + } + } +}; + +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([TabSource]); |