You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by br...@apache.org on 2014/01/06 21:25:45 UTC

[05/13] git commit: Installing and launching from CRX files, all working!

Installing and launching from CRX files, all working!


Project: http://git-wip-us.apache.org/repos/asf/cordova-app-harness/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-app-harness/commit/33d8fe23
Tree: http://git-wip-us.apache.org/repos/asf/cordova-app-harness/tree/33d8fe23
Diff: http://git-wip-us.apache.org/repos/asf/cordova-app-harness/diff/33d8fe23

Branch: refs/heads/master
Commit: 33d8fe23dc2cd55beecdf58783e607916c8f490e
Parents: 062ce6a
Author: Braden Shepherdson <br...@gmail.com>
Authored: Wed Nov 27 14:53:44 2013 -0800
Committer: Braden Shepherdson <br...@gmail.com>
Committed: Mon Jan 6 15:24:12 2014 -0500

----------------------------------------------------------------------
 www/cdvah/crx_files/config.android.xml |  2 +-
 www/cdvah/crx_files/config.ios.xml     |  1 -
 www/cdvah/index.html                   |  1 +
 www/cdvah/js/CrxInstaller.js           | 55 +++++++++++++++++++++++++
 www/cdvah/js/CrxPackageHandler.js      | 64 -----------------------------
 www/cdvah/js/Installer.js              | 19 +++++++--
 www/cdvah/js/ResourcesLoader.js        |  2 +-
 www/cdvah/views/add.html               |  7 ++--
 8 files changed, 78 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/33d8fe23/www/cdvah/crx_files/config.android.xml
----------------------------------------------------------------------
diff --git a/www/cdvah/crx_files/config.android.xml b/www/cdvah/crx_files/config.android.xml
index b0e4507..24126a4 100644
--- a/www/cdvah/crx_files/config.android.xml
+++ b/www/cdvah/crx_files/config.android.xml
@@ -92,7 +92,7 @@
         <param name="onload" value="true" />
     </feature>
 
-    <content src="chromeapp.html" />
+    <content src="chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/chromeapp.html" />
     <access origin="*" />
     <access origin="chrome-extension://*" />
     <access origin="cdv-app-harness://*" />

http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/33d8fe23/www/cdvah/crx_files/config.ios.xml
----------------------------------------------------------------------
diff --git a/www/cdvah/crx_files/config.ios.xml b/www/cdvah/crx_files/config.ios.xml
index 9254738..c6d446b 100644
--- a/www/cdvah/crx_files/config.ios.xml
+++ b/www/cdvah/crx_files/config.ios.xml
@@ -88,7 +88,6 @@
     <feature name="Zip">
         <param name="ios-package" value="Zip" />
     </feature>
-    <content src="chromeapp.html" />
     <access origin="*" />
     <access origin="chrome-extension://*" />
     <access origin="cdv-app-harness://*" />

http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/33d8fe23/www/cdvah/index.html
----------------------------------------------------------------------
diff --git a/www/cdvah/index.html b/www/cdvah/index.html
index 7d77fac..5a816b2 100644
--- a/www/cdvah/index.html
+++ b/www/cdvah/index.html
@@ -9,6 +9,7 @@
         <script type="text/javascript" src="js/ContextMenuInjectScript.js"></script>
         <script type="text/javascript" src="js/Installer.js"></script>
         <script type="text/javascript" src="js/ServeInstaller.js"></script>
+        <script type="text/javascript" src="js/CrxInstaller.js"></script>
         <script type="text/javascript" src="js/ResourcesLoader.js"></script>
         <script type="text/javascript" src="js/AppsService.js"></script>
         <script type="text/javascript" src="js/UrlRemap.js"></script>

http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/33d8fe23/www/cdvah/js/CrxInstaller.js
----------------------------------------------------------------------
diff --git a/www/cdvah/js/CrxInstaller.js b/www/cdvah/js/CrxInstaller.js
new file mode 100644
index 0000000..c9f08aa
--- /dev/null
+++ b/www/cdvah/js/CrxInstaller.js
@@ -0,0 +1,55 @@
+(function(){
+    'use strict';
+    /* global myApp */
+    myApp.run(['$q', 'Installer', 'AppsService', 'ResourcesLoader', function($q, Installer, AppsService, ResourcesLoader){
+
+        var platformId = cordova.require('cordova/platform').id;
+
+        function CrxInstaller(url, appId) {
+            Installer.call(this, url, appId);
+        }
+
+        CrxInstaller.prototype = Object.create(Installer.prototype);
+
+        CrxInstaller.prototype.type = 'crx';
+
+        CrxInstaller.prototype._doUpdateApp = function(installPath) {
+            var platformConfig = location.pathname.replace(/\/[^\/]*$/, '/crx_files/config.' + platformId + '.xml');
+            var targetConfig = installPath + '/config.xml';
+            var xhr;
+            var self = this;
+
+            var baseName = self.url.match(/\/([^\/]*)$/)[1];
+            var crxFile = installPath.replace(/\/$/, '') + '/' + baseName;
+
+            return ResourcesLoader.downloadFromUrl(this.url, crxFile).then(function(destination) {
+                return ResourcesLoader.extractZipFile(crxFile, installPath);
+            }).then(function() {
+                // Copy in the config.<platform>.xml file from the harness.
+                return ResourcesLoader.xhrGet(platformConfig);
+            }).then(function(_xhr){
+                xhr = _xhr;
+                return ResourcesLoader.ensureDirectoryExists(targetConfig);
+            }).then(function() {
+                return ResourcesLoader.writeFileContents(targetConfig, xhr.responseText);
+            });
+        };
+
+        AppsService.registerInstallerFactory({
+            type: 'crx',
+            createFromUrl: function(url) {
+                // Clean up the URL.
+                if (!/^https?:/.test(url)) {
+                    url = 'http://' + url;
+                }
+
+                // TODO: Fix the missing appId, somehow.
+                return $q.when(new CrxInstaller(url, 'New Chrome App'));
+            },
+
+            createFromJson: function(url, appId) {
+                return new CrxInstaller(url, appId);
+            }
+        });
+    }]);
+})();

http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/33d8fe23/www/cdvah/js/CrxPackageHandler.js
----------------------------------------------------------------------
diff --git a/www/cdvah/js/CrxPackageHandler.js b/www/cdvah/js/CrxPackageHandler.js
deleted file mode 100644
index a860d57..0000000
--- a/www/cdvah/js/CrxPackageHandler.js
+++ /dev/null
@@ -1,64 +0,0 @@
-(function(){
-    'use strict';
-    /* global myApp */
-    myApp.run(['$q', 'AppsService', 'ResourcesLoader', 'ContextMenuInjectScript', function($q, AppsService, ResourcesLoader, ContextMenuInjectScript){
-
-        var platformId = cordova.require('cordova/platform').id;
-
-        function copyFile(startUrl, targetLocation){
-            /************ Begin Work around for File system bug ************/
-            if(targetLocation.indexOf('file://') === 0) {
-                targetLocation = targetLocation.substring('file://'.length);
-            }
-            /************ End Work around for File system bug **************/
-            return ResourcesLoader.xhrGet(startUrl)
-            .then(function(xhr){
-                return ResourcesLoader.ensureDirectoryExists(targetLocation)
-                .then(function(){
-                    return ResourcesLoader.writeFileContents(targetLocation, xhr.responseText);
-                });
-            });
-        }
-
-        AppsService.registerPackageHandler('crx', {
-            extractPackageToDirectory : function (appName, fileName, outputDirectory){
-                console.log('extracting the crx');
-                var dataToAppend = ContextMenuInjectScript.getInjectString(appName);
-                var platformDirectory = outputDirectory + '/' + platformId + '/';
-                var platformWWWDirectory = platformDirectory + 'www/';
-                var cordovaFile = platformWWWDirectory + 'cordova.js';
-
-                // We need to
-                // 1) Copy over the files required to convert a crx to a normal web app
-                // 2) Modify the cordova.js file
-                return ResourcesLoader.extractZipFile(fileName, platformWWWDirectory)
-                .then(function(){
-                    var plugins = cordova.require('cordova/plugin_list');
-                    if (!plugins) {
-                        throw new Error('Error loading cordova_plugins.json');
-                    }
-
-                    var copies = [
-                        copyFile('app-bundle:///cordova.js', cordovaFile),
-                        copyFile('app-bundle:///crx_files/config.' + platformId + '.xml', platformDirectory + 'config.xml'),
-                        copyFile('app-bundle:///cordova_plugins.js', platformWWWDirectory + 'cordova_plugins.js'),
-                        copyFile('app-bundle:///chromeapp.html', platformWWWDirectory + 'chromeapp.html'),
-                        copyFile('app-bundle:///chromeappstyles.css', platformWWWDirectory + 'chromeappstyles.css'),
-                        copyFile('app-bundle:///chromebgpage.html', platformWWWDirectory + 'chromebgpage.html'),
-                        copyFile('app-bundle:///cdvah_js/ContextMenu.js', platformWWWDirectory + 'ContextMenu.js')
-                    ];
-
-                    for(var i = 0; i < plugins.length; i++) {
-                        console.log('copying ' + plugins[i].file);
-                        copies.push(copyFile('app-bundle:///' + plugins[i].file, platformWWWDirectory + plugins[i].file));
-                    }
-
-                    return $q.all(copies);
-                })
-                .then(function(){
-                    return ResourcesLoader.appendFileContents(cordovaFile, dataToAppend);
-                });
-            }
-        });
-    }]);
-})();

http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/33d8fe23/www/cdvah/js/Installer.js
----------------------------------------------------------------------
diff --git a/www/cdvah/js/Installer.js b/www/cdvah/js/Installer.js
index 7c2c2da..18d1093 100644
--- a/www/cdvah/js/Installer.js
+++ b/www/cdvah/js/Installer.js
@@ -67,7 +67,12 @@
                 self.installPath = installPath;
                 self.lastUpdated = new Date();
                 self.updatingStatus = null;
-                return getAppPlugins(installPath + '/www/cordova_plugins.js');
+                if (self.type === 'crx') {
+                    // No cordova_plugins.js to read for .crx-based apps.
+                    return $q.when({});
+                } else {
+                    return getAppPlugins(installPath + '/www/cordova_plugins.js');
+                }
             }, null, function(status) {
                 self.updatingStatus = Math.round(status * 100);
             }).then(function(metadata) {
@@ -91,6 +96,8 @@
             }
             var configLocation = installPath + '/config.xml';
 
+            var type = this.type;
+
             return getAppStartPageFromConfig(configLocation)
             .then(function(rawStartLocation) {
                 var urlutil = cordova.require('cordova/urlutil');
@@ -115,11 +122,17 @@
                 UrlRemap.aliasUri('/cordova\\.js.*', '.+', harnessDir + '/cordova.js', false /* redirect */);
                 UrlRemap.aliasUri('/cordova_plugins\\.js.*', '.+', harnessDir + '/cordova_plugins.js', false /* redirect */);
                 if (startLocation.indexOf('chrome-extension://') === 0) {
-                    var pluginsUrl = 'chrome-extension://[^\/]+/plugins/';
+                    var pluginsUrl = 'chrome-extension://[^/]+/plugins/';
                     UrlRemap.aliasUri('^' + pluginsUrl, '^' + pluginsUrl, harnessDir + '/plugins/', false /* redirect */);
+
+                    var bootstrapUrl = 'chrome-extension://[^/]+/chrome(?:app\\.html|bgpage\\.html|appstyles\\.css)';
+                    UrlRemap.aliasUri('^' + bootstrapUrl, '^chrome-extension://[^/]+/', harnessDir + '/', false /* redirect */);
+
                     var chromeExtensionUrl = 'chrome-extension://[^\/]+/(?!!gap_exec)';
                     // Add the extra mapping for chrome-extension://aaaa... to point to the install location.
-                    UrlRemap.aliasUri('^' + chromeExtensionUrl, '^' + chromeExtensionUrl, installUrl + '/www/', false /* redirect */);
+                    // We want the /www/ for Cordova apps, and no /www/ for CRX apps.
+                    var installSubdir = type == 'crx' ? '/' : '/www/';
+                    UrlRemap.aliasUri('^' + chromeExtensionUrl, '^' + chromeExtensionUrl, installUrl + installSubdir, false /* redirect */);
                 } else {
                     var pluginsUrl = startLocation.replace(/\/www\/.*/, '/www/plugins/');
                     UrlRemap.aliasUri('^' + pluginsUrl, '^' + pluginsUrl, harnessDir + '/plugins/', false /* redirect */);

http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/33d8fe23/www/cdvah/js/ResourcesLoader.js
----------------------------------------------------------------------
diff --git a/www/cdvah/js/ResourcesLoader.js b/www/cdvah/js/ResourcesLoader.js
index 982d2b5..e6faecf 100644
--- a/www/cdvah/js/ResourcesLoader.js
+++ b/www/cdvah/js/ResourcesLoader.js
@@ -172,7 +172,7 @@
             var xhr = new XMLHttpRequest();
             xhr.onreadystatechange = function() {
                 if (xhr.readyState === 4) {
-                    if(xhr.status === 200) {
+                    if(xhr.status === 200 || xhr.status === 0) {
                         deferred.resolve(xhr);
                     } else {
                         deferred.reject(new Error('XHR return status: ' + xhr.status + ' for url: ' + url));

http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/33d8fe23/www/cdvah/views/add.html
----------------------------------------------------------------------
diff --git a/www/cdvah/views/add.html b/www/cdvah/views/add.html
index 94bb581..1818ccd 100644
--- a/www/cdvah/views/add.html
+++ b/www/cdvah/views/add.html
@@ -1,8 +1,9 @@
-<form name="addForm" ng-controller="AddCtrl" ng-submit="addApp()">
+<form name="addForm" ng-controller="AddCtrl">
     <label>How to retrieve the app:<br>
         <select ng-model="appData.installerType">
             <option value="serve">cordova serve</option>
             <option value="cdvh">.cdvh file</option>
+            <option value="crx">.crx file</option>
         </select>
     </label>
     <div ng-show="appData.installerType == 'serve'">
@@ -17,14 +18,14 @@
               <option value="KEY.localtunnel.com">LocalTunnel</option>
           </select>
     </div>
-    <div ng-show="appData.installerType == 'cdvh'">
+    <div ng-show="appData.installerType != 'serve'">
       <label>Enter URL<br>
           <input class="topcoat-text-input" type="text" ng-model="appData.appUrl" autocorrect="off" autocapitalize="off">
       </label>
           <button class="topcoat-button" ng-click="fetchQR(appData, 'appUrl')" ng-show="qrEnabled">Scan QR Code</button><br>
     </div>
     <div class="buttons">
-        <input type="submit" value="Add" class="topcoat-button--cta"></button>
+        <button ng-click="addApp()" class="topcoat-button--cta">Add</button>
         <a href="#/"><button class="topcoat-button" ng-click="back()">Back</button></a>
     </div>
 </form>