source: chrome/content/v_identity/vI_htmlTextBox.xml @ 8e5aff

multiEditng_0.6ng_0.6_helpng_0.8ng_0.9
Last change on this file since 8e5aff was 8e5aff, checked in by rene <rene@…>, 11 years ago

final help-test implementation

  • Property mode set to 100644
File size: 10.7 KB
Line 
1<?xml version="1.0"?>
2<!-- ***** BEGIN LICENSE BLOCK *****
3   - This program is free software; you can redistribute it and/or modify
4   - it under the terms of the GNU General Public License as published by
5   - the Free Software Foundation; either version 2 of the License, or
6   - (at your option) any later version.
7
8   - This program is distributed in the hope that it will be useful,
9   - but WITHOUT ANY WARRANTY; without even the implied warranty of
10   - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11   - GNU General Public License for more details.
12
13   - You should have received a copy of the GNU General Public License
14   - along with this program; if not, write to the Free Software
15   - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
16
17   - The Original Code is the Virtual Identity Extension.
18
19   - The Initial Developer of the Original Code is Rene Ejury.
20   - Portions created by the Initial Developer are Copyright (C) 2007
21   - the Initial Developer. All Rights Reserved.
22
23   - Contributor(s):
24   - ***** END LICENSE BLOCK ***** -->
25
26<bindings id="vI_htmlTextBoxBindings"
27          xmlns="http://www.mozilla.org/xbl"
28          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
29          xmlns:xbl="http://www.mozilla.org/xbl">
30   
31    <binding id="vI_browserBox" extends="chrome://global/content/bindings/browser.xml#browser">
32    <implementation>
33    <field name="_cssRead">false</field>
34    <property name="cssSource" >
35        <setter><![CDATA[
36        if (!val) return;
37        dump("cssSource set to " + val + "\n");
38        var head = this.contentDocument.getElementsByTagName("HEAD").item(0);
39        var range = document.createRange();
40        range.selectNode(head);
41        var css_text = this._getContents("chrome://v_identity/skin/" + val);
42        dump("cssSource set to " + val + " cont.\n");
43        var documentFragment = range.createContextualFragment("<style type='text/css'>" + css_text + "</style>");
44        head.appendChild(documentFragment);
45        dump("cssSource set to " + val + " done\n");
46        this._cssRead = true;
47        ]]></setter>
48    </property>
49    <property name="htmlSource" >
50        <setter><![CDATA[
51        if (!val) return;
52        dump("htmlSource set to " + val + "\n");
53        var body = this.contentDocument.getElementsByTagName("BODY").item(0);
54       
55        var range = document.createRange();
56        range.selectNode(body);
57        var html_text = this._getContents("chrome://v_identity/content/doc/" + val);
58        dump("htmlSource set to " + val + " cont.\n");
59        var documentFragment = range.createContextualFragment(html_text);
60        body.appendChild(documentFragment);
61        for (var i = 0; i < body.children.length; i++)
62            if (!body.children[i].id || body.children[i].id != "main") body.removeChild(body.children[i--]);
63        dump("htmlSource set to " + val + " done\n");
64        ]]></setter>
65    </property>
66    <method name="_getContents">
67        <parameter name="aURL" />
68        <body><![CDATA[     
69        // read the chrome file (copied from http://forums.mozillazine.org/viewtopic.php?p=921150)
70        var ioService=Components.classes["@mozilla.org/network/io-service;1"]
71            .getService(Components.interfaces.nsIIOService);
72        var scriptableStream=Components
73            .classes["@mozilla.org/scriptableinputstream;1"]
74            .getService(Components.interfaces.nsIScriptableInputStream);
75       
76        var channel=ioService.newChannel(aURL,null,null);
77        var input=channel.open();
78        scriptableStream.init(input);
79        var str=scriptableStream.read(input.available());
80        scriptableStream.close();
81        input.close();
82        return str;
83        ]]></body>
84    </method>
85    </implementation>
86    </binding>
87
88    <binding id="vI_remoteBrowserBox">
89    <content>
90        <xul:vbox flex="1" >
91            <xul:vbox class="vI_remoteBrowserBoxProgressmeter" flex="1" >
92                <xul:progressmeter mode="undetermined" />
93                <xul:spacer flex="1" />
94            </xul:vbox>
95            <xul:browser xbl:inherits="src=url" class="vI_browserBox" hidden="true" flex="1" disablehistory="true" />
96            <xul:button xbl:inherits="tooltiptext=url" label="Open in Browser"
97                    oncommand="vI_prefDialog.openURL(this.tooltipText)" />
98        </xul:vbox>
99    </content>
100    <resources>
101            <stylesheet src="chrome://v_identity/skin/v_identity.css"/>
102    </resources>
103    <implementation>
104    <destructor><![CDATA[
105        // clean up the listener but you may not have one if you never showed
106        // the page with a <remotecontent> element
107        if (this._remoteProgressListener) this._content.webProgress.removeProgressListener(this._remoteProgressListener);
108    ]]></destructor>
109    <field name="_init">null</field>
110    <method name="init">
111    <body><![CDATA[
112        if (this._init) return;
113       
114        // just to be safe, turn off js, auth, plugins, and subframes
115        var docShell = this._content.docShell;
116        docShell.allowJavascript = false;
117        docShell.allowAuth = false;
118        docShell.allowPlugins = false;
119        //allow redirects
120        //docShell.allowMetaRedirects = false;
121        docShell.allowSubframes = false;
122        //allow images
123        //docShell.allowImages = false;
124       
125        this._init = true;
126    ]]></body>
127    </method>
128    <field name="_remoteProgressListener">null</field>
129    <property name="url">
130        <getter><![CDATA[
131        return this.getAttribute("url");
132        ]]></getter>
133        <setter><![CDATA[
134        this.init();
135        if (this._remoteProgressListener)
136            this._content.webProgress.removeProgressListener(this._remoteProgressListener);
137        var self = this;
138
139        this._remoteProgressListener = {
140            QueryInterface: function(aIID) {
141                if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
142                    aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
143                    aIID.equals(Components.interfaces.nsISupports))
144                    return this;
145                throw Components.results.NS_NOINTERFACE;
146            },
147            onLocationChange: function() {},
148            onProgressChange: function() {},
149            onStatusChange:   function() {},
150            onSecurityChange: function() {},
151            onStateChange:    function(aWebProgress, aRequest, aStateFlags, aStatus) {
152                if (!aRequest)
153                    return;
154
155                const nsIWebProgressListener =
156                    Components.interfaces.nsIWebProgressListener;
157           
158                if (aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK)
159                {
160                    if (aStateFlags & nsIWebProgressListener.STATE_START) self.onStart();
161                    else if (aStateFlags & nsIWebProgressListener.STATE_STOP) {
162                        const nsIHttpChannel = Components.interfaces.nsIHttpChannel;
163                        try {
164                            var channel = aRequest.QueryInterface(nsIHttpChannel);
165                            if (channel.requestSucceeded) {
166                                // if we get here, the load was OK, report success
167                                self.onLoad();
168                                return;
169                            }
170                        } catch (ex) {
171                            // the channel.requestSucceeded can throw
172                            // NS_ERROR_NOT_AVAILABLE if you can't reach the server
173                            // so we treat that as an error
174                        }
175                        // everything else (like a 404) is an error
176                        self.onError();
177                    }
178                }
179            }
180        }
181        this._content.webProgress.addProgressListener(this._remoteProgressListener,Components.interfaces.nsIWebProgress.NOTIFY_ALL);
182        // load the url now that the listener is registered
183        this.setAttribute("url", val);
184        ]]></setter>
185    </property>
186    <field name="_content">
187        document.getAnonymousElementByAttribute(this, "class", "vI_browserBox");
188    </field>
189    <field name="_progress">
190        document.getAnonymousElementByAttribute(this, "class", "vI_remoteBrowserBoxProgressmeter");
191    </field>
192    <property name="localCss" onget="return this.getAttribute('localCss');" onset="this.setAttribute('localCss', val); return val;" />
193    <method name="onError">
194    <body><![CDATA[
195        alert("error");
196    ]]></body>
197    </method>
198    <method name="onLoad">
199        <body><![CDATA[
200        this._content.cssSource = this.localCss;
201        this._progress.setAttribute("hidden", "true");
202        this._content.removeAttribute("hidden");
203    ]]></body>
204    </method>
205    <method name="onStart">
206    <body><![CDATA[
207        this._content.setAttribute("hidden", "true");
208        this._progress.removeAttribute("hidden");
209    ]]></body>
210    </method>
211    </implementation>
212    </binding>
213
214
215    <binding id="vI_htmlTextBox" extends="chrome://v_identity/content/vI_htmlTextBox.xml#BrowserBox">
216    <implementation>
217    <constructor>
218        <![CDATA[       
219        dump('******* vI_htmlTextBox.xml constructor\n');
220        ]]>
221    </constructor>
222    <property name="outputString" >
223        <setter><![CDATA[
224        if (!this._cssRead) this.cssSource = this.getAttribute('cssSource');    // read initial Attributes
225        this.contentDocument.lastChild.setAttribute("style", this.getAttribute('documentStyle'));
226       
227        var oldChilds = this.contentDocument.body.childNodes;
228        while (oldChilds.length > 0) this.contentDocument.body.removeChild(oldChilds[0])
229
230        var text_list = val.split(/\n/)
231        for (var i = 0; i < text_list.length; i++) {
232            if (this._isHR(text_list[i])) continue;
233            var text_item = this._checkList(text_list[i]);
234            this._add(text_item);
235            if (!this._currentList && (i + 1) < text_list.length) {
236                var new_br = this.contentDocument
237                    .createElementNS("http://www.w3.org/1999/xhtml", 'html:br');
238                this.contentDocument.body.appendChild(new_br);
239            }
240        }
241        ]]></setter>
242    </property>
243    <field name="_currentList">null</field>
244    <field name="_currentBaseNode">null</field>
245    <method name="_isHR">
246        <parameter name="text" />
247        <body><![CDATA[     
248        if (text == "---") {
249            var new_hr = this.contentDocument
250                .createElementNS("http://www.w3.org/1999/xhtml", 'html:hr');
251            this.contentDocument.body.appendChild(new_hr);
252            return true;
253        }
254        return false;
255        ]]></body>
256    </method>
257    <method name="_checkList">
258        <parameter name="text" />
259        <body><![CDATA[
260        if (text.match(/^\*\s/)) {
261            if (!this._currentList) {
262                this._currentList = this.contentDocument
263                    .createElementNS("http://www.w3.org/1999/xhtml", 'html:ul');
264                this.contentDocument.body.appendChild(this._currentList);
265            }
266            this._currentBaseNode = this.contentDocument
267                                .createElementNS("http://www.w3.org/1999/xhtml", 'html:li');
268            this._currentList.appendChild(this._currentBaseNode);
269        }
270        else {
271            this._currentList = null;
272            this._currentBaseNode = this.contentDocument.body;
273        }
274        return text.replace(/^\*\s/,"")
275        ]]></body>
276    </method>
277    <method name="_add">
278        <parameter name="text" />
279        <body><![CDATA[
280        if (text.match(/http[s]?:\/\/\S+/)) {
281            if (RegExp.leftContext) this._addText(RegExp.leftContext)
282            if (RegExp.lastMatch) this._addLink(RegExp.lastMatch)
283            if (RegExp.rightContext) this._add(RegExp.rightContext)
284        }
285        else this._addText(text);
286        ]]></body>
287    </method>
288    <method name="_addText">
289        <parameter name="text" />
290        <body><![CDATA[     
291        var range = document.createRange();
292        range.selectNode(this._currentBaseNode);
293        var documentFragment = range.createContextualFragment(text);
294        this._currentBaseNode.appendChild(documentFragment);
295        ]]></body>
296    </method>
297    <method name="_addLink">
298        <parameter name="text" />
299        <body><![CDATA[     
300        var new_a = this.contentDocument
301            .createElementNS("http://www.w3.org/1999/xhtml", 'html:a');
302        new_a.setAttribute("href", text)
303        new_a.setAttribute("style", "text-decoration: underline")
304        this._currentBaseNode.appendChild(new_a);
305        var new_text = this.contentDocument.createTextNode(text);
306        new_a.appendChild(new_text);
307        ]]></body>
308    </method>
309    </implementation>
310    </binding>
311
312</bindings>
Note: See TracBrowser for help on using the repository browser.