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

Side by Side Diff: chrome/browser/resources/ntp4/other_sessions.js

Issue 9838064: Add a sign-in promo message to the Other Devices menu. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address previously-unaddressed nits. Created 8 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @fileoverview The menu that shows tabs from sessions on other devices. 6 * @fileoverview The menu that shows tabs from sessions on other devices.
7 */ 7 */
8 8
9 cr.define('ntp', function() { 9 cr.define('ntp', function() {
10 'use strict'; 10 'use strict';
(...skipping 18 matching lines...) Expand all
29 29
30 decorate: function() { 30 decorate: function() {
31 MenuButton.prototype.decorate.call(this); 31 MenuButton.prototype.decorate.call(this);
32 this.menu = new Menu; 32 this.menu = new Menu;
33 cr.ui.decorate(this.menu, Menu); 33 cr.ui.decorate(this.menu, Menu);
34 this.menu.classList.add('footer-menu'); 34 this.menu.classList.add('footer-menu');
35 this.menu.addEventListener('contextmenu', 35 this.menu.addEventListener('contextmenu',
36 this.onContextMenu_.bind(this), true); 36 this.onContextMenu_.bind(this), true);
37 document.body.appendChild(this.menu); 37 document.body.appendChild(this.menu);
38 38
39 this.promoMessage_ = $('other-sessions-promo-message');
Dan Beam 2012/03/27 01:21:06 this would be much more loosely coupled if you pas
Patrick Dubroy 2012/03/27 13:44:21 What is the advantage of that? Currently new_tab.j
40
41 this.resetMenu_();
Dan Beam 2012/03/27 01:21:06 you're probably better off doing all this in initi
Patrick Dubroy 2012/03/27 13:44:21 It's not clear what you're talking about here. Wha
42
39 this.sessions_ = []; 43 this.sessions_ = [];
40 this.anchorType = cr.ui.AnchorType.ABOVE; 44 this.anchorType = cr.ui.AnchorType.ABOVE;
41 this.invertLeftRight = true; 45 this.invertLeftRight = true;
42 46
43 chrome.send('getForeignSessions');
44 this.recordUmaEvent_(HISTOGRAM_EVENT.INITIALIZED); 47 this.recordUmaEvent_(HISTOGRAM_EVENT.INITIALIZED);
45 }, 48 },
46 49
47 /** 50 /**
51 * Initialize this element.
52 * @param {boolean} signedIn Is the current user signed in?
53 */
54 initialize: function(signedIn) {
55 this.updateSignInState(signedIn);
56 },
57
58 /**
48 * Record an event in the UMA histogram. 59 * Record an event in the UMA histogram.
49 * @param {Number} eventId The id of the event to be recorded. 60 * @param {Number} eventId The id of the event to be recorded.
50 */ 61 */
51 recordUmaEvent_: function(eventId) { 62 recordUmaEvent_: function(eventId) {
52 chrome.send('metricsHandler:recordInHistogram', 63 chrome.send('metricsHandler:recordInHistogram',
53 ['NewTabPage.OtherSessionsMenu', eventId, HISTOGRAM_EVENT_LIMIT]); 64 ['NewTabPage.OtherSessionsMenu', eventId, HISTOGRAM_EVENT_LIMIT]);
54 }, 65 },
55 66
56 /** 67 /**
57 * Handle a context menu event for an object in the menu's DOM subtree. 68 * Handle a context menu event for an object in the menu's DOM subtree.
(...skipping 11 matching lines...) Expand all
69 * @override 80 * @override
70 */ 81 */
71 showMenu: function() { 82 showMenu: function() {
72 if (this.sessions_.length == 0) 83 if (this.sessions_.length == 0)
73 chrome.send('getForeignSessions'); 84 chrome.send('getForeignSessions');
74 this.recordUmaEvent_(HISTOGRAM_EVENT.SHOW_MENU); 85 this.recordUmaEvent_(HISTOGRAM_EVENT.SHOW_MENU);
75 MenuButton.prototype.showMenu.call(this); 86 MenuButton.prototype.showMenu.call(this);
76 }, 87 },
77 88
78 /** 89 /**
90 * Reset the menu to the default state.
91 * @private
92 */
93 resetMenu_: function() {
94 this.menu.innerHTML = '';
95 this.menu.appendChild(this.promoMessage_);
Dan Beam 2012/03/27 01:21:06 also, if you never need more than 1 and/or you mov
Patrick Dubroy 2012/03/27 13:44:21 What is the purpose of "also" in this sentence? Is
96 this.promoMessage_.hidden = true;
Dan Beam 2012/03/27 01:21:06 this should probably be using setPromoVisible_() i
Patrick Dubroy 2012/03/27 13:44:21 I've removed this line altogether. It's not really
97 },
98
99 /**
79 * Create a custom click handler for a link, so that clicking on a link 100 * Create a custom click handler for a link, so that clicking on a link
80 * restores the session (including back stack) rather than just opening 101 * restores the session (including back stack) rather than just opening
81 * the URL. 102 * the URL.
82 */ 103 */
83 makeClickHandler_: function(sessionTag, windowId, tabId) { 104 makeClickHandler_: function(sessionTag, windowId, tabId) {
84 var self = this; 105 var self = this;
85 return function(e) { 106 return function(e) {
86 self.recordUmaEvent_(HISTOGRAM_EVENT.LINK_CLICKED); 107 self.recordUmaEvent_(HISTOGRAM_EVENT.LINK_CLICKED);
87 chrome.send('openForeignSession', [sessionTag, windowId, tabId, 108 chrome.send('openForeignSession', [sessionTag, windowId, tabId,
88 e.button, e.altKey, e.ctrlKey, e.metaKey, e.shiftKey]); 109 e.button, e.altKey, e.ctrlKey, e.metaKey, e.shiftKey]);
(...skipping 26 matching lines...) Expand all
115 a.style.backgroundImage = 'url(chrome://favicon/' + tab.url + ')'; 136 a.style.backgroundImage = 'url(chrome://favicon/' + tab.url + ')';
116 var clickHandler = this.makeClickHandler_( 137 var clickHandler = this.makeClickHandler_(
117 session.tag, String(window.sessionId), String(tab.sessionId)); 138 session.tag, String(window.sessionId), String(tab.sessionId));
118 a.addEventListener('click', clickHandler); 139 a.addEventListener('click', clickHandler);
119 section.appendChild(a); 140 section.appendChild(a);
120 } 141 }
121 } 142 }
122 }, 143 },
123 144
124 /** 145 /**
125 * Create the UI for the promo and place it inside the menu. 146 * Show or hide the promo message shown in place of the session list.
126 * The promo is shown instead of foreign session data when tab sync is 147 * The promo is shown when the user is signed in, but there is no foreign
127 * not enabled for a profile. 148 * session data available.
149 * @param {boolean} visible Whether the message should be shown.
150 * @private
128 */ 151 */
129 showPromo_: function() { 152 setPromoVisible_: function(visible) {
130 var message = localStrings.getString('otherSessionsEmpty'); 153 this.resetMenu_();
Dan Beam 2012/03/27 01:21:06 should setting it |visible| remove the contents?
Patrick Dubroy 2012/03/27 13:44:21 No, probably not. Fixed.
131 this.menu.appendChild(this.ownerDocument.createTextNode(message)); 154 this.promoMessage_.hidden = !visible;
132 }, 155 },
133 156
134 /** 157 /**
135 * Sets the menu model data. 158 * Sets the menu model data. An empty list means that either there are no
159 * foreign sessions, or tab sync is disabled for this profile.
160 * |isTabSyncEnabled| makes it possible to distinguish between the cases.
161 *
136 * @param {Array} sessionList Array of objects describing the sessions 162 * @param {Array} sessionList Array of objects describing the sessions
137 * from other devices. 163 * from other devices.
164 * @param {boolean} isTabSyncEnabled Is tab sync enabled for this profile?
138 */ 165 */
139 set sessions(sessionList) { 166 setForeignSessions: function(sessionList, isTabSyncEnabled) {
140 // Clear the current contents of the menu. 167 this.sessions_ = sessionList;
141 this.menu.innerHTML = ''; 168 this.setPromoVisible_(sessionList.length == 0);
Dan Beam 2012/03/27 01:21:06 shouldn't this be done after you rebuild the sessi
Patrick Dubroy 2012/03/27 13:44:21 In this version of the code, it needed to be done
169 if (sessionList.length > 0) {
170 // Rebuild the menu with the new data.
171 for (var i = 0; i < sessionList.length; i++) {
172 this.addSession_(sessionList[i]);
173 }
174 }
175 // The menu button is shown iff tab sync is enabled.
176 if (isTabSyncEnabled)
177 this.classList.remove('invisible');
178 else
179 this.classList.add('invisible');
180 },
142 181
143 // Rebuild the menu with the new data. 182 /**
144 for (var i = 0; i < sessionList.length; i++) { 183 * Called when this element is initialized, and from the new tab page when
145 this.addSession_(sessionList[i]); 184 * the user's signed in state changes,
146 } 185 * @param {boolean} signedIn Is the user currently signed in?
147 186 */
148 if (sessionList.length == 0) 187 updateSignInState: function(signedIn) {
188 if (signedIn)
189 chrome.send('getForeignSessions');
190 else
149 this.classList.add('invisible'); 191 this.classList.add('invisible');
150 else
151 this.classList.remove('invisible');
152
153 this.sessions_ = sessionList;
154 }, 192 },
155 }; 193 };
156 194
157 return { 195 return {
158 OtherSessionsMenuButton: OtherSessionsMenuButton, 196 OtherSessionsMenuButton: OtherSessionsMenuButton,
159 }; 197 };
160 }); 198 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698