Bug 1285170 - Remove app:// protocol r=valentin
authorAlexandre Lissy <lissyx@lissyx.dyndns.org>
Wed, 16 Mar 2016 17:11:12 +0100
changeset 304245 a74a1865eb97f56ca13947e1f62790ab0454c372
parent 304244 590b6cdf1e9950dd60f9c10d91a6edfad4e787a1
child 304259 383cedd6feb650bb1242f228692f83ca5e213920
child 304362 abb40d3751b5d345a2eca3203c01f18ce7773afa
push id79280
push userkwierso@gmail.com
push dateFri, 08 Jul 2016 22:04:28 +0000
treeherdermozilla-inbound@14b16ac38991 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersvalentin
bugs1285170
milestone50.0a1
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
Bug 1285170 - Remove app:// protocol r=valentin MozReview-Commit-ID: 4cnLrqqyP35
addon-sdk/source/test/test-url.js
devtools/client/performance/test/unit/test_frame-utils-01.js
devtools/shared/apps/moz.build
devtools/shared/apps/tests/unit/.eslintrc
devtools/shared/apps/tests/unit/data/app-engineering.zip
devtools/shared/apps/tests/unit/data/app.zip
devtools/shared/apps/tests/unit/head_apps.js
devtools/shared/apps/tests/unit/tail_apps.js
devtools/shared/apps/tests/unit/test_webappsActor.js
devtools/shared/apps/tests/unit/xpcshell.ini
dom/indexedDB/test/unit/defaultStorageUpgrade_profile.zip
dom/indexedDB/test/unit/idbSubdirUpgrade1_profile.zip
dom/indexedDB/test/unit/idbSubdirUpgrade2_profile.zip
dom/indexedDB/test/unit/schema23upgrade_profile.zip
dom/indexedDB/test/unit/storagePersistentUpgrade_profile.zip
dom/indexedDB/test/unit/test_defaultStorageUpgrade.js
dom/indexedDB/test/unit/test_idbSubdirUpgrade.js
dom/indexedDB/test/unit/test_schema23upgrade.js
dom/indexedDB/test/unit/test_storagePersistentUpgrade.js
netwerk/build/moz.build
netwerk/build/nsNetCID.h
netwerk/build/nsNetModule.cpp
netwerk/ipc/NeckoParent.cpp
netwerk/ipc/NeckoParent.h
netwerk/protocol/app/AppProtocolHandler.cpp
netwerk/protocol/app/AppProtocolHandler.h
netwerk/protocol/app/moz.build
old-configure.in
--- a/addon-sdk/source/test/test-url.js
+++ b/addon-sdk/source/test/test-url.js
@@ -391,17 +391,17 @@ exports.testLocalURLwithInvalidURL = fun
   ]).forEach(aUri => {
     assert.ok(!isLocalURL(aUri), aUri + ' is an invalid Local URL');
   });
 }
 
 exports.testFileName = function(assert) {
   let urls = [
     ['https://foo/bar.js', 'bar.js'],
-    ['app://myfxosapp/file.js', 'file.js'],
+    ['chrome://gaia/content/myfxosapp/file.js', 'file.js'],
     ['http://localhost:8888/file.js', 'file.js'],
     ['http://foo/bar.js#hash', 'bar.js'],
     ['http://foo/bar.js?q=go&query=yeah', 'bar.js'],
     ['chrome://browser/content/content.js', 'content.js'],
     ['resource://gre/foo.js', 'foo.js'],
   ];
 
   urls.forEach(([url, fileName]) => assert.equal(URL(url).fileName, fileName, 'file names are equal'));
--- a/devtools/client/performance/test/unit/test_frame-utils-01.js
+++ b/devtools/client/performance/test/unit/test_frame-utils-01.js
@@ -9,17 +9,16 @@
 const CONTENT_LOCATIONS = [
   "hello/<.world (https://foo/bar.js:123:987)",
   "hello/<.world (http://foo/bar.js:123:987)",
   "hello/<.world (http://foo/bar.js:123)",
   "hello/<.world (http://foo/bar.js#baz:123:987)",
   "hello/<.world (http://foo/bar.js?myquery=params&search=1:123:987)",
   "hello/<.world (http://foo/#bar:123:987)",
   "hello/<.world (http://foo/:123:987)",
-  "hello/<.world (app://myfxosapp/file.js:100:1)",
 
   // Test scripts with port numbers (bug 1164131)
   "hello/<.world (http://localhost:8888/file.js:100:1)",
   "hello/<.world (http://localhost:8888/file.js:100)",
 
   // Eval
   "hello/<.world (http://localhost:8888/file.js line 65 > eval:1)",
 
@@ -67,17 +66,16 @@ add_task(function () {
   const PARSED_CONTENT = [
     ["hello/<.world", "bar.js", "foo", "https://foo/bar.js", 123, 987, "foo", null],
     ["hello/<.world", "bar.js", "foo", "http://foo/bar.js", 123, 987, "foo", null],
     ["hello/<.world", "bar.js", "foo", "http://foo/bar.js", 123, null, "foo", null],
     ["hello/<.world", "bar.js", "foo", "http://foo/bar.js#baz", 123, 987, "foo", null],
     ["hello/<.world", "bar.js", "foo", "http://foo/bar.js?myquery=params&search=1", 123, 987, "foo", null],
     ["hello/<.world", "/", "foo", "http://foo/#bar", 123, 987, "foo", null],
     ["hello/<.world", "/", "foo", "http://foo/", 123, 987, "foo", null],
-    ["hello/<.world", "file.js", "myfxosapp", "app://myfxosapp/file.js", 100, 1, "myfxosapp", null],
     ["hello/<.world", "file.js", "localhost:8888", "http://localhost:8888/file.js", 100, 1, "localhost:8888", 8888],
     ["hello/<.world", "file.js", "localhost:8888", "http://localhost:8888/file.js", 100, null, "localhost:8888", 8888],
     ["hello/<.world", "file.js (eval:1)", "localhost:8888", "http://localhost:8888/file.js", 65, null, "localhost:8888", 8888],
     ["hello/<.world", "/", "localhost:8888", "http://localhost:8888/", 1, null, "localhost:8888", 8888],
     ["hello/<.world", "/", "localhost:8888", "http://localhost:8888/", 100, 50, "localhost:8888", 8888],
     ["Native[\"arraycopy(blah)\"]", "profiler.html", "localhost:8888", "http://localhost:8888/profiler.html", 4, null, "localhost:8888", 8888],
     ["Native[\"arraycopy(blah)\"]", "profiler.html", "localhost:8888", "http://localhost:8888/profiler.html", 4, 5, "localhost:8888", 8888],
   ];
--- a/devtools/shared/apps/moz.build
+++ b/devtools/shared/apps/moz.build
@@ -11,15 +11,13 @@ TEST_HARNESS_FILES.testing.mochitest.tes
     'tests/data/app-certified.zip',
     'tests/data/app-overload.zip',
     'tests/data/app-redirect.zip',
     'tests/data/app-system.zip',
     'tests/data/app-updated.zip',
     'tests/data/app.zip',
 ]
 
-XPCSHELL_TESTS_MANIFESTS += ['tests/unit/xpcshell.ini']
-
 DevToolsModules(
     'app-actor-front.js',
     'Devices.jsm',
     'Simulator.jsm'
 )
deleted file mode 100644
--- a/devtools/shared/apps/tests/unit/.eslintrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  // Extend from the common devtools xpcshell eslintrc config.
-  "extends": "../../../../.eslintrc.xpcshell"
-}
\ No newline at end of file
deleted file mode 100644
index cb3c7ffd2a53c249dbcab8cc851a0c4f4354a053..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 4f838a2a13d79d9ff62de801353d19834b38d7f0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/devtools/shared/apps/tests/unit/head_apps.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-var Ci = Components.interfaces;
-var Cu = Components.utils;
-var Cr = Components.results;
-
-const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const Services = require("Services");
-const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
-const {FileUtils} = require("resource://gre/modules/FileUtils.jsm");
-const {DebuggerClient} = require("devtools/shared/client/main");
-const {DebuggerServer} = require("devtools/server/main");
-const {AppActorFront} = require("devtools/shared/apps/app-actor-front");
-
-var gClient, gActor, gActorFront;
-
-function connect(onDone) {
-  // Initialize a loopback remote protocol connection
-  DebuggerServer.init();
-  // We need to register browser actors to have `listTabs` working
-  // and also have a root actor
-  DebuggerServer.addBrowserActors();
-
-  // Setup client and actor used in all tests
-  gClient = new DebuggerClient(DebuggerServer.connectPipe());
-  gClient.connect()
-    .then(() => gClient.listTabs())
-    .then(aResponse => {
-      gActor = aResponse.webappsActor;
-      gActorFront = new AppActorFront(gClient, aResponse);
-      onDone();
-    });
-}
-
-function webappActorRequest(request, onResponse) {
-  if (!gActor) {
-    connect(webappActorRequest.bind(null, request, onResponse));
-    return;
-  }
-
-  request.to = gActor;
-  gClient.request(request, onResponse);
-}
-
-// Install a test packaged webapp from data folder
-function installTestApp(zipName, appId, onDone) {
-  // Copy our package to tmp folder, where the actor retrieves it
-  let zip = do_get_file("data/" + zipName);
-  let appDir = FileUtils.getDir("TmpD", ["b2g", appId], true, true);
-  zip.copyTo(appDir, "application.zip");
-
-  let request = {type: "install", appId: appId};
-  webappActorRequest(request, function (aResponse) {
-    do_check_eq(aResponse.appId, appId);
-    if ("error" in aResponse) {
-      do_throw("Error: " + aResponse.error);
-    }
-    if ("message" in aResponse) {
-      do_throw("Error message: " + aResponse.message);
-    }
-    do_check_false("error" in aResponse);
-
-    onDone();
-  });
-}
-
-function setup() {
-  // We have to setup a profile, otherwise indexed db used by webapps
-  // will throw random exception when trying to get profile folder
-  do_get_profile();
-
-  // The webapps dir isn't registered on b2g xpcshell tests,
-  // we have to manually set it to the directory service.
-  do_get_webappsdir();
-
-  // We also need a valid nsIXulAppInfo service as Webapps.jsm is querying it
-  Components.utils.import("resource://testing-common/AppInfo.jsm");
-  updateAppInfo();
-
-  Components.utils.import("resource://gre/modules/Webapps.jsm");
-
-  // Enable launch/close method of the webapps actor
-  let {WebappsActor} = require("devtools/server/actors/webapps");
-  WebappsActor.prototype.supportsLaunch = true;
-}
-
-function do_get_webappsdir() {
-  var webappsDir = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
-  webappsDir.append("test_webapps");
-  if (!webappsDir.exists())
-    webappsDir.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt("755", 8));
-
-  var coreAppsDir = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
-  coreAppsDir.append("test_coreapps");
-  if (!coreAppsDir.exists())
-    coreAppsDir.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt("755", 8));
-
-  // Register our own provider for the profile directory.
-  // It will return our special docshell profile directory.
-  var provider = {
-    getFile: function (prop, persistent) {
-      persistent.value = true;
-      if (prop == "webappsDir") {
-        return webappsDir.clone();
-      }
-      else if (prop == "coreAppsDir") {
-        return coreAppsDir.clone();
-      }
-      throw Cr.NS_ERROR_FAILURE;
-    },
-    QueryInterface: function (iid) {
-      if (iid.equals(Ci.nsIDirectoryServiceProvider) ||
-          iid.equals(Ci.nsISupports)) {
-        return this;
-      }
-      throw Cr.NS_ERROR_NO_INTERFACE;
-    }
-  };
-  Services.dirsvc.QueryInterface(Ci.nsIDirectoryService).registerProvider(provider);
-}
deleted file mode 100644
--- a/devtools/shared/apps/tests/unit/tail_apps.js
+++ /dev/null
@@ -1,6 +0,0 @@
-if (gClient) {
-  // Close the test remote connection before leaving this test
-  gClient.close(function () {
-    run_next_test();
-  });
-}
deleted file mode 100644
--- a/devtools/shared/apps/tests/unit/test_webappsActor.js
+++ /dev/null
@@ -1,311 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-const promise = require("promise");
-const defer = require("devtools/shared/defer");
-
-var gAppId = "actor-test";
-const APP_ORIGIN = "app://" + gAppId;
-
-add_test(function testLaunchInexistantApp() {
-  let request = {type: "launch", manifestURL: "http://foo.com"};
-  webappActorRequest(request, function (aResponse) {
-    do_check_eq(aResponse.error, "NO_SUCH_APP");
-    run_next_test();
-  });
-});
-
-add_test(function testCloseInexistantApp() {
-  let request = {type: "close", manifestURL: "http://foo.com"};
-  webappActorRequest(request, function (aResponse) {
-    do_check_eq(aResponse.error, "missingParameter");
-    do_check_eq(aResponse.message, "No application for http://foo.com");
-    run_next_test();
-  });
-});
-
-// Install a test app
-add_test(function testInstallPackaged() {
-  installTestApp("app.zip", gAppId, function () {
-    run_next_test();
-  });
-});
-
-// Now check that the app appear in getAll
-add_test(function testGetAll() {
-  let request = {type: "getAll"};
-  webappActorRequest(request, function (aResponse) {
-    do_check_true("apps" in aResponse);
-    let apps = aResponse.apps;
-    do_check_true(apps.length > 0);
-    for (let i = 0; i < apps.length; i++) {
-      let app = apps[i];
-      if (app.id == gAppId) {
-        do_check_eq(app.name, "Test app");
-        do_check_eq(app.manifest.description, "Testing webapps actor");
-        do_check_eq(app.manifest.launch_path, "/index.html");
-        do_check_eq(app.origin, APP_ORIGIN);
-        do_check_eq(app.installOrigin, app.origin);
-        do_check_eq(app.manifestURL, app.origin + "/manifest.webapp");
-        do_check_eq(app.csp, "script-src: http://foo.com");
-        run_next_test();
-        return;
-      }
-    }
-    do_throw("Unable to find the test app by its id");
-  });
-});
-
-add_test(function testGetApp() {
-  let manifestURL = APP_ORIGIN + "/manifest.webapp";
-  let request = {type: "getApp", manifestURL: manifestURL};
-  webappActorRequest(request, function (aResponse) {
-    do_check_true("app" in aResponse);
-    let app = aResponse.app;
-    do_check_eq(app.id, gAppId);
-    do_check_eq(app.name, "Test app");
-    do_check_eq(app.manifest.description, "Testing webapps actor");
-    do_check_eq(app.manifest.launch_path, "/index.html");
-    do_check_eq(app.origin, APP_ORIGIN);
-    do_check_eq(app.installOrigin, app.origin);
-    do_check_eq(app.manifestURL, app.origin + "/manifest.webapp");
-    run_next_test();
-  });
-});
-
-add_test(function testLaunchApp() {
-  let manifestURL = APP_ORIGIN + "/manifest.webapp";
-  let startPoint = "/index.html";
-  let request = {
-    type: "launch",
-    manifestURL: manifestURL,
-    startPoint: startPoint
-  };
-  Services.obs.addObserver(function observer(subject, topic, data) {
-    Services.obs.removeObserver(observer, topic);
-    let json = JSON.parse(data);
-    do_check_eq(json.manifestURL, manifestURL);
-    do_check_eq(json.startPoint, startPoint);
-    run_next_test();
-  }, "webapps-launch", false);
-
-  webappActorRequest(request, function (aResponse) {
-    do_check_false("error" in aResponse);
-  });
-});
-
-add_test(function testCloseApp() {
-  let manifestURL = APP_ORIGIN + "/manifest.webapp";
-  let request = {
-    type: "close",
-    manifestURL: manifestURL
-  };
-  Services.obs.addObserver(function observer(subject, topic, data) {
-    Services.obs.removeObserver(observer, topic);
-    let json = JSON.parse(data);
-    do_check_eq(json.manifestURL, manifestURL);
-
-  }, "webapps-close", false);
-
-  webappActorRequest(request, function (aResponse) {
-    do_check_false("error" in aResponse);
-    run_next_test();
-  });
-});
-
-// The 128px icon is a single red pixel and the 64px one is a blue one
-// bug 899177: there is a bug with xhr and app:// and jar:// uris
-// that ends up forcing the content type to application/xml
-var red1px = "data:application/xml;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVQI12P4z8AAAAMBAQAY3Y2wAAAAAElFTkSuQmCC";
-var blue1px = "data:application/xml;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVQI12MwZDgHAAFlAQBDpjhLAAAAAElFTkSuQmCC";
-
-add_test(function testGetIcon() {
-  let manifestURL = APP_ORIGIN + "/manifest.webapp";
-  let request = {
-    type: "getIconAsDataURL",
-    manifestURL: manifestURL
-  };
-
-  webappActorRequest(request, function (aResponse) {
-    do_check_false("error" in aResponse);
-
-    // By default, getIconAsDataURL return the 128x128 icon
-    do_check_eq(aResponse.url, red1px);
-    run_next_test();
-  });
-});
-
-add_test(function testGetIconWithCustomSize() {
-  let manifestURL = APP_ORIGIN + "/manifest.webapp";
-  let request = {
-    type: "getIconAsDataURL",
-    manifestURL: manifestURL,
-    size: 64
-  };
-
-  webappActorRequest(request, function (aResponse) {
-    do_check_false("error" in aResponse);
-
-    do_check_eq(aResponse.url, blue1px);
-    run_next_test();
-  });
-});
-
-add_test(function testUninstall() {
-  let manifestURL = APP_ORIGIN + "/manifest.webapp";
-  let request = {
-    type: "uninstall",
-    manifestURL: manifestURL
-  };
-
-  Services.obs.addObserver(function observer(subject, topic, data) {
-    Services.obs.removeObserver(observer, topic);
-    let json = JSON.parse(data);
-    do_check_eq(json.manifestURL, manifestURL);
-    do_check_eq(json.origin, APP_ORIGIN);
-    do_check_eq(json.id, gAppId);
-    run_next_test();
-  }, "webapps-uninstall", false);
-
-  webappActorRequest(request, function (aResponse) {
-    do_check_false("error" in aResponse);
-  });
-});
-
-add_test(function testFileUploadInstall() {
-  let packageFile = do_get_file("data/app.zip");
-
-  // Disable the bulk trait temporarily to test the JSON upload path
-  gClient.traits.bulk = false;
-
-  let progressDeferred = defer();
-  // Ensure we get at least one progress event at the end
-  gActorFront.on("install-progress", function onProgress(e, progress) {
-    if (progress.bytesSent == progress.totalBytes) {
-      gActorFront.off("install-progress", onProgress);
-      progressDeferred.resolve();
-    }
-  });
-
-  let installed =
-    gActorFront.installPackaged(packageFile.path, gAppId)
-    .then(function ({ appId }) {
-      do_check_eq(appId, gAppId);
-    }, function (e) {
-      do_throw("Failed install uploaded packaged app: " + e.error + ": " + e.message);
-    });
-
-  promise.all([progressDeferred.promise, installed])
-    .then(() => {
-      // Restore default bulk trait value
-      gClient.traits.bulk = true;
-      run_next_test();
-    });
-});
-
-add_test(function testBulkUploadInstall() {
-  let packageFile = do_get_file("data/app.zip");
-  do_check_true(gClient.traits.bulk);
-
-  let progressDeferred = defer();
-  // Ensure we get at least one progress event at the end
-  gActorFront.on("install-progress", function onProgress(e, progress) {
-    if (progress.bytesSent == progress.totalBytes) {
-      gActorFront.off("install-progress", onProgress);
-      progressDeferred.resolve();
-    }
-  });
-
-  let installed =
-    gActorFront.installPackaged(packageFile.path, gAppId)
-    .then(function ({ appId }) {
-      do_check_eq(appId, gAppId);
-    }, function (e) {
-      do_throw("Failed bulk install uploaded packaged app: " + e.error + ": " + e.message);
-    });
-
-  promise.all([progressDeferred.promise, installed])
-    .then(run_next_test);
-});
-
-add_test(function testInstallHosted() {
-  gAppId = "hosted-app";
-  let metadata = {
-    origin: "http://foo.com",
-    installOrigin: "http://metadata.foo.com",
-    manifestURL: "http://foo.com/metadata/manifest.webapp"
-  };
-  let manifest = {
-    name: "My hosted app",
-    csp: "script-src: http://foo.com"
-  };
-  gActorFront.installHosted(gAppId, metadata, manifest)
-  .then(function ({ appId }) {
-    do_check_eq(appId, gAppId);
-    run_next_test();
-  },
-  function (e) {
-    do_throw("Failed installing hosted app: " + e.error + ": " + e.message);
-  });
-});
-
-add_test(function testCheckHostedApp() {
-  let request = {type: "getAll"};
-  webappActorRequest(request, function (aResponse) {
-    do_check_true("apps" in aResponse);
-    let apps = aResponse.apps;
-    do_check_true(apps.length > 0);
-    for (let i = 0; i < apps.length; i++) {
-      let app = apps[i];
-      if (app.id == gAppId) {
-        do_check_eq(app.name, "My hosted app");
-        do_check_eq(app.origin, "http://foo.com");
-        do_check_eq(app.installOrigin, "http://metadata.foo.com");
-        do_check_eq(app.manifestURL, "http://foo.com/metadata/manifest.webapp");
-        do_check_eq(app.csp, "script-src: http://foo.com");
-        run_next_test();
-        return;
-      }
-    }
-    do_throw("Unable to find the test app by its id");
-  });
-});
-
-add_test(function testInstallOverrideSystem() {
-  let appId = "actor-test"; // Match app.zip id
-
-  // Make the test app non-removable, like system apps
-  DOMApplicationRegistry.webapps[appId].removable = false;
-
-  let packageFile = do_get_file("data/app.zip");
-  gActorFront.installPackaged(packageFile.path, appId)
-    .then(function ({ appId }) {
-      do_throw("Override of a non-removable app has been accepted.");
-    }, function (e) {
-      do_check_eq(e.message, "The application " + appId + " can't be overridden.");
-
-      // Then make it removable again...
-      DOMApplicationRegistry.webapps[appId].removable = true;
-      run_next_test();
-    });
-});
-
-add_test(function testInstallEngineeringMode() {
-  let appId = "actor-test"; // Match app.zip id
-
-  let packageFile = do_get_file("data/app-engineering.zip");
-  gActorFront.installPackaged(packageFile.path, appId)
-    .then(function ({ appId }) {
-      do_throw("App with engineering mode permission was accepted.");
-    }, function (e) {
-      do_check_eq(e.message, "Installing apps with any of these permissions is forbidden: " +
-                             Services.prefs.getCharPref("devtools.apps.forbidden-permissions"));
-      run_next_test();
-    });
-});
-
-function run_test() {
-  setup();
-
-  run_next_test();
-}
deleted file mode 100644
--- a/devtools/shared/apps/tests/unit/xpcshell.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-[DEFAULT]
-tags = devtools
-head = head_apps.js
-tail = tail_apps.js
-firefox-appdir = browser
-skip-if = toolkit == 'android' || (toolkit == 'gonk' && debug) # Bug 1206586
-support-files =
-  data/app.zip
-  data/app-engineering.zip
-
-[test_webappsActor.js]
-skip-if = buildapp == "b2g"
index 588a9970597a5e1e1b84915b9ead980253288a00..68bb4749f527fbf71c5b509b6614c69ea8b37284
GIT binary patch
literal 71933
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
index 1f8066a4a032a181e308dc5c74203287c0e01115..b7e434171df3d80dc91cf7ddf684188b8723d468
GIT binary patch
literal 5530
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
Hx^nklWNn!Y
index bbebcc12c7dce08d41fc6d0a84dffe7714d179af..264c68d866d55dfc3739fc8e85302677e0b57a74
GIT binary patch
literal 5809
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
NUYvy<-<MhZ^k2!c^@9Ka
index fec7aa8307525b00956f7e45104c18bc1a2ec858..888d24434525d9cf041733de62061b853c773899
GIT binary patch
literal 5735
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
index ecdb0e5ee0022e174560074b36e97dd6c22f13c7..b1082106b218c990ecabc23a4d1dc1637f5b2085
GIT binary patch
literal 6469
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
--- a/dom/indexedDB/test/unit/test_defaultStorageUpgrade.js
+++ b/dom/indexedDB/test/unit/test_defaultStorageUpgrade.js
@@ -41,20 +41,16 @@ function testSteps()
     { url: "file:///c:/Users/joe/", dbName: "dbJ", dbVersion: 1 },
 
     // This one lives in storage/default/file++++c++Users+joe+index.html
     { url: "file:///c:/Users/joe/index.html", dbName: "dbK", dbVersion: 1 },
 
     // This one lives in storage/permanent/chrome
     { dbName: "dbL", dbVersion: 1 },
 
-    // This one lives in storage/default/1007+f+app+++system.gaiamobile.org
-    { appId: 1007, inIsolatedMozBrowser: false, url: "app://system.gaiamobile.org",
-      dbName: "dbM", dbVersion: 1 },
-
     // This one lives in storage/default/1007+t+https+++developer.cdn.mozilla.net
     { appId: 1007, inIsolatedMozBrowser: true, url: "https://developer.cdn.mozilla.net",
       dbName: "dbN", dbVersion: 1 },
 
     // This one lives in storage/default/http+++127.0.0.1
     { url: "http://127.0.0.1", dbName: "dbO", dbVersion: 1 },
 
     // This one lives in storage/default/file++++
@@ -86,20 +82,16 @@ function testSteps()
       dbOptions: { version: 1, storage: "temporary" } },
 
     // This one lives in storage/temporary/http+++localhost+82
     // The .metadata file was intentionally truncated for this origin directory
     // to test restoring during upgrade.
     { url: "http://localhost:82", dbName: "dbW",
       dbOptions: { version: 1, storage: "temporary" } },
 
-    // This one lives in storage/temporary/1007+f+app+++system.gaiamobile.org
-    { appId: 1007, inIsolatedMozBrowser: false, url: "app://system.gaiamobile.org",
-      dbName: "dbX", dbOptions: { version: 1, storage: "temporary" } },
-
     // This one lives in storage/temporary/1007+t+https+++developer.cdn.mozilla.net
     { appId: 1007, inIsolatedMozBrowser: true, url: "https://developer.cdn.mozilla.net",
       dbName: "dbY", dbOptions: { version: 1, storage: "temporary" } },
 
     // This one lives in storage/temporary/http+++localhost
     { url: "http://localhost", dbName: "dbZ",
       dbOptions: { version: 1, storage: "temporary" } }
   ];
--- a/dom/indexedDB/test/unit/test_idbSubdirUpgrade.js
+++ b/dom/indexedDB/test/unit/test_idbSubdirUpgrade.js
@@ -6,20 +6,16 @@
 var testGenerator = testSteps();
 
 function testSteps()
 {
   const openParams = [
     // This one lives in storage/default/http+++www.mozilla.org
     { url: "http://www.mozilla.org", dbName: "dbB", dbVersion: 1 },
 
-    // This one lives in storage/default/1007+f+app+++system.gaiamobile.org
-    { appId: 1007, inIsolatedMozBrowser: false, url: "app://system.gaiamobile.org",
-      dbName: "dbM", dbVersion: 1 },
-
     // This one lives in storage/default/1007+t+https+++developer.cdn.mozilla.net
     { appId: 1007, inIsolatedMozBrowser: true, url: "https://developer.cdn.mozilla.net",
       dbName: "dbN", dbVersion: 1 },
   ];
 
   let ios = SpecialPowers.Cc["@mozilla.org/network/io-service;1"]
                          .getService(SpecialPowers.Ci.nsIIOService);
 
--- a/dom/indexedDB/test/unit/test_schema23upgrade.js
+++ b/dom/indexedDB/test/unit/test_schema23upgrade.js
@@ -6,20 +6,16 @@
 var testGenerator = testSteps();
 
 function testSteps()
 {
   const openParams = [
     // This one lives in storage/default/http+++www.mozilla.org
     { url: "http://www.mozilla.org", dbName: "dbB", dbVersion: 1 },
 
-    // This one lives in storage/default/1007+f+app+++system.gaiamobile.org
-    { appId: 1007, inIsolatedMozBrowser: false, url: "app://system.gaiamobile.org",
-      dbName: "dbM", dbVersion: 1 },
-
     // This one lives in storage/default/1007+t+https+++developer.cdn.mozilla.net
     { appId: 1007, inIsolatedMozBrowser: true, url: "https://developer.cdn.mozilla.net",
       dbName: "dbN", dbVersion: 1 },
   ];
 
   let ios = SpecialPowers.Cc["@mozilla.org/network/io-service;1"]
                          .getService(SpecialPowers.Ci.nsIIOService);
 
--- a/dom/indexedDB/test/unit/test_storagePersistentUpgrade.js
+++ b/dom/indexedDB/test/unit/test_storagePersistentUpgrade.js
@@ -6,20 +6,16 @@
 var testGenerator = testSteps();
 
 function testSteps()
 {
   const openParams = [
     // This one lives in storage/default/http+++www.mozilla.org
     { url: "http://www.mozilla.org", dbName: "dbB", dbVersion: 1 },
 
-    // This one lives in storage/default/1007+f+app+++system.gaiamobile.org
-    { appId: 1007, inIsolatedMozBrowser: false, url: "app://system.gaiamobile.org",
-      dbName: "dbM", dbVersion: 1 },
-
     // This one lives in storage/default/1007+t+https+++developer.cdn.mozilla.net
     { appId: 1007, inIsolatedMozBrowser: true, url: "https://developer.cdn.mozilla.net",
       dbName: "dbN", dbVersion: 1 },
   ];
 
   let ios = SpecialPowers.Cc["@mozilla.org/network/io-service;1"]
                          .getService(SpecialPowers.Ci.nsIIOService);
 
--- a/netwerk/build/moz.build
+++ b/netwerk/build/moz.build
@@ -17,17 +17,16 @@ include('/ipc/chromium/chromium-config.m
 FINAL_LIBRARY = 'xul'
 
 LOCAL_INCLUDES += [
     '/netwerk/base',
     '/netwerk/cache',
     '/netwerk/dns',
     '/netwerk/mime',
     '/netwerk/protocol/about',
-    '/netwerk/protocol/app',
     '/netwerk/socket',
     '/netwerk/streamconv',
     '/netwerk/streamconv/converters',
 ]
 
 protocols = CONFIG['NECKO_PROTOCOLS']
 LOCAL_INCLUDES += sorted([
     '/netwerk/protocol/%s' % d for d in protocols if d != 'about'
--- a/netwerk/build/nsNetCID.h
+++ b/netwerk/build/nsNetCID.h
@@ -672,28 +672,16 @@
 { /* fbc81170-1f69-11d3-9344-00104ba0fd40 */         \
     0xfbc81170,                                      \
     0x1f69,                                          \
     0x11d3,                                          \
     {0x93, 0x44, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40} \
 }
 
 /******************************************************************************
- * netwerk/protocol/app/ classes
- */
-
-#define NS_APPPROTOCOLHANDLER_CID                    \
-{ /* {B6ED3030-9999-11d3-A178-0050041CAF44} */       \
-    0xb6ed3030,                                      \
-    0x9999,                                          \
-    0x11d3,                                          \
-    {0xa1, 0x78, 0x00, 0x50, 0x04, 0x1c, 0xaf, 0x44} \
-}
-
-/******************************************************************************
  * netwerk/protocol/data/ classes
  */
 
 #define NS_DATAPROTOCOLHANDLER_CID                   \
 { /* {B6ED3030-6183-11d3-A178-0050041CAF44} */       \
     0xb6ed3030,                                      \
     0x6183,                                          \
     0x11d3,                                          \
--- a/netwerk/build/nsNetModule.cpp
+++ b/netwerk/build/nsNetModule.cpp
@@ -290,17 +290,16 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsHttpDig
 #include "mozilla/net/PackagedAppVerifier.h"
 namespace mozilla {
 namespace net {
   NS_GENERIC_FACTORY_CONSTRUCTOR(Dashboard)
   NS_GENERIC_FACTORY_CONSTRUCTOR(PackagedAppService)
   NS_GENERIC_FACTORY_CONSTRUCTOR(PackagedAppVerifier)
 } // namespace net
 } // namespace mozilla
-#include "AppProtocolHandler.h"
 
 #ifdef NECKO_PROTOCOL_res
 // resource
 #include "nsResProtocolHandler.h"
 #include "ExtensionProtocolHandler.h"
 #include "SubstitutingProtocolHandler.h"
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsResProtocolHandler, Init)
 
@@ -817,17 +816,16 @@ NS_DEFINE_NAMED_CID(NS_ABOUT_CACHE_ENTRY
 #endif
 NS_DEFINE_NAMED_CID(NS_SOCKSSOCKETPROVIDER_CID);
 NS_DEFINE_NAMED_CID(NS_SOCKS4SOCKETPROVIDER_CID);
 NS_DEFINE_NAMED_CID(NS_UDPSOCKETPROVIDER_CID);
 NS_DEFINE_NAMED_CID(NS_CACHESERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_APPLICATIONCACHESERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_APPLICATIONCACHENAMESPACE_CID);
 NS_DEFINE_NAMED_CID(NS_APPLICATIONCACHE_CID);
-NS_DEFINE_NAMED_CID(NS_APPPROTOCOLHANDLER_CID);
 #ifdef NECKO_COOKIES
 NS_DEFINE_NAMED_CID(NS_COOKIEMANAGER_CID);
 NS_DEFINE_NAMED_CID(NS_COOKIESERVICE_CID);
 #endif
 #ifdef NECKO_WIFI
 NS_DEFINE_NAMED_CID(NS_WIFI_MONITOR_COMPONENT_CID);
 #endif
 #ifdef NECKO_PROTOCOL_data
@@ -968,17 +966,16 @@ static const mozilla::Module::CIDEntry k
 #endif
     { &kNS_SOCKSSOCKETPROVIDER_CID, false, nullptr, nsSOCKSSocketProvider::CreateV5 },
     { &kNS_SOCKS4SOCKETPROVIDER_CID, false, nullptr, nsSOCKSSocketProvider::CreateV4 },
     { &kNS_UDPSOCKETPROVIDER_CID, false, nullptr, nsUDPSocketProviderConstructor },
     { &kNS_CACHESERVICE_CID, false, nullptr, nsCacheService::Create },
     { &kNS_APPLICATIONCACHESERVICE_CID, false, nullptr, nsApplicationCacheServiceConstructor },
     { &kNS_APPLICATIONCACHENAMESPACE_CID, false, nullptr, nsApplicationCacheNamespaceConstructor },
     { &kNS_APPLICATIONCACHE_CID, false, nullptr, nsApplicationCacheConstructor },
-    { &kNS_APPPROTOCOLHANDLER_CID, false, nullptr, AppProtocolHandler::Create },
 #ifdef NECKO_COOKIES
     { &kNS_COOKIEMANAGER_CID, false, nullptr, nsICookieServiceConstructor },
     { &kNS_COOKIESERVICE_CID, false, nullptr, nsICookieServiceConstructor },
 #endif
 #ifdef NECKO_WIFI
     { &kNS_WIFI_MONITOR_COMPONENT_CID, false, nullptr, nsWifiMonitorConstructor },
 #endif
 #ifdef NECKO_PROTOCOL_data
@@ -1128,17 +1125,16 @@ static const mozilla::Module::ContractID
 #endif
     { NS_NETWORK_SOCKET_CONTRACTID_PREFIX "socks", &kNS_SOCKSSOCKETPROVIDER_CID },
     { NS_NETWORK_SOCKET_CONTRACTID_PREFIX "socks4", &kNS_SOCKS4SOCKETPROVIDER_CID },
     { NS_NETWORK_SOCKET_CONTRACTID_PREFIX "udp", &kNS_UDPSOCKETPROVIDER_CID },
     { NS_CACHESERVICE_CONTRACTID, &kNS_CACHESERVICE_CID },
     { NS_APPLICATIONCACHESERVICE_CONTRACTID, &kNS_APPLICATIONCACHESERVICE_CID },
     { NS_APPLICATIONCACHENAMESPACE_CONTRACTID, &kNS_APPLICATIONCACHENAMESPACE_CID },
     { NS_APPLICATIONCACHE_CONTRACTID, &kNS_APPLICATIONCACHE_CID },
-    { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "app", &kNS_APPPROTOCOLHANDLER_CID },
 #ifdef NECKO_COOKIES
     { NS_COOKIEMANAGER_CONTRACTID, &kNS_COOKIEMANAGER_CID },
     { NS_COOKIESERVICE_CONTRACTID, &kNS_COOKIESERVICE_CID },
 #endif
 #ifdef NECKO_WIFI
     { NS_WIFI_MONITOR_CONTRACTID, &kNS_WIFI_MONITOR_COMPONENT_CID },
 #endif
 #ifdef NECKO_PROTOCOL_data
--- a/netwerk/ipc/NeckoParent.cpp
+++ b/netwerk/ipc/NeckoParent.cpp
@@ -69,31 +69,16 @@ PNeckoParent *gNeckoParent = nullptr;
 NeckoParent::NeckoParent()
 {
   // Init HTTP protocol handler now since we need atomTable up and running very
   // early (IPDL argument handling for PHttpChannel constructor needs it) so
   // normal init (during 1st Http channel request) isn't early enough.
   nsCOMPtr<nsIProtocolHandler> proto =
     do_GetService("@mozilla.org/network/protocol;1?name=http");
 
-  if (UsingNeckoIPCSecurity()) {
-    // cache values for core/packaged apps basepaths
-    nsAutoString corePath, webPath;
-    nsCOMPtr<nsIAppsService> appsService = do_GetService(APPS_SERVICE_CONTRACTID);
-    if (appsService) {
-      appsService->GetCoreAppsBasePath(corePath);
-      appsService->GetWebAppsBasePath(webPath);
-    }
-    // corePath may be empty: we don't use it for all build types
-    MOZ_ASSERT(!webPath.IsEmpty());
-
-    LossyCopyUTF16toASCII(corePath, mCoreAppsBasePath);
-    LossyCopyUTF16toASCII(webPath, mWebAppsBasePath);
-  }
-
   mObserver = new OfflineObserver(this);
   gNeckoParent = this;
 }
 
 NeckoParent::~NeckoParent()
 {
   gNeckoParent = nullptr;
   if (mObserver) {
@@ -612,108 +597,16 @@ NeckoParent::AllocPRemoteOpenFileParent(
       bool fromExtension = false;
       if (NS_SUCCEEDED(appsService->IsExtensionResource(appUri, &fromExtension)) &&
           fromExtension) {
         RemoteOpenFileParent* parent = new RemoteOpenFileParent(fileURL);
         return parent;
       }
       return nullptr;
     }
-
-    nsAutoCString requestedPath;
-    fileURL->GetPath(requestedPath);
-    NS_UnescapeURL(requestedPath);
-
-    // Check if we load the whitelisted app uri for the neterror page.
-    bool netErrorWhiteList = false;
-
-    if (appUri) {
-      nsAdoptingString netErrorURI;
-      netErrorURI = Preferences::GetString("b2g.neterror.url");
-      if (netErrorURI) {
-        nsAutoCString spec;
-        appUri->GetSpec(spec);
-        netErrorWhiteList = spec.Equals(NS_ConvertUTF16toUTF8(netErrorURI).get());
-      }
-    }
-
-    // Check if we load a resource from the shared theme url space.
-    // If we try to load the theme but have no permission, refuse to load.
-    bool themeWhitelist = false;
-    if (Preferences::GetBool("dom.mozApps.themable") && appUri) {
-      nsAutoCString origin;
-      nsPrincipal::GetOriginForURI(appUri, origin);
-      nsAutoCString themeOrigin;
-      themeOrigin = Preferences::GetCString("b2g.theme.origin");
-      themeWhitelist = origin.Equals(themeOrigin);
-      if (themeWhitelist) {
-        bool hasThemePerm = false;
-        mozApp->HasPermission("themeable", &hasThemePerm);
-        if (!hasThemePerm) {
-          return nullptr;
-        }
-      }
-    }
-
-    if (hasManage || netErrorWhiteList || themeWhitelist) {
-      // webapps-manage permission means allow reading any application.zip file
-      // in either the regular webapps directory, or the core apps directory (if
-      // we're using one).
-      NS_NAMED_LITERAL_CSTRING(appzip, "/application.zip");
-      nsAutoCString pathEnd;
-      requestedPath.Right(pathEnd, appzip.Length());
-      if (!pathEnd.Equals(appzip)) {
-        return nullptr;
-      }
-      nsAutoCString pathStart;
-      requestedPath.Left(pathStart, mWebAppsBasePath.Length());
-      if (!pathStart.Equals(mWebAppsBasePath)) {
-        if (mCoreAppsBasePath.IsEmpty()) {
-          return nullptr;
-        }
-        requestedPath.Left(pathStart, mCoreAppsBasePath.Length());
-        if (!pathStart.Equals(mCoreAppsBasePath)) {
-          return nullptr;
-        }
-      }
-      // Finally: make sure there are no "../" in URI.
-      // Note: not checking for symlinks (would cause I/O for each path
-      // component).  So it's up to us to avoid creating symlinks that could
-      // provide attack vectors.
-      if (PL_strnstr(requestedPath.BeginReading(), "/../",
-                     requestedPath.Length())) {
-        printf_stderr("NeckoParent::AllocPRemoteOpenFile: "
-                      "FATAL error: requested file URI '%s' contains '/../' "
-                      "KILLING CHILD PROCESS\n", requestedPath.get());
-        return nullptr;
-      }
-    } else {
-      // regular packaged apps can only access their own application.zip file
-      nsAutoString basePath;
-      nsresult rv = mozApp->GetBasePath(basePath);
-      if (NS_FAILED(rv)) {
-        return nullptr;
-      }
-      nsAutoString uuid;
-      rv = mozApp->GetId(uuid);
-      if (NS_FAILED(rv)) {
-        return nullptr;
-      }
-      nsPrintfCString mustMatch("%s/%s/application.zip",
-                                NS_LossyConvertUTF16toASCII(basePath).get(),
-                                NS_LossyConvertUTF16toASCII(uuid).get());
-      if (!requestedPath.Equals(mustMatch)) {
-        printf_stderr("NeckoParent::AllocPRemoteOpenFile: "
-                      "FATAL error: app without webapps-manage permission is "
-                      "requesting file '%s' but is only allowed to open its "
-                      "own application.zip at %s: KILLING CHILD PROCESS\n",
-                      requestedPath.get(), mustMatch.get());
-        return nullptr;
-      }
-    }
   }
 
   RemoteOpenFileParent* parent = new RemoteOpenFileParent(fileURL);
   return parent;
 }
 
 bool
 NeckoParent::RecvPRemoteOpenFileConstructor(
--- a/netwerk/ipc/NeckoParent.h
+++ b/netwerk/ipc/NeckoParent.h
@@ -230,18 +230,16 @@ protected:
                              const ipc::OptionalURIParams& aSourceURI,
                              const PredictorPredictReason& aReason,
                              const IPC::SerializedLoadContext& aLoadContext) override;
   virtual bool RecvPredReset() override;
 
   virtual bool RecvRemoveRequestContext(const nsCString& rcid) override;
 
 private:
-  nsCString mCoreAppsBasePath;
-  nsCString mWebAppsBasePath;
   RefPtr<OfflineObserver> mObserver;
 };
 
 /**
  * Reference to the PNecko Parent protocol.
  */
 extern PNeckoParent *gNeckoParent;
 
deleted file mode 100644
--- a/netwerk/protocol/app/AppProtocolHandler.cpp
+++ /dev/null
@@ -1,513 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim:set expandtab ts=2 sw=2 sts=2 cin: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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/. */
-
-#include "AppProtocolHandler.h"
-#include "nsBaseChannel.h"
-#include "nsJARChannel.h"
-#include "nsNetCID.h"
-#include "nsNetUtil.h"
-#include "nsIStandardURL.h"
-#include "nsIAppsService.h"
-#include "nsILoadInfo.h"
-#include "nsXULAppAPI.h"
-#include "nsPrincipal.h"
-#include "nsContentSecurityManager.h"
-#include "nsContentUtils.h"
-
-#include "mozilla/dom/ScriptSettings.h"
-#include "mozilla/Preferences.h"
-
-using namespace mozilla;
-
-/**
-  * 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.
-  */
-class DummyChannel : public nsIJARChannel
-                          , Runnable
-{
-public:
-  NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_NSIREQUEST
-  NS_DECL_NSICHANNEL
-  NS_DECL_NSIJARCHANNEL
-
-  DummyChannel();
-
-  NS_IMETHODIMP Run() override;
-
-private:
-  ~DummyChannel() {}
-
-  bool                        mPending;
-  uint32_t                    mSuspendCount;
-  nsCOMPtr<nsISupports>       mListenerContext;
-  nsCOMPtr<nsIStreamListener> mListener;
-  nsCOMPtr<nsILoadGroup>      mLoadGroup;
-  nsLoadFlags                 mLoadFlags;
-  nsCOMPtr<nsILoadInfo>       mLoadInfo;
-};
-
-NS_IMPL_ISUPPORTS_INHERITED(DummyChannel, Runnable, nsIRequest, nsIChannel, nsIJARChannel)
-
-DummyChannel::DummyChannel() : mPending(false)
-                             , mSuspendCount(0)
-                             , mLoadFlags(LOAD_NORMAL)
-{
-}
-
-NS_IMETHODIMP DummyChannel::GetName(nsACString &result)
-{
-  result = "dummy_app_channel";
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::GetStatus(nsresult *aStatus)
-{
-  *aStatus = NS_ERROR_FILE_NOT_FOUND;
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::IsPending(bool *aResult)
-{
-  *aResult = mPending;
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::Suspend()
-{
-  mSuspendCount++;
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::Resume()
-{
-  if (mSuspendCount <= 0) {
-    return NS_ERROR_UNEXPECTED;
-  }
-
-  if (--mSuspendCount == 0) {
-    NS_DispatchToMainThread(this, NS_DISPATCH_NORMAL);
-  }
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::Open(nsIInputStream**)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-DummyChannel::Open2(nsIInputStream** aStream)
-{
-  nsCOMPtr<nsIStreamListener> listener;
-  nsresult rv = nsContentSecurityManager::doContentSecurityCheck(this, listener);
-  NS_ENSURE_SUCCESS(rv, rv);
-  return Open(aStream);
-}
-
-NS_IMETHODIMP DummyChannel::AsyncOpen(nsIStreamListener* aListener, nsISupports* aContext)
-{
-  MOZ_ASSERT(!mLoadInfo ||
-             mLoadInfo->GetSecurityMode() == 0 ||
-             mLoadInfo->GetInitialSecurityCheckDone() ||
-             (mLoadInfo->GetSecurityMode() == nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL &&
-              nsContentUtils::IsSystemPrincipal(mLoadInfo->LoadingPrincipal())),
-             "security flags in loadInfo but asyncOpen2() not called");
-
-  mListener = aListener;
-  mListenerContext = aContext;
-  mPending = true;
-
-  if (mLoadGroup) {
-    mLoadGroup->AddRequest(this, aContext);
-  }
-
-  if (mSuspendCount == 0) {
-    NS_DispatchToMainThread(this, NS_DISPATCH_NORMAL);
-  }
-
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-DummyChannel::AsyncOpen2(nsIStreamListener* aListener)
-{
-  nsCOMPtr<nsIStreamListener> listener = aListener;
-  nsresult rv = nsContentSecurityManager::doContentSecurityCheck(this, listener);
-  NS_ENSURE_SUCCESS(rv, rv);
-  return AsyncOpen(listener, nullptr);
-}
-
-// nsIJarChannel, needed for XHR to turn NS_ERROR_FILE_NOT_FOUND into
-// a 404 error.
-NS_IMETHODIMP DummyChannel::GetIsUnsafe(bool *aResult)
-{
-  *aResult = false;
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::SetAppURI(nsIURI *aURI)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetJarFile(nsIFile* *aFile)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetZipEntry(nsIZipEntry* *aEntry)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::Run()
-{
-  nsresult rv = mListener->OnStartRequest(this, mListenerContext);
-  mPending = false;
-  rv = mListener->OnStopRequest(this, mListenerContext, NS_ERROR_FILE_NOT_FOUND);
-  if (mLoadGroup) {
-    mLoadGroup->RemoveRequest(this, mListenerContext, NS_ERROR_FILE_NOT_FOUND);
-  }
-
-  mListener = nullptr;
-  mListenerContext = nullptr;
-  rv = SetNotificationCallbacks(nullptr);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::Cancel(nsresult)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
-{
-  *aLoadGroup = mLoadGroup;
-  NS_IF_ADDREF(*aLoadGroup);
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::SetLoadGroup(nsILoadGroup* aLoadGroup)
-{
-  mLoadGroup = aLoadGroup;
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::GetLoadFlags(nsLoadFlags *aLoadFlags)
-{
-  *aLoadFlags = mLoadFlags;
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::SetLoadFlags(nsLoadFlags aLoadFlags)
-{
-  mLoadFlags = aLoadFlags;
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::GetOriginalURI(nsIURI**)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::SetOriginalURI(nsIURI*)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetOwner(nsISupports**)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::SetOwner(nsISupports*)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetLoadInfo(nsILoadInfo** aLoadInfo)
-{
-  NS_IF_ADDREF(*aLoadInfo = mLoadInfo);
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::SetLoadInfo(nsILoadInfo* aLoadInfo)
-{
-  mLoadInfo = aLoadInfo;
-  return NS_OK;
-}
-
-NS_IMETHODIMP DummyChannel::GetNotificationCallbacks(nsIInterfaceRequestor**)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::SetNotificationCallbacks(nsIInterfaceRequestor*)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetSecurityInfo(nsISupports**)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetContentType(nsACString&)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::SetContentType(const nsACString&)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetContentCharset(nsACString&)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::SetContentCharset(const nsACString&)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetContentLength(int64_t*)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::SetContentLength(int64_t)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetContentDisposition(uint32_t*)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::SetContentDisposition(uint32_t)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetURI(nsIURI**)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetContentDispositionFilename(nsAString&)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::SetContentDispositionFilename(nsAString const &)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP DummyChannel::GetContentDispositionHeader(nsACString&)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/**
-  * app:// protocol implementation.
-  */
-
-AppProtocolHandler::AppProtocolHandler() {
-}
-
-AppProtocolHandler::~AppProtocolHandler() {
-  mAppInfoCache.Clear();
-}
-
-NS_IMPL_ISUPPORTS(AppProtocolHandler, nsIProtocolHandler)
-
-/* static */
-nsresult
-AppProtocolHandler::Create(nsISupports* aOuter,
-                           const nsIID& aIID,
-                           void* *aResult)
-{
-  // Instantiate the service here since that intializes gJarHandler, which we
-  // use indirectly (via our new JarChannel) in NewChannel.
-  nsCOMPtr<nsIProtocolHandler> jarInitializer(
-    do_GetService(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "jar"));
-  AppProtocolHandler* ph = new AppProtocolHandler();
-  if (ph == nullptr) {
-    return NS_ERROR_OUT_OF_MEMORY;
-  }
-  NS_ADDREF(ph);
-  nsresult rv = ph->QueryInterface(aIID, aResult);
-  NS_RELEASE(ph);
-  return rv;
-}
-
-NS_IMETHODIMP
-AppProtocolHandler::GetScheme(nsACString &aResult)
-{
-  aResult.AssignLiteral("app");
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-AppProtocolHandler::GetDefaultPort(int32_t *aResult)
-{
-  // No ports for the app protocol.
-  *aResult = -1;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-AppProtocolHandler::GetProtocolFlags(uint32_t *aResult)
-{
-  *aResult = URI_NOAUTH |
-             URI_DANGEROUS_TO_LOAD |
-             URI_CROSS_ORIGIN_NEEDS_WEBAPPS_PERM;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-AppProtocolHandler::NewURI(const nsACString &aSpec,
-                           const char *aCharset, // ignore charset info
-                           nsIURI *aBaseURI,
-                           nsIURI **result)
-{
-  nsresult rv;
-  nsCOMPtr<nsIStandardURL> surl(do_CreateInstance(NS_STANDARDURL_CONTRACTID, &rv));
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = surl->Init(nsIStandardURL::URLTYPE_STANDARD, -1, aSpec, aCharset, aBaseURI);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  nsCOMPtr<nsIURL> url(do_QueryInterface(surl, &rv));
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  url.forget(result);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-AppProtocolHandler::NewChannel2(nsIURI* aUri,
-                                nsILoadInfo* aLoadInfo,
-                                nsIChannel** aResult)
-{
-  NS_ENSURE_ARG_POINTER(aUri);
-  RefPtr<nsJARChannel> channel = new nsJARChannel();
-
-  nsAutoCString host;
-  nsresult rv = aUri->GetHost(host);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  if (Preferences::GetBool("dom.mozApps.themable")) {
-    nsAutoCString origin;
-    nsPrincipal::GetOriginForURI(aUri, origin);
-    nsAdoptingCString themeOrigin;
-    themeOrigin = Preferences::GetCString("b2g.theme.origin");
-    if (themeOrigin.Equals(origin)) {
-      // We are trying to load a theme resource. Check whether we have a
-      // package registered as a theme provider to override the file path.
-      nsAdoptingCString selectedTheme;
-      selectedTheme = Preferences::GetCString("dom.mozApps.selected_theme");
-      if (!selectedTheme.IsEmpty()) {
-        // Substitute the path with the actual theme.
-        host = selectedTheme;
-      }
-    }
-  }
-
-  nsAutoCString fileSpec;
-  nsCOMPtr<nsIURL> url = do_QueryInterface(aUri);
-  rv = url->GetFilePath(fileSpec);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  mozilla::dom::AppInfo *appInfo;
-
-  if (!mAppInfoCache.Get(host, &appInfo)) {
-    nsCOMPtr<nsIAppsService> appsService = do_GetService(APPS_SERVICE_CONTRACTID);
-    if (!appsService) {
-      return NS_ERROR_FAILURE;
-    }
-
-    mozilla::AutoSafeJSContext cx;
-    JS::RootedValue jsInfo(cx);
-    rv = appsService->GetAppInfo(NS_ConvertUTF8toUTF16(host), &jsInfo);
-    if (NS_FAILED(rv) || !jsInfo.isObject()) {
-      // Return a DummyChannel.
-      printf_stderr("!! Creating a dummy channel for %s (no appInfo)\n", host.get());
-      RefPtr<nsIChannel> dummyChannel = new DummyChannel();
-      dummyChannel->SetLoadInfo(aLoadInfo);
-      dummyChannel.forget(aResult);
-      return NS_OK;
-    }
-
-    appInfo = new mozilla::dom::AppInfo();
-    JSAutoCompartment ac(cx, &jsInfo.toObject());
-    if (!appInfo->Init(cx, jsInfo) || appInfo->mPath.IsEmpty()) {
-      // Return a DummyChannel.
-      printf_stderr("!! Creating a dummy channel for %s (invalid appInfo)\n", host.get());
-      RefPtr<nsIChannel> dummyChannel = new DummyChannel();
-      dummyChannel->SetLoadInfo(aLoadInfo);
-      dummyChannel.forget(aResult);
-      return NS_OK;
-    }
-    mAppInfoCache.Put(host, appInfo);
-  }
-
-  // Even core apps are on /system partition and can be accessed directly, but
-  // to ease sandboxing code not to handle the special case of core apps, only
-  // use scheme jar:file in parent, see bug 1119692 comment 20.
-  nsAutoCString jarSpec(XRE_IsParentProcess() ? "jar:file://"
-                                              : "jar:remoteopenfile://");
-  jarSpec += NS_ConvertUTF16toUTF8(appInfo->mPath) +
-             NS_LITERAL_CSTRING("/application.zip!") +
-             fileSpec;
-
-  nsCOMPtr<nsIURI> jarURI;
-  rv = NS_NewURI(getter_AddRefs(jarURI),
-                 jarSpec, nullptr, nullptr);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = channel->Init(jarURI);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  // set the loadInfo on the new channel
-  rv = channel->SetLoadInfo(aLoadInfo);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = channel->SetAppURI(aUri);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = channel->SetOriginalURI(aUri);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  channel.forget(aResult);
-  return NS_OK;
-}
-
-// We map app://ABCDEF/path/to/file.ext to
-// jar:file:///path/to/profile/webapps/ABCDEF/application.zip!/path/to/file.ext
-NS_IMETHODIMP
-AppProtocolHandler::NewChannel(nsIURI* aUri, nsIChannel* *aResult)
-{
-  return NewChannel2(aUri, nullptr, aResult);
-}
-
-NS_IMETHODIMP
-AppProtocolHandler::AllowPort(int32_t aPort, const char *aScheme, bool *aRetval)
-{
-  // No port allowed for this scheme.
-  *aRetval = false;
-  return NS_OK;
-}
-
deleted file mode 100644
--- a/netwerk/protocol/app/AppProtocolHandler.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* vim:set expandtab ts=4 sw=4 sts=4 cin: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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/. */
-
-#ifndef AppProtocolHandler_
-#define AppProtocolHandler_
-
-#include "nsIProtocolHandler.h"
-#include "nsClassHashtable.h"
-#include "mozilla/dom/AppInfoBinding.h"
-
-class AppProtocolHandler : public nsIProtocolHandler
-{
-public:
-  NS_DECL_ISUPPORTS
-
-  // nsIProtocolHandler methods:
-  NS_DECL_NSIPROTOCOLHANDLER
-
-  // AppProtocolHandler methods:
-  AppProtocolHandler();
-
-  // Define a Create method to be used with a factory:
-  static nsresult Create(nsISupports* aOuter,
-                         const nsIID& aIID,
-                         void* *aResult);
-
-private:
-  virtual ~AppProtocolHandler();
-  nsClassHashtable<nsCStringHashKey, mozilla::dom::AppInfo> mAppInfoCache;
-};
-
-#endif /* AppProtocolHandler_ */
deleted file mode 100644
--- a/netwerk/protocol/app/moz.build
+++ /dev/null
@@ -1,16 +0,0 @@
-# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# 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/.
-
-SOURCES += [
-    'AppProtocolHandler.cpp',
-]
-
-FINAL_LIBRARY = 'xul'
-LOCAL_INCLUDES += [
-    '/caps',
-    '/modules/libjar',
-    '/netwerk/base',
-]
--- a/old-configure.in
+++ b/old-configure.in
@@ -2635,17 +2635,17 @@ MOZ_XUL=1
 MOZ_ZIPWRITER=1
 NS_PRINTING=1
 if test "$MOZ_IOS"; then
    NS_PRINTING=
 fi
 MOZ_NO_SMART_CARDS=
 NSS_DISABLE_DBM=
 NECKO_COOKIES=1
-NECKO_PROTOCOLS_DEFAULT="about app data file ftp http res viewsource websocket wyciwyg device"
+NECKO_PROTOCOLS_DEFAULT="about data file ftp http res viewsource websocket wyciwyg device"
 if test -n "$MOZ_RTSP"; then
   NECKO_PROTOCOLS_DEFAULT="$NECKO_PROTOCOLS_DEFAULT rtsp"
 fi
 BUILD_CTYPES=1
 MOZ_USE_NATIVE_POPUP_WINDOWS=
 MOZ_WEBSMS_BACKEND=
 MOZ_EXCLUDE_HYPHENATION_DICTIONARIES=
 MOZ_INSTALL_TRACKING=