|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 const Cc = Components.classes; |
|
6 const Ci = Components.interfaces; |
|
7 const Cu = Components.utils; |
|
8 |
|
9 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
10 Cu.import("resource://gre/modules/Services.jsm"); |
|
11 |
|
12 |
|
13 function dump(a) { |
|
14 Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).logStringMessage(a); |
|
15 } |
|
16 |
|
17 function openWindow(aParent, aURL, aTarget, aFeatures, aArgs) { |
|
18 let argsArray = Cc["@mozilla.org/supports-array;1"].createInstance(Ci.nsISupportsArray); |
|
19 let urlString = null; |
|
20 let pinnedBool = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool); |
|
21 let guestBool = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool); |
|
22 let widthInt = Cc["@mozilla.org/supports-PRInt32;1"].createInstance(Ci.nsISupportsPRInt32); |
|
23 let heightInt = Cc["@mozilla.org/supports-PRInt32;1"].createInstance(Ci.nsISupportsPRInt32); |
|
24 |
|
25 if ("url" in aArgs) { |
|
26 urlString = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString); |
|
27 urlString.data = aArgs.url; |
|
28 } |
|
29 widthInt.data = "width" in aArgs ? aArgs.width : 1; |
|
30 heightInt.data = "height" in aArgs ? aArgs.height : 1; |
|
31 pinnedBool.data = "pinned" in aArgs ? aArgs.pinned : false; |
|
32 guestBool.data = "guest" in aArgs ? aArgs["guest"] : false; |
|
33 |
|
34 argsArray.AppendElement(urlString, false); |
|
35 argsArray.AppendElement(widthInt, false); |
|
36 argsArray.AppendElement(heightInt, false); |
|
37 argsArray.AppendElement(pinnedBool, false); |
|
38 argsArray.AppendElement(guestBool, false); |
|
39 return Services.ww.openWindow(aParent, aURL, aTarget, aFeatures, argsArray); |
|
40 } |
|
41 |
|
42 |
|
43 function resolveURIInternal(aCmdLine, aArgument) { |
|
44 let uri = aCmdLine.resolveURI(aArgument); |
|
45 if (uri) |
|
46 return uri; |
|
47 |
|
48 try { |
|
49 let urifixup = Cc["@mozilla.org/docshell/urifixup;1"].getService(Ci.nsIURIFixup); |
|
50 uri = urifixup.createFixupURI(aArgument, 0); |
|
51 } catch (e) { |
|
52 Cu.reportError(e); |
|
53 } |
|
54 |
|
55 return uri; |
|
56 } |
|
57 |
|
58 function BrowserCLH() {} |
|
59 |
|
60 BrowserCLH.prototype = { |
|
61 handle: function fs_handle(aCmdLine) { |
|
62 let openURL = "about:home"; |
|
63 let pinned = false; |
|
64 let guest = false; |
|
65 |
|
66 let width = 1; |
|
67 let height = 1; |
|
68 |
|
69 try { |
|
70 openURL = aCmdLine.handleFlagWithParam("url", false); |
|
71 } catch (e) { /* Optional */ } |
|
72 try { |
|
73 pinned = aCmdLine.handleFlag("webapp", false); |
|
74 } catch (e) { /* Optional */ } |
|
75 try { |
|
76 guest = aCmdLine.handleFlag("guest", false); |
|
77 } catch (e) { /* Optional */ } |
|
78 |
|
79 try { |
|
80 width = aCmdLine.handleFlagWithParam("width", false); |
|
81 } catch (e) { /* Optional */ } |
|
82 try { |
|
83 height = aCmdLine.handleFlagWithParam("height", false); |
|
84 } catch (e) { /* Optional */ } |
|
85 |
|
86 try { |
|
87 let uri = resolveURIInternal(aCmdLine, openURL); |
|
88 if (!uri) |
|
89 return; |
|
90 |
|
91 // Let's get a head start on opening the network connection to the URI we are about to load |
|
92 Services.io.QueryInterface(Ci.nsISpeculativeConnect).speculativeConnect(uri, null); |
|
93 |
|
94 let browserWin = Services.wm.getMostRecentWindow("navigator:browser"); |
|
95 if (browserWin) { |
|
96 if (!pinned) { |
|
97 browserWin.browserDOMWindow.openURI(uri, null, Ci.nsIBrowserDOMWindow.OPEN_NEWTAB, Ci.nsIBrowserDOMWindow.OPEN_EXTERNAL); |
|
98 } |
|
99 } else { |
|
100 let args = { |
|
101 url: openURL, |
|
102 pinned: pinned, |
|
103 width: width, |
|
104 height: height, |
|
105 guest: guest |
|
106 }; |
|
107 |
|
108 // Make sure webapps do not have: locationbar, personalbar, menubar, statusbar, and toolbar |
|
109 let flags = "chrome,dialog=no"; |
|
110 if (!pinned) |
|
111 flags += ",all"; |
|
112 |
|
113 browserWin = openWindow(null, "chrome://browser/content/browser.xul", "_blank", flags, args); |
|
114 } |
|
115 |
|
116 aCmdLine.preventDefault = true; |
|
117 } catch (x) { |
|
118 dump("BrowserCLH.handle: " + x); |
|
119 } |
|
120 }, |
|
121 |
|
122 // QI |
|
123 QueryInterface: XPCOMUtils.generateQI([Ci.nsICommandLineHandler]), |
|
124 |
|
125 // XPCOMUtils factory |
|
126 classID: Components.ID("{be623d20-d305-11de-8a39-0800200c9a66}") |
|
127 }; |
|
128 |
|
129 var components = [ BrowserCLH ]; |
|
130 this.NSGetFactory = XPCOMUtils.generateNSGetFactory(components); |