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); |