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

Side by Side Diff: chrome/browser/resources/new_new_tab.js

Issue 149127: Another batrch of performance improvements for NNTP... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 5 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
« no previous file with comments | « chrome/browser/resources/new_new_tab.html ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 // Helpers 2 // Helpers
3 3
4 function $(id) { 4 function $(id) {
5 return document.getElementById(id); 5 return document.getElementById(id);
6 } 6 }
7 7
8 // TODO(arv): Remove these when classList is available in HTML5. 8 // TODO(arv): Remove these when classList is available in HTML5.
9 // https://bugs.webkit.org/show_bug.cgi?id=20709 9 // https://bugs.webkit.org/show_bug.cgi?id=20709
10 function hasClass(el, name) { 10 function hasClass(el, name) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 // differently. 77 // differently.
78 var maxItems = 8; 78 var maxItems = 8;
79 data.length = Math.min(maxItems, data.length); 79 data.length = Math.min(maxItems, data.length);
80 var len = data.length; 80 var len = data.length;
81 for (var i = len; i < maxItems; i++) { 81 for (var i = len; i < maxItems; i++) {
82 data[i] = {filler: true}; 82 data[i] = {filler: true};
83 } 83 }
84 84
85 mostVisitedData = data; 85 mostVisitedData = data;
86 renderMostVisited(data); 86 renderMostVisited(data);
87 layoutMostVisited();
88 87
89 gotMostVisited = true; 88 gotMostVisited = true;
90 onDataLoaded(); 89 onDataLoaded();
91 } 90 }
92 91
93 function downloadsList(data) { 92 function downloadsList(data) {
94 logEvent('received downloads'); 93 logEvent('received downloads');
95 data.length = Math.min(data.length, 5); 94 data.length = Math.min(data.length, 5);
96 processData('#download-items', data); 95 processData('#download-items', data);
97 } 96 }
98 97
99 function recentlyClosedTabs(data) { 98 function recentlyClosedTabs(data) {
100 logEvent('received recently closed tabs'); 99 logEvent('received recently closed tabs');
101 data.length = Math.min(data.length, 5); 100 data.length = Math.min(data.length, 5);
102 processData('#tab-items', data); 101 processData('#tab-items', data);
103 } 102 }
104 103
105 function onShownSections(mask) { 104 function onShownSections(mask) {
106 logEvent('received shown sections'); 105 logEvent('received shown sections');
107 if (mask != shownSections) { 106 if (mask != shownSections) {
107
108 // Only invalidate most visited if needed.
109 if (mask & Section.THUMB != shownSections & Section.THUMB ||
110 mask & Section.LIST != shownSections & Section.LIST) {
111 mostVisited.invalidate();
112 }
113
108 shownSections = mask; 114 shownSections = mask;
109 // No need to relayout these unless changed.
110 mostVisited.updateDisplayMode(); 115 mostVisited.updateDisplayMode();
111 layoutMostVisited();
112 layoutLowerSections(); 116 layoutLowerSections();
113 updateOptionMenu(); 117 updateOptionMenu();
114 } 118 }
115 119
116 gotShownSections = true; 120 gotShownSections = true;
117 onDataLoaded(); 121 onDataLoaded();
118 } 122 }
119 123
120 function saveShownSections() { 124 function saveShownSections() {
121 chrome.send('setShownSections', [String(shownSections)]); 125 chrome.send('setShownSections', [String(shownSections)]);
122 } 126 }
123 127
124 function tips(data) { 128 function tips(data) {
125 logEvent('received tips data'); 129 logEvent('received tips data');
126 data.length = Math.min(data.length, 5); 130 data.length = Math.min(data.length, 5);
127 processData('#tip-items', data); 131 processData('#tip-items', data);
128 } 132 }
129 133
130 function layoutMostVisited() {
131 var d0 = Date.now();
132 var mostVisitedElement = $('most-visited');
133 var thumbnails = mostVisitedElement.querySelectorAll('.thumbnail-container');
134
135 if (thumbnails.length < 8) {
136 return;
137 }
138
139 var small = useSmallGrid();
140
141 var cols = 4;
142 var rows = 2;
143 var marginWidth = 10;
144 var marginHeight = 7;
145 var borderWidth = 4;
146 var thumbWidth = small ? 150 : 212;
147 var thumbHeight = small ? 93 : 132;
148 var w = thumbWidth + 2 * borderWidth + 2 * marginWidth;
149 var h = thumbHeight + 40 + 2 * marginHeight;
150 var sumWidth = cols * w - 2 * marginWidth;
151 var sumHeight = rows * h;
152 var opacity = 1;
153
154 if (shownSections & Section.LIST) {
155 w = (sumWidth + 2 * marginWidth) / 2;
156 h = 45;
157 rows = 4;
158 cols = 2;
159 sumHeight = rows * h;
160 addClass(mostVisitedElement, 'list');
161 } else if (shownSections & Section.THUMB) {
162 removeClass(mostVisitedElement, 'list');
163 } else {
164 sumHeight = 0;
165 opacity = 0;
166 }
167
168 mostVisitedElement.style.height = sumHeight + 'px';
169 mostVisitedElement.style.opacity = opacity;
170 // We set overflow to hidden so that the most visited element does not
171 // "leak" when we hide and show it.
172 mostVisitedElement.style.overflow = 'hidden';
173
174 var rtl = document.documentElement.dir == 'rtl';
175
176 if (shownSections & Section.THUMB || shownSections & Section.LIST) {
177 for (var i = 0; i < thumbnails.length; i++) {
178 var t = thumbnails[i];
179
180 var row, col;
181 if (shownSections & Section.THUMB) {
182 row = Math.floor(i / cols);
183 col = i % cols;
184 } else {
185 col = Math.floor(i / rows);
186 row = i % rows;
187 }
188
189 if (shownSections & Section.THUMB) {
190 t.style.left = (rtl ?
191 sumWidth - col * w - thumbWidth - 2 * borderWidth :
192 col * w) + 'px';
193 } else {
194 t.style.left = (rtl ?
195 sumWidth - col * w - w + 2 * marginWidth :
196 col * w) + 'px';
197 }
198 t.style.top = row * h + 'px';
199
200 if (shownSections & Section.LIST) {
201 t.style.width = w - 2 * marginWidth + 'px';
202 } else {
203 t.style.width = '';
204 }
205 }
206 }
207
208 afterTransition(function() {
209 // Only set overflow to visible if the element is shown.
210 if (opacity) {
211 mostVisitedElement.style.overflow = '';
212 }
213 });
214
215 logEvent('layoutMostVisited: ' + (Date.now() - d0));
216 }
217
218 // This global variable is used to skip parts of the DOM tree for the global 134 // This global variable is used to skip parts of the DOM tree for the global
219 // jst processing done by the i18n. 135 // jst processing done by the i18n.
220 var processing = false; 136 var processing = false;
221 137
222 function processData(selector, data) { 138 function processData(selector, data) {
223 var output = document.querySelector(selector); 139 var output = document.querySelector(selector);
224 140
225 // Wait until ready 141 // Wait until ready
226 if (typeof JsEvalContext !== 'function' || !output) { 142 if (typeof JsEvalContext !== 'function' || !output) {
227 logEvent('JsEvalContext is not yet available, ' + selector); 143 logEvent('JsEvalContext is not yet available, ' + selector);
228 document.addEventListener('DOMContentLoaded', function() { 144 document.addEventListener('DOMContentLoaded', function() {
229 processData(selector, data); 145 processData(selector, data);
230 }); 146 });
231 } else { 147 } else {
232 var d0 = Date.now(); 148 var d0 = Date.now();
233 var input = new JsEvalContext(data); 149 var input = new JsEvalContext(data);
234 processing = true; 150 processing = true;
235 jstProcess(input, output); 151 jstProcess(input, output);
236 processing = false; 152 processing = false;
237 logEvent('processData: ' + selector + ', ' + (Date.now() - d0)); 153 logEvent('processData: ' + selector + ', ' + (Date.now() - d0));
238 } 154 }
239 } 155 }
240 156
241 var thumbnailTemplate;
242
243 function getThumbnailClassName(data) { 157 function getThumbnailClassName(data) {
244 return 'thumbnail-container' + 158 return 'thumbnail-container' +
245 (data.pinned ? ' pinned' : '') + 159 (data.pinned ? ' pinned' : '') +
246 (data.filler ? ' filler' : ''); 160 (data.filler ? ' filler' : '');
247 } 161 }
248 162
249 function renderMostVisited(data) { 163 function renderMostVisited(data) {
250 var parent = $('most-visited'); 164 var parent = $('most-visited');
251 if (!thumbnailTemplate) {
252 thumbnailTemplate = $('thumbnail-template');
253 thumbnailTemplate.parentNode.removeChild(thumbnailTemplate);
254 }
255
256 var children = parent.children; 165 var children = parent.children;
257 for (var i = 0; i < data.length; i++) { 166 for (var i = 0; i < data.length; i++) {
258 var d = data[i]; 167 var d = data[i];
259 var reuse = !!children[i]; 168 var t = children[i];
260 var t = children[i] || thumbnailTemplate.cloneNode(true); 169
261 t.style.display = ''; 170 // If we have a filler continue
262 t.className = getThumbnailClassName(d); 171 var oldClassName = t.className;
172 var newClassName = getThumbnailClassName(d);
173 if (oldClassName != newClassName) {
174 t.className = newClassName;
175 }
176
177 // No need to continue if this is a filler.
178 if (newClassName == 'thumbnail-container filler') {
179 continue;
180 }
181
263 t.title = d.title; 182 t.title = d.title;
264 t.href = d.url; 183 t.href = d.url;
265 t.querySelector('.pin').title = localStrings.getString(d.pinned ? 184 t.querySelector('.pin').title = localStrings.getString(d.pinned ?
266 'unpinthumbnailtooltip' : 'pinthumbnailtooltip'); 185 'unpinthumbnailtooltip' : 'pinthumbnailtooltip');
267 t.querySelector('.remove').title = 186 t.querySelector('.remove').title =
268 localStrings.getString('removethumbnailtooltip'); 187 localStrings.getString('removethumbnailtooltip');
269 188
270 // There was some concern that a malformed malicious URL could cause an XSS 189 // There was some concern that a malformed malicious URL could cause an XSS
271 // attack but setting style.backgroundImage = 'url(javascript:...)' does 190 // attack but setting style.backgroundImage = 'url(javascript:...)' does
272 // not execute the JavaScript in WebKit. 191 // not execute the JavaScript in WebKit.
273 t.querySelector('.thumbnail-wrapper').style.backgroundImage = 192 t.querySelector('.thumbnail-wrapper').style.backgroundImage =
274 'url(chrome://thumb/' + d.url + ')'; 193 'url(chrome://thumb/' + d.url + ')';
275 var titleDiv = t.querySelector('.title > div'); 194 var titleDiv = t.querySelector('.title > div');
276 titleDiv.textContent = d.title; 195 titleDiv.textContent = d.title;
277 titleDiv.style.backgroundImage = 'url(chrome://favicon/' + d.url + ')'; 196 titleDiv.style.backgroundImage = 'url(chrome://favicon/' + d.url + ')';
278 titleDiv.dir = d.direction; 197 titleDiv.dir = d.direction;
279 if (!reuse) {
280 parent.appendChild(t);
281 }
282 } 198 }
283 } 199 }
284 200
285 /** 201 /**
286 * Calls chrome.send with a callback and restores the original afterwards. 202 * Calls chrome.send with a callback and restores the original afterwards.
287 */ 203 */
288 function chromeSend(name, params, callbackName, callback) { 204 function chromeSend(name, params, callbackName, callback) {
289 var old = global[callbackName]; 205 var old = global[callbackName];
290 global[callbackName] = function() { 206 global[callbackName] = function() {
291 // restore 207 // restore
(...skipping 12 matching lines...) Expand all
304 function handleWindowResize(e, opt_noUpdate) { 220 function handleWindowResize(e, opt_noUpdate) {
305 var body = document.body; 221 var body = document.body;
306 if (!body || body.clientWidth < 10) { 222 if (!body || body.clientWidth < 10) {
307 // We're probably a background tab, so don't do anything. 223 // We're probably a background tab, so don't do anything.
308 return; 224 return;
309 } 225 }
310 226
311 var hasSmallClass = hasClass(body, 'small'); 227 var hasSmallClass = hasClass(body, 'small');
312 if (hasSmallClass && !useSmallGrid()) { 228 if (hasSmallClass && !useSmallGrid()) {
313 removeClass(body, 'small'); 229 removeClass(body, 'small');
230 mostVisited.invalidate();
314 if (!opt_noUpdate) { 231 if (!opt_noUpdate) {
315 layoutMostVisited(); 232 mostVisited.layout();
316 layoutLowerSections(); 233 layoutLowerSections();
317 } 234 }
318 } else if (!hasSmallClass && useSmallGrid()) { 235 } else if (!hasSmallClass && useSmallGrid()) {
319 addClass(body, 'small'); 236 addClass(body, 'small');
237 mostVisited.invalidate();
320 if (!opt_noUpdate) { 238 if (!opt_noUpdate) {
321 layoutMostVisited(); 239 mostVisited.layout();
322 layoutLowerSections(); 240 layoutLowerSections();
323 } 241 }
324 } 242 }
325 } 243 }
326 244
327 /** 245 /**
328 * Bitmask for the different UI sections. 246 * Bitmask for the different UI sections.
329 * This matches the Section enum in ../dom_ui/shown_sections_handler.h 247 * This matches the Section enum in ../dom_ui/shown_sections_handler.h
330 * @enum {number} 248 * @enum {number}
331 */ 249 */
332 var Section = { 250 var Section = {
333 THUMB: 1, 251 THUMB: 1,
334 LIST: 2, 252 LIST: 2,
335 RECENT: 4, 253 RECENT: 4,
336 TIPS: 8 254 TIPS: 8
337 }; 255 };
338 256
339 var shownSections = Section.THUMB | Section.RECENT | Section.TIPS; 257 var shownSections = Section.THUMB | Section.RECENT | Section.TIPS;
340 258
341 function showSection(section) { 259 function showSection(section) {
342 if (!(section & shownSections)) { 260 if (!(section & shownSections)) {
261 shownSections |= section;
262
343 // THUMBS and LIST are mutually exclusive. 263 // THUMBS and LIST are mutually exclusive.
344 if (section == Section.THUMB) { 264 if (section == Section.THUMB) {
345 hideSection(Section.LIST); 265 // hide LIST
266 shownSections &= ~Section.LIST;
267 mostVisited.invalidate();
346 } else if (section == Section.LIST) { 268 } else if (section == Section.LIST) {
347 hideSection(Section.THUMB); 269 // hide THUMB
270 shownSections &= ~Section.THUMB;
271 mostVisited.invalidate();
272 } else {
273 notifyLowerSectionForChange(section, false);
274 layoutLowerSections();
348 } 275 }
349 276
350 shownSections |= section; 277 updateOptionMenu();
351 notifyLowerSectionForChange(section, false);
352
353 mostVisited.updateDisplayMode(); 278 mostVisited.updateDisplayMode();
354 layoutMostVisited(); 279 mostVisited.layout();
355 updateOptionMenu();
356 layoutLowerSections();
357 } 280 }
358 } 281 }
359 282
360 function hideSection(section) { 283 function hideSection(section) {
361 if (section & shownSections) { 284 if (section & shownSections) {
362 shownSections &= ~section; 285 shownSections &= ~section;
363 notifyLowerSectionForChange(section, true);
364 286
287 if (section & Section.THUMB || section & Section.LIST) {
288 mostVisited.invalidate();
289 }
290
291 if (section & Section.RECENT|| section & Section.TIPS) {
292 notifyLowerSectionForChange(section, true);
293 layoutLowerSections();
294 }
295
296 updateOptionMenu();
365 mostVisited.updateDisplayMode(); 297 mostVisited.updateDisplayMode();
366 layoutMostVisited(); 298 mostVisited.layout();
367 updateOptionMenu();
368 layoutLowerSections();
369 } 299 }
370 } 300 }
371 301
372 function notifyLowerSectionForChange(section, large) { 302 function notifyLowerSectionForChange(section, large) {
373 // Notify recent and tips if they need to display more data. 303 // Notify recent and tips if they need to display more data.
374 if (section == Section.RECENT || section == Section.TIPS) { 304 if (section == Section.RECENT || section == Section.TIPS) {
375 // we are hiding one of them so if the other one is visible it is now 305 // we are hiding one of them so if the other one is visible it is now
376 // {@code large}. 306 // {@code large}.
377 if (shownSections & Section.RECENT) { 307 if (shownSections & Section.RECENT) {
378 recentChangedSize(large); 308 recentChangedSize(large);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 423
494 removeFromBlackList: function(url) { 424 removeFromBlackList: function(url) {
495 chrome.send('removeURLsFromMostVisitedBlacklist', [url]); 425 chrome.send('removeURLsFromMostVisitedBlacklist', [url]);
496 }, 426 },
497 427
498 clearAllBlacklisted: function() { 428 clearAllBlacklisted: function() {
499 chrome.send('clearMostVisitedURLsBlacklist', []); 429 chrome.send('clearMostVisitedURLsBlacklist', []);
500 }, 430 },
501 431
502 updateDisplayMode: function() { 432 updateDisplayMode: function() {
433 if (!this.dirty_) {
434 return;
435 }
436
503 var thumbCheckbox = $('thumb-checkbox'); 437 var thumbCheckbox = $('thumb-checkbox');
504 var listCheckbox = $('list-checkbox'); 438 var listCheckbox = $('list-checkbox');
505 var mostVisitedElement = $('most-visited'); 439 var mostVisitedElement = $('most-visited');
506 440
507 if (shownSections & Section.THUMB) { 441 if (shownSections & Section.THUMB) {
508 thumbCheckbox.checked = true; 442 thumbCheckbox.checked = true;
509 listCheckbox.checked = false; 443 listCheckbox.checked = false;
510 removeClass(mostVisitedElement, 'list'); 444 removeClass(mostVisitedElement, 'list');
511 } else if (shownSections & Section.LIST) { 445 } else if (shownSections & Section.LIST) {
512 thumbCheckbox.checked = false; 446 thumbCheckbox.checked = false;
513 listCheckbox.checked = true; 447 listCheckbox.checked = true;
514 addClass(mostVisitedElement, 'list'); 448 addClass(mostVisitedElement, 'list');
515 } else { 449 } else {
516 thumbCheckbox.checked = false; 450 thumbCheckbox.checked = false;
517 listCheckbox.checked = false; 451 listCheckbox.checked = false;
518 } 452 }
519 453
520 thumbCheckbox.title = localStrings.getString( 454 thumbCheckbox.title = localStrings.getString(
521 shownSections & Section.THUMB ? 'hidethumbnails' : 'showthumbnails'); 455 shownSections & Section.THUMB ? 'hidethumbnails' : 'showthumbnails');
522 listCheckbox.title = localStrings.getString( 456 listCheckbox.title = localStrings.getString(
523 shownSections & Section.LIST ? 'hidelist' : 'showlist'); 457 shownSections & Section.LIST ? 'hidelist' : 'showlist');
458 },
459
460 dirty_: false,
461
462 invalidate: function() {
463 this.dirty_ = true;
464 },
465
466 layout: function() {
467 if (!this.dirty_) {
468 return;
469 }
470 var d0 = Date.now();
471 var mostVisitedElement = $('most-visited');
472 var thumbnails = mostVisitedElement.children;
473
474 var small = useSmallGrid();
475
476 var cols = 4;
477 var rows = 2;
478 var marginWidth = 10;
479 var marginHeight = 7;
480 var borderWidth = 4;
481 var thumbWidth = small ? 150 : 212;
482 var thumbHeight = small ? 93 : 132;
483 var w = thumbWidth + 2 * borderWidth + 2 * marginWidth;
484 var h = thumbHeight + 40 + 2 * marginHeight;
485 var sumWidth = cols * w - 2 * marginWidth;
486 var sumHeight = rows * h;
487 var opacity = 1;
488
489 if (shownSections & Section.LIST) {
490 w = (sumWidth + 2 * marginWidth) / 2;
491 h = 45;
492 rows = 4;
493 cols = 2;
494 sumHeight = rows * h;
495 addClass(mostVisitedElement, 'list');
496 } else if (shownSections & Section.THUMB) {
497 removeClass(mostVisitedElement, 'list');
498 } else {
499 sumHeight = 0;
500 opacity = 0;
501 }
502
503 mostVisitedElement.style.height = sumHeight + 'px';
504 mostVisitedElement.style.opacity = opacity;
505 // We set overflow to hidden so that the most visited element does not
506 // "leak" when we hide and show it.
507 if (!opacity) {
508 mostVisitedElement.style.overflow = 'hidden';
509 }
510
511 var rtl = document.documentElement.dir == 'rtl';
512
513 if (shownSections & Section.THUMB || shownSections & Section.LIST) {
514 for (var i = 0; i < thumbnails.length; i++) {
515 var t = thumbnails[i];
516
517 var row, col;
518 if (shownSections & Section.THUMB) {
519 row = Math.floor(i / cols);
520 col = i % cols;
521 } else {
522 col = Math.floor(i / rows);
523 row = i % rows;
524 }
525
526 if (shownSections & Section.THUMB) {
527 t.style.left = (rtl ?
528 sumWidth - col * w - thumbWidth - 2 * borderWidth :
529 col * w) + 'px';
530 } else {
531 t.style.left = (rtl ?
532 sumWidth - col * w - w + 2 * marginWidth :
533 col * w) + 'px';
534 }
535 t.style.top = row * h + 'px';
536
537 if (shownSections & Section.LIST) {
538 t.style.width = w - 2 * marginWidth + 'px';
539 } else {
540 t.style.width = '';
541 }
542 }
543 }
544
545 afterTransition(function() {
546 // Only set overflow to visible if the element is shown.
547 if (opacity) {
548 mostVisitedElement.style.overflow = '';
549 }
550 });
551
552 this.dirty_ = false;
553
554 logEvent('mostVisited.layout: ' + (Date.now() - d0));
524 } 555 }
525 }; 556 };
526 557
527 function recentChangedSize(large) { 558 function recentChangedSize(large) {
528 // TODO(arv): Implement 559 // TODO(arv): Implement
529 } 560 }
530 561
531 function tipsChangedSize(large) { 562 function tipsChangedSize(large) {
532 // TODO(arv): Implement 563 // TODO(arv): Implement
533 } 564 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 return localStrings.getString('closedwindowsingle'); 616 return localStrings.getString('closedwindowsingle');
586 return localStrings.formatString('closedwindowmultiple', numTabs); 617 return localStrings.formatString('closedwindowmultiple', numTabs);
587 } 618 }
588 619
589 /** 620 /**
590 * We need both most visited and the shown sections to be considered loaded. 621 * We need both most visited and the shown sections to be considered loaded.
591 * @return {boolean} 622 * @return {boolean}
592 */ 623 */
593 function onDataLoaded() { 624 function onDataLoaded() {
594 if (gotMostVisited && gotShownSections) { 625 if (gotMostVisited && gotShownSections) {
626 mostVisited.layout();
595 loading = false; 627 loading = false;
596 // Remove class name in a timeout so that changes done in this JS thread are 628 // Remove class name in a timeout so that changes done in this JS thread are
597 // not animated. 629 // not animated.
598 window.setTimeout(function() { 630 window.setTimeout(function() {
599 removeClass(document.body, 'loading'); 631 removeClass(document.body, 'loading');
600 }, 10); 632 }, 10);
601 } 633 }
602 } 634 }
603 635
604 // Theme related 636 // Theme related
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 executeItem: function(item) { 879 executeItem: function(item) {
848 var section = Section[item.getAttribute('section')]; 880 var section = Section[item.getAttribute('section')];
849 var show = item.getAttribute('show') == 'true'; 881 var show = item.getAttribute('show') == 'true';
850 if (show) { 882 if (show) {
851 showSection(section); 883 showSection(section);
852 } else { 884 } else {
853 hideSection(section); 885 hideSection(section);
854 } 886 }
855 887
856 this.hideMenu(); 888 this.hideMenu();
857
858 layoutLowerSections();
859 mostVisited.updateDisplayMode();
860 layoutMostVisited();
861
862 saveShownSections(); 889 saveShownSections();
863 } 890 }
864 }; 891 };
865 892
866 new OptionMenu($('option-button'), $('option-menu')); 893 new OptionMenu($('option-button'), $('option-menu'));
867 894
868 $('most-visited').addEventListener('click', function(e) { 895 $('most-visited').addEventListener('click', function(e) {
869 var target = e.target; 896 var target = e.target;
870 if (hasClass(target, 'pin')) { 897 if (hasClass(target, 'pin')) {
871 mostVisited.togglePinned(mostVisited.getItem(target)); 898 mostVisited.togglePinned(mostVisited.getItem(target));
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
948 menuEl.style.top = rect.top + bodyRect.top + rect.height + 'px'; 975 menuEl.style.top = rect.top + bodyRect.top + rect.height + 'px';
949 976
950 } 977 }
951 978
952 $('thumb-checkbox').addEventListener('change', function(e) { 979 $('thumb-checkbox').addEventListener('change', function(e) {
953 if (e.target.checked) { 980 if (e.target.checked) {
954 showSection(Section.THUMB); 981 showSection(Section.THUMB);
955 } else { 982 } else {
956 hideSection(Section.THUMB); 983 hideSection(Section.THUMB);
957 } 984 }
958 mostVisited.updateDisplayMode();
959 layoutMostVisited();
960 saveShownSections(); 985 saveShownSections();
961 }); 986 });
962 987
963 $('list-checkbox').addEventListener('change', function(e) { 988 $('list-checkbox').addEventListener('change', function(e) {
964 var newValue = shownSections;
965 if (e.target.checked) { 989 if (e.target.checked) {
966 showSection(Section.LIST); 990 showSection(Section.LIST);
967 } else { 991 } else {
968 hideSection(Section.LIST); 992 hideSection(Section.LIST);
969 } 993 }
970 mostVisited.updateDisplayMode();
971 layoutMostVisited();
972 saveShownSections(); 994 saveShownSections();
973 }); 995 });
974 996
975 window.addEventListener('load', bind(logEvent, global, 'onload fired')); 997 window.addEventListener('load', bind(logEvent, global, 'onload fired'));
976 window.addEventListener('load', onDataLoaded); 998 window.addEventListener('load', onDataLoaded);
977 window.addEventListener('resize', handleWindowResize); 999 window.addEventListener('resize', handleWindowResize);
978 document.addEventListener('DOMContentLoaded', bind(logEvent, global, 1000 document.addEventListener('DOMContentLoaded', bind(logEvent, global,
979 'domcontentloaded fired')); 1001 'domcontentloaded fired'));
980 1002
981 // DnD 1003 // DnD
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 } 1042 }
1021 1043
1022 this.currentOverItem = null; 1044 this.currentOverItem = null;
1023 }, 1045 },
1024 1046
1025 handleDrop: function(e) { 1047 handleDrop: function(e) {
1026 var dropTarget = mostVisited.getItem(e.target); 1048 var dropTarget = mostVisited.getItem(e.target);
1027 if (this.canDropOnElement(dropTarget)) { 1049 if (this.canDropOnElement(dropTarget)) {
1028 dropTarget.style.zIndex = 1; 1050 dropTarget.style.zIndex = 1;
1029 mostVisited.swapPosition(this.dragItem, dropTarget); 1051 mostVisited.swapPosition(this.dragItem, dropTarget);
1030 layoutMostVisited(); 1052 mostVisited.invalidate();
1053 mostVisited.layout();
1031 e.preventDefault(); 1054 e.preventDefault();
1032 if (this.dragEndTimer) { 1055 if (this.dragEndTimer) {
1033 window.clearTimeout(this.dragEndTimer); 1056 window.clearTimeout(this.dragEndTimer);
1034 this.dragEndTimer = null; 1057 this.dragEndTimer = null;
1035 } 1058 }
1036 afterTransition(function() { 1059 afterTransition(function() {
1037 dropTarget.style.zIndex = ''; 1060 dropTarget.style.zIndex = '';
1038 }); 1061 });
1039 } 1062 }
1040 }, 1063 },
1041 1064
1042 handleDragEnd: function(e) { 1065 handleDragEnd: function(e) {
1043 // WebKit fires dragend before drop. 1066 // WebKit fires dragend before drop.
1044 var dragItem = this.dragItem; 1067 var dragItem = this.dragItem;
1045 if (dragItem) { 1068 if (dragItem) {
1046 dragItem.style.pointerEvents = ''; 1069 dragItem.style.pointerEvents = '';
1047 removeClass(dragItem, 'dragging'); 1070 removeClass(dragItem, 'dragging');
1048 1071
1049 afterTransition(function() { 1072 afterTransition(function() {
1050 // Delay resetting zIndex to let the animation finish. 1073 // Delay resetting zIndex to let the animation finish.
1051 dragItem.style.zIndex = ''; 1074 dragItem.style.zIndex = '';
1052 // Same for overflow. 1075 // Same for overflow.
1053 dragItem.parentNode.style.overflow = ''; 1076 dragItem.parentNode.style.overflow = '';
1054 }); 1077 });
1055 var self = this; 1078 var self = this;
1056 this.dragEndTimer = window.setTimeout(function() { 1079 this.dragEndTimer = window.setTimeout(function() {
1057 // These things needto happen after the drop event. 1080 // These things needto happen after the drop event.
1058 layoutMostVisited(); 1081 mostVisited.invalidate();
1082 mostVisited.layout();
1059 self.dragItem = null; 1083 self.dragItem = null;
1060 }, 10); 1084 }, 10);
1061 1085
1062 } 1086 }
1063 }, 1087 },
1064 1088
1065 handleDrag: function(e) { 1089 handleDrag: function(e) {
1066 var item = mostVisited.getItem(e.target); 1090 var item = mostVisited.getItem(e.target);
1067 var rect = document.querySelector('#most-visited').getBoundingClientRect(); 1091 var rect = document.querySelector('#most-visited').getBoundingClientRect();
1068 item.style.pointerEvents = 'none'; 1092 item.style.pointerEvents = 'none';
(...skipping 25 matching lines...) Expand all
1094 el.addEventListener('dragover', bind(this.handleDragOver, this)); 1118 el.addEventListener('dragover', bind(this.handleDragOver, this));
1095 el.addEventListener('dragleave', bind(this.handleDragLeave, this)); 1119 el.addEventListener('dragleave', bind(this.handleDragLeave, this));
1096 el.addEventListener('drop', bind(this.handleDrop, this)); 1120 el.addEventListener('drop', bind(this.handleDrop, this));
1097 el.addEventListener('dragend', bind(this.handleDragEnd, this)); 1121 el.addEventListener('dragend', bind(this.handleDragEnd, this));
1098 el.addEventListener('drag', bind(this.handleDrag, this)); 1122 el.addEventListener('drag', bind(this.handleDrag, this));
1099 el.addEventListener('mousedown', bind(this.handleMouseDown, this)); 1123 el.addEventListener('mousedown', bind(this.handleMouseDown, this));
1100 } 1124 }
1101 }; 1125 };
1102 1126
1103 dnd.init(); 1127 dnd.init();
OLDNEW
« no previous file with comments | « chrome/browser/resources/new_new_tab.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698