gecko/browser/metro/base/content/RemoteTabs.js

148 lines
4.5 KiB
JavaScript

// -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; js2-basic-offset: 2; js2-skip-preprocessor-directives: t; -*-
/* 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';
Components.utils.import("resource://services-sync/main.js");
/**
* Wraps a list/grid control implementing nsIDOMXULSelectControlElement and
* fills it with the user's synced tabs.
*
* Note, the Sync module takes care of initializing the sync service. We should
* not make calls that start sync or sync tabs since this module loads really
* early during startup.
*
* @param aSet Control implementing nsIDOMXULSelectControlElement.
* @param aSetUIAccess The UI element that should be hidden when Sync is
* disabled. Must sanely support 'hidden' attribute.
* You may only have one UI access point at this time.
*/
function RemoteTabsView(aSet, aSetUIAccessList) {
this._set = aSet;
this._set.controller = this;
this._uiAccessElements = aSetUIAccessList;
// Sync uses special voodoo observers.
// If you want to change this code, talk to the fx-si team
Weave.Svc.Obs.add("weave:service:sync:finish", this);
Weave.Svc.Obs.add("weave:service:start-over", this);
if (this.isSyncEnabled() ) {
this.populateGrid();
}
else {
this.setUIAccessVisible(false);
}
}
RemoteTabsView.prototype = {
_set: null,
_uiAccessElements: [],
handleItemClick: function tabview_handleItemClick(aItem) {
let url = aItem.getAttribute("value");
BrowserUI.goToURI(url);
},
observe: function(subject, topic, data) {
switch (topic) {
case "weave:service:sync:finish":
this.populateGrid();
break;
case "weave:service:start-over":
this.setUIAccessVisible(false);
break;
}
},
setUIAccessVisible: function setUIAccessVisible(aVisible) {
for (let elem of this._uiAccessElements) {
elem.hidden = !aVisible;
}
},
populateGrid: function populateGrid() {
let tabsEngine = Weave.Service.engineManager.get("tabs");
let list = this._set;
let seenURLs = new Set();
// Clear grid, We don't know what has happened to tabs since last sync
// Also can result in duplicate tabs(bug 864614)
this._set.clearAll();
let show = false;
for (let [guid, client] in Iterator(tabsEngine.getAllClients())) {
client.tabs.forEach(function({title, urlHistory, icon}) {
let url = urlHistory[0];
if (tabsEngine.locallyOpenTabMatchesURL(url) || seenURLs.has(url)) {
return;
}
seenURLs.add(url);
show = true;
// If we wish to group tabs by client, we should be looking for records
// of {type:client, clientName, class:{mobile, desktop}} and will
// need to readd logic to reset seenURLs for each client.
let item = this._set.appendItem((title || url), url);
item.setAttribute("iconURI", Weave.Utils.getIcon(icon));
}, this);
}
this.setUIAccessVisible(show);
},
destruct: function destruct() {
Weave.Svc.Obs.remove("weave:engine:sync:finish", this);
Weave.Svc.Obs.remove("weave:service:logout:start-over", this);
},
isSyncEnabled: function isSyncEnabled() {
return (Weave.Status.checkSetup() != Weave.CLIENT_NOT_CONFIGURED);
}
};
let RemoteTabsStartView = {
_view: null,
get _grid() { return document.getElementById("start-remotetabs-grid"); },
init: function init() {
let vbox = document.getElementById("start-remotetabs");
let uiList = [vbox];
this._view = new RemoteTabsView(this._grid, uiList);
},
uninit: function uninit() {
this._view.destruct();
},
show: function show() {
this._grid.arrangeItems();
}
};
let RemoteTabsPanelView = {
_view: null,
get _grid() { return document.getElementById("remotetabs-list"); },
get visible() { return PanelUI.isPaneVisible("remotetabs-container"); },
init: function init() {
//decks are fragile, don't hide the tab panel(bad things happen), hide link in menu.
let menuEntry = document.getElementById("menuitem-remotetabs");
let snappedEntry = document.getElementById("snappedRemoteTabsLabel");
let uiList = [menuEntry, snappedEntry];
this._view = new RemoteTabsView(this._grid, uiList);
},
show: function show() {
this._grid.arrangeItems();
},
uninit: function uninit() {
this._view.destruct();
}
};