| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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('extensions', function() { | 5 cr.define('extensions', function() { |
| 6 'use strict'; | 6 'use strict'; |
| 7 | 7 |
| 8 /** | 8 /** |
| 9 * Clear all the content of a given element. | 9 * Clear all the content of a given element. |
| 10 * @param {HTMLElement} element The element to be cleared. | 10 * @param {HTMLElement} element The element to be cleared. |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 /** | 368 /** |
| 369 * The element of the full overlay. | 369 * The element of the full overlay. |
| 370 * @type {HTMLDivElement} | 370 * @type {HTMLDivElement} |
| 371 * @private | 371 * @private |
| 372 */ | 372 */ |
| 373 this.overlayDiv_ = $('extension-error-overlay'); | 373 this.overlayDiv_ = $('extension-error-overlay'); |
| 374 | 374 |
| 375 /** | 375 /** |
| 376 * The portion of the overlay which shows the code relating to the error | 376 * The portion of the overlay which shows the code relating to the error |
| 377 * and the corresponding line numbers. | 377 * and the corresponding line numbers. |
| 378 * @type {HTMLElement} | 378 * @type {ExtensionCode} |
| 379 * @private | 379 * @private |
| 380 */ | 380 */ |
| 381 this.codeDiv_ = $('extension-error-overlay-code'); | 381 this.codeDiv_ = |
| 382 | 382 new extensions.ExtensionCode($('extension-error-overlay-code')); |
| 383 // Also initialize two properties of codeDiv for the section for the pure | |
| 384 // file content and the section for the line numbers. | |
| 385 this.codeDiv_.sourceDiv = | |
| 386 this.codeDiv_.querySelector('#extension-error-overlay-source'); | |
| 387 this.codeDiv_.linesDiv = | |
| 388 this.codeDiv_.querySelector('#extension-error-overlay-line-numbers'); | |
| 389 | 383 |
| 390 /** | 384 /** |
| 391 * The function to show or hide the ExtensionErrorOverlay. | 385 * The function to show or hide the ExtensionErrorOverlay. |
| 392 * @type {function} | 386 * @type {function} |
| 393 * @param {boolean} isVisible Whether the overlay should be visible. | 387 * @param {boolean} isVisible Whether the overlay should be visible. |
| 394 */ | 388 */ |
| 395 this.setVisible = function(isVisible) { | 389 this.setVisible = function(isVisible) { |
| 396 showOverlay(isVisible ? this.overlayDiv_ : null); | 390 showOverlay(isVisible ? this.overlayDiv_ : null); |
| 397 }; | 391 }; |
| 398 | 392 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 416 handleDismiss_: function(e) { | 410 handleDismiss_: function(e) { |
| 417 this.setVisible(false); | 411 this.setVisible(false); |
| 418 | 412 |
| 419 // There's a chance that the overlay receives multiple dismiss events; in | 413 // There's a chance that the overlay receives multiple dismiss events; in |
| 420 // this case, handle it gracefully and return (since all necessary work | 414 // this case, handle it gracefully and return (since all necessary work |
| 421 // will already have been done). | 415 // will already have been done). |
| 422 if (!this.error_) | 416 if (!this.error_) |
| 423 return; | 417 return; |
| 424 | 418 |
| 425 // Remove all previous content. | 419 // Remove all previous content. |
| 426 clearElement(this.codeDiv_.sourceDiv); | 420 this.codeDiv_.clear(); |
| 427 clearElement(this.codeDiv_.linesDiv); | |
| 428 | 421 |
| 429 this.openDevtoolsButton_.hidden = true; | 422 this.openDevtoolsButton_.hidden = true; |
| 430 | 423 |
| 431 if (this.error_.type == ExtensionErrorOverlay.RUNTIME_ERROR_TYPE_) { | 424 if (this.error_.type == ExtensionErrorOverlay.RUNTIME_ERROR_TYPE_) { |
| 432 this.overlayDiv_.querySelector('.content-area').removeChild( | 425 this.overlayDiv_.querySelector('.content-area').removeChild( |
| 433 this.runtimeErrorContent_); | 426 this.runtimeErrorContent_); |
| 434 this.runtimeErrorContent_.clearError(); | 427 this.runtimeErrorContent_.clearError(); |
| 435 } | 428 } |
| 436 | 429 |
| 437 this.error_ = undefined; | 430 this.error_ = undefined; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 * Set the code to be displayed in the code portion of the overlay. | 477 * Set the code to be displayed in the code portion of the overlay. |
| 485 * @see ExtensionErrorOverlay.requestFileSourceResponse(). | 478 * @see ExtensionErrorOverlay.requestFileSourceResponse(). |
| 486 * @param {?Object} code The code to be displayed. If |code| is null, then | 479 * @param {?Object} code The code to be displayed. If |code| is null, then |
| 487 * a "Could not display code" message will be displayed instead. | 480 * a "Could not display code" message will be displayed instead. |
| 488 */ | 481 */ |
| 489 setCode: function(code) { | 482 setCode: function(code) { |
| 490 document.querySelector( | 483 document.querySelector( |
| 491 '#extension-error-overlay .extension-error-overlay-title'). | 484 '#extension-error-overlay .extension-error-overlay-title'). |
| 492 textContent = code.title; | 485 textContent = code.title; |
| 493 | 486 |
| 494 // Remove all previous content. This should be done on close, but, just in | 487 this.codeDiv_.populate( |
| 495 // case we crashed, do it again. | 488 code, |
| 496 clearElement(this.codeDiv_.sourceDiv); | 489 loadTimeData.getString('extensionErrorOverlayNoCodeToDisplay')); |
| 497 clearElement(this.codeDiv_.linesDiv); | |
| 498 | |
| 499 // If there's no code, then display an appropriate message. | |
| 500 if (!code) { | |
| 501 var span = document.createElement('span'); | |
| 502 span.textContent = | |
| 503 loadTimeData.getString('extensionErrorOverlayNoCodeToDisplay'); | |
| 504 this.codeDiv_.sourceDiv.appendChild(span); | |
| 505 return; | |
| 506 } | |
| 507 | |
| 508 var lineCount = 0; | |
| 509 var createSpan = function(source, isHighlighted) { | |
| 510 lineCount += source.split('\n').length - 1; | |
| 511 var span = document.createElement('span'); | |
| 512 span.className = isHighlighted ? 'highlighted-source' : 'normal-source'; | |
| 513 span.textContent = source; | |
| 514 return span; | |
| 515 }; | |
| 516 | |
| 517 if (code.beforeHighlight) { | |
| 518 this.codeDiv_.sourceDiv.appendChild( | |
| 519 createSpan(code.beforeHighlight, false)); | |
| 520 } | |
| 521 | |
| 522 if (code.highlight) { | |
| 523 var highlightSpan = createSpan(code.highlight, true); | |
| 524 highlightSpan.title = code.message; | |
| 525 this.codeDiv_.sourceDiv.appendChild(highlightSpan); | |
| 526 } | |
| 527 | |
| 528 if (code.afterHighlight) { | |
| 529 this.codeDiv_.sourceDiv.appendChild( | |
| 530 createSpan(code.afterHighlight, false)); | |
| 531 } | |
| 532 | |
| 533 // Make the line numbers. This should be the number of line breaks + 1 | |
| 534 // (the last line doesn't break, but should still be numbered). | |
| 535 var content = ''; | |
| 536 for (var i = 1; i < lineCount + 1; ++i) | |
| 537 content += i + '\n'; | |
| 538 var span = document.createElement('span'); | |
| 539 span.textContent = content; | |
| 540 this.codeDiv_.linesDiv.appendChild(span); | |
| 541 }, | 490 }, |
| 542 }; | 491 }; |
| 543 | 492 |
| 544 /** | 493 /** |
| 545 * Called by the ExtensionErrorHandler responding to the request for a file's | 494 * Called by the ExtensionErrorHandler responding to the request for a file's |
| 546 * source. Populate the content area of the overlay and display the overlay. | 495 * source. Populate the content area of the overlay and display the overlay. |
| 547 * @param {Object?} result An object with four strings - the title, | 496 * @param {Object?} result An object with four strings - the title, |
| 548 * beforeHighlight, afterHighlight, and highlight. The three 'highlight' | 497 * beforeHighlight, afterHighlight, and highlight. The three 'highlight' |
| 549 * strings represent three portions of the file's content to display - the | 498 * strings represent three portions of the file's content to display - the |
| 550 * portion which is most relevant and should be emphasized (highlight), | 499 * portion which is most relevant and should be emphasized (highlight), |
| 551 * and the parts both before and after this portion. These may be empty. | 500 * and the parts both before and after this portion. These may be empty. |
| 552 */ | 501 */ |
| 553 ExtensionErrorOverlay.requestFileSourceResponse = function(result) { | 502 ExtensionErrorOverlay.requestFileSourceResponse = function(result) { |
| 554 var overlay = extensions.ExtensionErrorOverlay.getInstance(); | 503 var overlay = extensions.ExtensionErrorOverlay.getInstance(); |
| 555 overlay.setCode(result); | 504 overlay.setCode(result); |
| 556 overlay.setVisible(true); | 505 overlay.setVisible(true); |
| 557 }; | 506 }; |
| 558 | 507 |
| 559 // Export | 508 // Export |
| 560 return { | 509 return { |
| 561 ExtensionErrorOverlay: ExtensionErrorOverlay | 510 ExtensionErrorOverlay: ExtensionErrorOverlay |
| 562 }; | 511 }; |
| 563 }); | 512 }); |
| OLD | NEW |