Bug 1285170 - Remove app:// protocol r=valentin
authorAlexandre Lissy <lissyx@lissyx.dyndns.org>
Wed, 16 Mar 2016 17:11:12 +0100
changeset 329263 a74a1865eb97f56ca13947e1f62790ab0454c372
parent 329262 590b6cdf1e9950dd60f9c10d91a6edfad4e787a1
child 329264 383cedd6feb650bb1242f228692f83ca5e213920
child 329298 abb40d3751b5d345a2eca3203c01f18ce7773afa
push id9858
push userjlund@mozilla.com
push dateMon, 01 Aug 2016 14:37:10 +0000
treeherdermozilla-aurora@203106ef6cb6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersvalentin
bugs1285170
milestone50.0a1
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..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 4f838a2a13d79d9ff62de801353d19834b38d7f0..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
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=