| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 // To avoid creating tons of unnecessary nodes. We assume we cannot fit more | 5 // To avoid creating tons of unnecessary nodes. We assume we cannot fit more |
| 6 // than this many items in the miniview. | 6 // than this many items in the miniview. |
| 7 var MAX_MINIVIEW_ITEMS = 15; | 7 var MAX_MINIVIEW_ITEMS = 15; |
| 8 | 8 |
| 9 // Extra spacing at the top of the layout. | 9 // Extra spacing at the top of the layout. |
| 10 var LAYOUT_SPACING_TOP = 25; | 10 var LAYOUT_SPACING_TOP = 25; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 } | 90 } |
| 91 | 91 |
| 92 var oldLayoutMode = layoutMode; | 92 var oldLayoutMode = layoutMode; |
| 93 var b = useSmallGrid(); | 93 var b = useSmallGrid(); |
| 94 layoutMode = b ? LayoutMode.SMALL : LayoutMode.NORMAL | 94 layoutMode = b ? LayoutMode.SMALL : LayoutMode.NORMAL |
| 95 | 95 |
| 96 if (layoutMode != oldLayoutMode){ | 96 if (layoutMode != oldLayoutMode){ |
| 97 mostVisited.useSmallGrid = b; | 97 mostVisited.useSmallGrid = b; |
| 98 mostVisited.layout(); | 98 mostVisited.layout(); |
| 99 renderRecentlyClosed(); | 99 renderRecentlyClosed(); |
| 100 updateAllMiniviewClippings(); |
| 100 } | 101 } |
| 101 | 102 |
| 102 layoutSections(); | 103 layoutSections(); |
| 103 } | 104 } |
| 104 | 105 |
| 105 // Stores some information about each section necessary to layout. A new | 106 // Stores some information about each section necessary to layout. A new |
| 106 // instance is constructed for each section on each layout. | 107 // instance is constructed for each section on each layout. |
| 107 function SectionLayoutInfo(section) { | 108 function SectionLayoutInfo(section) { |
| 108 this.section = section; | 109 this.section = section; |
| 109 this.header = section.getElementsByTagName('h2')[0]; | 110 this.header = section.getElementsByTagName('h2')[0]; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 120 // Get all sections to be layed out. | 121 // Get all sections to be layed out. |
| 121 SectionLayoutInfo.getAll = function() { | 122 SectionLayoutInfo.getAll = function() { |
| 122 var sections = document.querySelectorAll('.section:not(.disabled)'); | 123 var sections = document.querySelectorAll('.section:not(.disabled)'); |
| 123 var result = []; | 124 var result = []; |
| 124 for (var i = 0, section; section = sections[i]; i++) { | 125 for (var i = 0, section; section = sections[i]; i++) { |
| 125 result.push(new SectionLayoutInfo(section)); | 126 result.push(new SectionLayoutInfo(section)); |
| 126 } | 127 } |
| 127 return result; | 128 return result; |
| 128 }; | 129 }; |
| 129 | 130 |
| 131 // Ensure the miniview sections don't have any clipped items. |
| 132 function updateMiniviewClipping(miniview) { |
| 133 var clipped = false; |
| 134 for (var j = 0, item; item = miniview.children[j]; j++) { |
| 135 item.style.display = ''; |
| 136 if (clipped || |
| 137 (item.offsetLeft + item.offsetWidth) > miniview.offsetWidth) { |
| 138 item.style.display = 'none'; |
| 139 clipped = true; |
| 140 } else { |
| 141 item.style.display = ''; |
| 142 } |
| 143 } |
| 144 } |
| 145 |
| 146 // Ensure none of the miniviews have any clipped items. |
| 147 function updateAllMiniviewClippings() { |
| 148 var miniviews = document.querySelectorAll('.section.hidden .miniview'); |
| 149 for (var i = 0, miniview; miniview = miniviews[i]; i++) { |
| 150 updateMiniviewClipping(miniview); |
| 151 } |
| 152 } |
| 153 |
| 130 // Layout the sections in a modified accordian. The header and miniview, if | 154 // Layout the sections in a modified accordian. The header and miniview, if |
| 131 // visible are fixed within the viewport. If there is an expanded section, its | 155 // visible are fixed within the viewport. If there is an expanded section, its |
| 132 // it scrolls. | 156 // it scrolls. |
| 133 // | 157 // |
| 134 // ============================= | 158 // ============================= |
| 135 // | collapsed section | <- Any collapsed sections are fixed position. | 159 // | collapsed section | <- Any collapsed sections are fixed position. |
| 136 // | and miniview | | 160 // | and miniview | |
| 137 // |---------------------------| | 161 // |---------------------------| |
| 138 // | expanded section | | 162 // | expanded section | |
| 139 // | | <- There can be one expanded section and it | 163 // | | <- There can be one expanded section and it |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 document.body.style.height = ''; | 233 document.body.style.height = ''; |
| 210 } | 234 } |
| 211 } | 235 } |
| 212 | 236 |
| 213 // Now position all the elements. | 237 // Now position all the elements. |
| 214 var y = LAYOUT_SPACING_TOP; | 238 var y = LAYOUT_SPACING_TOP; |
| 215 for (i = 0, section; section = sections[i]; i++) { | 239 for (i = 0, section; section = sections[i]; i++) { |
| 216 section.section.style.top = y + 'px'; | 240 section.section.style.top = y + 'px'; |
| 217 y += section.fixedHeight; | 241 y += section.fixedHeight; |
| 218 | 242 |
| 219 if (section.maxiview) { | 243 if (section.maxiview && section == expandedSection) { |
| 220 section.maxiview.style.top = y + 'px'; | 244 section.maxiview.style.top = y + 'px'; |
| 221 | 245 updateMask(section.maxiview, expandedSectionHeight); |
| 222 if (section == expandedSection) | |
| 223 updateMask(section.maxiview, expandedSectionHeight); | |
| 224 } | 246 } |
| 225 | 247 |
| 226 if (section == expandedSection) | 248 if (section == expandedSection) |
| 227 y += expandedSectionHeight; | 249 y += expandedSectionHeight; |
| 228 } | 250 } |
| 229 } | 251 } |
| 230 | 252 |
| 231 function updateMask(maxiview, visibleHeightPx) { | 253 function updateMask(maxiview, visibleHeightPx) { |
| 232 // We want to end up with 10px gradients at the top and bottom of | 254 // We want to end up with 10px gradients at the top and bottom of |
| 233 // visibleHeight, but webkit-mask only supports expression in terms of | 255 // visibleHeight, but webkit-mask only supports expression in terms of |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 } | 306 } |
| 285 | 307 |
| 286 function showSection(section) { | 308 function showSection(section) { |
| 287 if (!(section & shownSections)) { | 309 if (!(section & shownSections)) { |
| 288 shownSections |= section; | 310 shownSections |= section; |
| 289 var el = getSectionElement(section); | 311 var el = getSectionElement(section); |
| 290 if (el) { | 312 if (el) { |
| 291 el.classList.remove('hidden'); | 313 el.classList.remove('hidden'); |
| 292 | 314 |
| 293 var maxiview = getSectionMaxiview(el); | 315 var maxiview = getSectionMaxiview(el); |
| 294 if (maxiview) | 316 if (maxiview) { |
| 317 maxiview.classList.remove('hiding'); |
| 295 maxiview.classList.remove('hidden'); | 318 maxiview.classList.remove('hidden'); |
| 319 } |
| 296 } | 320 } |
| 297 | 321 |
| 298 switch (section) { | 322 switch (section) { |
| 299 case Section.THUMB: | 323 case Section.THUMB: |
| 300 mostVisited.visible = true; | 324 mostVisited.visible = true; |
| 301 mostVisited.layout(); | 325 mostVisited.layout(); |
| 302 break; | 326 break; |
| 303 } | 327 } |
| 304 } | 328 } |
| 305 } | 329 } |
| 306 | 330 |
| 307 function hideSection(section) { | 331 function hideSection(section) { |
| 308 if (section & shownSections) { | 332 if (section & shownSections) { |
| 309 shownSections &= ~section; | 333 shownSections &= ~section; |
| 310 | 334 |
| 311 switch (section) { | 335 switch (section) { |
| 312 case Section.THUMB: | 336 case Section.THUMB: |
| 313 mostVisited.visible = false; | 337 mostVisited.visible = false; |
| 314 mostVisited.layout(); | 338 mostVisited.layout(); |
| 315 break; | 339 break; |
| 316 } | 340 } |
| 317 | 341 |
| 318 var el = getSectionElement(section); | 342 var el = getSectionElement(section); |
| 319 if (el) { | 343 if (el) { |
| 320 el.classList.add('hidden'); | 344 el.classList.add('hidden'); |
| 321 | 345 |
| 322 var maxiview = getSectionMaxiview(el); | 346 var maxiview = getSectionMaxiview(el); |
| 323 if (maxiview) | 347 if (maxiview) |
| 324 maxiview.classList.add('hidden'); | 348 maxiview.classList.add('hiding'); |
| 349 |
| 350 var miniview = el.getElementsByClassName('miniview')[0]; |
| 351 if (miniview) |
| 352 updateMiniviewClipping(miniview); |
| 325 } | 353 } |
| 326 } | 354 } |
| 327 } | 355 } |
| 328 | 356 |
| 357 window.addEventListener('webkitTransitionEnd', function(e) { |
| 358 if (e.target.classList.contains('hiding')) |
| 359 e.target.classList.add('hidden'); |
| 360 |
| 361 document.documentElement.setAttribute("enable-section-animations", "false"); |
| 362 }); |
| 363 |
| 329 /** | 364 /** |
| 330 * Callback when the shown sections changes in another NTP. | 365 * Callback when the shown sections changes in another NTP. |
| 331 * @param {number} newShownSections Bitmask of the shown sections. | 366 * @param {number} newShownSections Bitmask of the shown sections. |
| 332 */ | 367 */ |
| 333 function setShownSections(newShownSections) { | 368 function setShownSections(newShownSections) { |
| 334 for (var key in Section) { | 369 for (var key in Section) { |
| 335 if (newShownSections & Section[key]) | 370 if (newShownSections & Section[key]) |
| 336 showSection(Section[key]); | 371 showSection(Section[key]); |
| 337 else | 372 else |
| 338 hideSection(Section[key]); | 373 hideSection(Section[key]); |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 return; | 829 return; |
| 795 } | 830 } |
| 796 | 831 |
| 797 p = p.parentNode; | 832 p = p.parentNode; |
| 798 if (!getSectionMaxiview(p)) { | 833 if (!getSectionMaxiview(p)) { |
| 799 return; | 834 return; |
| 800 } | 835 } |
| 801 | 836 |
| 802 var section = p.getAttribute('section'); | 837 var section = p.getAttribute('section'); |
| 803 if (section) { | 838 if (section) { |
| 839 // We set it back in webkitTransitionEnd. |
| 840 document.documentElement.setAttribute("enable-section-animations", "true"); |
| 804 if (shownSections & Section[section]) { | 841 if (shownSections & Section[section]) { |
| 805 hideSection(Section[section]); | 842 hideSection(Section[section]); |
| 806 } else { | 843 } else { |
| 807 for (var p in Section) { | 844 for (var p in Section) { |
| 808 if (p == section) | 845 if (p == section) |
| 809 showSection(Section[p]); | 846 showSection(Section[p]); |
| 810 else | 847 else |
| 811 hideSection(Section[p]); | 848 hideSection(Section[p]); |
| 812 } | 849 } |
| 813 } | 850 } |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1077 window.setTimeout(function() { | 1114 window.setTimeout(function() { |
| 1078 mostVisited.ensureSmallGridCorrect(); | 1115 mostVisited.ensureSmallGridCorrect(); |
| 1079 document.body.classList.remove('loading'); | 1116 document.body.classList.remove('loading'); |
| 1080 }, 1); | 1117 }, 1); |
| 1081 | 1118 |
| 1082 // Only show the first run notification if first run. | 1119 // Only show the first run notification if first run. |
| 1083 if (firstRun) { | 1120 if (firstRun) { |
| 1084 showFirstRunNotification(); | 1121 showFirstRunNotification(); |
| 1085 } | 1122 } |
| 1086 } | 1123 } |
| OLD | NEW |