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 cr.define('options', function() { | 5 cr.define('options', function() { |
6 ///////////////////////////////////////////////////////////////////////////// | 6 ///////////////////////////////////////////////////////////////////////////// |
7 // OptionsPage class: | 7 // OptionsPage class: |
8 | 8 |
9 /** | 9 /** |
10 * Base class for options page. | 10 * Base class for options page. |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 OptionsPage.initialize = function() { | 312 OptionsPage.initialize = function() { |
313 chrome.send('coreOptionsInitialize'); | 313 chrome.send('coreOptionsInitialize'); |
314 this.initialized_ = true; | 314 this.initialized_ = true; |
315 | 315 |
316 // Set up the overlay sheets: | 316 // Set up the overlay sheets: |
317 // Close nested sub-pages when clicking the visible part of an earlier page. | 317 // Close nested sub-pages when clicking the visible part of an earlier page. |
318 for (var level = 1; level <= 2; level++) { | 318 for (var level = 1; level <= 2; level++) { |
319 var containerId = 'subpage-sheet-container-' + level; | 319 var containerId = 'subpage-sheet-container-' + level; |
320 $(containerId).onclick = this.subPageClosingClickHandler_(level); | 320 $(containerId).onclick = this.subPageClosingClickHandler_(level); |
321 } | 321 } |
| 322 |
| 323 var self = this; |
| 324 // Close subpages if the user clicks on the html body. Listen in the |
| 325 // capturing phase so that we can stop the click from doing anything. |
| 326 document.body.addEventListener('click', |
| 327 this.bodyMouseEventHandler_.bind(this), |
| 328 true); |
| 329 // We also need to cancel mousedowns on non-subpage content. |
| 330 document.body.addEventListener('mousedown', |
| 331 this.bodyMouseEventHandler_.bind(this), |
| 332 true); |
| 333 |
322 // Hook up the close buttons. | 334 // Hook up the close buttons. |
323 var self = this; | |
324 subpageCloseButtons = document.querySelectorAll('.close-subpage'); | 335 subpageCloseButtons = document.querySelectorAll('.close-subpage'); |
325 for (var i = 0; i < subpageCloseButtons.length; i++) { | 336 for (var i = 0; i < subpageCloseButtons.length; i++) { |
326 subpageCloseButtons[i].onclick = function() { | 337 subpageCloseButtons[i].onclick = function() { |
327 self.closeTopSubPage(); | 338 self.closeTopSubPage(); |
328 }; | 339 }; |
329 } | 340 }; |
330 | 341 |
331 // Close the top overlay or sub-page on esc. | 342 // Close the top overlay or sub-page on esc. |
332 document.addEventListener('keydown', function(e) { | 343 document.addEventListener('keydown', function(e) { |
333 if (e.keyCode == 27) { // Esc | 344 if (e.keyCode == 27) { // Esc |
334 if (self.isOverlayVisible_()) | 345 if (self.isOverlayVisible_()) |
335 self.clearOverlays(); | 346 self.clearOverlays(); |
336 else | 347 else |
337 self.closeTopSubPage(); | 348 self.closeTopSubPage(); |
338 } | 349 } |
339 }); | 350 }); |
340 }; | 351 }; |
341 | 352 |
342 /** | 353 /** |
343 * Returns a function to handle clicks behind a subpage at level |level| by | 354 * Returns a function to handle clicks behind a subpage at level |level| by |
344 * closing all subpages down to |level| - 1. | 355 * closing all subpages down to |level| - 1. |
345 * @param {number} level The level of the subpage being handled. | 356 * @param {number} level The level of the subpage being handled. |
346 * @return {function} a function to handle clicks outside the given subpage. | 357 * @return {Function} a function to handle clicks outside the given subpage. |
347 * @private | 358 * @private |
348 */ | 359 */ |
349 OptionsPage.subPageClosingClickHandler_ = function(level) { | 360 OptionsPage.subPageClosingClickHandler_ = function(level) { |
350 var self = this; | 361 var self = this; |
351 return function(event) { | 362 return function(event) { |
352 // Clicks on the visible part of the parent page should close the overlay, | 363 // Clicks on the narrow strip between the left of the subpage sheet and |
| 364 // that shows part of the parent page should close the overlay, but |
353 // not fall through to the parent page. | 365 // not fall through to the parent page. |
354 if (!$('subpage-sheet-' + level).contains(event.target)) | 366 if (!$('subpage-sheet-' + level).contains(event.target)) |
355 self.closeSubPagesToLevel(level - 1); | 367 self.closeSubPagesToLevel(level - 1); |
356 event.stopPropagation(); | 368 event.stopPropagation(); |
| 369 event.preventDefault(); |
357 }; | 370 }; |
358 }; | 371 }; |
359 | 372 |
360 /** | 373 /** |
| 374 * A function to handle mouse events (mousedown or click) on the html body by |
| 375 * closing subpages and/or stopping event propagation. |
| 376 * @return {Event} a mousedown or click event. |
| 377 * @private |
| 378 */ |
| 379 OptionsPage.bodyMouseEventHandler_ = function(event) { |
| 380 // Do nothing if a subpage isn't showing. |
| 381 var topPage = this.getTopmostVisiblePage(); |
| 382 if (!(topPage && topPage.parentPage)) |
| 383 return; |
| 384 |
| 385 // If the click was within a subpage, do nothing. |
| 386 for (var level = 1; level <= 2; level++) { |
| 387 if ($('subpage-sheet-container-' + level).contains(event.target)) |
| 388 return; |
| 389 } |
| 390 |
| 391 // Close all subpages on click. |
| 392 if (event.type == 'click') |
| 393 this.closeSubPagesToLevel(0); |
| 394 |
| 395 // Events should not fall through to the main view, |
| 396 // but they can fall through for the sidebar. |
| 397 if ($('mainview-content').contains(event.target)) { |
| 398 event.stopPropagation(); |
| 399 event.preventDefault(); |
| 400 } |
| 401 }; |
| 402 |
| 403 /** |
361 * Re-initializes the C++ handlers if necessary. This is called if the | 404 * Re-initializes the C++ handlers if necessary. This is called if the |
362 * handlers are torn down and recreated but the DOM may not have been (in | 405 * handlers are torn down and recreated but the DOM may not have been (in |
363 * which case |initialize| won't be called again). If |initialize| hasn't been | 406 * which case |initialize| won't be called again). If |initialize| hasn't been |
364 * called, this does nothing (since it will be later, once the DOM has | 407 * called, this does nothing (since it will be later, once the DOM has |
365 * finished loading). | 408 * finished loading). |
366 */ | 409 */ |
367 OptionsPage.reinitializeCore = function() { | 410 OptionsPage.reinitializeCore = function() { |
368 if (this.initialized_) | 411 if (this.initialized_) |
369 chrome.send('coreOptionsInitialize'); | 412 chrome.send('coreOptionsInitialize'); |
370 } | 413 } |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 OptionsPage.showOverlay(hash); | 570 OptionsPage.showOverlay(hash); |
528 }, | 571 }, |
529 }; | 572 }; |
530 | 573 |
531 // Export | 574 // Export |
532 return { | 575 return { |
533 OptionsPage: OptionsPage | 576 OptionsPage: OptionsPage |
534 }; | 577 }; |
535 | 578 |
536 }); | 579 }); |
OLD | NEW |