1
Components.utils.import("resource://weave/service.js");
2
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
4
let RemoteTabViewer = {
5
get _tabsList() document.getElementById("tabsList"),
8
Weave.Svc.Obs.add("weave:service:login:finish", this);
9
Weave.Svc.Obs.add("weave:engine:sync:finish", this);
13
let win = getTopWin();
14
let i = win.gFxWeaveGlue.getPageIndex();
15
win.gBrowser.setIcon(win.gBrowser.mTabs[i], "chrome://weave/skin/sync-16x16.png");
18
buildList: function(force) {
19
if (!Weave.Service.isLoggedIn ||
20
this._refetchTabs(force))
23
this._generateTabList();
26
createItem: function(attrs) {
27
let item = document.createElement("richlistitem");
29
// Copy the attributes from the argument into the item
30
for (let attr in attrs)
31
item.setAttribute(attr, attrs[attr]);
33
if (attrs["type"] == "tab")
34
item.label = attrs.title != "" ? attrs.title : attrs.url;
39
filterTabs: function(event) {
40
let val = event.target.value.toLowerCase();
41
let numTabs = this._tabsList.getRowCount();
43
let currentClient = null;
44
for (let i = 0;i < numTabs;i++) {
45
let item = this._tabsList.getItemAtIndex(i);
47
if (item.getAttribute("type") == "tab") {
48
if (item.getAttribute("url").toLowerCase().indexOf(val) == -1 &&
49
item.getAttribute("title").toLowerCase().indexOf(val) == -1)
54
else if (item.getAttribute("type") == "client") {
57
currentClient.hidden = true;
65
currentClient.hidden = true;
68
openSelected: function() {
69
let items = this._tabsList.selectedItems;
71
for (let i = 0;i < items.length;i++) {
72
if (items[i].getAttribute("type") == "tab") {
73
urls.push(items[i].getAttribute("url"));
74
let index = this._tabsList.getIndexOfItem(items[i]);
75
this._tabsList.removeItemAt(index);
79
getTopWin().gBrowser.loadTabs(urls);
80
this._tabsList.clearSelection();
84
bookmarkSingleTab: function() {
85
let item = this._tabsList.selectedItems[0];
86
let uri = Weave.Utils.makeURI(item.getAttribute("url"));
87
let title = item.getAttribute("title");
88
PlacesUIUtils.showMinimalAddBookmarkUI(uri, title);
91
bookmarkSelectedTabs: function() {
92
let items = this._tabsList.selectedItems;
94
for (let i = 0;i < items.length;i++) {
95
if (items[i].getAttribute("type") == "tab") {
96
let uri = Weave.Utils.makeURI(items[i].getAttribute("url"));
104
PlacesUIUtils.showMinimalAddMultiBookmarkUI(URIs);
107
_generateTabList: function() {
108
let engine = Weave.Engines.get("tabs");
109
let list = this._tabsList;
111
// clear out existing richlistitems
112
let count = list.getRowCount();
114
for (i = count - 1;i >= 0;i--)
115
list.removeItemAt(i);
118
for (let [guid, client] in Iterator(engine.getAllClients())) {
119
// Create the client node, but don't add it in-case we don't show any tabs
120
let appendClient = true;
122
client.tabs.forEach(function({title, urlHistory, icon}) {
123
let url = urlHistory[0];
124
if (engine.locallyOpenTabMatchesURL(url) || url in seenURLs)
127
seenURLs[url] = null;
132
clientName: client.clientName,
133
icon: Weave.Clients.isMobile(client.id) ? "chrome://weave/skin/mobile-icon.png"
134
: "chrome://weave/skin/desktop-icon.png",
136
let clientEnt = RemoteTabViewer.createItem(attrs);
137
list.appendChild(clientEnt);
138
appendClient = false;
139
clientEnt.disabled = true;
145
icon: Weave.Utils.getIcon(icon)
147
let tab = RemoteTabViewer.createItem(attrs);
148
list.appendChild(tab);
153
adjustContextMenu: function(event) {
155
switch (this._tabsList.selectedItems.length) {
165
let menu = document.getElementById("tabListContext");
166
let el = menu.firstChild;
168
let sf = el.getAttribute("showFor");
170
el.hidden = sf != mode && sf != "all";
176
_refetchTabs: function(force) {
178
// Don't bother refetching tabs if we already did so recently
179
let lastFetch = Weave.Svc.Prefs.get("lastTabFetch", 0);
180
let now = Math.floor(Date.now() / 1000);
181
if (now - lastFetch < 30)
185
// if Clients hasn't synced yet this session, need to sync it as well
186
if (Weave.Clients.lastSync == 0)
187
Weave.Clients.sync();
189
// Force a sync only for the tabs engine
190
let engine = Weave.Engines.get("tabs");
191
engine.lastModified = null;
193
Weave.Svc.Prefs.set("lastTabFetch", Math.floor(Date.now() / 1000));
198
QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIObserver,
199
Components.interfaces.nsISupportsWeakReference]),
201
observe: function(subject, topic, data) {
203
case "weave:service:login:finish":
204
this.buildList(true);
206
case "weave:engine:sync:finish":
207
if (subject == "tabs")
208
this._generateTabList();
213
handleClick: function(event) {
214
if (event.target.getAttribute("type") != "tab")
217
if (event.button == 1) {
218
let url = event.target.getAttribute("url");
219
openUILink(url, event);
220
let index = this._tabsList.getIndexOfItem(event.target);
221
this._tabsList.removeItemAt(index);