| 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 89b11cce5e41ccdcc2e59b2c6cace0b2c405c3de..99fae6ba5769f7a3eff9f864134a01026c5740ea 100644
|
| --- a/chrome/renderer/resources/extensions/webstore_custom_bindings.js
|
| +++ b/chrome/renderer/resources/extensions/webstore_custom_bindings.js
|
| @@ -5,35 +5,46 @@
|
| // Custom binding for the webstore API.
|
|
|
| var webstoreNatives = requireNative('webstore');
|
| -var Event = require('event_bindings').Event;
|
| +
|
| +var onInstallStageChanged;
|
| +var onDownloadProgress;
|
|
|
| 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 new Error('A Chrome Web Store installation is already pending.');
|
| - if (url !== undefined && typeof(url) !== 'string') {
|
| +
|
| + // With native bindings, these calls go through argument validation, which
|
| + // sets optional/missing arguments to null. The native webstore bindings
|
| + // expect either present or undefined, so transform null to undefined.
|
| + if (url === null)
|
| + url = undefined;
|
| + if (onSuccess === null)
|
| + onSuccess = undefined;
|
| + if (onFailure === null)
|
| + onFailure = undefined;
|
| +
|
| + 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')
|
| + if (onSuccess !== undefined && typeof onSuccess !== 'function') {
|
| throw new Error('The success callback parameter must be a function.');
|
| - if (onFailure !== undefined && typeof(onFailure) !== '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(),
|
| + onInstallStageChanged.hasListeners(),
|
| + onDownloadProgress.hasListeners(),
|
| url,
|
| onSuccess,
|
| onFailure);
|
| @@ -68,29 +79,48 @@ Installer.prototype.onInstallResponse =
|
| };
|
|
|
| Installer.prototype.onInstallStageChanged = function(installStage) {
|
| - this.onInstallStageChanged.dispatch(installStage);
|
| + onInstallStageChanged.dispatch(installStage);
|
| };
|
|
|
| Installer.prototype.onDownloadProgress = function(progress) {
|
| - this.onDownloadProgress.dispatch(progress);
|
| + onDownloadProgress.dispatch(progress);
|
| };
|
|
|
| var installer = new Installer();
|
|
|
| -var chromeWebstore = {
|
| - install: function (url, onSuccess, onFailure) {
|
| - installer.install(url, onSuccess, onFailure);
|
| - },
|
| - onInstallStageChanged: installer.onInstallStageChanged,
|
| - onDownloadProgress: installer.onDownloadProgress
|
| -};
|
|
|
| -exports.$set('binding', chromeWebstore);
|
| +if (apiBridge) {
|
| + apiBridge.registerCustomHook(function(api) {
|
| + api.apiFunctions.setHandleRequest('install',
|
| + function(url, onSuccess, onFailure) {
|
| + installer.install(url, onSuccess, onFailure);
|
| + });
|
| +
|
| + onInstallStageChanged = api.compiledApi.onInstallStageChanged;
|
| + onDownloadProgress = api.compiledApi.onDownloadProgress;
|
| + });
|
| +} else {
|
| + var Event = require('event_bindings').Event;
|
| + onInstallStageChanged =
|
| + new Event(null, [{name: 'stage', type: 'string'}], {unmanaged: true});
|
| + onDownloadProgress =
|
| + new Event(null, [{name: 'progress', type: 'number'}], {unmanaged: true});
|
| +
|
| + var chromeWebstore = {
|
| + install: function (url, onSuccess, onFailure) {
|
| + installer.install(url, onSuccess, onFailure);
|
| + },
|
| + onInstallStageChanged: onInstallStageChanged,
|
| + onDownloadProgress: onDownloadProgress,
|
| + };
|
| + exports.$set('binding', chromeWebstore);
|
| +}
|
|
|
| // 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);
|
| +exports.$set('onInstallResponse',
|
| + $Function.bind(Installer.prototype.onInstallResponse, installer));
|
| +exports.$set('onInstallStageChanged',
|
| + $Function.bind(Installer.prototype.onInstallStageChanged,
|
| + installer));
|
| +exports.$set('onDownloadProgress',
|
| + $Function.bind(Installer.prototype.onDownloadProgress, installer));
|
|
|