Chromium Code Reviews| Index: chrome/browser/resources/ntp_android/ntp_android.js |
| diff --git a/chrome/browser/resources/ntp_android/ntp_android.js b/chrome/browser/resources/ntp_android/ntp_android.js |
| index cfed89423df0139563ff4c62c1e0cf704a6a99d9..0b05ed199ba77331ed3e430b88549b381b850475 100644 |
| --- a/chrome/browser/resources/ntp_android/ntp_android.js |
| +++ b/chrome/browser/resources/ntp_android/ntp_android.js |
| @@ -214,6 +214,36 @@ cr.define('ntp', function() { |
| */ |
| var promoIsAllowed = false; |
| + /** |
| + * Whether promo should be shown on Most Visited page (externally set). |
| + * @type {boolean} |
| + */ |
| + var promoIsAllowedOnMostVisited = false; |
| + |
| + /** |
| + * Whether promo should be shown on Open Tabs page (externally set). |
| + * @type {boolean} |
| + */ |
| + var promoIsAllowedOnOpenTabs = false; |
| + |
| + /** |
| + * Whether promo should show a virtual computer on Open Tabs (externally set). |
| + * @type {boolean} |
| + */ |
| + var promoIsAllowedAsVirtualComputer = false; |
| + |
| + /** |
| + * Promo-injected title of a virtual computer on an open tabs pane. |
| + * @type {string} |
| + */ |
| + var promoInjectedComputerTitleText = ''; |
| + |
| + /** |
| + * Promo-injected last synced text of a virtual computer on an open tabs pane. |
| + * @type {string} |
| + */ |
| + var promoInjectedComputerLastSyncedText = ''; |
| + |
| function setIncognitoMode(incognito) { |
| isIncognito = incognito; |
| } |
| @@ -231,6 +261,7 @@ cr.define('ntp', function() { |
| FOREIGN_SESSION: 5, |
| FOREIGN_SESSION_HEADER: 6, |
| SNAPSHOTS: 7, |
| + PROMO_VC_SESSION_HEADER: 8, |
| UNKNOWN: 100, |
| }; |
| @@ -255,6 +286,8 @@ cr.define('ntp', function() { |
| RECENTLY_CLOSED_REMOVE: 22, |
| FOREIGN_SESSIONS_REMOVE: 30, |
| + |
| + PROMO_VC_SESSION_REMOVE: 40, |
| }; |
| /** |
| @@ -278,7 +311,7 @@ cr.define('ntp', function() { |
| WAITING_FOR_DATA: 1, |
| DISPLAYING_LOADING: 2, |
| DISPLAYED_LOADING: 3, |
| - LOADED: 3, |
| + LOADED: 4, |
| }; |
| /** |
| @@ -398,6 +431,9 @@ cr.define('ntp', function() { |
| for (var i = 0, len = titleScrollers.length; i < len; i++) |
| initializeTitleScroller(titleScrollers[i]); |
| + // Initialize virtual computers for the sync promo. |
| + createPromoVirtualComputers(); |
| + |
| chrome.send('getMostVisited'); |
| chrome.send('getRecentlyClosedTabs'); |
| chrome.send('getForeignSessions'); |
| @@ -827,11 +863,15 @@ cr.define('ntp', function() { |
| var title = createDiv('session-name'); |
| title.textContent = item.title; |
| + if (item.titleId) |
| + title.id = item.titleId; |
|
Dan Beam
2012/08/25 00:48:20
nit: title.id = item.titleId || '';
(shorter and e
aruslan
2012/08/27 22:19:51
Done.
|
| sessionInnerDiv.appendChild(title); |
| var lastSynced = createDiv('session-last-synced'); |
| lastSynced.textContent = |
| templateData.opentabslastsynced + ': ' + item.userVisibleTimestamp; |
| + if (item.userVisibleTimestampId) |
| + lastSynced.id = item.userVisibleTimestampId; |
| sessionInnerDiv.appendChild(lastSynced); |
| sessionOuterDiv.addEventListener('click', function(evt) { |
| @@ -848,7 +888,7 @@ cr.define('ntp', function() { |
| */ |
| function setNumberOfMostVisitedPages(n) { |
| numberOfMostVisitedPages = n; |
| - promoSetVisibility(); |
| + updatePromoVisibility(); |
| } |
| /** |
| @@ -857,7 +897,7 @@ cr.define('ntp', function() { |
| */ |
| function setHasRecentlyClosedTabs(anyTabs) { |
| hasRecentlyClosedTabs = anyTabs; |
| - promoSetVisibility(); |
| + updatePromoVisibility(); |
| } |
| /** |
| @@ -967,7 +1007,7 @@ cr.define('ntp', function() { |
| * @return {boolean} Whether the promo should be shown on most_visited. |
| */ |
| function shouldPromoBeShownOnMostVisited() { |
| - return promoIsAllowed && |
| + return promoIsAllowed && promoIsAllowedOnMostVisited && |
| (numberOfMostVisitedPages >= 2) && |
| (!hasRecentlyClosedTabs); |
|
Dan Beam
2012/08/25 00:48:20
nit: the style guide says don't use extra (), thes
aruslan
2012/08/27 22:19:51
Done.
|
| } |
| @@ -980,7 +1020,7 @@ cr.define('ntp', function() { |
| var snapshotsCount = |
| currentSnapshots == null ? 0 : currentSnapshots.length; |
| var sessionsCount = currentSessions == null ? 0 : currentSessions.length; |
| - return promoIsAllowed && |
| + return promoIsAllowed && promoIsAllowedOnOpenTabs && |
| (snapshotsCount + sessionsCount != 0); |
| } |
| @@ -988,11 +1028,11 @@ cr.define('ntp', function() { |
| * Checks if promo is allowed and SyncPromo requirements are satisfied. |
| * @return {boolean} Whether the promo should be shown on sync_promo. |
| */ |
| - function shouldPromoBeShownOnSyncPromo() { |
| + function shouldPromoBeShownOnSync() { |
| var snapshotsCount = |
| currentSnapshots == null ? 0 : currentSnapshots.length; |
| var sessionsCount = currentSessions == null ? 0 : currentSessions.length; |
| - return promoIsAllowed && |
| + return promoIsAllowed && promoIsAllowedOnOpenTabs && |
| (snapshotsCount + sessionsCount == 0); |
| } |
| @@ -1001,31 +1041,39 @@ cr.define('ntp', function() { |
| * @param {string} section Active section name to check. |
| */ |
| function promoUpdateImpressions(section) { |
| - if (section == 'most_visited' && shouldPromoBeShownOnMostVisited()) { |
| + if (section == 'most_visited' && shouldPromoBeShownOnMostVisited()) |
| chrome.send('recordImpression', ['most_visited']); |
| - } else if (section == 'open_tabs' && shouldPromoBeShownOnOpenTabs()) { |
| + else if (section == 'open_tabs' && shouldPromoBeShownOnOpenTabs()) |
| chrome.send('recordImpression', ['open_tabs']); |
| - } else if (section == 'open_tabs' && shouldPromoBeShownOnSyncPromo()) { |
| + else if (section == 'open_tabs' && shouldPromoBeShownOnSync()) |
| chrome.send('recordImpression', ['sync_promo']); |
| - } |
| } |
| /** |
| - * Sets the visibility on all promo-related items as necessary. |
| + * Updates the visibility on all promo-related items as necessary. |
| */ |
| - function promoSetVisibility() { |
| - var mostVisited = $('promo_message_on_most_visited'); |
| - var openTabs = $('promo_message_on_open_tabs'); |
| - if (shouldPromoBeShownOnMostVisited()) { |
| - mostVisited.style.display = 'block'; |
| - } else { |
| - mostVisited.style.display = 'none'; |
| - } |
| - if (shouldPromoBeShownOnOpenTabs()) { |
| - openTabs.style.display = 'block'; |
| - } else { |
| - openTabs.style.display = 'none'; |
| - } |
| + function updatePromoVisibility() { |
| + var mostVisitedEl = $('promo_message_on_most_visited'); |
| + var openTabsVCEl = $('promo_vc_list'); |
| + var syncPromoLegacyEl = $('promo_message_on_sync_promo_legacy'); |
| + var syncPromoReceivedEl = $('promo_message_on_sync_promo_received'); |
| + mostVisitedEl.style.display = |
|
Dan Beam
2012/08/25 00:48:20
mostVisitedEl.hidden = !shouldPromoBeShownOnMostVi
aruslan
2012/08/27 22:19:51
The rest of the code uses style.display, and there
Dan Beam
2012/08/28 00:32:31
it's probably not intentional, either way it's fin
|
| + shouldPromoBeShownOnMostVisited() ? 'block' : 'none'; |
| + syncPromoReceivedEl.style.display = |
| + shouldPromoBeShownOnSync() ? 'block' : 'none'; |
| + syncPromoLegacyEl.style.display = |
| + shouldPromoBeShownOnSync() ? 'none' : 'block'; |
| + openTabsVCEl.style.display = |
| + (shouldPromoBeShownOnOpenTabs() && promoIsAllowedAsVirtualComputer) ? |
| + 'block' : 'none'; |
| + } |
| + |
| + /** |
| + * Called from native. |
| + * Clears the promotion. |
| + */ |
| + function clearPromotions() { |
| + setPromotions({}); |
| } |
| /** |
| @@ -1036,24 +1084,40 @@ cr.define('ntp', function() { |
| * @param {Object} promotions Dictionary used to fill-in the text. |
| */ |
| function setPromotions(promotions) { |
| - var mostVisited = $('promo_message_on_most_visited'); |
| - var openTabs = $('promo_message_on_open_tabs'); |
| - var syncPromoLegacy = $('promo_message_on_sync_promo_legacy'); |
| - mostVisited.innerHTML = promotions['promoMessage']; |
| - openTabs.innerHTML = promotions['promoMessage']; |
| - if (promotions['promoMessageLong']) { |
| - syncPromoLegacy.innerHTML = promotions['promoMessageLong']; |
| - } |
| + var mostVisitedEl = $('promo_message_on_most_visited'); |
| + var openTabsEl = $('promo_message_on_open_tabs'); |
| + var syncPromoReceivedEl = $('promo_message_on_sync_promo_received'); |
| + |
| promoIsAllowed = promotions['promoIsAllowed'] === true; |
|
Dan Beam
2012/08/25 00:48:20
you should use . notation instead of [''] notation
aruslan
2012/08/27 22:19:51
Done.
|
| + promoIsAllowedOnMostVisited = |
| + promotions['promoIsAllowedOnMostVisited'] === true; |
| + promoIsAllowedOnOpenTabs = promotions['promoIsAllowedOnOpenTabs'] === true; |
| + promoIsAllowedAsVirtualComputer = promotions['promoIsAllowedAsVC'] === true; |
| + |
| + mostVisitedEl.innerHTML = promotions['promoMessage'] || ''; |
|
Dan Beam
2012/08/25 00:48:20
this is bad if there's a <script> in the message,
aruslan
2012/08/27 22:19:51
Done.
|
| + if (openTabsEl) |
| + openTabsEl.innerHTML = promotions['promoMessage'] || ''; |
| + syncPromoReceivedEl.innerHTML = promotions['promoMessageLong'] || ''; |
| + |
| + promoInjectedComputerTitleText = promotions['promoVCTitle'] || ''; |
| + promoInjectedComputerLastSyncedText = promotions['promoVCLastSynced'] || ''; |
| + var openTabsVCTitleEl = $('promo_vc_title'); |
| + if (openTabsVCTitleEl) |
| + openTabsVCTitleEl.textContent = promoInjectedComputerTitleText; |
| + var openTabsVCLastSyncEl = $('promo_vc_lastsync'); |
| + if (openTabsVCLastSyncEl) |
| + openTabsVCLastSyncEl.textContent = promoInjectedComputerLastSyncedText; |
| + |
| if (promoIsAllowed) { |
| - var promoTargets = |
| - document.getElementsByClassName('promo-action-target'); |
| - for (var i = 0, len = promoTargets.length; i < len; i++) { |
| - promoTargets[i].href = 'javascript:void(0)'; |
| - promoTargets[i].onclick = promoAction; |
| + var promoButtonEls = |
| + document.getElementsByClassName('promo-button'); |
| + for (var i = 0, len = promoButtonEls.length; i < len; i++) { |
| + promoButtonEls[i].href = 'javascript:void(0)'; |
|
Dan Beam
2012/08/25 00:48:20
hmm, why is this necessary? why not just '#' and d
aruslan
2012/08/27 22:19:51
Done -- thanks!
|
| + promoButtonEls[i].onclick = executePromoAction; |
| + addActiveTouchListener(promoButtonEls[i], 'promo-button-active'); |
| } |
| } |
| - promoSetVisibility(); |
| + updatePromoVisibility(); |
| } |
| /** |
| @@ -1061,7 +1125,7 @@ cr.define('ntp', function() { |
| * Performs the promo action "send email". |
| * @param {Object} evt User interface event that triggered the action. |
| */ |
| - function promoAction(evt) { |
| + function executePromoAction(evt) { |
| if (evt.preventDefault) |
| evt.preventDefault(); |
| evt.returnValue = false; |
| @@ -1122,6 +1186,10 @@ cr.define('ntp', function() { |
| } |
| break; |
| + case ContextMenuItemIds.PROMO_VC_SESSION_REMOVE: |
| + chrome.send('promoDisabled'); |
| + break; |
| + |
| default: |
| log.error('Unknown context menu selected id=' + itemId); |
| break; |
| @@ -1349,6 +1417,7 @@ cr.define('ntp', function() { |
| } else { |
| localStorage.removeItem(SYNC_ENABLED_KEY); |
| } |
| + updatePromoVisibility(); |
| if (bookmarkData) { |
| // Bookmark data can now be displayed (or needs to be refiltered) |
| @@ -1428,7 +1497,7 @@ cr.define('ntp', function() { |
| openTabsList.style.display = sessionsCount == 0 ? 'none' : 'block'; |
| snapshotsList.style.display = snapshotsCount == 0 ? 'none' : 'block'; |
| } |
| - promoSetVisibility(); |
| + updatePromoVisibility(); |
| } |
| /** |
| @@ -1539,6 +1608,38 @@ cr.define('ntp', function() { |
| } |
| /** |
| + * Initializes the promo_vc_list div to look like a foreign session |
| + * with a desktop. |
| + */ |
| + function createPromoVirtualComputers() { |
| + var list = findList('promo_vc'); |
|
Dan Beam
2012/08/25 00:48:20
I'm scared of code without newlines :(
aruslan
2012/08/27 22:19:51
Done.
|
| + list.innerHTML = ''; |
| + var sessionEl = createDiv(); |
| + list.appendChild(sessionEl); |
| + var sessionHeader = createDiv('session-header'); |
| + sessionEl.appendChild(sessionHeader); |
| + var sessionChildren = createDiv('session-children-container'); |
| + var promoMessage = createDiv('promo-message'); |
| + promoMessage.id = 'promo_message_on_open_tabs'; |
| + sessionChildren.appendChild(promoMessage); |
| + sessionEl.appendChild(sessionChildren); |
| + var expando = createDiv(); |
| + var expandoFunction = createExpandoFunction(expando, sessionChildren); |
| + |
| + var headerList = [{ |
| + 'title': promoInjectedComputerTitleText, |
| + 'titleId': 'promo_vc_title', |
| + 'userVisibleTimestamp': promoInjectedComputerLastSyncedText, |
| + 'userVisibleTimestampId': 'promo_vc_lastsync', |
| + 'iconStyle': 'laptop' |
| + }]; |
| + |
| + populateData(sessionHeader, SectionType.PROMO_VC_SESSION_HEADER, headerList, |
| + makeForeignSessionListEntry, expandoFunction); |
| + sessionHeader.appendChild(expando); |
| + } |
| + |
| + /** |
| * Called externally when updated synced sessions data is available. |
| * |
| * @param {Object} data The snapshot data |
| @@ -1754,6 +1855,8 @@ cr.define('ntp', function() { |
| return 'recently_closed'; |
| case SectionType.SYNCED_DEVICES: |
| return 'synced_devices'; |
| + case SectionType.PROMO_VC_SESSION_HEADER: |
|
Dan Beam
2012/08/25 00:48:20
I'm slightly confused by this, why can't this just
aruslan
2012/08/27 22:19:51
Done -- as this is not an enum, changed it to be s
|
| + return 'promo_vc_session_header'; |
| case SectionType.UNKNOWN: |
| default: |
| return 'unknown'; |
| @@ -2328,6 +2431,11 @@ cr.define('ntp', function() { |
| [ContextMenuItemIds.FOREIGN_SESSIONS_REMOVE, |
| templateData.elementremove] |
| ]); |
| + } else if (section == SectionType.PROMO_VC_SESSION_HEADER) { |
| + chrome.send('showContextMenu', [ |
|
Dan Beam
2012/08/25 00:48:20
this is super repetitive, why not do something lik
aruslan
2012/08/27 22:19:51
Done.
|
| + [ContextMenuItemIds.PROMO_VC_SESSION_REMOVE, |
| + templateData.elementremove] |
| + ]); |
| } |
| return false; |
| } |
| @@ -2336,11 +2444,12 @@ cr.define('ntp', function() { |
| return { |
| bookmarks: bookmarks, |
| bookmarkChanged: bookmarkChanged, |
| - setForeignSessions: setForeignSessions, |
| + clearPromotions: clearPromotions, |
| init: init, |
| onCustomMenuSelected: onCustomMenuSelected, |
| openSection: openSection, |
| setFaviconDominantColor: setFaviconDominantColor, |
| + setForeignSessions: setForeignSessions, |
| setIncognitoMode: setIncognitoMode, |
| setMostVisitedPages: setMostVisitedPages, |
| setPromotions: setPromotions, |