diff --git a/dom/apps/src/Webapps.jsm b/dom/apps/src/Webapps.jsm index b593b4f2439..7f1f66099f6 100644 --- a/dom/apps/src/Webapps.jsm +++ b/dom/apps/src/Webapps.jsm @@ -1920,17 +1920,70 @@ this.DOMApplicationRegistry = { // content side. This let the webpage the opportunity to set event handlers // on the app before we start firing progress events. queuedDownload: {}, + queuedPackageDownload: {}, onInstallSuccessAck: function onInstallSuccessAck(aManifestURL) { - let download = this.queuedDownload[aManifestURL]; - if (!download) { + let cacheDownload = this.queuedDownload[aManifestURL]; + if (cacheDownload) { + this.startOfflineCacheDownload(cacheDownload.manifest, + cacheDownload.app, + cacheDownload.profileDir, + cacheDownload.offlineCacheObserver); + delete this.queuedDownload[aManifestURL]; + return; } - this.startOfflineCacheDownload(download.manifest, - download.app, - download.profileDir, - download.offlineCacheObserver); - delete this.queuedDownload[aManifestURL]; + + let packageDownload = this.queuedPackageDownload[aManifestURL]; + if (packageDownload) { + let manifest = packageDownload.manifest; + let appObject = packageDownload.app; + let installSuccessCallback = packageDownload.callback; + + delete this.queuedPackageDownload[aManifestURL]; + + this.downloadPackage(manifest, appObject, false, (function(aId, aManifest) { + // Move the zip out of TmpD. + let app = DOMApplicationRegistry.webapps[aId]; + let zipFile = FileUtils.getFile("TmpD", ["webapps", aId, "application.zip"], true); + let dir = this._getAppDir(aId); + zipFile.moveTo(dir, "application.zip"); + let tmpDir = FileUtils.getDir("TmpD", ["webapps", aId], true, true); + try { + tmpDir.remove(true); + } catch(e) { } + + // Save the manifest + let manFile = dir.clone(); + manFile.append("manifest.webapp"); + this._writeFile(manFile, JSON.stringify(aManifest), function() { }); + // Set state and fire events. + app.installState = "installed"; + app.downloading = false; + app.downloadAvailable = false; + this._saveApps((function() { + this.updateAppHandlers(null, aManifest, appObject); + this.broadcastMessage("Webapps:AddApp", { id: aId, app: appObject }); + + if (supportUseCurrentProfile()) { + // Update the permissions for this app. + PermissionsInstaller.installPermissions({ manifest: aManifest, + origin: appObject.origin, + manifestURL: appObject.manifestURL }, + true); + } + debug("About to fire Webapps:PackageEvent 'installed'"); + this.broadcastMessage("Webapps:PackageEvent", + { type: "installed", + manifestURL: appObject.manifestURL, + app: app, + manifest: aManifest }); + if (installSuccessCallback) { + installSuccessCallback(aManifest); + } + }).bind(this)); + }).bind(this)); + } }, confirmInstall: function(aData, aFromSync, aProfileDir, @@ -2070,47 +2123,12 @@ this.DOMApplicationRegistry = { // origin for install apps is meaningless here, since it's app:// and this // can't be used to resolve package paths. manifest = new ManifestHelper(jsonManifest, app.manifestURL); - this.downloadPackage(manifest, appObject, false, (function(aId, aManifest) { - // Success! Move the zip out of TmpD. - let app = DOMApplicationRegistry.webapps[aId]; - let zipFile = FileUtils.getFile("TmpD", ["webapps", aId, "application.zip"], true); - let dir = this._getAppDir(id); - zipFile.moveTo(dir, "application.zip"); - let tmpDir = FileUtils.getDir("TmpD", ["webapps", aId], true, true); - try { - tmpDir.remove(true); - } catch(e) { } - // Save the manifest - let manFile = dir.clone(); - manFile.append("manifest.webapp"); - this._writeFile(manFile, JSON.stringify(aManifest), function() { }); - // Set state and fire events. - app.installState = "installed"; - app.downloading = false; - app.downloadAvailable = false; - this._saveApps((function() { - this.updateAppHandlers(null, aManifest, appObject); - this.broadcastMessage("Webapps:AddApp", { id: aId, app: appObject }); - - if (supportUseCurrentProfile()) { - // Update the permissions for this app. - PermissionsInstaller.installPermissions({ manifest: aManifest, - origin: appObject.origin, - manifestURL: appObject.manifestURL }, - true); - } - debug("About to fire Webapps:PackageEvent 'installed'"); - this.broadcastMessage("Webapps:PackageEvent", - { type: "installed", - manifestURL: appObject.manifestURL, - app: app, - manifest: aManifest }); - if (aInstallSuccessCallback) { - aInstallSuccessCallback(aManifest); - } - }).bind(this)); - }).bind(this)); + this.queuedPackageDownload[app.manifestURL] = { + manifest: manifest, + app: appObject, + callback: aInstallSuccessCallback + } } }, diff --git a/dom/apps/tests/Makefile.in b/dom/apps/tests/Makefile.in index 0660eeb54e7..b4adc4a47eb 100644 --- a/dom/apps/tests/Makefile.in +++ b/dom/apps/tests/Makefile.in @@ -18,16 +18,11 @@ MOCHITEST_FILES = \ file_cached_app.template.appcache \ file_hosted_app.template.webapp \ test_app_update.html \ - $(NULL) - -ifdef MOZ_B2G -MOCHITEST_FILES += \ file_packaged_app.sjs \ file_packaged_app.template.webapp \ file_packaged_app.template.html \ test_packaged_app_install.html \ $(NULL) -endif MOCHITEST_CHROME_FILES = \ test_apps_service.xul \