Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5836)

Unified Diff: chrome/browser/resources/ntp4/other_sessions.js

Issue 1140813003: NTP Zombie Code Slayer III, The Saga Continues: Foreign Sessions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@suggestions-page
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/resources/ntp4/new_tab.js ('k') | chrome/browser/ui/webui/foreign_session_handler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
- };
-});
« no previous file with comments | « chrome/browser/resources/ntp4/new_tab.js ('k') | chrome/browser/ui/webui/foreign_session_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698