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

Side by Side Diff: chrome/browser/resources/extensions/extension_error_overlay.js

Issue 252593003: Improve UI for unpacked extensions failing to load (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Resources updated Created 6 years, 8 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
OLDNEW
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.
10 * @param {HTMLElement} element The element to be cleared.
11 */
12 function clearElement(element) {
13 while (element.firstChild)
14 element.removeChild(element.firstChild);
15 }
16
17 /**
18 * Get the url relative to the main extension url. If the url is 9 * Get the url relative to the main extension url. If the url is
19 * unassociated with the extension, this will be the full url. 10 * unassociated with the extension, this will be the full url.
20 * @param {string} url The url to make relative. 11 * @param {string} url The url to make relative.
21 * @param {string} extensionUrl The url for the extension resources, in the 12 * @param {string} extensionUrl The url for the extension resources, in the
22 * form "chrome-etxension://<extension_id>/". 13 * form "chrome-etxension://<extension_id>/".
23 * @return {string} The url relative to the host. 14 * @return {string} The url relative to the host.
24 */ 15 */
25 function getRelativeUrl(url, extensionUrl) { 16 function getRelativeUrl(url, extensionUrl) {
26 return url.substring(0, extensionUrl.length) == extensionUrl ? 17 return url.substring(0, extensionUrl.length) == extensionUrl ?
27 url.substring(extensionUrl.length) : url; 18 url.substring(extensionUrl.length) : url;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 this.initStackTrace_(); 132 this.initStackTrace_();
142 }, 133 },
143 134
144 /** 135 /**
145 * Wipe content associated with a specific error. 136 * Wipe content associated with a specific error.
146 */ 137 */
147 clearError: function() { 138 clearError: function() {
148 this.error_ = undefined; 139 this.error_ = undefined;
149 this.extensionUrl_ = undefined; 140 this.extensionUrl_ = undefined;
150 this.currentFrameNode_ = undefined; 141 this.currentFrameNode_ = undefined;
151 clearElement(this.stackTrace_); 142 extensions.ExtensionUtil.clearElement(this.stackTrace_);
152 this.stackTrace_.hidden = true; 143 this.stackTrace_.hidden = true;
153 }, 144 },
154 145
155 /** 146 /**
156 * Makes |frame| active and deactivates the previously active frame (if 147 * Makes |frame| active and deactivates the previously active frame (if
157 * there was one). 148 * there was one).
158 * @param {HTMLElement} frame The frame to activate. 149 * @param {HTMLElement} frame The frame to activate.
159 * @private 150 * @private
160 */ 151 */
161 setActiveFrame_: function(frameNode) { 152 setActiveFrame_: function(frameNode) {
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 this.overlayDiv_ = $('extension-error-overlay'); 364 this.overlayDiv_ = $('extension-error-overlay');
374 365
375 /** 366 /**
376 * The portion of the overlay which shows the code relating to the error 367 * The portion of the overlay which shows the code relating to the error
377 * and the corresponding line numbers. 368 * and the corresponding line numbers.
378 * @type {HTMLElement} 369 * @type {HTMLElement}
379 * @private 370 * @private
380 */ 371 */
381 this.codeDiv_ = $('extension-error-overlay-code'); 372 this.codeDiv_ = $('extension-error-overlay-code');
382 373
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
390 /** 374 /**
391 * The function to show or hide the ExtensionErrorOverlay. 375 * The function to show or hide the ExtensionErrorOverlay.
392 * @type {function} 376 * @type {function}
393 * @param {boolean} isVisible Whether the overlay should be visible. 377 * @param {boolean} isVisible Whether the overlay should be visible.
394 */ 378 */
395 this.setVisible = function(isVisible) { 379 this.setVisible = function(isVisible) {
396 showOverlay(isVisible ? this.overlayDiv_ : null); 380 showOverlay(isVisible ? this.overlayDiv_ : null);
397 }; 381 };
398 382
399 /** 383 /**
(...skipping 16 matching lines...) Expand all
416 handleDismiss_: function(e) { 400 handleDismiss_: function(e) {
417 this.setVisible(false); 401 this.setVisible(false);
418 402
419 // There's a chance that the overlay receives multiple dismiss events; in 403 // There's a chance that the overlay receives multiple dismiss events; in
420 // this case, handle it gracefully and return (since all necessary work 404 // this case, handle it gracefully and return (since all necessary work
421 // will already have been done). 405 // will already have been done).
422 if (!this.error_) 406 if (!this.error_)
423 return; 407 return;
424 408
425 // Remove all previous content. 409 // Remove all previous content.
426 clearElement(this.codeDiv_.sourceDiv); 410 extensions.ExtensionUtil.clearElement(this.codeDiv_);
427 clearElement(this.codeDiv_.linesDiv);
428 411
429 this.openDevtoolsButton_.hidden = true; 412 this.openDevtoolsButton_.hidden = true;
430 413
431 if (this.error_.type == ExtensionErrorOverlay.RUNTIME_ERROR_TYPE_) { 414 if (this.error_.type == ExtensionErrorOverlay.RUNTIME_ERROR_TYPE_) {
432 this.overlayDiv_.querySelector('.content-area').removeChild( 415 this.overlayDiv_.querySelector('.content-area').removeChild(
433 this.runtimeErrorContent_); 416 this.runtimeErrorContent_);
434 this.runtimeErrorContent_.clearError(); 417 this.runtimeErrorContent_.clearError();
435 } 418 }
436 419
437 this.error_ = undefined; 420 this.error_ = undefined;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 * Set the code to be displayed in the code portion of the overlay. 467 * Set the code to be displayed in the code portion of the overlay.
485 * @see ExtensionErrorOverlay.requestFileSourceResponse(). 468 * @see ExtensionErrorOverlay.requestFileSourceResponse().
486 * @param {?Object} code The code to be displayed. If |code| is null, then 469 * @param {?Object} code The code to be displayed. If |code| is null, then
487 * a "Could not display code" message will be displayed instead. 470 * a "Could not display code" message will be displayed instead.
488 */ 471 */
489 setCode: function(code) { 472 setCode: function(code) {
490 document.querySelector( 473 document.querySelector(
491 '#extension-error-overlay .extension-error-overlay-title'). 474 '#extension-error-overlay .extension-error-overlay-title').
492 textContent = code.title; 475 textContent = code.title;
493 476
494 // Remove all previous content. This should be done on close, but, just in 477 extensions.ExtensionUtil.populateCodeDiv(
495 // case we crashed, do it again. 478 this.codeDiv_,
496 clearElement(this.codeDiv_.sourceDiv); 479 code,
497 clearElement(this.codeDiv_.linesDiv); 480 loadTimeData.getString('extensionErrorOverlayNoCodeToDisplay'));
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 }, 481 },
542 }; 482 };
543 483
544 /** 484 /**
545 * Called by the ExtensionErrorHandler responding to the request for a file's 485 * 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. 486 * source. Populate the content area of the overlay and display the overlay.
547 * @param {Object?} result An object with four strings - the title, 487 * @param {Object?} result An object with four strings - the title,
548 * beforeHighlight, afterHighlight, and highlight. The three 'highlight' 488 * beforeHighlight, afterHighlight, and highlight. The three 'highlight'
549 * strings represent three portions of the file's content to display - the 489 * strings represent three portions of the file's content to display - the
550 * portion which is most relevant and should be emphasized (highlight), 490 * portion which is most relevant and should be emphasized (highlight),
551 * and the parts both before and after this portion. These may be empty. 491 * and the parts both before and after this portion. These may be empty.
552 */ 492 */
553 ExtensionErrorOverlay.requestFileSourceResponse = function(result) { 493 ExtensionErrorOverlay.requestFileSourceResponse = function(result) {
554 var overlay = extensions.ExtensionErrorOverlay.getInstance(); 494 var overlay = extensions.ExtensionErrorOverlay.getInstance();
555 overlay.setCode(result); 495 overlay.setCode(result);
556 overlay.setVisible(true); 496 overlay.setVisible(true);
557 }; 497 };
558 498
559 // Export 499 // Export
560 return { 500 return {
561 ExtensionErrorOverlay: ExtensionErrorOverlay 501 ExtensionErrorOverlay: ExtensionErrorOverlay
562 }; 502 };
563 }); 503 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698