addon-sdk/source/lib/sdk/ui/sidebar/view.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2 * License, v. 2.0. If a copy of the MPL was not distributed with this
     3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     4 'use strict';
     6 module.metadata = {
     7   'stability': 'unstable',
     8   'engines': {
     9     'Firefox': '*'
    10   }
    11 };
    13 const { models, buttons, views, viewsFor, modelFor } = require('./namespace');
    14 const { isBrowser, getMostRecentBrowserWindow, windows, isWindowPrivate } = require('../../window/utils');
    15 const { setStateFor } = require('../state');
    16 const { defer } = require('../../core/promise');
    17 const { isPrivateBrowsingSupported } = require('../../self');
    19 const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    20 const WEB_PANEL_BROWSER_ID = 'web-panels-browser';
    22 function create(window, details) {
    23   let id = makeID(details.id);
    24   let { document } = window;
    26   if (document.getElementById(id))
    27     throw new Error('The ID "' + details.id + '" seems already used.');
    29   let menuitem = document.createElementNS(XUL_NS, 'menuitem');
    30   menuitem.setAttribute('id', id);
    31   menuitem.setAttribute('label', details.title);
    32   menuitem.setAttribute('sidebarurl', details.sidebarurl);
    33   menuitem.setAttribute('checked', 'false');
    34   menuitem.setAttribute('type', 'checkbox');
    35   menuitem.setAttribute('group', 'sidebar');
    36   menuitem.setAttribute('autoCheck', 'false');
    38   document.getElementById('viewSidebarMenu').appendChild(menuitem);
    40   return menuitem;
    41 }
    42 exports.create = create;
    44 function dispose(menuitem) {
    45   menuitem.parentNode.removeChild(menuitem);
    46 }
    47 exports.dispose = dispose;
    49 function updateTitle(sidebar, title) {
    50   let button = buttons.get(sidebar);
    52   for (let window of windows(null, { includePrivate: true })) {
    53   	let { document } = window;
    55     // update the button
    56     if (button) {
    57       setStateFor(button, window, { label: title });
    58     }
    60     // update the menuitem
    61     let mi = document.getElementById(makeID(sidebar.id));
    62     if (mi) {
    63       mi.setAttribute('label', title)
    64     }
    66     // update sidebar, if showing
    67     if (isSidebarShowing(window, sidebar)) {
    68       document.getElementById('sidebar-title').setAttribute('value', title);
    69     }
    70   }
    71 }
    72 exports.updateTitle = updateTitle;
    74 function updateURL(sidebar, url) {
    75   let eleID = makeID(sidebar.id);
    77   for (let window of windows(null, { includePrivate: true })) {
    78     // update the menuitem
    79     let mi = window.document.getElementById(eleID);
    80     if (mi) {
    81       mi.setAttribute('sidebarurl', url)
    82     }
    84     // update sidebar, if showing
    85     if (isSidebarShowing(window, sidebar)) {
    86       showSidebar(window, sidebar, url);
    87     }
    88   }
    89 }
    90 exports.updateURL = updateURL;
    92 function isSidebarShowing(window, sidebar) {
    93   let win = window || getMostRecentBrowserWindow();
    95   // make sure there is a window
    96   if (!win) {
    97     return false;
    98   }
   100   // make sure there is a sidebar for the window
   101   let sb = win.document.getElementById('sidebar');
   102   let sidebarTitle = win.document.getElementById('sidebar-title');
   103   if (!(sb && sidebarTitle)) {
   104     return false;
   105   }
   107   // checks if the sidebar box is hidden
   108   let sbb = win.document.getElementById('sidebar-box');
   109   if (!sbb || sbb.hidden) {
   110     return false;
   111   }
   113   if (sidebarTitle.value == modelFor(sidebar).title) {
   114     // checks if the sidebar is loading
   115     if (win.gWebPanelURI == modelFor(sidebar).url) {
   116       return true;
   117     }
   119     // checks if the sidebar loaded already
   120     let ele = sb.contentDocument && sb.contentDocument.getElementById(WEB_PANEL_BROWSER_ID);
   121     if (!ele) {
   122       return false;
   123     }
   125     if (ele.getAttribute('cachedurl') ==  modelFor(sidebar).url) {
   126       return true;
   127     }
   129     if (ele && ele.contentWindow && ele.contentWindow.location == modelFor(sidebar).url) {
   130       return true;
   131     }
   132   }
   134   // default
   135   return false;
   136 }
   137 exports.isSidebarShowing = isSidebarShowing;
   139 function showSidebar(window, sidebar, newURL) {
   140   window = window || getMostRecentBrowserWindow();
   142   let { promise, resolve, reject } = defer();
   143   let model = modelFor(sidebar);
   145   if (!newURL && isSidebarShowing(window, sidebar)) {
   146     resolve({});
   147   }
   148   else if (!isPrivateBrowsingSupported && isWindowPrivate(window)) {
   149     reject(Error('You cannot show a sidebar on private windows'));
   150   }
   151   else {
   152     sidebar.once('show', resolve);
   154     let menuitem = window.document.getElementById(makeID(model.id));
   155     menuitem.setAttribute('checked', true);
   157     window.openWebPanel(model.title, newURL || model.url);
   158   }
   160   return promise;
   161 }
   162 exports.showSidebar = showSidebar;
   165 function hideSidebar(window, sidebar) {
   166   window = window || getMostRecentBrowserWindow();
   168   let { promise, resolve, reject } = defer();
   170   if (!isSidebarShowing(window, sidebar)) {
   171     reject(Error('The sidebar is already hidden'));
   172   }
   173   else {
   174     sidebar.once('hide', resolve);
   176     // Below was taken from http://mxr.mozilla.org/mozilla-central/source/browser/base/content/browser.js#4775
   177     // the code for window.todggleSideBar()..
   178     let { document } = window;
   179     let sidebarEle = document.getElementById('sidebar');
   180     let sidebarTitle = document.getElementById('sidebar-title');
   181     let sidebarBox = document.getElementById('sidebar-box');
   182     let sidebarSplitter = document.getElementById('sidebar-splitter');
   183     let commandID = sidebarBox.getAttribute('sidebarcommand');
   184     let sidebarBroadcaster = document.getElementById(commandID);
   186     sidebarBox.hidden = true;
   187     sidebarSplitter.hidden = true;
   189     sidebarEle.setAttribute('src', 'about:blank');
   190     //sidebarEle.docShell.createAboutBlankContentViewer(null);
   192     sidebarBroadcaster.removeAttribute('checked');
   193     sidebarBox.setAttribute('sidebarcommand', '');
   194     sidebarTitle.value = '';
   195     sidebarBox.hidden = true;
   196     sidebarSplitter.hidden = true;
   198     // TODO: perhaps this isn't necessary if the window is not most recent?
   199     window.gBrowser.selectedBrowser.focus();
   200   }
   202   return promise;
   203 }
   204 exports.hideSidebar = hideSidebar;
   206 function makeID(id) {
   207   return 'jetpack-sidebar-' + id;
   208 }

mercurial