browser/metro/base/content/startui/RemoteTabsView.js

Wed, 31 Dec 2014 06:55:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:50 +0100
changeset 2
7e26c7da4463
permissions
-rw-r--r--

Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2

     1 // -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; js2-basic-offset: 2; js2-skip-preprocessor-directives: t; -*-
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 "use strict";
     8 const Cu = Components.utils;
    10 Cu.import("resource://services-sync/main.js");
    11 Cu.import("resource://gre/modules/PlacesUtils.jsm", this);
    13 /**
    14  * Wraps a list/grid control implementing nsIDOMXULSelectControlElement and
    15  * fills it with the user's synced tabs.
    16  *
    17  * Note, the Sync module takes care of initializing the sync service. We should
    18  * not make calls that start sync or sync tabs since this module loads really
    19  * early during startup.
    20  *
    21  * @param    aSet         Control implementing nsIDOMXULSelectControlElement.
    22  * @param    aSetUIAccess The UI element that should be hidden when Sync is
    23  *                          disabled. Must sanely support 'hidden' attribute.
    24  *                          You may only have one UI access point at this time.
    25  */
    26 function RemoteTabsView(aSet, aSetUIAccessList) {
    27   View.call(this, aSet);
    29   this._uiAccessElements = aSetUIAccessList;
    31   // Sync uses special voodoo observers.
    32   // If you want to change this code, talk to the fx-si team
    33   Weave.Svc.Obs.add("weave:service:sync:finish", this);
    34   Weave.Svc.Obs.add("weave:service:start-over", this);
    36   if (this.isSyncEnabled() ) {
    37     this.populateGrid();
    38   }
    39   else {
    40     this.setUIAccessVisible(false);
    41   }
    42 }
    44 RemoteTabsView.prototype = Util.extend(Object.create(View.prototype), {
    45   _set: null,
    46   _uiAccessElements: [],
    48   handleItemClick: function tabview_handleItemClick(aItem) {
    49     let url = aItem.getAttribute("value");
    50     StartUI.goToURI(url);
    51   },
    53   observe: function(subject, topic, data) {
    54     switch (topic) {
    55       case "weave:service:sync:finish":
    56         this.populateGrid();
    57         break;
    58       case "weave:service:start-over":
    59         this.setUIAccessVisible(false);
    60         break;
    61     }
    62   },
    64   setUIAccessVisible: function setUIAccessVisible(aVisible) {
    65     for (let elem of this._uiAccessElements) {
    66       elem.hidden = !aVisible;
    67     }
    68   },
    70   getIcon: function (iconUri, defaultIcon) {
    71     try {
    72       let iconURI = Weave.Utils.makeURI(iconUri);
    73       return PlacesUtils.favicons.getFaviconLinkForIcon(iconURI).spec;
    74     } catch(ex) {
    75       // Do nothing.
    76     }
    78     // Just give the provided default icon or the system's default.
    79     return defaultIcon || PlacesUtils.favicons.defaultFavicon.spec;
    80   },
    82   populateGrid: function populateGrid() {
    84     let tabsEngine = Weave.Service.engineManager.get("tabs");
    85     let list = this._set;
    86     let seenURLs = new Set();
    87     let localURLs = tabsEngine.getOpenURLs();
    89     // Clear grid, We don't know what has happened to tabs since last sync
    90     // Also can result in duplicate tabs(bug 864614)
    91     this._set.clearAll();
    92     let show = false;
    93     for (let [guid, client] in Iterator(tabsEngine.getAllClients())) {
    94       client.tabs.forEach(function({title, urlHistory, icon}) {
    95         let url = urlHistory[0];
    96         if (!url || getOpenURLs.has(url) || seenURLs.has(url)) {
    97           return;
    98         }
    99         seenURLs.add(url);
   100         show = true;
   102         // If we wish to group tabs by client, we should be looking for records
   103         //  of {type:client, clientName, class:{mobile, desktop}} and will
   104         //  need to readd logic to reset seenURLs for each client.
   106         let item = this._set.appendItem((title || url), url);
   107         item.setAttribute("iconURI", this.getIcon(icon));
   109       }, this);
   110     }
   111     this.setUIAccessVisible(show);
   112     this._set.arrangeItems();
   113   },
   115   destruct: function destruct() {
   116     Weave.Svc.Obs.remove("weave:engine:sync:finish", this);
   117     Weave.Svc.Obs.remove("weave:service:logout:start-over", this);
   118     View.prototype.destruct.call(this);
   119   },
   121   isSyncEnabled: function isSyncEnabled() {
   122     return (Weave.Status.checkSetup() != Weave.CLIENT_NOT_CONFIGURED);
   123   }
   125 });
   127 let RemoteTabsStartView = {
   128   _view: null,
   129   get _grid() { return document.getElementById("start-remotetabs-grid"); },
   131   init: function init() {
   132     let vbox = document.getElementById("start-remotetabs");
   133     let uiList = [vbox];
   134     this._view = new RemoteTabsView(this._grid, uiList);
   135     this._grid.removeAttribute("fade");
   136   },
   138   uninit: function uninit() {
   139     if (this._view) {
   140       this._view.destruct();
   141     }
   142   },
   143 };

mercurial