author | Ryan VanderMeulen <ryanvm@gmail.com> |
Wed, 27 Feb 2013 15:09:12 -0500 | |
changeset 123204 | a87453b34058710274990a26b0cecce1897eab4d |
parent 123203 | b7473553fea140debdd7574cd9d174b0507e9ab6 |
child 123205 | e125dce45cb734475fff25e1823202b3494ccc87 |
push id | 24373 |
push user | ryanvm@gmail.com |
push date | Thu, 28 Feb 2013 01:36:21 +0000 |
treeherder | mozilla-central@8cb9d6981978 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
bugs | 834672 |
milestone | 22.0a1 |
backs out | 7a79ddc7bedf213d15b67f052c7bb06d36fd275d |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/netwerk/protocol/app/AppProtocolHandler.js +++ b/netwerk/protocol/app/AppProtocolHandler.js @@ -2,17 +2,16 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; -const Cr = Components.results; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); XPCOMUtils.defineLazyServiceGetter(this, "appsService", "@mozilla.org/AppsService;1", "nsIAppsService"); @@ -48,32 +47,29 @@ AppProtocolHandler.prototype = { uri.init(Ci.nsIStandardURL.URLTYPE_STANDARD, -1, aSpec, aOriginCharset, aBaseURI); return uri.QueryInterface(Ci.nsIURI); }, newChannel: function app_phNewChannel(aURI) { // We map app://ABCDEF/path/to/file.ext to // jar:file:///path/to/profile/webapps/ABCDEF/application.zip!/path/to/file.ext - let url = aURI.QueryInterface(Ci.nsIURL); - let appId = aURI.host; - let fileSpec = url.filePath; + let noScheme = aURI.spec.substring(6); + let firstSlash = noScheme.indexOf("/"); + + let appId = noScheme; + let fileSpec = aURI.path; + + if (firstSlash) { + appId = noScheme.substring(0, firstSlash); + } // Build a jar channel and masquerade as an app:// URI. let appInfo = this.getAppInfo(appId); let uri; - - if (!appInfo) { - // That should not happen, so dump() inconditionnally. - // We create a dummy channel instead of throwing to let the - // downstream user get a 404 error. - dump("!! got no appInfo for " + appId + "\n"); - return new DummyChannel(); - } - if (this._runningInParent || appInfo.isCoreApp) { // In-parent and CoreApps can directly access files, so use jar:file:// uri = "jar:file://" + appInfo.basePath + appId + "/application.zip!" + fileSpec; } else { // non-CoreApps in child need to ask parent for file handle, use jar:ipcfile:// uri = "jar:remoteopenfile://" + appInfo.basePath + appId + "/application.zip!" + fileSpec; } let channel = Services.io.newChannel(uri, null, null); @@ -83,117 +79,9 @@ AppProtocolHandler.prototype = { return channel; }, allowPort: function app_phAllowPort(aPort, aScheme) { return false; } }; -/** - * This dummy channel implementation only provides enough functionality - * to return a fake 404 error when the caller asks for an app:// URL - * containing an unknown appId. - */ -function DummyChannel() { -} - -DummyChannel.prototype = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsIRequest, - Ci.nsIChannel, - Ci.nsIJARChannel]), - - // nsIRequest - name: "dummy_app_channel", - - isPending: function dc_isPending() { - return this._pending; - }, - - status: Cr.NS_ERROR_FILE_NOT_FOUND, - - cancel: function dc_cancel() { - }, - - suspend: function dc_suspend() { - this._suspendCount++; - }, - - resume: function dc_resume() { - if (this._suspendCount <= 0) - throw Cr.NS_ERROR_UNEXPECTED; - - if (--this._suspendCount == 0 && this._pending) { - this._dispatch(); - } - }, - - loadGroup: null, - loadFlags: Ci.nsIRequest.LOAD_NORMAL, - - // nsIChannel - originalURI: Services.io.newURI("app://unknown/nothing.html", null, null), - URI: Services.io.newURI("app://unknown/nothing.html", null, null), - - owner: null, - notificationCallbacks: null, - securityInfo: null, - contentType: null, - contentCharset: null, - contentLength: 0, - contentDisposition: Ci.nsIChannel.DISPOSITION_INLINE, - contentDispositionFilename: "", - - _pending: false, - _suspendCount: 0, - _listener: null, - _context: null, - - open: function dc_open() { - return Cr.NS_ERROR_NOT_IMPLEMENTED; - }, - - _dispatch: function dc_dispatch() { - let request = this; - - Services.tm.currentThread.dispatch( - { - run: function dc_run() { - request._listener.onStartRequest(request, request._context); - request._listener.onStopRequest(request, request._context, - Cr.NS_ERROR_FILE_NOT_FOUND); - if (request.loadGroup) { - request.loadGroup.removeRequest(request, request._context, - Cr.NS_ERROR_FILE_NOT_FOUND); - } - request._pending = false; - request.notificationCallbacks = null; - request._listener = null; - request._context = null; - } - }, - Ci.nsIThread.DISPATCH_NORMAL); - }, - - asyncOpen: function dc_asyncopenfunction(aListener, aContext) { - if (this.loadGroup) { - this.loadGroup.addRequest(this, aContext); - } - - this._listener = aListener; - this._context = aContext; - this._pending = true; - - if (!this._suspended) { - this._dispatch(); - } - }, - - // nsIJarChannel, needed for XHR to turn NS_ERROR_FILE_NOT_FOUND into - // a 404 error. - isUnsafe: false, - - setAppURI: function(aURI) { - throw Cr.NS_ERROR_NOT_IMPLEMENTED; - } -}; - this.NSGetFactory = XPCOMUtils.generateNSGetFactory([AppProtocolHandler]);