| Index: chrome/browser/resources/ntp4/other_sessions.js
|
| diff --git a/chrome/browser/resources/ntp4/other_sessions.js b/chrome/browser/resources/ntp4/other_sessions.js
|
| deleted file mode 100644
|
| index bc1181850826548f660cb241b7a6e0b520613521..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/resources/ntp4/other_sessions.js
|
| +++ /dev/null
|
| @@ -1,386 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -/**
|
| - * @fileoverview The menu that shows tabs from sessions on other devices.
|
| - */
|
| -
|
| -/**
|
| - * @typedef {{collapsed: boolean,
|
| - * deviceType: string,
|
| - * modifiedTime: string,
|
| - * name: string,
|
| - * tag: string,
|
| - * windows: Array<WindowData>}}
|
| - * @see chrome/browser/ui/webui/ntp/foreign_session_handler.cc
|
| - */
|
| -var SessionData;
|
| -
|
| -/**
|
| - * @typedef {{sessionId: number,
|
| - * tabs: Array,
|
| - * timestamp: number,
|
| - * type: string,
|
| - * userVisibleTimestamp: string}}
|
| - * @see chrome/browser/ui/webui/ntp/foreign_session_handler.cc
|
| - */
|
| -var WindowData;
|
| -
|
| -cr.define('ntp', function() {
|
| - 'use strict';
|
| -
|
| - /** @const */ var ContextMenuButton = cr.ui.ContextMenuButton;
|
| - /** @const */ var Menu = cr.ui.Menu;
|
| - /** @const */ var MenuItem = cr.ui.MenuItem;
|
| - /** @const */ var MenuButton = cr.ui.MenuButton;
|
| -
|
| - /**
|
| - * @constructor
|
| - * @extends {cr.ui.MenuButton}
|
| - */
|
| - var OtherSessionsMenuButton = cr.ui.define('button');
|
| -
|
| - // Histogram buckets for UMA tracking of menu usage.
|
| - /** @const */ var HISTOGRAM_EVENT = {
|
| - INITIALIZED: 0,
|
| - SHOW_MENU: 1,
|
| - LINK_CLICKED: 2,
|
| - LINK_RIGHT_CLICKED: 3,
|
| - SESSION_NAME_RIGHT_CLICKED: 4,
|
| - SHOW_SESSION_MENU: 5,
|
| - COLLAPSE_SESSION: 6,
|
| - EXPAND_SESSION: 7,
|
| - OPEN_ALL: 8
|
| - };
|
| - /** @const */ var HISTOGRAM_EVENT_LIMIT =
|
| - HISTOGRAM_EVENT.OPEN_ALL + 1;
|
| -
|
| - /**
|
| - * Record an event in the UMA histogram.
|
| - * @param {number} eventId The id of the event to be recorded.
|
| - * @private
|
| - */
|
| - function recordUmaEvent_(eventId) {
|
| - chrome.send('metricsHandler:recordInHistogram',
|
| - ['NewTabPage.OtherSessionsMenu', eventId, HISTOGRAM_EVENT_LIMIT]);
|
| - }
|
| -
|
| - OtherSessionsMenuButton.prototype = {
|
| - __proto__: MenuButton.prototype,
|
| -
|
| - decorate: function() {
|
| - MenuButton.prototype.decorate.call(this);
|
| - this.menu = new Menu;
|
| - this.menu.menuItemSelector = '[role=menuitem]'; // before decoration
|
| - cr.ui.decorate(this.menu, Menu);
|
| - this.menu.classList.add('footer-menu');
|
| - this.menu.addEventListener('contextmenu',
|
| - this.onContextMenu_.bind(this), true);
|
| - document.body.appendChild(this.menu);
|
| -
|
| - // Create the context menu that appears when the user right clicks
|
| - // on a device name.
|
| - this.deviceContextMenu_ = DeviceContextMenuController.getInstance().menu;
|
| - document.body.appendChild(this.deviceContextMenu_);
|
| -
|
| - this.promoMessage_ = $('other-sessions-promo-template').cloneNode(true);
|
| - this.promoMessage_.removeAttribute('id'); // Prevent a duplicate id.
|
| -
|
| - this.sessions_ = [];
|
| - this.anchorType = cr.ui.AnchorType.ABOVE;
|
| - this.invertLeftRight = true;
|
| -
|
| - // Initialize the images for the drop-down buttons that appear beside the
|
| - // session names.
|
| - MenuButton.createDropDownArrows();
|
| -
|
| - recordUmaEvent_(HISTOGRAM_EVENT.INITIALIZED);
|
| - },
|
| -
|
| - /**
|
| - * Initialize this element.
|
| - * @param {boolean} signedIn Is the current user signed in?
|
| - */
|
| - initialize: function(signedIn) {
|
| - this.updateSignInState(signedIn);
|
| - },
|
| -
|
| - /**
|
| - * Handle a context menu event for an object in the menu's DOM subtree.
|
| - */
|
| - onContextMenu_: function(e) {
|
| - // Only record the action if it occurred in one of the menu items or
|
| - // on one of the session headings.
|
| - if (findAncestorByClass(e.target, 'footer-menu-item')) {
|
| - recordUmaEvent_(HISTOGRAM_EVENT.LINK_RIGHT_CLICKED);
|
| - } else {
|
| - var heading = findAncestorByClass(e.target, 'session-heading');
|
| - if (heading) {
|
| - recordUmaEvent_(HISTOGRAM_EVENT.SESSION_NAME_RIGHT_CLICKED);
|
| -
|
| - // Let the context menu know which session it was invoked on,
|
| - // since they all share the same instance of the menu.
|
| - DeviceContextMenuController.getInstance().setSession(
|
| - heading.sessionData_);
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Hides the menu.
|
| - * @override
|
| - */
|
| - hideMenu: function() {
|
| - // Don't hide if the device context menu is currently showing.
|
| - if (this.deviceContextMenu_.hidden)
|
| - MenuButton.prototype.hideMenu.call(this);
|
| - },
|
| -
|
| - /**
|
| - * Shows the menu, first rebuilding it if necessary.
|
| - * TODO(estade): the right of the menu should align with the right of the
|
| - * button.
|
| - * @override
|
| - */
|
| - showMenu: function(shouldSetFocus) {
|
| - if (this.sessions_.length == 0)
|
| - chrome.send('getForeignSessions');
|
| - recordUmaEvent_(HISTOGRAM_EVENT.SHOW_MENU);
|
| - MenuButton.prototype.showMenu.apply(this, arguments);
|
| -
|
| - // Work around https://bugs.webkit.org/show_bug.cgi?id=85884.
|
| - this.menu.scrollTop = 0;
|
| - },
|
| -
|
| - /**
|
| - * Reset the menu contents to the default state.
|
| - * @private
|
| - */
|
| - resetMenuContents_: function() {
|
| - this.menu.innerHTML = '';
|
| - this.menu.appendChild(this.promoMessage_);
|
| - },
|
| -
|
| - /**
|
| - * Create a custom click handler for a link, so that clicking on a link
|
| - * restores the session (including back stack) rather than just opening
|
| - * the URL.
|
| - */
|
| - makeClickHandler_: function(sessionTag, windowId, tabId) {
|
| - var self = this;
|
| - return function(e) {
|
| - recordUmaEvent_(HISTOGRAM_EVENT.LINK_CLICKED);
|
| - chrome.send('openForeignSession', [sessionTag, windowId, tabId,
|
| - e.button, e.altKey, e.ctrlKey, e.metaKey, e.shiftKey]);
|
| - e.preventDefault();
|
| - };
|
| - },
|
| -
|
| - /**
|
| - * Add the UI for a foreign session to the menu.
|
| - * @param {SessionData} session Object describing the foreign session.
|
| - */
|
| - addSession_: function(session) {
|
| - var doc = this.ownerDocument;
|
| -
|
| - var section = doc.createElement('section');
|
| - this.menu.appendChild(section);
|
| -
|
| - var heading = doc.createElement('h3');
|
| - heading.className = 'session-heading';
|
| - heading.textContent = session.name;
|
| - heading.sessionData_ = session;
|
| - section.appendChild(heading);
|
| -
|
| - var dropDownButton = new ContextMenuButton;
|
| - dropDownButton.classList.add('drop-down');
|
| - // Keep track of the drop down that triggered the menu, so we know
|
| - // which element to apply the command to.
|
| - function handleDropDownFocus(e) {
|
| - DeviceContextMenuController.getInstance().setSession(session);
|
| - }
|
| - dropDownButton.addEventListener('mousedown', handleDropDownFocus);
|
| - dropDownButton.addEventListener('focus', handleDropDownFocus);
|
| - heading.appendChild(dropDownButton);
|
| -
|
| - var timeSpan = doc.createElement('span');
|
| - timeSpan.className = 'details';
|
| - timeSpan.textContent = session.modifiedTime;
|
| - heading.appendChild(timeSpan);
|
| -
|
| - cr.ui.contextMenuHandler.setContextMenu(heading,
|
| - this.deviceContextMenu_);
|
| -
|
| - if (!session.collapsed)
|
| - section.appendChild(this.createSessionContents_(session));
|
| - },
|
| -
|
| - /**
|
| - * Create the DOM tree representing the tabs and windows in a session.
|
| - * @param {SessionData} session The session model object.
|
| - * @return {Element} A single div containing the list of tabs & windows.
|
| - * @private
|
| - */
|
| - createSessionContents_: function(session) {
|
| - var doc = this.ownerDocument;
|
| - var contents = doc.createElement('div');
|
| -
|
| - for (var i = 0; i < session.windows.length; i++) {
|
| - var window = session.windows[i];
|
| -
|
| - // Show a separator between multiple windows in the same session.
|
| - if (i > 0)
|
| - contents.appendChild(doc.createElement('hr'));
|
| -
|
| - for (var j = 0; j < window.tabs.length; j++) {
|
| - var tab = window.tabs[j];
|
| - var a = doc.createElement('a');
|
| - a.className = 'footer-menu-item';
|
| - a.textContent = tab.title;
|
| - a.href = tab.url;
|
| - a.style.backgroundImage = getFaviconImageSet(tab.url);
|
| -
|
| - var clickHandler = this.makeClickHandler_(
|
| - session.tag, String(window.sessionId), String(tab.sessionId));
|
| - a.addEventListener('click', clickHandler);
|
| - contents.appendChild(a);
|
| - cr.ui.decorate(a, MenuItem);
|
| - }
|
| - }
|
| -
|
| - return contents;
|
| - },
|
| -
|
| - /**
|
| - * Sets the menu model data. An empty list means that either there are no
|
| - * foreign sessions, or tab sync is disabled for this profile.
|
| - * |isTabSyncEnabled| makes it possible to distinguish between the cases.
|
| - *
|
| - * @param {Array<SessionData>} sessionList Array of objects describing the
|
| - * sessions from other devices.
|
| - * @param {boolean} isTabSyncEnabled Is tab sync enabled for this profile?
|
| - */
|
| - setForeignSessions: function(sessionList, isTabSyncEnabled) {
|
| - this.sessions_ = sessionList;
|
| - this.resetMenuContents_();
|
| - if (sessionList.length > 0) {
|
| - // Rebuild the menu with the new data.
|
| - for (var i = 0; i < sessionList.length; i++) {
|
| - this.addSession_(sessionList[i]);
|
| - }
|
| - }
|
| -
|
| - // The menu button is shown iff tab sync is enabled.
|
| - this.hidden = !isTabSyncEnabled;
|
| - },
|
| -
|
| - /**
|
| - * Called when this element is initialized, and from the new tab page when
|
| - * the user's signed in state changes,
|
| - * @param {boolean} signedIn Is the user currently signed in?
|
| - */
|
| - updateSignInState: function(signedIn) {
|
| - if (signedIn)
|
| - chrome.send('getForeignSessions');
|
| - else
|
| - this.hidden = true;
|
| - },
|
| - };
|
| -
|
| - /**
|
| - * Controller for the context menu for device names in the list of sessions.
|
| - * This class is designed to be used as a singleton.
|
| - *
|
| - * @constructor
|
| - */
|
| - function DeviceContextMenuController() {
|
| - this.__proto__ = DeviceContextMenuController.prototype;
|
| - this.initialize();
|
| - }
|
| - cr.addSingletonGetter(DeviceContextMenuController);
|
| -
|
| - DeviceContextMenuController.prototype = {
|
| -
|
| - initialize: function() {
|
| - var menu = new cr.ui.Menu;
|
| - cr.ui.decorate(menu, cr.ui.Menu);
|
| - menu.classList.add('device-context-menu');
|
| - menu.classList.add('footer-menu-context-menu');
|
| - this.menu = menu;
|
| - this.collapseItem_ = this.appendMenuItem_('collapseSessionMenuItemText');
|
| - this.collapseItem_.addEventListener('activate',
|
| - this.onCollapseOrExpand_.bind(this));
|
| - this.expandItem_ = this.appendMenuItem_('expandSessionMenuItemText');
|
| - this.expandItem_.addEventListener('activate',
|
| - this.onCollapseOrExpand_.bind(this));
|
| - this.openAllItem_ = this.appendMenuItem_('restoreSessionMenuItemText');
|
| - this.openAllItem_.addEventListener('activate',
|
| - this.onOpenAll_.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * Appends a menu item to |this.menu|.
|
| - * @param {string} textId The ID for the localized string that acts as
|
| - * the item's label.
|
| - */
|
| - appendMenuItem_: function(textId) {
|
| - var button = cr.doc.createElement('button');
|
| - this.menu.appendChild(button);
|
| - cr.ui.decorate(button, cr.ui.MenuItem);
|
| - button.textContent = loadTimeData.getString(textId);
|
| - return button;
|
| - },
|
| -
|
| - /**
|
| - * Handler for the 'Collapse' and 'Expand' menu items.
|
| - * @param {Event} e The activation event.
|
| - * @private
|
| - */
|
| - onCollapseOrExpand_: function(e) {
|
| - this.session_.collapsed = !this.session_.collapsed;
|
| - this.updateMenuItems_();
|
| - chrome.send('setForeignSessionCollapsed',
|
| - [this.session_.tag, this.session_.collapsed]);
|
| - chrome.send('getForeignSessions'); // Refresh the list.
|
| -
|
| - var eventId = this.session_.collapsed ?
|
| - HISTOGRAM_EVENT.COLLAPSE_SESSION : HISTOGRAM_EVENT.EXPAND_SESSION;
|
| - recordUmaEvent_(eventId);
|
| - },
|
| -
|
| - /**
|
| - * Handler for the 'Open all' menu item.
|
| - * @param {Event} e The activation event.
|
| - * @private
|
| - */
|
| - onOpenAll_: function(e) {
|
| - chrome.send('openForeignSession', [this.session_.tag]);
|
| - recordUmaEvent_(HISTOGRAM_EVENT.OPEN_ALL);
|
| - },
|
| -
|
| - /**
|
| - * Set the session data for the session the context menu was invoked on.
|
| - * This should never be called when the menu is visible.
|
| - * @param {Object} session The model object for the session.
|
| - */
|
| - setSession: function(session) {
|
| - this.session_ = session;
|
| - this.updateMenuItems_();
|
| - },
|
| -
|
| - /**
|
| - * Set the visibility of the Expand/Collapse menu items based on the state
|
| - * of the session that this menu is currently associated with.
|
| - * @private
|
| - */
|
| - updateMenuItems_: function() {
|
| - this.collapseItem_.hidden = this.session_.collapsed;
|
| - this.expandItem_.hidden = !this.session_.collapsed;
|
| - }
|
| - };
|
| -
|
| - return {
|
| - OtherSessionsMenuButton: OtherSessionsMenuButton,
|
| - };
|
| -});
|
|
|