// 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'; /** * 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, /** * Initialize the ExtensionLoadError div. */ init: function() { /** * The element which displays the path of the extension. * @type {HTMLSpanElement} * @private */ this.path_ = this.querySelector('#extension-load-error-path'); /** * The element which displays the reason the extension failed to load. * @type {HTMLSpanElement} * @private */ this.reason_ = this.querySelector('#extension-load-error-reason'); /** * The element which displays the manifest code. * @type {ExtensionCode} * @private */ this.manifest_ = new extensions.ExtensionCode( this.querySelector('#extension-load-error-manifest')); this.querySelector('#extension-load-error-retry-button').addEventListener( 'click', function(e) { chrome.send('extensionLoaderRetry'); this.hide_(); }.bind(this)); this.querySelector('#extension-load-error-give-up-button'). addEventListener('click', function(e) { this.hide_(); }.bind(this)); }, /** * Display the load error to the user. * @param {string} path The path from which the extension was loaded. * @param {string} reason The reason the extension failed to load. * @param {string} manifest The manifest object, with highlighted regions. */ show: function(path, reason, manifest) { this.path_.textContent = path; this.reason_.textContent = reason; manifest.message = reason; this.manifest_.populate( manifest, loadTimeData.getString('extensionLoadCouldNotLoadManifest')); this.hidden = false; this.manifest_.scrollToError(); }, /** * Hide the extension load error. * @private */ hide_: function() { this.hidden = true; } }; /** * The ExtensionLoader is the class in charge of loading unpacked extensions. * @constructor */ function ExtensionLoader() { /** * The ExtensionLoadError to show any errors from loading an unpacked * extension. * @type {ExtensionLoadError} * @private */ this.loadError_ = new ExtensionLoadError($('extension-load-error')); } cr.addSingletonGetter(ExtensionLoader); ExtensionLoader.prototype = { /** * 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 }; });