1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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]);
|