Bug 1422019 - Make resource://android/asset work again with GeckoView r=jchen draft
authorJames Willcox <snorp@snorp.net>
Fri, 01 Dec 2017 10:47:15 -0600
changeset 757613 b2f97a53d65357a80e233aa06607cd8e4fbb3d8f
parent 757612 a6675ad4af752216b85c2b957d7460f346623969
child 757614 d2150a35ee47aa76ebec1c88c7aee9f3a93bbec5
push id99800
push userbmo:snorp@snorp.net
push dateTue, 20 Feb 2018 22:22:10 +0000
reviewersjchen
bugs1422019
milestone60.0a1
Bug 1422019 - Make resource://android/asset work again with GeckoView r=jchen MozReview-Commit-ID: FYD4cOaNBza
mobile/android/components/geckoview/GeckoViewStartup.js
--- a/mobile/android/components/geckoview/GeckoViewStartup.js
+++ b/mobile/android/components/geckoview/GeckoViewStartup.js
@@ -12,20 +12,38 @@ XPCOMUtils.defineLazyModuleGetters(this,
 function GeckoViewStartup() {
 }
 
 GeckoViewStartup.prototype = {
   classID: Components.ID("{8e993c34-fdd6-432c-967e-f995d888777f}"),
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
 
+  /**
+   * Register resource://android as the APK root.
+   *
+   * Consumers can access Android assets using resource://android/assets/FILENAME.
+   */
+  setResourceSubstitutions: function() {
+    let registry = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIChromeRegistry);
+    // Like jar:jar:file:///data/app/org.mozilla.geckoview.test.apk!/assets/omni.ja!/chrome/geckoview/content/geckoview.js
+    let url = registry.convertChromeURL(Services.io.newURI("chrome://geckoview/content/geckoview.js")).spec;
+    // Like jar:file:///data/app/org.mozilla.geckoview.test.apk!/
+    url = url.substring(4, url.indexOf("!/") + 2);
+
+    let protocolHandler = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
+    protocolHandler.setSubstitution("android", Services.io.newURI(url));
+  },
+
   /* ----------  nsIObserver  ---------- */
   observe: function(aSubject, aTopic, aData) {
     switch (aTopic) {
       case "app-startup": {
+        this.setResourceSubstitutions();
+
         // Parent and content process.
         Services.obs.addObserver(this, "chrome-document-global-created");
         Services.obs.addObserver(this, "content-document-global-created");
 
         GeckoViewUtils.addLazyGetter(this, "GeckoViewPermission", {
           service: "@mozilla.org/content-permission/prompt;1",
           observers: [
             "getUserMedia:ask-device-permission",