Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 New tab page | 6 * @fileoverview New tab page |
| 7 * This is the main code for the new tab page used by touch-enabled Chrome | 7 * This is the main code for the new tab page used by touch-enabled Chrome |
| 8 * browsers. For now this is still a prototype. | 8 * browsers. For now this is still a prototype. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 139 /** | 139 /** |
| 140 * The time in milliseconds for most transitions. This should match what's | 140 * The time in milliseconds for most transitions. This should match what's |
| 141 * in new_tab.css. Unfortunately there's no better way to try to time | 141 * in new_tab.css. Unfortunately there's no better way to try to time |
| 142 * something to occur until after a transition has completed. | 142 * something to occur until after a transition has completed. |
| 143 * @type {number} | 143 * @type {number} |
| 144 * @const | 144 * @const |
| 145 */ | 145 */ |
| 146 var DEFAULT_TRANSITION_TIME = 500; | 146 var DEFAULT_TRANSITION_TIME = 500; |
| 147 | 147 |
| 148 /** | 148 /** |
| 149 * Invoked at startup once the DOM is available to initialize the app. | 149 * Sets up the app using given config. |
| 150 * @param {Object} config Config object. | |
| 150 */ | 151 */ |
| 151 function initialize() { | 152 function setup(config) { |
| 152 cr.enablePlatformSpecificCSSRules(); | 153 cr.enablePlatformSpecificCSSRules(); |
| 153 | 154 |
| 154 // Load the current theme colors. | 155 // Load the current theme colors. |
| 155 themeChanged(); | 156 themeChanged(); |
| 156 | 157 |
| 157 dotList = getRequiredElement('dot-list'); | 158 dotList = getRequiredElement('dot-list'); |
| 158 dotList.addEventListener('keydown', onDotListKeyDown); | 159 dotList.addEventListener('keydown', onDotListKeyDown); |
| 159 navDots = dotList.getElementsByClassName('dot'); | 160 navDots = dotList.getElementsByClassName('dot'); |
| 160 | 161 |
| 161 pageList = getRequiredElement('page-list'); | 162 pageList = getRequiredElement('page-list'); |
| 162 trash = getRequiredElement('trash'); | 163 trash = getRequiredElement('trash'); |
| 163 new ntp4.Trash(trash); | 164 new ntp4.Trash(trash); |
| 164 | 165 |
| 165 shownPage = templateData['shown_page_type']; | 166 shownPage = config.shownPage; |
| 166 shownPageIndex = templateData['shown_page_index']; | 167 shownPageIndex = config.shownPageIndex; |
| 167 | 168 |
| 168 // Request data on the apps so we can fill them in. | 169 // Request data on the apps so we can fill them in. |
| 169 // Note that this is kicked off asynchronously. 'getAppsCallback' will be | 170 // Note that this is kicked off asynchronously. 'getAppsCallback' will be |
| 170 // invoked at some point after this function returns. | 171 // invoked at some point after this function returns. |
| 171 chrome.send('getApps'); | 172 chrome.send('getApps'); |
| 172 | 173 |
| 173 document.addEventListener('keydown', onKeyDown); | 174 document.addEventListener('keydown', onKeyDown); |
| 174 // Prevent touch events from triggering any sort of native scrolling | 175 // Prevent touch events from triggering any sort of native scrolling |
| 175 document.addEventListener('touchmove', function(e) { | 176 document.addEventListener('touchmove', function(e) { |
| 176 e.preventDefault(); | 177 e.preventDefault(); |
| 177 }, true); | 178 }, true); |
| 178 | 179 |
| 179 tilePages = pageList.getElementsByClassName('tile-page'); | 180 tilePages = pageList.getElementsByClassName('tile-page'); |
| 180 appsPages = pageList.getElementsByClassName('apps-page'); | 181 appsPages = pageList.getElementsByClassName('apps-page'); |
| 181 | 182 |
| 182 pageSwitcherStart = getRequiredElement('page-switcher-start'); | 183 if (config.supportsPageSwitchers) { |
|
Evan Stade
2011/11/03 16:42:14
this seems like a heck of a lot of if configs, esp
| |
| 183 ntp4.initializePageSwitcher(pageSwitcherStart); | 184 pageSwitcherStart = getRequiredElement('page-switcher-start'); |
| 184 pageSwitcherEnd = getRequiredElement('page-switcher-end'); | 185 ntp4.initializePageSwitcher(pageSwitcherStart); |
| 185 ntp4.initializePageSwitcher(pageSwitcherEnd); | 186 pageSwitcherEnd = getRequiredElement('page-switcher-end'); |
| 187 ntp4.initializePageSwitcher(pageSwitcherEnd); | |
| 188 } | |
| 186 | 189 |
| 187 notificationContainer = getRequiredElement('notification-container'); | 190 if (config.supportsNotification) { |
| 188 notificationContainer.addEventListener( | 191 notificationContainer = getRequiredElement('notification-container'); |
| 189 'webkitTransitionEnd', onNotificationTransitionEnd); | 192 notificationContainer.addEventListener( |
| 193 'webkitTransitionEnd', onNotificationTransitionEnd); | |
| 194 } | |
| 190 | 195 |
| 191 // Initialize the cardSlider without any cards at the moment | 196 // Initialize the cardSlider without any cards at the moment |
| 192 var sliderFrame = getRequiredElement('card-slider-frame'); | 197 var sliderFrame = getRequiredElement('card-slider-frame'); |
| 193 cardSlider = new CardSlider(sliderFrame, pageList, sliderFrame.offsetWidth); | 198 cardSlider = new CardSlider(sliderFrame, pageList, sliderFrame.offsetWidth); |
| 194 cardSlider.initialize(); | 199 cardSlider.initialize(); |
| 195 | 200 |
| 196 // Ensure the slider is resized appropriately with the window | 201 // Ensure the slider is resized appropriately with the window |
| 197 window.addEventListener('resize', function() { | 202 window.addEventListener('resize', function() { |
| 198 cardSlider.resize(sliderFrame.offsetWidth); | 203 cardSlider.resize(sliderFrame.offsetWidth); |
| 199 updatePageSwitchers(); | 204 updatePageSwitchers(); |
| 200 }); | 205 }); |
| 201 | 206 |
| 202 // Handle the page being changed | 207 // Handle the page being changed |
| 203 pageList.addEventListener( | 208 pageList.addEventListener( |
| 204 CardSlider.EventType.CARD_CHANGED, | 209 CardSlider.EventType.CARD_CHANGED, |
| 205 cardChangedHandler); | 210 cardChangedHandler); |
| 206 | 211 |
| 207 cr.ui.decorate($('recently-closed-menu-button'), ntp4.RecentMenuButton); | 212 if (config.supportsRecentlyClosed) { |
| 208 chrome.send('getRecentlyClosedTabs'); | 213 cr.ui.decorate($('recently-closed-menu-button'), ntp4.RecentMenuButton); |
| 214 chrome.send('getRecentlyClosedTabs'); | |
| 215 } | |
| 209 | 216 |
| 210 mostVisitedPage = new ntp4.MostVisitedPage(); | 217 if (config.supportsMostVisited) { |
| 211 appendTilePage(mostVisitedPage, localStrings.getString('mostvisited'), | 218 mostVisitedPage = new ntp4.MostVisitedPage(); |
| 212 false); | 219 appendTilePage(mostVisitedPage, localStrings.getString('mostvisited'), |
| 213 chrome.send('getMostVisited'); | 220 false); |
| 221 chrome.send('getMostVisited'); | |
| 222 } | |
| 214 | 223 |
| 215 if (localStrings.getString('login_status_message')) { | 224 if (localStrings.getString('login_status_message')) { |
|
Evan Stade
2011/11/03 16:42:14
seems this should also be toggled by supportsSyncL
| |
| 216 loginBubble = new cr.ui.Bubble; | 225 loginBubble = new cr.ui.Bubble; |
| 217 loginBubble.anchorNode = $('login-container'); | 226 loginBubble.anchorNode = $('login-container'); |
| 218 loginBubble.setArrowLocation(cr.ui.ArrowLocation.TOP_END); | 227 loginBubble.setArrowLocation(cr.ui.ArrowLocation.TOP_END); |
| 219 loginBubble.bubbleAlignment = | 228 loginBubble.bubbleAlignment = |
| 220 cr.ui.BubbleAlignment.BUBBLE_EDGE_TO_ANCHOR_EDGE; | 229 cr.ui.BubbleAlignment.BUBBLE_EDGE_TO_ANCHOR_EDGE; |
| 221 loginBubble.deactivateToDismissDelay = 2000; | 230 loginBubble.deactivateToDismissDelay = 2000; |
| 222 loginBubble.setCloseButtonVisible(false); | 231 loginBubble.setCloseButtonVisible(false); |
| 223 | 232 |
| 224 var bubbleContent = $('login-status-bubble-contents'); | 233 var bubbleContent = $('login-status-bubble-contents'); |
| 225 loginBubble.content = bubbleContent; | 234 loginBubble.content = bubbleContent; |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 253 infoBubble.content = bubbleContent; | 262 infoBubble.content = bubbleContent; |
| 254 bubbleContent.hidden = false; | 263 bubbleContent.hidden = false; |
| 255 | 264 |
| 256 var learnMoreLink = infoBubble.querySelector('a'); | 265 var learnMoreLink = infoBubble.querySelector('a'); |
| 257 learnMoreLink.href = localStrings.getString('ntp4_intro_url'); | 266 learnMoreLink.href = localStrings.getString('ntp4_intro_url'); |
| 258 learnMoreLink.onclick = infoBubble.hide.bind(infoBubble); | 267 learnMoreLink.onclick = infoBubble.hide.bind(infoBubble); |
| 259 | 268 |
| 260 infoBubble.show(); | 269 infoBubble.show(); |
| 261 } | 270 } |
| 262 | 271 |
| 263 var bookmarkFeatures = localStrings.getString('bookmark_features'); | 272 if (config.supportsBookmarks) { |
| 264 if (bookmarkFeatures == 'true') { | |
| 265 bookmarksPage = new ntp4.BookmarksPage(); | 273 bookmarksPage = new ntp4.BookmarksPage(); |
| 266 appendTilePage(bookmarksPage, localStrings.getString('bookmarksPage'), | 274 appendTilePage(bookmarksPage, localStrings.getString('bookmarksPage'), |
| 267 false); | 275 false); |
| 268 chrome.send('getBookmarksData'); | 276 chrome.send('getBookmarksData'); |
| 269 } | 277 } |
| 270 | 278 |
| 271 var serverpromo = localStrings.getString('serverpromo'); | 279 var serverpromo = localStrings.getString('serverpromo'); |
|
Evan Stade
2011/11/03 16:42:14
and I don't think you want this either
| |
| 272 if (serverpromo) { | 280 if (serverpromo) { |
| 273 showNotification(parseHtmlSubset(serverpromo), [], function() { | 281 showNotification(parseHtmlSubset(serverpromo), [], function() { |
| 274 chrome.send('closeNotificationPromo'); | 282 chrome.send('closeNotificationPromo'); |
| 275 }, 60000); | 283 }, 60000); |
| 276 chrome.send('notificationPromoViewed'); | 284 chrome.send('notificationPromoViewed'); |
| 277 } | 285 } |
| 278 | 286 |
| 279 var loginContainer = getRequiredElement('login-container'); | 287 if (config.supportsSyncLogin) { |
| 280 loginContainer.addEventListener('click', function() { | 288 var loginContainer = getRequiredElement('login-container'); |
| 281 var rect = loginContainer.getBoundingClientRect(); | 289 loginContainer.addEventListener('click', function() { |
| 282 chrome.send('showSyncLoginUI', | 290 var rect = loginContainer.getBoundingClientRect(); |
| 283 [rect.left, rect.top, rect.width, rect.height]); | 291 chrome.send('showSyncLoginUI', |
| 284 }); | 292 [rect.left, rect.top, rect.width, rect.height]); |
| 285 chrome.send('initializeSyncLogin'); | 293 }); |
| 294 chrome.send('initializeSyncLogin'); | |
| 295 } | |
| 286 } | 296 } |
| 287 | 297 |
| 288 /** | 298 /** |
| 289 * Simple common assertion API | 299 * Simple common assertion API |
| 290 * @param {*} condition The condition to test. Note that this may be used to | 300 * @param {*} condition The condition to test. Note that this may be used to |
| 291 * test whether a value is defined or not, and we don't want to force a | 301 * test whether a value is defined or not, and we don't want to force a |
| 292 * cast to Boolean. | 302 * cast to Boolean. |
| 293 * @param {string=} opt_message A message to use in any error. | 303 * @param {string=} opt_message A message to use in any error. |
| 294 */ | 304 */ |
| 295 function assert(condition, opt_message) { | 305 function assert(condition, opt_message) { |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 704 } | 714 } |
| 705 | 715 |
| 706 updatePageSwitchers(); | 716 updatePageSwitchers(); |
| 707 } | 717 } |
| 708 | 718 |
| 709 /** | 719 /** |
| 710 * Adjusts the size and position of the page switchers according to the | 720 * Adjusts the size and position of the page switchers according to the |
| 711 * layout of the current card. | 721 * layout of the current card. |
| 712 */ | 722 */ |
| 713 function updatePageSwitchers() { | 723 function updatePageSwitchers() { |
| 724 if (!pageSwitcherStart || !pageSwitcherEnd) | |
| 725 return; | |
| 726 | |
| 714 var page = cardSlider.currentCardValue; | 727 var page = cardSlider.currentCardValue; |
| 715 | 728 |
| 716 pageSwitcherStart.hidden = !page || (cardSlider.currentCard == 0); | 729 pageSwitcherStart.hidden = !page || (cardSlider.currentCard == 0); |
| 717 pageSwitcherEnd.hidden = !page || | 730 pageSwitcherEnd.hidden = !page || |
| 718 (cardSlider.currentCard == cardSlider.cardCount - 1); | 731 (cardSlider.currentCard == cardSlider.cardCount - 1); |
| 719 | 732 |
| 720 if (!page) | 733 if (!page) |
| 721 return; | 734 return; |
| 722 | 735 |
| 723 var pageSwitcherLeft = isRTL() ? pageSwitcherEnd : pageSwitcherStart; | 736 var pageSwitcherLeft = isRTL() ? pageSwitcherEnd : pageSwitcherStart; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 741 * Returns the index of the given page. | 754 * Returns the index of the given page. |
| 742 * @param {AppsPage} page The AppsPage for we wish to find. | 755 * @param {AppsPage} page The AppsPage for we wish to find. |
| 743 * @return {number} The index of |page|, or -1 if it is not here. | 756 * @return {number} The index of |page|, or -1 if it is not here. |
| 744 */ | 757 */ |
| 745 function getAppsPageIndex(page) { | 758 function getAppsPageIndex(page) { |
| 746 return Array.prototype.indexOf.call(appsPages, page); | 759 return Array.prototype.indexOf.call(appsPages, page); |
| 747 } | 760 } |
| 748 | 761 |
| 749 // TODO(estade): rename newtab.css to new_tab_theme.css | 762 // TODO(estade): rename newtab.css to new_tab_theme.css |
| 750 function themeChanged(hasAttribution) { | 763 function themeChanged(hasAttribution) { |
| 751 $('themecss').href = 'chrome://theme/css/newtab.css?' + Date.now(); | 764 var themecss = $('themecss'); |
| 765 if (!themecss) | |
| 766 return; | |
| 767 | |
| 768 themecss.href = 'chrome://theme/css/newtab.css?' + Date.now(); | |
| 752 if (typeof hasAttribution != 'undefined') | 769 if (typeof hasAttribution != 'undefined') |
| 753 document.documentElement.setAttribute('hasattribution', hasAttribution); | 770 document.documentElement.setAttribute('hasattribution', hasAttribution); |
| 754 updateLogo(); | 771 updateLogo(); |
| 755 updateAttribution(); | 772 updateAttribution(); |
| 756 } | 773 } |
| 757 | 774 |
| 758 /** | 775 /** |
| 759 * Sets the proper image for the logo at the bottom left. | 776 * Sets the proper image for the logo at the bottom left. |
| 760 */ | 777 */ |
| 761 function updateLogo() { | 778 function updateLogo() { |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 991 bookmarkImportEnded: bookmarkImportEnded, | 1008 bookmarkImportEnded: bookmarkImportEnded, |
| 992 bookmarkNodeAdded: bookmarkNodeAdded, | 1009 bookmarkNodeAdded: bookmarkNodeAdded, |
| 993 bookmarkNodeChanged: bookmarkNodeChanged, | 1010 bookmarkNodeChanged: bookmarkNodeChanged, |
| 994 bookmarkNodeChildrenReordered: bookmarkNodeChildrenReordered, | 1011 bookmarkNodeChildrenReordered: bookmarkNodeChildrenReordered, |
| 995 bookmarkNodeMoved: bookmarkNodeMoved, | 1012 bookmarkNodeMoved: bookmarkNodeMoved, |
| 996 bookmarkNodeRemoved: bookmarkNodeRemoved, | 1013 bookmarkNodeRemoved: bookmarkNodeRemoved, |
| 997 enterRearrangeMode: enterRearrangeMode, | 1014 enterRearrangeMode: enterRearrangeMode, |
| 998 getAppsCallback: getAppsCallback, | 1015 getAppsCallback: getAppsCallback, |
| 999 getAppsPageIndex: getAppsPageIndex, | 1016 getAppsPageIndex: getAppsPageIndex, |
| 1000 getCardSlider: getCardSlider, | 1017 getCardSlider: getCardSlider, |
| 1001 initialize: initialize, | |
| 1002 isRTL: isRTL, | 1018 isRTL: isRTL, |
| 1003 leaveRearrangeMode: leaveRearrangeMode, | 1019 leaveRearrangeMode: leaveRearrangeMode, |
| 1004 saveAppPageName: saveAppPageName, | 1020 saveAppPageName: saveAppPageName, |
| 1005 setAppToBeHighlighted: setAppToBeHighlighted, | 1021 setAppToBeHighlighted: setAppToBeHighlighted, |
| 1006 setBookmarksData: setBookmarksData, | 1022 setBookmarksData: setBookmarksData, |
| 1007 setMostVisitedPages: setMostVisitedPages, | 1023 setMostVisitedPages: setMostVisitedPages, |
| 1008 setRecentlyClosedTabs: setRecentlyClosedTabs, | 1024 setRecentlyClosedTabs: setRecentlyClosedTabs, |
| 1009 setStripeColor: setStripeColor, | 1025 setStripeColor: setStripeColor, |
| 1026 setup: setup, | |
| 1010 showNotification: showNotification, | 1027 showNotification: showNotification, |
| 1011 themeChanged: themeChanged, | 1028 themeChanged: themeChanged, |
| 1012 updateLogin: updateLogin, | 1029 updateLogin: updateLogin, |
| 1013 updateOfflineEnabledApps: updateOfflineEnabledApps | 1030 updateOfflineEnabledApps: updateOfflineEnabledApps |
| 1014 }; | 1031 }; |
| 1015 }); | 1032 }); |
| 1016 | 1033 |
| 1017 // publish ntp globals | 1034 // publish ntp globals |
| 1018 // TODO(estade): update the content handlers to use ntp namespace instead of | 1035 // TODO(estade): update the content handlers to use ntp namespace instead of |
| 1019 // making these global. | 1036 // making these global. |
| 1020 var assert = ntp4.assert; | 1037 var assert = ntp4.assert; |
| 1021 var getAppsCallback = ntp4.getAppsCallback; | 1038 var getAppsCallback = ntp4.getAppsCallback; |
| 1022 var appsPrefChangeCallback = ntp4.appsPrefChangeCallback; | 1039 var appsPrefChangeCallback = ntp4.appsPrefChangeCallback; |
| 1023 var themeChanged = ntp4.themeChanged; | 1040 var themeChanged = ntp4.themeChanged; |
| 1024 var recentlyClosedTabs = ntp4.setRecentlyClosedTabs; | 1041 var recentlyClosedTabs = ntp4.setRecentlyClosedTabs; |
| 1025 var setMostVisitedPages = ntp4.setMostVisitedPages; | 1042 var setMostVisitedPages = ntp4.setMostVisitedPages; |
| 1026 var updateLogin = ntp4.updateLogin; | 1043 var updateLogin = ntp4.updateLogin; |
| 1027 | 1044 |
| 1028 document.addEventListener('DOMContentLoaded', ntp4.initialize); | |
| 1029 window.addEventListener('online', ntp4.updateOfflineEnabledApps); | 1045 window.addEventListener('online', ntp4.updateOfflineEnabledApps); |
| 1030 window.addEventListener('offline', ntp4.updateOfflineEnabledApps); | 1046 window.addEventListener('offline', ntp4.updateOfflineEnabledApps); |
| OLD | NEW |