2013-09-05 06:15:37 -07:00
|
|
|
/* 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/. */
|
|
|
|
|
|
|
|
const Cu = Components.utils;
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
|
|
Cu.import("resource:///modules/devtools/gDevTools.jsm");
|
|
|
|
|
|
|
|
const {devtools} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
|
|
|
|
const {require} = devtools;
|
|
|
|
|
|
|
|
const {ConnectionManager, Connection} = require("devtools/client/connection-manager");
|
|
|
|
const {getDeviceFront} = require("devtools/server/actors/device");
|
2013-09-16 22:30:00 -07:00
|
|
|
const {getTargetForApp} = require("devtools/app-actor-front");
|
2013-09-05 06:15:37 -07:00
|
|
|
const DeviceStore = require("devtools/app-manager/device-store");
|
|
|
|
const WebappsStore = require("devtools/app-manager/webapps-store");
|
|
|
|
const promise = require("sdk/core/promise");
|
|
|
|
|
|
|
|
window.addEventListener("message", function(event) {
|
|
|
|
try {
|
|
|
|
let message = JSON.parse(event.data);
|
|
|
|
if (message.name == "connection") {
|
|
|
|
let cid = parseInt(message.cid);
|
|
|
|
for (let c of ConnectionManager.connections) {
|
|
|
|
if (c.uid == cid) {
|
|
|
|
UI.connection = c;
|
|
|
|
UI.onNewConnection();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch(e) {
|
|
|
|
Cu.reportError(e);
|
|
|
|
}
|
|
|
|
}, false);
|
|
|
|
|
|
|
|
let UI = {
|
|
|
|
init: function() {
|
|
|
|
this.showFooterIfNeeded();
|
|
|
|
this._onConnectionStatusChange = this._onConnectionStatusChange.bind(this);
|
|
|
|
this.setTab("apps");
|
|
|
|
if (this.connection) {
|
|
|
|
this.onNewConnection();
|
|
|
|
} else {
|
|
|
|
this.hide();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
showFooterIfNeeded: function() {
|
|
|
|
let footer = document.querySelector("#connection-footer");
|
|
|
|
if (window.parent == window) {
|
|
|
|
// We're alone. Let's add a footer.
|
|
|
|
footer.removeAttribute("hidden");
|
|
|
|
footer.src = "chrome://browser/content/devtools/app-manager/connection-footer.xhtml";
|
|
|
|
} else {
|
|
|
|
footer.setAttribute("hidden", "true");
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
hide: function() {
|
|
|
|
document.body.classList.add("notconnected");
|
|
|
|
},
|
|
|
|
|
|
|
|
show: function() {
|
|
|
|
document.body.classList.remove("notconnected");
|
|
|
|
},
|
|
|
|
|
|
|
|
onNewConnection: function() {
|
|
|
|
this.connection.on(Connection.Events.STATUS_CHANGED, this._onConnectionStatusChange);
|
|
|
|
|
|
|
|
this.store = Utils.mergeStores({
|
|
|
|
"device": new DeviceStore(this.connection),
|
|
|
|
"apps": new WebappsStore(this.connection),
|
|
|
|
});
|
|
|
|
|
|
|
|
this.template = new Template(document.body, this.store, Utils.l10n);
|
|
|
|
|
|
|
|
this.template.start();
|
|
|
|
this._onConnectionStatusChange();
|
|
|
|
},
|
|
|
|
|
|
|
|
setWallpaper: function(dataurl) {
|
|
|
|
document.getElementById("meta").style.backgroundImage = "url(" + dataurl + ")";
|
|
|
|
},
|
|
|
|
|
|
|
|
_onConnectionStatusChange: function() {
|
|
|
|
if (this.connection.status != Connection.Status.CONNECTED) {
|
|
|
|
this.hide();
|
|
|
|
this.listTabsResponse = null;
|
|
|
|
} else {
|
|
|
|
this.show();
|
|
|
|
this.connection.client.listTabs(
|
|
|
|
response => {
|
|
|
|
this.listTabsResponse = response;
|
|
|
|
let front = getDeviceFront(this.connection.client, this.listTabsResponse);
|
|
|
|
front.getWallpaper().then(longstr => {
|
|
|
|
longstr.string().then(dataURL => {
|
|
|
|
longstr.release().then(null, Cu.reportError);
|
|
|
|
this.setWallpaper(dataURL);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
setTab: function(name) {
|
|
|
|
var tab = document.querySelector(".tab.selected");
|
|
|
|
var panel = document.querySelector(".tabpanel.selected");
|
|
|
|
|
|
|
|
if (tab) tab.classList.remove("selected");
|
|
|
|
if (panel) panel.classList.remove("selected");
|
|
|
|
|
|
|
|
var tab = document.querySelector(".tab." + name);
|
|
|
|
var panel = document.querySelector(".tabpanel." + name);
|
|
|
|
|
|
|
|
if (tab) tab.classList.add("selected");
|
|
|
|
if (panel) panel.classList.add("selected");
|
|
|
|
},
|
|
|
|
|
|
|
|
screenshot: function() {
|
|
|
|
if (!this.listTabsResponse)
|
|
|
|
return;
|
|
|
|
|
|
|
|
let front = getDeviceFront(this.connection.client, this.listTabsResponse);
|
|
|
|
front.screenshotToBlob().then(blob => {
|
|
|
|
let topWindow = Services.wm.getMostRecentWindow("navigator:browser");
|
|
|
|
let gBrowser = topWindow.gBrowser;
|
|
|
|
let url = topWindow.URL.createObjectURL(blob);
|
|
|
|
let tab = gBrowser.selectedTab = gBrowser.addTab(url);
|
|
|
|
tab.addEventListener("TabClose", function onTabClose() {
|
|
|
|
tab.removeEventListener("TabClose", onTabClose, false);
|
|
|
|
topWindow.URL.revokeObjectURL(url);
|
|
|
|
}, false);
|
|
|
|
}).then(null, console.error);
|
|
|
|
},
|
|
|
|
|
|
|
|
openToolbox: function(manifest) {
|
2013-09-16 22:30:00 -07:00
|
|
|
if (!this.listTabsResponse)
|
|
|
|
return;
|
|
|
|
getTargetForApp(this.connection.client,
|
|
|
|
this.listTabsResponse.webappsActor,
|
|
|
|
manifest).then((target) => {
|
2013-09-10 10:57:48 -07:00
|
|
|
gDevTools.showToolbox(target,
|
|
|
|
null,
|
|
|
|
devtools.Toolbox.HostType.WINDOW).then(toolbox => {
|
|
|
|
this.connection.once(Connection.Events.DISCONNECTED, () => {
|
|
|
|
toolbox.destroy();
|
|
|
|
});
|
|
|
|
});
|
2013-09-05 06:15:37 -07:00
|
|
|
}, console.error);
|
|
|
|
},
|
|
|
|
|
|
|
|
startApp: function(manifest) {
|
|
|
|
let deferred = promise.defer();
|
|
|
|
|
|
|
|
if (!this.listTabsResponse) {
|
|
|
|
deferred.reject();
|
|
|
|
} else {
|
|
|
|
let actor = this.listTabsResponse.webappsActor;
|
|
|
|
let request = {
|
|
|
|
to: actor,
|
|
|
|
type: "launch",
|
|
|
|
manifestURL: manifest,
|
|
|
|
}
|
|
|
|
this.connection.client.request(request, (res) => {
|
|
|
|
deferred.resolve()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return deferred.promise;
|
|
|
|
},
|
|
|
|
|
|
|
|
stopApp: function(manifest) {
|
|
|
|
let deferred = promise.defer();
|
|
|
|
|
|
|
|
if (!this.listTabsResponse) {
|
|
|
|
deferred.reject();
|
|
|
|
} else {
|
|
|
|
let actor = this.listTabsResponse.webappsActor;
|
|
|
|
let request = {
|
|
|
|
to: actor,
|
|
|
|
type: "close",
|
|
|
|
manifestURL: manifest,
|
|
|
|
}
|
|
|
|
this.connection.client.request(request, (res) => {
|
|
|
|
deferred.resolve()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return deferred.promise;
|
|
|
|
},
|
|
|
|
}
|