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

Unified Diff: chrome/browser/resources/extensions/extension_loader.js

Issue 252593003: Improve UI for unpacked extensions failing to load (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/extensions/extension_loader.js
diff --git a/chrome/browser/resources/extensions/extension_loader.js b/chrome/browser/resources/extensions/extension_loader.js
new file mode 100644
index 0000000000000000000000000000000000000000..22a1261966246c93b4482a4245754e560cec9730
--- /dev/null
+++ b/chrome/browser/resources/extensions/extension_loader.js
@@ -0,0 +1,154 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+cr.define('extensions', function() {
+ 'use strict';
+
+ /**
+ * Clear all the content of a given element.
+ * @param {HTMLElement} element The element to be cleared.
+ */
+ function clearElement(element) {
+ while (element.firstChild)
+ element.removeChild(element.firstChild);
+ }
+
+ /**
+ * Construct an ExtensionLoadError around the given |div|.
+ * @param {HTMLDivElement} div The HTML div for the extension load error.
+ * @constructor
+ */
+ function ExtensionLoadError(div) {
+ div.__proto__ = ExtensionLoadError.prototype;
+ div.init();
+ return div;
+ }
+
+ ExtensionLoadError.prototype = {
+ __proto__: HTMLDivElement.prototype,
+
+ init: function() {
+ this.path_ = this.querySelector('#extension-load-error-path');
+ this.reason_ = this.querySelector('#extension-load-error-reason');
+ this.manifest_ = this.querySelector('#extension-load-error-manifest');
+
+ console.log('initd');
+ this.querySelector('#extension-load-error-retry-button').addEventListener(
+ 'click', function(e) {
+ chrome.send('extensionLoaderRetry');
+ console.log('Retry Clicked!');
+ this.hide_();
+ }.bind(this));
+
+ this.querySelector('#extension-load-error-give-up-button').
+ addEventListener('click', function(e) {
+ this.hide_();
+ }.bind(this));
+ },
+
+ show: function(path, reason, manifest) {
+ this.path_.textContent = path;
+ this.reason_.textContent = reason;
+
+ clearElement(this.manifest_);
+ if (manifest.highlight) {
+ var createSpan = function(source, isHighlighted) {
+ var span = document.createElement('span');
+ span.className =
+ isHighlighted ? 'highlighted-source' : 'normal-source';
+ span.textContent = source;
+ return span;
+ };
+
+ if (manifest.beforeHighlight) {
+ this.manifest_.appendChild(
+ createSpan(manifest.beforeHighlight, false));
+ }
+
+ if (manifest.highlight) {
+ this.manifest_.appendChild(
+ createSpan(manifest.highlight, true));
+ }
+
+ if (manifest.afterHighlight) {
+ this.manifest_.appendChild(
+ createSpan(manifest.afterHighlight, false));
+ }
+ this.manifest_.hidden = false;
+ } else {
+ this.manifest_.hidden = true;
+ }
+
+ this.hidden = false;
+ },
+
+ hide_: function() {
+ this.hidden = true;
+ }
+ };
+
+ function ExtensionLoader() {
+ this.__proto__ = ExtensionLoader.prototype;
+ this.init();
+ }
+
+ cr.addSingletonGetter(ExtensionLoader);
+
+ /**
+ * The class in charge of loading unpacked extensions.
+ */
+ ExtensionLoader.prototype = {
+ /**
+ * Perform first-time initialization.
+ */
+ init: function() {
+ console.log('Initing ExtensionLoader');
+ /**
+ * The ExtensionLoadError to show any errors from loading an unpacked
+ * extension.
+ * @type {ExtensionLoadError}
+ * @private
+ */
+ this.loadError_ = new ExtensionLoadError($('extension-load-error'));
+ },
+
+ /**
+ * Begin the sequence of loading an unpacked extension. If an error is
+ * encountered, this object will get notified via notifyFailed().
+ */
+ loadUnpacked: function() {
+ chrome.send('extensionLoaderLoadUnpacked');
+ },
+
+ /**
+ * Notify the ExtensionLoader that loading an unpacked extension failed.
+ * Show the ExtensionLoadError.
+ * @param {string} filePath The path to the unpacked extension.
+ * @param {string} reason The reason the extension failed to load.
+ * @param {Object} manifest An object with three strings: beforeHighlight,
+ * afterHighlight, and highlight. These represent three portions of the
+ * file's content to display - the portion which is most relevant and
+ * should be emphasized (highlight), and the parts both before and after
+ * this portion. These may be empty.
+ */
+ notifyFailed: function(filePath, reason, manifest) {
+ this.loadError_.show(filePath, reason, manifest);
+ }
+ };
+
+ /*
+ * A static forwarding function for ExtensionLoader.notifyFailed.
+ * @param {string} filePath The path to the unpacked extension.
+ * @param {string} reason The reason the extension failed to load.
+ * @param {Object} manifest The manifest of the failed extension.
+ * @see ExtensionLoader.notifyFailed
+ */
+ ExtensionLoader.notifyLoadFailed = function(filePath, reason, manifest) {
+ ExtensionLoader.getInstance().notifyFailed(filePath, reason, manifest);
+ };
+
+ return {
+ ExtensionLoader: ExtensionLoader
+ };
+});

Powered by Google App Engine
This is Rietveld 408576698