1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/devtools/apps/tests/unit/head_apps.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,122 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +const Cc = Components.classes; 1.8 +const Ci = Components.interfaces; 1.9 +const Cu = Components.utils; 1.10 +const Cr = Components.results; 1.11 +const CC = Components.Constructor; 1.12 + 1.13 +Cu.import("resource://gre/modules/devtools/dbg-server.jsm"); 1.14 +Cu.import("resource://gre/modules/devtools/dbg-client.jsm"); 1.15 + 1.16 +Cu.import("resource://gre/modules/Services.jsm"); 1.17 +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 1.18 +Cu.import("resource://gre/modules/FileUtils.jsm"); 1.19 + 1.20 +let gClient, gActor; 1.21 + 1.22 +function connect(onDone) { 1.23 + // Initialize a loopback remote protocol connection 1.24 + DebuggerServer.init(function () { return true; }); 1.25 + // We need to register browser actors to have `listTabs` working 1.26 + // and also have a root actor 1.27 + DebuggerServer.addBrowserActors(); 1.28 + 1.29 + // Setup client and actor used in all tests 1.30 + gClient = new DebuggerClient(DebuggerServer.connectPipe()); 1.31 + gClient.connect(function onConnect() { 1.32 + gClient.listTabs(function onListTabs(aResponse) { 1.33 + gActor = aResponse.webappsActor; 1.34 + onDone(); 1.35 + }); 1.36 + }); 1.37 +} 1.38 + 1.39 +function webappActorRequest(request, onResponse) { 1.40 + if (!gActor) { 1.41 + connect(webappActorRequest.bind(null, request, onResponse)); 1.42 + return; 1.43 + } 1.44 + 1.45 + request.to = gActor; 1.46 + gClient.request(request, onResponse); 1.47 +} 1.48 + 1.49 +// Install a test packaged webapp from data folder 1.50 +function installTestApp(zipName, appId, onDone) { 1.51 + // Copy our package to tmp folder, where the actor retrieves it 1.52 + let zip = do_get_file("data/" + zipName); 1.53 + let appDir = FileUtils.getDir("TmpD", ["b2g", appId], true, true); 1.54 + zip.copyTo(appDir, "application.zip"); 1.55 + 1.56 + let request = {type: "install", appId: appId}; 1.57 + webappActorRequest(request, function (aResponse) { 1.58 + do_check_eq(aResponse.appId, appId); 1.59 + if ("error" in aResponse) { 1.60 + do_throw("Error: " + aResponse.error); 1.61 + } 1.62 + if ("message" in aResponse) { 1.63 + do_throw("Error message: " + aResponse.message); 1.64 + } 1.65 + do_check_false("error" in aResponse); 1.66 + 1.67 + onDone(); 1.68 + }); 1.69 +}; 1.70 + 1.71 +function setup() { 1.72 + // We have to setup a profile, otherwise indexed db used by webapps 1.73 + // will throw random exception when trying to get profile folder 1.74 + do_get_profile(); 1.75 + 1.76 + // The webapps dir isn't registered on b2g xpcshell tests, 1.77 + // we have to manually set it to the directory service. 1.78 + do_get_webappsdir(); 1.79 + 1.80 + // We also need a valid nsIXulAppInfo service as Webapps.jsm is querying it 1.81 + Components.utils.import("resource://testing-common/AppInfo.jsm"); 1.82 + updateAppInfo(); 1.83 + 1.84 + // We have to toggle this flag in order to have apps being listed in getAll 1.85 + // as only launchable apps are returned 1.86 + Components.utils.import('resource://gre/modules/Webapps.jsm'); 1.87 + DOMApplicationRegistry.allAppsLaunchable = true; 1.88 +} 1.89 + 1.90 +function do_get_webappsdir() { 1.91 + var webappsDir = Services.dirsvc.get("ProfD", Ci.nsILocalFile); 1.92 + webappsDir.append("test_webapps"); 1.93 + if (!webappsDir.exists()) 1.94 + webappsDir.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt("755", 8)); 1.95 + 1.96 + var coreAppsDir = Services.dirsvc.get("ProfD", Ci.nsILocalFile); 1.97 + coreAppsDir.append("test_coreapps"); 1.98 + if (!coreAppsDir.exists()) 1.99 + coreAppsDir.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt("755", 8)); 1.100 + 1.101 + // Register our own provider for the profile directory. 1.102 + // It will return our special docshell profile directory. 1.103 + var provider = { 1.104 + getFile: function(prop, persistent) { 1.105 + persistent.value = true; 1.106 + if (prop == "webappsDir") { 1.107 + return webappsDir.clone(); 1.108 + } 1.109 + else if (prop == "coreAppsDir") { 1.110 + return coreAppsDir.clone(); 1.111 + } 1.112 + throw Cr.NS_ERROR_FAILURE; 1.113 + }, 1.114 + QueryInterface: function(iid) { 1.115 + if (iid.equals(Ci.nsIDirectoryServiceProvider) || 1.116 + iid.equals(Ci.nsISupports)) { 1.117 + return this; 1.118 + } 1.119 + throw Cr.NS_ERROR_NO_INTERFACE; 1.120 + } 1.121 + }; 1.122 + Services.dirsvc.QueryInterface(Ci.nsIDirectoryService).registerProvider(provider); 1.123 +} 1.124 + 1.125 +