addon-sdk/source/lib/sdk/ui/button/toggle.js

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     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': 'experimental',
     8   'engines': {
     9     'Firefox': '> 28'
    10   }
    11 };
    13 const { Class } = require('../../core/heritage');
    14 const { merge } = require('../../util/object');
    15 const { Disposable } = require('../../core/disposable');
    16 const { on, off, emit, setListeners } = require('../../event/core');
    17 const { EventTarget } = require('../../event/target');
    18 const { getNodeView } = require('../../view/core');
    20 const view = require('./view');
    21 const { toggleButtonContract, toggleStateContract } = require('./contract');
    22 const { properties, render, state, register, unregister,
    23   setStateFor, getStateFor, getDerivedStateFor } = require('../state');
    24 const { events: stateEvents } = require('../state/events');
    25 const { events: viewEvents } = require('./view/events');
    26 const events = require('../../event/utils');
    28 const { getActiveTab } = require('../../tabs/utils');
    30 const { id: addonID } = require('../../self');
    31 const { identify } = require('../id');
    33 const buttons = new Map();
    35 const toWidgetId = id =>
    36   ('toggle-button--' + addonID.toLowerCase()+ '-' + id).
    37     replace(/[^a-z0-9_-]/g, '');
    39 const ToggleButton = Class({
    40   extends: EventTarget,
    41   implements: [
    42     properties(toggleStateContract),
    43     state(toggleStateContract),
    44     Disposable
    45   ],
    46   setup: function setup(options) {
    47     let state = merge({
    48       disabled: false,
    49       checked: false
    50     }, toggleButtonContract(options));
    52     let id = toWidgetId(options.id);
    54     register(this, state);
    56     // Setup listeners.
    57     setListeners(this, options);
    59     buttons.set(id, this);
    61     view.create(merge({ type: 'checkbox' }, state, { id: id }));
    62   },
    64   dispose: function dispose() {
    65     let id = toWidgetId(this.id);
    66     buttons.delete(id);
    68     off(this);
    70     view.dispose(id);
    72     unregister(this);
    73   },
    75   get id() this.state().id,
    77   click: function click() view.click(toWidgetId(this.id))
    78 });
    79 exports.ToggleButton = ToggleButton;
    81 identify.define(ToggleButton, ({id}) => toWidgetId(id));
    83 getNodeView.define(ToggleButton, button =>
    84   view.nodeFor(toWidgetId(button.id))
    85 );
    87 let toggleButtonStateEvents = events.filter(stateEvents,
    88   e => e.target instanceof ToggleButton);
    90 let toggleButtonViewEvents = events.filter(viewEvents,
    91   e => buttons.has(e.target));
    93 let clickEvents = events.filter(toggleButtonViewEvents, e => e.type === 'click');
    94 let updateEvents = events.filter(toggleButtonViewEvents, e => e.type === 'update');
    96 on(toggleButtonStateEvents, 'data', ({target, window, state}) => {
    97   let id = toWidgetId(target.id);
    99   view.setIcon(id, window, state.icon);
   100   view.setLabel(id, window, state.label);
   101   view.setDisabled(id, window, state.disabled);
   102   view.setChecked(id, window, state.checked);
   103 });
   105 on(clickEvents, 'data', ({target: id, window, checked }) => {
   106   let button = buttons.get(id);
   107   let windowState = getStateFor(button, window);
   109   let newWindowState = merge({}, windowState, { checked: checked });
   111   setStateFor(button, window, newWindowState);
   113   let state = getDerivedStateFor(button, getActiveTab(window));
   115   emit(button, 'click', state);
   117   emit(button, 'change', state);
   118 });
   120 on(updateEvents, 'data', ({target: id, window}) => {
   121   render(buttons.get(id), window);
   122 });

mercurial