зеркало из https://github.com/mozilla/gecko-dev.git
92 строки
2.8 KiB
JavaScript
92 строки
2.8 KiB
JavaScript
/* -*- 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]);
|