| Index: chrome/renderer/resources/extensions/webstore_custom_bindings.js
|
| diff --git a/chrome/renderer/resources/extensions/webstore_custom_bindings.js b/chrome/renderer/resources/extensions/webstore_custom_bindings.js
|
| index 963adaa1da3a04822a7a8bb382c33b64cb4900a3..c31f40f88e9a6bd23ee09bcc3fc34251b06b3237 100644
|
| --- a/chrome/renderer/resources/extensions/webstore_custom_bindings.js
|
| +++ b/chrome/renderer/resources/extensions/webstore_custom_bindings.js
|
| @@ -5,15 +5,38 @@
|
| // Custom binding for the webstore API.
|
|
|
| var webstoreNatives = requireNative('webstore');
|
| +var Event = require('event_bindings').Event;
|
|
|
| function Installer() {
|
| this._pendingInstall = null;
|
| + this.onInstallStageChanged =
|
| + new Event(null, [{name: 'stage', type: 'string'}], {unmanaged: true});
|
| + this.onDownloadProgress =
|
| + new Event(null, [{name: 'progress', type: 'number'}], {unmanaged: true});
|
| }
|
|
|
| Installer.prototype.install = function(url, onSuccess, onFailure) {
|
| if (this._pendingInstall)
|
| - throw 'A Chrome Web Store installation is already pending.';
|
| - var installId = webstoreNatives.Install(url, onSuccess, onFailure);
|
| + throw new Error('A Chrome Web Store installation is already pending.');
|
| + if (url !== undefined && typeof(url) !== 'string') {
|
| + throw new Error(
|
| + 'The Chrome Web Store item link URL parameter must be a string.');
|
| + }
|
| + if (onSuccess !== undefined && typeof(onSuccess) !== 'function')
|
| + throw new Error('The success callback parameter must be a function.');
|
| + if (onFailure !== undefined && typeof(onFailure) !== 'function')
|
| + throw new Error('The failure callback parameter must be a function.');
|
| +
|
| + // Since we call Install() with a bool for if we have listeners, listeners
|
| + // must be set prior to the inline installation starting (this is also
|
| + // noted in the Event documentation in
|
| + // chrome/common/extensions/api/webstore.json).
|
| + var installId = webstoreNatives.Install(
|
| + this.onInstallStageChanged.hasListeners(),
|
| + this.onDownloadProgress.hasListeners(),
|
| + url,
|
| + onSuccess,
|
| + onFailure);
|
| if (installId !== undefined) {
|
| this._pendingInstall = {
|
| installId: installId,
|
| @@ -43,20 +66,32 @@ Installer.prototype.onInstallResponse = function(installId, success, error) {
|
| }
|
| };
|
|
|
| +Installer.prototype.onInstallStageChanged = function(installStage) {
|
| + this.onInstallStageChanged.dispatch(installStage);
|
| +};
|
| +
|
| +Installer.prototype.onDownloadProgress = function(progress) {
|
| + this.onDownloadProgress.dispatch(progress);
|
| +};
|
| +
|
| var installer = new Installer();
|
|
|
| var chromeWebstore = {
|
| - install: function install(url, onSuccess, onFailure) {
|
| + install: function (url, onSuccess, onFailure) {
|
| installer.install(url, onSuccess, onFailure);
|
| - }
|
| + },
|
| + onInstallStageChanged: installer.onInstallStageChanged,
|
| + onDownloadProgress: installer.onDownloadProgress
|
| };
|
|
|
| -// Called by webstore_binding.cc.
|
| -function onInstallResponse(installId, success, error) {
|
| - installer.onInstallResponse(installId, success, error);
|
| -}
|
| -
|
| -// These must match the names in InstallWebstorebinding in
|
| +// This must match the name in InstallWebstoreBindings in
|
| // chrome/renderer/extensions/dispatcher.cc.
|
| exports.chromeWebstore = chromeWebstore;
|
| -exports.onInstallResponse = onInstallResponse;
|
| +
|
| +// Called by webstore_bindings.cc.
|
| +exports.onInstallResponse =
|
| + Installer.prototype.onInstallResponse.bind(installer);
|
| +exports.onInstallStageChanged =
|
| + Installer.prototype.onInstallStageChanged.bind(installer);
|
| +exports.onDownloadProgress =
|
| + Installer.prototype.onDownloadProgress.bind(installer);
|
|
|