You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2013/05/23 22:03:39 UTC
[16/30] git commit: Add apps hosted by cordova serve. (Context menu
not injected into app)
Add apps hosted by cordova serve. (Context menu not injected into app)
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/636794a8
Tree: http://git-wip-us.apache.org/repos/asf/cordova-app-harness/tree/636794a8
Diff: http://git-wip-us.apache.org/repos/asf/cordova-app-harness/diff/636794a8
Branch: refs/heads/master
Commit: 636794a83fe4e89e592ca61bd927295d0feb23c4
Parents: dd4d655
Author: Shravan Narayan <sh...@google.com>
Authored: Wed May 8 17:52:15 2013 -0400
Committer: Shravan Narayan <sh...@google.com>
Committed: Wed May 8 18:38:55 2013 -0400
----------------------------------------------------------------------
www/cdvah_js/AddCtrl.js | 28 ++++--
www/cdvah_js/AppsService.js | 151 +++++++++++++++++++++++-----------
www/cdvah_js/ListCtrl.js | 2 +-
www/cdvah_js/ResourcesLoader.js | 97 ++++++++++++++--------
www/cdvah_views/add.html | 12 ++-
5 files changed, 195 insertions(+), 95 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/636794a8/www/cdvah_js/AddCtrl.js
----------------------------------------------------------------------
diff --git a/www/cdvah_js/AddCtrl.js b/www/cdvah_js/AddCtrl.js
index 09a1c50..7f6a34c 100644
--- a/www/cdvah_js/AddCtrl.js
+++ b/www/cdvah_js/AddCtrl.js
@@ -3,21 +3,29 @@
/* global myApp */
myApp.controller("AddCtrl", ["$scope", "AppsService", function ($scope, AppsService) {
- $scope.addApp = function(appName, appSource, appSourcePattern) {
+ $scope.addApp = function(appName, appSource, appSourcePattern, appSourceServe) {
+ var serviceCall;
if(appSource === "pattern") {
if(!appSourcePattern) {
- alert("Url not specified");
+ alert("Url of package not specified");
return;
}
-
- AppsService.addAppFromPattern(appName, appSourcePattern)
- .then(function() {
- alert("Successfully installed");
- }, function(error) {
- console.error(error);
- alert("Unable to add application because: \n" + JSON.stringify(error));
- });
+ serviceCall = AppsService.addAppFromPattern(appName, appSourcePattern);
+ } else if(appSource === "serve") {
+ if(!appSourceServe) {
+ alert("Url of config file not specified");
+ return;
+ }
+ serviceCall = AppsService.addAppFromServe(appName, appSourceServe);
}
+
+ serviceCall.then(function() {
+ alert("Successfully installed");
+ }, function(error) {
+ console.error(error);
+ alert("Unable to add application because: \n" + error);
+ });
+
};
}]);
http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/636794a8/www/cdvah_js/AppsService.js
----------------------------------------------------------------------
diff --git a/www/cdvah_js/AppsService.js b/www/cdvah_js/AppsService.js
index 9afe5a3..824cb8a 100644
--- a/www/cdvah_js/AppsService.js
+++ b/www/cdvah_js/AppsService.js
@@ -47,42 +47,35 @@
});
}
- function registerApp(appName, appSource, appSourcePattern) {
+ function addNewAppFromServe(appName, appSourceServe){
+ return registerApp(appName, "serve", appSourceServe);
+ }
+
+ function registerApp(appName, appSource, appSourceData) {
return ResourcesLoader.readJSONFileContents(APPS_JSON)
.then(function(result){
result.installedApps = result.installedApps || [];
result.installedApps.push({
"Name" : appName,
"Source" : appSource,
- "Data" : appSourcePattern,
+ "Data" : appSourceData,
"Installed" : (new Date()).toLocaleString()
});
return ResourcesLoader.writeJSONFileContents(APPS_JSON, result);
});
}
- function cleanPath(path){
- if(path.indexOf("file://") === 0){
- path = path.substring("file://".length);
- }
- // remove trailing slash
- return (path.substring(path.length - 1) === "/") ? path.substring(0, path.length - 1) : path;
- }
-
function isPathAbsolute(path){
return (path.match(/^[a-z0-9+.-]+:/) != null);
}
- function getAppStartPageFromConfig(configFile, appBaseDirectory) {
- configFile = cleanPath(configFile);
- appBaseDirectory = "file://" + cleanPath(appBaseDirectory);
-
+ function getAppStartPageFromConfig(configFile, appBaseLocation) {
return ResourcesLoader.readFileContents(configFile)
.then(function(contents){
if(!contents) {
throw new Error("Config file is empty. Unable to find a start page for your app.");
} else {
- var startLocation = appBaseDirectory + "/index.html";
+ var startLocation = appBaseLocation + "/index.html";
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(contents, "text/xml");
var els = xmlDoc.getElementsByTagName("content");
@@ -97,7 +90,7 @@
startLocation = srcValue;
} else {
srcValue = srcValue.charAt(0) === "/" ? srcValue.substring(1) : srcValue;
- startLocation = appBaseDirectory + "/" + srcValue;
+ startLocation = appBaseLocation + "/" + srcValue;
}
break;
}
@@ -139,31 +132,93 @@
});
}
- return {
- //return promise with the array of apps
- getAppsList : function(getFullEntries) {
- return ResourcesLoader.ensureDirectoryExists(APPS_JSON)
- .then(function() {
- return ResourcesLoader.readJSONFileContents(APPS_JSON);
- })
- .then(function(result){
- result.installedApps = result.installedApps || [];
- var newAppsList = [];
+ function getAppsList(getFullEntries){
+ return ResourcesLoader.ensureDirectoryExists(APPS_JSON)
+ .then(function() {
+ return ResourcesLoader.readJSONFileContents(APPS_JSON);
+ })
+ .then(function(result){
+ result.installedApps = result.installedApps || [];
+ var newAppsList = [];
- for(var i = 0; i < result.installedApps.length; i++){
- if(getFullEntries) {
- newAppsList.push(result.installedApps[i]);
- } else {
- newAppsList.push(result.installedApps[i].Name);
- }
+ for(var i = 0; i < result.installedApps.length; i++){
+ if(getFullEntries) {
+ newAppsList.push(result.installedApps[i]);
+ } else {
+ newAppsList.push(result.installedApps[i].Name);
}
+ }
- return newAppsList;
- });
+ return newAppsList;
+ });
+ }
+
+ function isUniqueApp(appName){
+ return getAppsList(false /* App names only */)
+ .then(function(appsList){
+ if(appsList.indexOf(appName) !== -1) {
+ throw new Error("An app with this name already exists");
+ }
+ });
+ }
+
+ function getWWWDirAndStartPageFromConfigForApp(appName){
+ var platformWWWLocation;
+ return getAppsList(true /* Get full app entry */)
+ .then(function(appEntries){
+ var entry;
+ for(var i = 0; i < appEntries.length; i++){
+ if(appEntries[i].Name === appName){
+ entry = appEntries[i];
+ break;
+ }
+ }
+ if(!entry){
+ throw new Error("Could not find the app " + appName + " in the installed apps");
+ }
+ if(entry.Source === "pattern"){
+ return ResourcesLoader.getFullFilePath(INSTALL_DIRECTORY + appName + "/" + platformId)
+ .then(function(platformLocation){
+ return {
+ platformWWWLocation : platformLocation + "/www/",
+ configLocation : platformLocation + "/config.xml"
+ };
+ });
+ } else if(entry.Source === "serve"){
+ var configFile = entry.Data;
+ var location = configFile.indexOf("/config.xml");
+ if(location === -1){
+ throw new Error("The location of config.xml provided is invalid. Expected the location to end with 'config.xml'");
+ }
+ //grab path including upto last slash
+ var appLocation = configFile.substring(0, location + 1);
+ return {
+ platformWWWLocation : appLocation,
+ configLocation : configFile
+ };
+ } else {
+ throw new Error("Unknown app source: " + entry.Source);
+ }
+ })
+ .then(function(appPaths){
+ platformWWWLocation = appPaths.platformWWWLocation;
+ return getAppStartPageFromConfig(appPaths.configLocation, appPaths.platformWWWLocation);
+ })
+ .then(function(startLocation){
+ return {
+ startLocation : startLocation,
+ platformWWWLocation : platformWWWLocation
+ };
+ });
+ }
+
+ return {
+ //return promise with the array of apps
+ getAppsList : function(getFullEntries) {
+ return getAppsList(getFullEntries);
},
launchApp : function(appName) {
- var platformWWWLocation;
var startLocation;
return ResourcesLoader.readJSONFileContents(METADATA_JSON)
.then(function(settings){
@@ -172,17 +227,13 @@
return ResourcesLoader.writeJSONFileContents(METADATA_JSON, settings);
})
.then(function(){
- return ResourcesLoader.getFullFilePath(INSTALL_DIRECTORY + appName + "/" + platformId);
- })
- .then(function(platformLocation){
- platformWWWLocation = platformLocation + "/www/";
- return getAppStartPageFromConfig(platformLocation + "/config.xml", platformWWWLocation);
+ return getWWWDirAndStartPageFromConfigForApp(appName);
})
- .then(function(_startLocation){
- startLocation = _startLocation;
+ .then(function(startLocationAndWWWLocation){
+ startLocation = startLocationAndWWWLocation.startLocation;
var promises = [];
for (var i = preLaunchHooks.length - 1; i >= 0; i--) {
- promises.push(preLaunchHooks[i](appName, platformWWWLocation));
+ promises.push(preLaunchHooks[i](appName, startLocationAndWWWLocation.platformWWWLocation));
}
return Q.all(promises);
})
@@ -192,15 +243,19 @@
},
addAppFromPattern : function(appName, appSourcePattern) {
- return this.getAppsList(false /* App names only */)
- .then(function(appsList){
- if(appsList.indexOf(appName) !== -1) {
- throw new Error("An app with this name already exists");
- }
+ return isUniqueApp(appName)
+ .then(function(){
return addNewAppFromPattern(appName, appSourcePattern);
});
},
+ addAppFromServe : function(appName, appSourceServe) {
+ return isUniqueApp(appName)
+ .then(function(){
+ return addNewAppFromServe(appName, appSourceServe);
+ });
+ },
+
uninstallApp : function(appName) {
return removeApp(appName);
},
http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/636794a8/www/cdvah_js/ListCtrl.js
----------------------------------------------------------------------
diff --git a/www/cdvah_js/ListCtrl.js b/www/cdvah_js/ListCtrl.js
index 5dd0794..326f394 100644
--- a/www/cdvah_js/ListCtrl.js
+++ b/www/cdvah_js/ListCtrl.js
@@ -87,7 +87,7 @@
return AppsService.launchApp(app)
.then(null, function(error){
console.error("Error during loading of app " + app + ": " + error);
- alert("Something went wrong during the loading of the app. Please try again.");
+ alert("Something went wrong during the loading of the app. Please try again." + error);
});
};
http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/636794a8/www/cdvah_js/ResourcesLoader.js
----------------------------------------------------------------------
diff --git a/www/cdvah_js/ResourcesLoader.js b/www/cdvah_js/ResourcesLoader.js
index d9ca013..e1df6db 100644
--- a/www/cdvah_js/ResourcesLoader.js
+++ b/www/cdvah_js/ResourcesLoader.js
@@ -72,6 +72,14 @@
return path;
}
+ function getScheme(uri){
+ var ret = uri.match(/^[a-z0-9+.-]+(?=:)/);
+ if(!ret){
+ return;
+ }
+ return ret[0];
+ }
+
//promise returns the directory entry
function getDirectoryEntry(directoryName) {
var deferred = Q.defer();
@@ -196,6 +204,23 @@
});
}
+ function xhrGet(url){
+ var deferred = Q.defer();
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState === 4) {
+ if(xhr.status === 200) {
+ deferred.resolve(xhr);
+ } else {
+ deferred.reject("XHR return status: " + xhr.statusText);
+ }
+ }
+ };
+ xhr.open("GET", url, true);
+ xhr.send();
+ return deferred.promise;
+ }
+
return {
doesFileExist : function(fileName){
return initialiseFileSystem()
@@ -283,24 +308,37 @@
//returns a promise with the contents of the file
readFileContents : function(fileName) {
- return initialiseFileSystem()
- .then(function(){
- return getFile(fileName);
- })
- .then(function(file){
- var deferred = Q.defer();
-
- var reader = new $window.FileReader();
- reader.onload = function(evt) {
- var text = evt.target.result;
- deferred.resolve(text);
- };
- reader.onerror = function(evt) {
- deferred.reject(new Error(evt));
- };
- reader.readAsText(file);
-
- return deferred.promise;
+ return Q.fcall(function(){
+ var scheme = getScheme(fileName);
+ // assume file scheme by default
+ if(!scheme || scheme === "file") {
+ return initialiseFileSystem()
+ .then(function(){
+ return getFile(fileName);
+ })
+ .then(function(file){
+ var deferred = Q.defer();
+
+ var reader = new $window.FileReader();
+ reader.onload = function(evt) {
+ var text = evt.target.result;
+ deferred.resolve(text);
+ };
+ reader.onerror = function(evt) {
+ deferred.reject(new Error(evt));
+ };
+ reader.readAsText(file);
+
+ return deferred.promise;
+ });
+ } else if(scheme === "http" || scheme === "https") {
+ return xhrGet(fileName)
+ .then(function(xhr){
+ return xhr.responseText;
+ });
+ } else {
+ throw new Error("Cannot read file " + fileName);
+ }
});
},
@@ -321,7 +359,13 @@
writeFileContents : function(fileName, contents) {
return initialiseFileSystem()
.then(function(){
- return writeToFile(fileName, contents, false /* append */);
+ var scheme = getScheme(fileName);
+ // assume file scheme by default
+ if(!scheme || scheme === "file") {
+ return writeToFile(fileName, contents, false /* append */);
+ } else {
+ throw new Error("Cannot write to " + fileName);
+ }
});
},
@@ -383,20 +427,7 @@
},
xhrGet : function(url) {
- var deferred = Q.defer();
- var xhr = new XMLHttpRequest();
- xhr.onreadystatechange = function() {
- if (xhr.readyState === 4) {
- if(xhr.status === 200) {
- deferred.resolve(xhr);
- } else {
- deferred.reject("XHR return status: " + xhr.statusText);
- }
- }
- };
- xhr.open("GET", url, true);
- xhr.send();
- return deferred.promise;
+ return xhrGet(url);
}
};
}]);
http://git-wip-us.apache.org/repos/asf/cordova-app-harness/blob/636794a8/www/cdvah_views/add.html
----------------------------------------------------------------------
diff --git a/www/cdvah_views/add.html b/www/cdvah_views/add.html
index 902c46d..af318b8 100644
--- a/www/cdvah_views/add.html
+++ b/www/cdvah_views/add.html
@@ -6,12 +6,18 @@
<span ng-show="addForm.appName.$error.maxlength">Too long</span>
<br />
- <input type="radio" ng-model="appSource" name="appSource" value="pattern" ng-init="appPatternChecked=true; appSource='pattern'" ng-checked="appPatternChecked" />
+ <input type="radio" ng-model="appSource" name="appSource" value="pattern" ng-init="appSource='pattern'" ng-checked="appSource=='pattern'" />
<label for="inputAppPattern">Enter the URL to a file</label><br />
- <input id="inputAppPattern" type="text" name="appSourcePattern" ng-model="appSourcePattern" ng-disabled="!appPatternChecked" ng-required="appPatternChecked" />
+ <input id="inputAppPattern" type="text" name="appSourcePattern" ng-model="appSourcePattern" ng-disabled="appSource!='pattern'" ng-required="appSource=='pattern'" />
<span ng-show="addForm.appSourcePattern.$error.required">Required</span>
<br />
- <button ng-click="addApp(appName, appSource, appSourcePattern)" ng-disabled="!(addForm.$valid)">Add</button>
+ <input type="radio" ng-model="appSource" name="appSource" value="serve" ng-checked="appSource=='serve'" />
+ <label for="inputAppServe">Enter the URL to the server hosting the app</label><br />
+ <input id="inputAppServe" type="text" name="appSourceServe" ng-model="appSourceServe" ng-disabled="appSource!='serve'" ng-pattern="/.*\/config.xml(\?.*|#.*)?$/" ng-required="appSource=='serve'" />
+ <span ng-show="addForm.appSourceServe.$error.required">Required</span>
+ <span ng-show="addForm.appSourceServe.$error.pattern">Url must point to a config.xml file</span>
+ <br />
+ <button ng-click="addApp(appName, appSource, appSourcePattern, appSourceServe)" ng-disabled="!(addForm.$valid)">Add</button>
<br />
<a href="#/">Back To Main Menu</a>
</form>
\ No newline at end of file