summaryrefslogtreecommitdiffabout
path: root/src/chrome/content/xrdsHandler.js
Unidiff
Diffstat (limited to 'src/chrome/content/xrdsHandler.js') (more/less context) (ignore whitespace changes)
-rwxr-xr-xsrc/chrome/content/xrdsHandler.js258
1 files changed, 258 insertions, 0 deletions
diff --git a/src/chrome/content/xrdsHandler.js b/src/chrome/content/xrdsHandler.js
new file mode 100755
index 0000000..d4b0d35
--- a/dev/null
+++ b/src/chrome/content/xrdsHandler.js
@@ -0,0 +1,258 @@
1
2const nsISupports = Components.interfaces.nsISupports;
3const nsIChannel = Components.interfaces.nsIChannel;
4const nsIContentHandler = Components.interfaces.nsIContentHandler;
5const nsIDOMWindow = Components.interfaces.nsIDOMWindow;
6const nsIInterfaceRequestor = Components.interfaces.nsIInterfaceRequestor;
7const nsIStreamListener = Components.interfaces.nsIStreamListener;
8const nsIRequestObserver = Components.interfaces.nsIRequestObserver;
9const nsIURILoader = Components.interfaces.nsIURILoader;
10const nsIURIContentListener = Components.interfaces.nsIURIContentListener;
11
12
13
14
15var g_xrdsHandler = null;
16
17
18
19
20
21
22XrdsContentHandler.prototype = {
23
24 /** browser window */
25 contentWindow: null,
26
27 /** XRDS buffer */
28 buf: null,
29
30 scriptableInStream: null,
31
32 init: function(contentWin) {
33 dump("XrdsContentHandler.init()\n");
34 this.contentWindow = contentWin;
35
36 var uriLoader = Components.classes["@mozilla.org/uriloader;1"]
37 .getService(Components.interfaces.nsIURILoader);
38 uriLoader.registerContentListener(this);
39 dump("XrdsContentHandler.init() returning\n");
40 },
41
42 close: function() {
43 this.contentWindow = null;
44 var uriLoader = Components.classes["@mozilla.org/uriloader;1"]
45 .getService(Components.interfaces.nsIURILoader);
46 uriLoader.unRegisterContentListener(g_xrdsHandler);
47 },
48
49 /* nsISupports */
50 QueryInterface : function(iid) {
51 dump("xrdsCH ... ");
52 if (iid.equals(nsISupports)) {
53 dump("QI(nsISupports)\n");
54 }
55 else if (iid.equals(nsIContentHandler)) {
56 dump("QI(nsIContentHandler)\n");
57 }
58 else if (iid.equals(nsIStreamListener)) {
59 dump("QI(nsIStreamListener)\n");
60 }
61 else if (iid.equals(nsIRequestObserver)) {
62 dump("QI(nsIRequestObserver)\n");
63 }
64 else if (iid.equals(Components.interfaces.nsIURIContentListener)) {
65 dump("QI(nsIURIContentListener)\n");
66 }
67 else if (iid.equals(nsIFactory)) {
68 dump("QI(nsIFactory)\n");
69 }
70 else {
71 dump("QI(" + iid + ") - IDONTKNOW!!!!!\n");
72 }
73
74 if (!iid.equals(nsISupports) &&
75// !iid.equals(nsIContentHandler) &&
76 !iid.equals(nsIURIContentListener) &&
77 !iid.equals(nsIStreamListener) &&
78// !iid.equals(nsIRequestObserver) &&
79 !iid.equals(nsIFactory))
80 throw Components.results.NS_ERROR_NO_INTERFACE;
81
82 dump("QI returning this..\n");
83 return this;
84 },
85
86
87 /* nsIURIContentListener */
88 loadCookie: null,
89
90 parentContentListener: null,
91
92 onStartURIOpen: function(uri)
93 {
94 dump("xrdsCH onStartURIOpen '" + uri + "'");
95 // ignore and don't abort
96 return false;
97 },
98
99 doContent: function(contentType, isContentPreferred, request, contentHandler)
100 {
101 dump("doContent called\n");
102 // forward the doContent to our content area webshell
103 var docShell = this.contentWindow.docShell;
104 var contentListener;
105 try {
106 contentListener =
107 docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
108 .getInterface(Components.interfaces.nsIURIContentListener);
109 } catch (ex) {
110 dump(ex);
111 }
112
113 dump("no content listener from docShell!\n");
114 if (!contentListener) return false;
115
116 var rv = contentListener.doContent(contentType, isContentPreferred, request, contentHandler);
117
118 if (rv) {
119 dump("docShell wants to handle the load..\n");
120 }
121 else {
122 dump("docShell does NOT want to handle the load..\n");
123
124 contentHandler = contentHandler.value;
125 }
126
127 return rv;
128
129 },
130
131 isPreferred: function(contentType, desiredContentType)
132 {
133 dump("isPreferred '" + contentType + "'\n");
134 switch(contentType) {
135 case "application/xrds+xml":
136 case "application/xrd+xml":
137 dump("yes!!!\n");
138 return true;
139 }
140 dump("erm.. nope!\n");
141 return false;
142 },
143
144 canHandleContent: function(contentType, isContentPreferred, desiredContentType)
145 {
146 dump("canHandleContent '" + contentType + "'\n");
147 return this.isPreferred(contentType, desiredContentType);
148 },
149
150
151
152 /* nsIRequestObserver */
153 onStartRequest: function(request, ctx)
154 {
155 dump("xrdsContentHandler - onStartRequest\n");
156 },
157
158 onStopRequest: function(request, ctx, status)
159 {
160 dump("xrdsContentHandler - onStopRequest\n");
161 this.scriptableInStream.close();
162 },
163
164
165 /* nsIStreamListener */
166 onDataAvailable: function(request, domWindow, inputStream, offset, count)
167 {
168 dump("onDataAvailable, offset=" + offset + ", count=" + count + "\n");
169 if (offset == 0) {
170 this.scriptableInStream.init(inputStream);
171 }
172
173 buf += this.scriptableInStream.read(count);
174
175 if (!request.isPending()) {
176 dump("request finished, buf = " + buf + "\n");
177 var html = domWindow.document.createElement("html");
178 html.createTextNode(buf);
179 this.scriptableInStream = null;
180 }
181 else {
182 dump("request pending...\n");
183 }
184 },
185
186 /* nsIContentHandler */
187
188 handleContent : function(contentType, context, request)
189 {
190 dump("handleContent " + contentType + "\n");
191 var parentWin;
192 try {
193 parentWin = context.getInterface(nsIDOMWindow);
194 }
195 catch (e) {
196 alert("no parent!!!"); // XXX
197 return;
198 }
199
200 dump("getting channel\n");
201 var channel = request.QueryInterface(nsIChannel);
202 if (!channel) {
203 dump("no channel!!!\n");
204 return;
205 }
206
207 if (this.scriptableInStream) {
208 dump("Hey! You can't possibly be reusing this handler?!\n");
209 return;
210 }
211
212 dump("making scriptableInStream\n");
213 this.scriptableInStream = Components.classes["@mozilla.org/scriptableinputstream;1"]
214 .createInstance(Components.interfaces.nsIScriptableInputStream);
215
216 buf = '';
217
218 }
219
220};
221
222
223function XrdsContentHandler(contentWindow)
224{
225 this.init(contentWindow);
226}
227
228
229
230
231
232
233
234
235
236
237
238
239
240function foxri_startup() {
241 // our XRDS content-handler also does nsIURIContentListener
242 var xrdsHandler = new XrdsContentHandler(getBrowser());
243 g_xrdsHandler = xrdsHandler;
244
245}
246
247
248function foxri_shutdown() {
249 if (!g_xrdsHandler)
250 return;
251
252 g_xrdsHandler.close();
253}
254
255
256
257
258foxri_startup();