rubinium 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +7 -0
- data/MIT-LICENSE +21 -0
- data/README +137 -0
- data/Rakefile +139 -0
- data/TODO +7 -0
- data/doc/examples/rtc_site_live.rb +12 -0
- data/doc/examples/rts_main.rb +9 -0
- data/doc/examples/rts_shared_code.rb +25 -0
- data/lib/rubinium.rb +9 -0
- data/lib/rubinium/string.rb +3 -0
- data/lib/rubinium/test_base.rb +80 -0
- data/lib/rubinium/test_suite.rb +53 -0
- data/lib/rubinium/validator.rb +16 -0
- data/test/selenium_tests/test_click.rb +22 -0
- data/test/selenium_tests/test_open.rb +11 -0
- data/test/tc_file_creation.rb +60 -0
- data/test/ts_rubinium.rb +1 -0
- data/vendor/selenium-0.6.0/install-readme.txt +9 -0
- data/vendor/selenium-0.6.0/selenium/SeleneseRunner.html +253 -0
- data/vendor/selenium-0.6.0/selenium/SeleniumLog.html +61 -0
- data/vendor/selenium-0.6.0/selenium/TestRunner-splash.html +55 -0
- data/vendor/selenium-0.6.0/selenium/TestRunner.hta +146 -0
- data/vendor/selenium-0.6.0/selenium/TestRunner.html +146 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestClickInFrame.html +58 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestOpenInFrame.html +48 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestOpenInNewWindow.html +78 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestOpenMeta.html +43 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestSuite.html +39 -0
- data/vendor/selenium-0.6.0/selenium/devtests/meta/page.html +5 -0
- data/vendor/selenium-0.6.0/selenium/dom-images/butmin.gif +0 -0
- data/vendor/selenium-0.6.0/selenium/dom-images/butplus.gif +0 -0
- data/vendor/selenium-0.6.0/selenium/dom-styles/default.css +298 -0
- data/vendor/selenium-0.6.0/selenium/domviewer.html +16 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/carnation.jpg +0 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/example.html +75 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/html-xpath-patched.js +657 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/html-xpath.js +610 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/license.txt +504 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/rainbow.jpg +0 -0
- data/vendor/selenium-0.6.0/selenium/htmlutils.js +283 -0
- data/vendor/selenium-0.6.0/selenium/index.html +60 -0
- data/vendor/selenium-0.6.0/selenium/jsmock/mock-tests.html +205 -0
- data/vendor/selenium-0.6.0/selenium/jsmock/mock.js +124 -0
- data/vendor/selenium-0.6.0/selenium/selenium-api.js +683 -0
- data/vendor/selenium-0.6.0/selenium/selenium-browserbot.js +930 -0
- data/vendor/selenium-0.6.0/selenium/selenium-commandhandlers.js +286 -0
- data/vendor/selenium-0.6.0/selenium/selenium-domviewer.js +188 -0
- data/vendor/selenium-0.6.0/selenium/selenium-executionloop.js +250 -0
- data/vendor/selenium-0.6.0/selenium/selenium-fitrunner.js +597 -0
- data/vendor/selenium-0.6.0/selenium/selenium-logging.js +88 -0
- data/vendor/selenium-0.6.0/selenium/selenium-logo.png +0 -0
- data/vendor/selenium-0.6.0/selenium/selenium-tableparser.js +50 -0
- data/vendor/selenium-0.6.0/selenium/selenium.css +211 -0
- data/vendor/selenium-0.6.0/selenium/tests/ErrorCheckingTestSuite.html +36 -0
- data/vendor/selenium-0.6.0/selenium/tests/GoogleTestSearch.html +69 -0
- data/vendor/selenium-0.6.0/selenium/tests/GoogleTestSuite.html +32 -0
- data/vendor/selenium-0.6.0/selenium/tests/JsUnitSuite.html +38 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestClick.html +128 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestClickJavascriptHref.html +115 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestCommandError.html +79 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestConfirmations.html +77 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestErrorChecking.html +71 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestFailingAssert.html +59 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestFailingVerifications.html +198 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestFocusOnBlur.html +53 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestGoBack.html +81 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestImplicitLocators.html +81 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestJavascriptParameters.html +91 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestLocators.html +161 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestModalDialog.html +58 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestModalDialogDialog.html +48 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestOpen.html +66 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestPatternMatching.html +127 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestPause.html +78 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestPrompting.html +82 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestProxy.html +62 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSelect.html +111 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSelectWindow.html +106 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestStore.html +165 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSuite-InternetExplorer.html +79 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSuite-Konqueror.html +75 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSuite-Safari.html +75 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSuite.html +75 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestType.html +79 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestUserExtensions.html +81 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifications.html +164 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyAlerts.html +80 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyAlertsFailures.html +108 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyConfirmationFailures.html +86 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyEditable.html +70 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyEditableFailures.html +95 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVisibility.html +91 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVisibilityFailures.html +131 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestWait.html +112 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestWaitFor.html +63 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestWaitInPopupWindow.html +94 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestXPathLocators.html +98 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/alert-handling-tests.html +79 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/assert-tests.html +113 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/browserbot-tests.html +123 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/command-factory-tests.html +290 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/command-handler-tests.html +115 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/confirm-handling-tests.html +97 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/error-checking-command-tests.html +198 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/event-bubble-tests.html +106 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/optionlocator-tests.html +180 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-accessor-tests.html +65 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-action-tests.html +200 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-attribute-tests.html +98 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-locator-tests-include.html +33 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-locator-tests.html +258 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-property-tests.html +49 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pattern-matcher-tests.html +66 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/selenium-api-tests.html +412 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/selenium-parameter-tests.html +98 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/suite.html +52 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/testloop-handle-error-tests.html +74 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestButtonEvents.html +72 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestCheckboxEvents.html +107 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestFireEvents.html +75 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestLinkEvents.html +43 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestRadioEvents.html +149 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestSelectEvents.html +122 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestTextEvents.html +87 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/readme.txt +26 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/banner.gif +0 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_async_event.html +36 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_click_javascript_page.html +34 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_click_page1.html +31 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_click_page2.html +30 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_confirm.html +34 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_dummy_page.html +26 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_editable.html +36 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_focus_on_blur.html +33 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_form_events.html +98 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_framed_page.html +7 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_just_text.html +22 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_locators.html +34 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_modal_dialog.html +29 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_modal_dialog_dialog.html +35 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_open.html +23 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_prompt.html +34 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_reload_onchange_page.html +32 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_select.html +35 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_select_window.html +29 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_select_window_popup.html +28 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_slowloading_page.html +27 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_store_value.html +23 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_type_page1.html +37 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_type_page2.html +61 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_verifications.html +42 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_verify_alert.html +46 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_visibility.html +53 -0
- data/vendor/selenium-0.6.0/selenium/tests/readme.txt +1 -0
- data/vendor/selenium-0.6.0/selenium/tests/tableparser/tableparser-tests.html +122 -0
- data/vendor/selenium-0.6.0/selenium/tests/tinyWebServer.py +70 -0
- data/vendor/selenium-0.6.0/selenium/user-extensions.js.sample +62 -0
- data/vendor/selenium-0.6.0/selenium/version.txt +1 -0
- data/vendor/selenium-0.6.0/selenium/xmlextras.js +153 -0
- data/vendor/selenium-0.6.0/selenium/xpath.js +3910 -0
- metadata +216 -0
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
/*
|
|
2
|
+
html-xpath, an implementation of DOM Level 3 XPath for Internet Explorer 5+
|
|
3
|
+
Copyright (C) 2004 Dimitri Glazkov
|
|
4
|
+
|
|
5
|
+
This library is free software; you can redistribute it and/or
|
|
6
|
+
modify it under the terms of the GNU Lesser General Public
|
|
7
|
+
License as published by the Free Software Foundation; either
|
|
8
|
+
version 2.1 of the License, or (at your option) any later version.
|
|
9
|
+
|
|
10
|
+
This library is distributed in the hope that it will be useful,
|
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
Lesser General Public License for more details.
|
|
14
|
+
|
|
15
|
+
You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
License along with this library; if not, write to the Free Software
|
|
17
|
+
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
var isIe = /MSIE [56789]/.test(navigator.userAgent) && (navigator.platform == "Win32");
|
|
21
|
+
|
|
22
|
+
// Mozilla has support by default, we don't have an implementation for the rest
|
|
23
|
+
if (isIe)
|
|
24
|
+
{
|
|
25
|
+
// release number
|
|
26
|
+
document.DomL3XPathRelease = "0.0.3.0";
|
|
27
|
+
|
|
28
|
+
// XPathException
|
|
29
|
+
// An Error object will be thrown, this is just a handler to instantiate that object
|
|
30
|
+
var XPathException = new _XPathExceptionHandler();
|
|
31
|
+
function _XPathExceptionHandler()
|
|
32
|
+
{
|
|
33
|
+
this.INVALID_EXPRESSION_ERR = 51;
|
|
34
|
+
this.TYPE_ERR = 52;
|
|
35
|
+
this.NOT_IMPLEMENTED_ERR = -1;
|
|
36
|
+
this.RUNTIME_ERR = -2;
|
|
37
|
+
|
|
38
|
+
this.ThrowNotImplemented = function(message)
|
|
39
|
+
{
|
|
40
|
+
ThrowError(this.NOT_IMPLEMENTED_ERR, "This functionality is not implemented.", message);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
this.ThrowInvalidExpression = function(message)
|
|
44
|
+
{
|
|
45
|
+
ThrowError(this.INVALID_EXPRESSION_ERR, "Invalid expression", message);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
this.ThrowType = function(message)
|
|
49
|
+
{
|
|
50
|
+
ThrowError(this.TYPE_ERR, "Type error", message);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
this.Throw = function(message)
|
|
54
|
+
{
|
|
55
|
+
ThrowError(this.RUNTIME_ERR, "Run-time error", message);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function ThrowError(code, description, message)
|
|
59
|
+
{
|
|
60
|
+
var error = new Error(code, "DOM-L3-XPath " + document.DomL3XPathRelease + ": " + description + (message ? ", \"" + message + "\"": ""));
|
|
61
|
+
error.code = code;
|
|
62
|
+
error.name = "XPathException";
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// DOMException
|
|
68
|
+
// An Error object will be thrown, this is just a handler to instantiate that object
|
|
69
|
+
var DOMException = new _DOMExceptionHandler();
|
|
70
|
+
function _DOMExceptionHandler()
|
|
71
|
+
{
|
|
72
|
+
this.ThrowInvalidState = function(message)
|
|
73
|
+
{
|
|
74
|
+
ThrowError(13, "The state of the object is no longer valid", message);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function ThrowError(code, description, message)
|
|
78
|
+
{
|
|
79
|
+
var error = new Error(code, "DOM : " + description + (message ? ", \"" + message + "\"": ""));
|
|
80
|
+
error.code = code;
|
|
81
|
+
error.name = "DOMException";
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// XPathEvaluator
|
|
87
|
+
// implemented as document object methods
|
|
88
|
+
|
|
89
|
+
// XPathExpression createExpression(String expression, XPathNSResolver resolver)
|
|
90
|
+
document.createExpression = function
|
|
91
|
+
(
|
|
92
|
+
expression, // String
|
|
93
|
+
resolver // XPathNSResolver
|
|
94
|
+
)
|
|
95
|
+
{
|
|
96
|
+
// returns XPathExpression object
|
|
97
|
+
return new XPathExpression(expression, resolver);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// XPathNSResolver createNSResolver(nodeResolver)
|
|
101
|
+
document.createNSResolver = function
|
|
102
|
+
(
|
|
103
|
+
nodeResolver // Node
|
|
104
|
+
)
|
|
105
|
+
{
|
|
106
|
+
// returns XPathNSResolver
|
|
107
|
+
return new XPathNSResolver(nodeResolver);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// XPathResult evaluate(String expresison, Node contextNode, XPathNSResolver resolver, Number type, XPathResult result)
|
|
111
|
+
document.evaluate = function
|
|
112
|
+
(
|
|
113
|
+
expression, // String
|
|
114
|
+
contextNode, // Node
|
|
115
|
+
resolver, // XPathNSResolver
|
|
116
|
+
type, // Number
|
|
117
|
+
result // XPathResult
|
|
118
|
+
)
|
|
119
|
+
// can raise XPathException, DOMException
|
|
120
|
+
{
|
|
121
|
+
// return XPathResult
|
|
122
|
+
return document.createExpression(expression, resolver).evaluate(contextNode, type, result);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// XPathExpression
|
|
126
|
+
function XPathExpression
|
|
127
|
+
(
|
|
128
|
+
expression, // String
|
|
129
|
+
resolver // XPathNSResolver
|
|
130
|
+
)
|
|
131
|
+
{
|
|
132
|
+
this.expressionString = expression;
|
|
133
|
+
this.resolver = resolver;
|
|
134
|
+
|
|
135
|
+
// XPathResult evaluate(Node contextNode, Number type, XPathResult result)
|
|
136
|
+
this.evaluate = function
|
|
137
|
+
(
|
|
138
|
+
contextNode, // Node
|
|
139
|
+
type, // Number
|
|
140
|
+
result // XPathResult
|
|
141
|
+
)
|
|
142
|
+
// raises XPathException, DOMException
|
|
143
|
+
{
|
|
144
|
+
// return XPathResult
|
|
145
|
+
return (result && result.constructor == XPathResult ? result.initialize(this, contextNode, resolver, type) : new XPathResult(this, contextNode, resolver, type));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
this.toString = function()
|
|
149
|
+
{
|
|
150
|
+
return "[XPathExpression]";
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// XPathNSResolver
|
|
155
|
+
function XPathNSResolver(node)
|
|
156
|
+
{
|
|
157
|
+
this.node = node;
|
|
158
|
+
|
|
159
|
+
// String lookupNamespaceURI(String prefix)
|
|
160
|
+
this.lookupNamespaceURI = function
|
|
161
|
+
(
|
|
162
|
+
prefix // String
|
|
163
|
+
)
|
|
164
|
+
{
|
|
165
|
+
XPathException.ThrowNotImplemented();
|
|
166
|
+
// return String
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
this.toString = function()
|
|
171
|
+
{
|
|
172
|
+
return "[XPathNSResolver]";
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// XPathResult
|
|
177
|
+
XPathResult.ANY_TYPE = 0;
|
|
178
|
+
XPathResult.NUMBER_TYPE = 1;
|
|
179
|
+
XPathResult.STRING_TYPE = 2;
|
|
180
|
+
XPathResult.BOOLEAN_TYPE = 3;
|
|
181
|
+
XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
|
|
182
|
+
XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
|
|
183
|
+
XPathResult.UNORDERED_SNAPSHOT_TYPE = 6;
|
|
184
|
+
XPathResult.ORDERED_SNAPSHOT_TYPE = 7;
|
|
185
|
+
XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
|
|
186
|
+
XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
|
|
187
|
+
|
|
188
|
+
function XPathResult
|
|
189
|
+
(
|
|
190
|
+
expression, // XPathExpression
|
|
191
|
+
contextNode, // Node
|
|
192
|
+
resolver, // XPathNSResolver
|
|
193
|
+
type // Number
|
|
194
|
+
)
|
|
195
|
+
{
|
|
196
|
+
this.initialize = function(expression, contextNode, resolver, type)
|
|
197
|
+
{
|
|
198
|
+
this._domResult = null;
|
|
199
|
+
this._expression = expression;
|
|
200
|
+
this._contextNode = contextNode;
|
|
201
|
+
this._resolver = resolver;
|
|
202
|
+
if (type)
|
|
203
|
+
{
|
|
204
|
+
this.resultType = type;
|
|
205
|
+
this._isIterator = (type == XPathResult.UNORDERED_NODE_ITERATOR_TYPE ||
|
|
206
|
+
type == XPathResult.ORDERED_NODE_ITERATOR_TYPE ||
|
|
207
|
+
type == XPathResult.ANY_TYPE);
|
|
208
|
+
this._isSnapshot = (type == XPathResult.UNORDERED_SNAPSHOT_TYPE || type == XPathResult.ORDERED_SNAPSHOT_TYPE);
|
|
209
|
+
this._isNodeSet = type > XPathResult.BOOLEAN_TYPE;
|
|
210
|
+
}
|
|
211
|
+
else
|
|
212
|
+
{
|
|
213
|
+
this.resultType = XPathResult.ANY_TYPE;
|
|
214
|
+
this._isIterator = true;
|
|
215
|
+
this._isSnapshot = false;
|
|
216
|
+
this._isNodeSet = true;
|
|
217
|
+
}
|
|
218
|
+
return this;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
this.initialize(expression, contextNode, resolver, type);
|
|
222
|
+
|
|
223
|
+
this.getInvalidIteratorState = function()
|
|
224
|
+
{
|
|
225
|
+
return documentChangeDetected() || !this._isIterator;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
this.getSnapshotLength = function()
|
|
229
|
+
// raises XPathException
|
|
230
|
+
{
|
|
231
|
+
if (!this._isSnapshot)
|
|
232
|
+
{
|
|
233
|
+
XPathException.ThrowType("Snapshot is not an expected result type");
|
|
234
|
+
}
|
|
235
|
+
activateResult(this);
|
|
236
|
+
// return Number
|
|
237
|
+
return this._domResult.length;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Node iterateNext()
|
|
241
|
+
this.iterateNext = function()
|
|
242
|
+
// raises XPathException, DOMException
|
|
243
|
+
{
|
|
244
|
+
if (!this._isIterator)
|
|
245
|
+
{
|
|
246
|
+
XPathException.ThrowType("Iterator is not an expected result type");
|
|
247
|
+
}
|
|
248
|
+
activateResult(this);
|
|
249
|
+
if (documentChangeDetected())
|
|
250
|
+
{
|
|
251
|
+
DOMException.ThrowInvalidState("iterateNext");
|
|
252
|
+
}
|
|
253
|
+
// return Node
|
|
254
|
+
return getNextNode(this);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Node snapshotItem(Number index)
|
|
258
|
+
this.snapshotItem = function(index)
|
|
259
|
+
// raises XPathException
|
|
260
|
+
{
|
|
261
|
+
if (!this._isSnapshot)
|
|
262
|
+
{
|
|
263
|
+
XPathException.ThrowType("Snapshot is not an expected result type");
|
|
264
|
+
}
|
|
265
|
+
// return Node
|
|
266
|
+
return getItemNode(this, index);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
this.toString = function()
|
|
270
|
+
{
|
|
271
|
+
return "[XPathResult]";
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// returns string value of the result, if result type is STRING_TYPE
|
|
275
|
+
// otherwise throws an XPathException
|
|
276
|
+
this.getStringValue = function()
|
|
277
|
+
{
|
|
278
|
+
if (this.resultType != XPathResult.STRING_TYPE)
|
|
279
|
+
{
|
|
280
|
+
XPathException.ThrowType("The expression can not be converted to return String");
|
|
281
|
+
}
|
|
282
|
+
return getNodeText(this);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// returns number value of the result, if the result is NUMBER_TYPE
|
|
286
|
+
// otherwise throws an XPathException
|
|
287
|
+
this.getNumberValue = function()
|
|
288
|
+
{
|
|
289
|
+
if (this.resultType != XPathResult.NUMBER_TYPE)
|
|
290
|
+
{
|
|
291
|
+
XPathException.ThrowType("The expression can not be converted to return Number");
|
|
292
|
+
}
|
|
293
|
+
var number = parseInt(getNodeText(this));
|
|
294
|
+
if (isNaN(number))
|
|
295
|
+
{
|
|
296
|
+
XPathException.ThrowType("The result can not be converted to Number");
|
|
297
|
+
}
|
|
298
|
+
return number;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// returns boolean value of the result, if the result is BOOLEAN_TYPE
|
|
302
|
+
// otherwise throws an XPathException
|
|
303
|
+
this.getBooleanValue = function()
|
|
304
|
+
{
|
|
305
|
+
if (this.resultType != XPathResult.BOOLEAN_TYPE)
|
|
306
|
+
{
|
|
307
|
+
XPathException.ThrowType("The expression can not be converted to return Boolean");
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
var
|
|
311
|
+
text = getNodeText(this);
|
|
312
|
+
bool = (text ? text.toLowerCase() : null);
|
|
313
|
+
if (bool == "false" || bool == "true")
|
|
314
|
+
{
|
|
315
|
+
return bool;
|
|
316
|
+
}
|
|
317
|
+
XPathException.ThrowType("The result can not be converted to Boolean");
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// returns single node, if the result is ANY_UNORDERED_NODE_TYPE or FIRST_ORDERED_NODE_TYPE
|
|
321
|
+
// otherwise throws an XPathException
|
|
322
|
+
this.getSingleNodeValue = function()
|
|
323
|
+
{
|
|
324
|
+
if (this.resultType != XPathResult.ANY_UNORDERED_NODE_TYPE &&
|
|
325
|
+
this.resultType != XPathResult.FIRST_ORDERED_NODE_TYPE)
|
|
326
|
+
{
|
|
327
|
+
XPathException.ThrowType("The expression can not be converted to return single Node value");
|
|
328
|
+
}
|
|
329
|
+
return getSingleNode(this);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function documentChangeDetected()
|
|
333
|
+
{
|
|
334
|
+
return document._XPathMsxmlDocumentHelper.documentChangeDetected();
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function getNodeText(result)
|
|
338
|
+
{
|
|
339
|
+
activateResult(result);
|
|
340
|
+
return result._textResult;
|
|
341
|
+
// return ((node = getSingleNode(result)) ? (node.nodeType == 1 ? node.innerText : node.nodeValue) : null);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function findNode(result, current)
|
|
345
|
+
{
|
|
346
|
+
switch(current.nodeType)
|
|
347
|
+
{
|
|
348
|
+
case 1: // NODE_ELEMENT
|
|
349
|
+
var id = current.attributes.getNamedItem("id");
|
|
350
|
+
if (id)
|
|
351
|
+
{
|
|
352
|
+
return document.getElementById(id.value);
|
|
353
|
+
}
|
|
354
|
+
XPathException.Throw("unable to locate element in XML tree");
|
|
355
|
+
case 2: // NODE_ATTRIBUTE
|
|
356
|
+
var id = current.selectSingleNode("..").attributes.getNamedItem("id");
|
|
357
|
+
if (id)
|
|
358
|
+
{
|
|
359
|
+
var node = document.getElementById(id.text);
|
|
360
|
+
if (node)
|
|
361
|
+
{
|
|
362
|
+
return node.attributes.getNamedItem(current.nodeName);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
XPathException.Throw("unable to locate attribute in XML tree");
|
|
366
|
+
case 3: // NODE_TEXT
|
|
367
|
+
var id = current.selectSingleNode("..").attributes.getNamedItem("id");
|
|
368
|
+
if (id)
|
|
369
|
+
{
|
|
370
|
+
var node = document.getElementById(id.value);
|
|
371
|
+
if (node)
|
|
372
|
+
{
|
|
373
|
+
for(child in node.childNodes)
|
|
374
|
+
{
|
|
375
|
+
if (child.nodeType == 3 && child.nodeValue == current.nodeValue)
|
|
376
|
+
{
|
|
377
|
+
return child;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
XPathException.Throw("unable to locate text in XML tree");
|
|
383
|
+
}
|
|
384
|
+
XPathException.Throw("unknown node type");
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function activateResult(result)
|
|
388
|
+
{
|
|
389
|
+
if (!result._domResult)
|
|
390
|
+
{
|
|
391
|
+
try
|
|
392
|
+
{
|
|
393
|
+
var expression = result._expression.expressionString;
|
|
394
|
+
|
|
395
|
+
// adjust expression if contextNode is not a document
|
|
396
|
+
if (result._contextNode != document && expression.indexOf("//") != 0)
|
|
397
|
+
{
|
|
398
|
+
|
|
399
|
+
expression = "//*[@id = '" + result._contextNode.id + "']" +
|
|
400
|
+
(expression.indexOf("/") == 0 ? "" : "/") + expression;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (result._isNodeSet)
|
|
404
|
+
{
|
|
405
|
+
result._domResult = document._XPathMsxmlDocumentHelper.getDom().selectNodes(expression);
|
|
406
|
+
}
|
|
407
|
+
else
|
|
408
|
+
{
|
|
409
|
+
result._domResult = true;
|
|
410
|
+
result._textResult = document._XPathMsxmlDocumentHelper.getTextResult(expression);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
}
|
|
414
|
+
catch(error)
|
|
415
|
+
{
|
|
416
|
+
alert(error.description);
|
|
417
|
+
XPathException.ThrowInvalidExpression(error.description);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
function getSingleNode(result)
|
|
423
|
+
{
|
|
424
|
+
var node = getItemNode(result, 0);
|
|
425
|
+
result._domResult = null;
|
|
426
|
+
return node;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
function getItemNode(result, index)
|
|
430
|
+
{
|
|
431
|
+
activateResult(result);
|
|
432
|
+
var current = result._domResult.item(index);
|
|
433
|
+
return (current ? findNode(result, current) : null);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function getNextNode(result)
|
|
437
|
+
{
|
|
438
|
+
var current = result._domResult.nextNode;
|
|
439
|
+
if (current)
|
|
440
|
+
{
|
|
441
|
+
return findNode(result, current);
|
|
442
|
+
}
|
|
443
|
+
result._domResult = null;
|
|
444
|
+
return null;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
document.reloadDom = function()
|
|
449
|
+
{
|
|
450
|
+
document._XPathMsxmlDocumentHelper.reset();
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
document._XPathMsxmlDocumentHelper = new _XPathMsxmlDocumentHelper();
|
|
454
|
+
function _XPathMsxmlDocumentHelper()
|
|
455
|
+
{
|
|
456
|
+
this.getDom = function()
|
|
457
|
+
{
|
|
458
|
+
activateDom(this);
|
|
459
|
+
return this.dom;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
this.getXml = function()
|
|
463
|
+
{
|
|
464
|
+
activateDom(this);
|
|
465
|
+
return this.dom.xml;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
this.getTextResult = function(expression)
|
|
469
|
+
{
|
|
470
|
+
expression = expression.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, "\"");
|
|
471
|
+
var xslText = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +
|
|
472
|
+
"<xsl:output method=\"text\"/><xsl:template match=\"*\"><xsl:value-of select=\"" + expression + "\"/>" +
|
|
473
|
+
"</xsl:template></xsl:stylesheet>";
|
|
474
|
+
var xsl = new ActiveXObject("Msxml2.DOMDocument");
|
|
475
|
+
xsl.loadXML(xslText);
|
|
476
|
+
try
|
|
477
|
+
{
|
|
478
|
+
var result = this.getDom().transformNode(xsl);
|
|
479
|
+
}
|
|
480
|
+
catch(error)
|
|
481
|
+
{
|
|
482
|
+
alert("Error: " + error.description);
|
|
483
|
+
}
|
|
484
|
+
return result;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
this.reset = function()
|
|
488
|
+
{
|
|
489
|
+
this.dom = null;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
function onPropertyChangeEventHandler()
|
|
493
|
+
{
|
|
494
|
+
document._propertyChangeDetected = true;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
this.documentChangeDetected = function()
|
|
498
|
+
{
|
|
499
|
+
return (document.ignoreDocumentChanges ? false : this._currentElementCount != document.all.length || document._propertyChangeDetected);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function activateDom(helper)
|
|
503
|
+
{
|
|
504
|
+
if (!helper.dom)
|
|
505
|
+
{
|
|
506
|
+
var dom = new ActiveXObject("Msxml2.DOMDocument");
|
|
507
|
+
dom.async = false;
|
|
508
|
+
dom.resolveExternals = false;
|
|
509
|
+
loadDocument(dom, helper);
|
|
510
|
+
helper.dom = dom;
|
|
511
|
+
helper._currentElementCount = document.all.length;
|
|
512
|
+
document._propertyChangeDetected = false;
|
|
513
|
+
}
|
|
514
|
+
else
|
|
515
|
+
{
|
|
516
|
+
if (helper.documentChangeDetected())
|
|
517
|
+
{
|
|
518
|
+
var dom = helper.dom;
|
|
519
|
+
dom.load("");
|
|
520
|
+
loadDocument(dom, helper);
|
|
521
|
+
helper._currentElementCount = document.all.length;
|
|
522
|
+
document._propertyChangeDetected = false;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
function loadDocument(dom, helper)
|
|
528
|
+
{
|
|
529
|
+
return loadNode(dom, dom, document.body, helper);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
function loadNode(dom, domParentNode, node, helper)
|
|
533
|
+
{
|
|
534
|
+
if (node.nodeType == 3)
|
|
535
|
+
{
|
|
536
|
+
domParentNode.appendChild(dom.createTextNode(node.nodeValue));
|
|
537
|
+
}
|
|
538
|
+
else
|
|
539
|
+
{
|
|
540
|
+
var domNode = dom.createElement(node.nodeName.toLowerCase());
|
|
541
|
+
if (!node.id)
|
|
542
|
+
{
|
|
543
|
+
node.id = node.uniqueID;
|
|
544
|
+
}
|
|
545
|
+
domParentNode.appendChild(domNode);
|
|
546
|
+
loadAttributes(dom, domNode, node);
|
|
547
|
+
var length = node.childNodes.length;
|
|
548
|
+
for(var i = 0; i < length; i ++ )
|
|
549
|
+
{
|
|
550
|
+
loadNode(dom, domNode, node.childNodes[i], helper);
|
|
551
|
+
}
|
|
552
|
+
node.attachEvent("onpropertychange", onPropertyChangeEventHandler);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
function loadAttributes(dom, domParentNode, node)
|
|
557
|
+
{
|
|
558
|
+
for (var i = 0; i < node.attributes.length; i ++ )
|
|
559
|
+
{
|
|
560
|
+
var attribute = node.attributes[i];
|
|
561
|
+
var attributeValue = attribute.nodeValue;
|
|
562
|
+
if (attributeValue && attribute.specified)
|
|
563
|
+
{
|
|
564
|
+
var domAttribute = dom.createAttribute(attribute.nodeName);
|
|
565
|
+
domAttribute.value = attributeValue;
|
|
566
|
+
domParentNode.setAttributeNode(domAttribute);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
else
|
|
574
|
+
{
|
|
575
|
+
document.reloadDom = function() {}
|
|
576
|
+
XPathResult.prototype.getStringValue = function()
|
|
577
|
+
{
|
|
578
|
+
return this.stringValue;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
XPathResult.prototype.getNumberValue = function()
|
|
582
|
+
{
|
|
583
|
+
return this.numberValue;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
XPathResult.prototype.getBooleanValue = function()
|
|
587
|
+
{
|
|
588
|
+
return this.booleanValue;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
XPathResult.prototype.getSingleNodeValue = function()
|
|
592
|
+
{
|
|
593
|
+
return this.singleNodeValue;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
XPathResult.prototype.getInvalidIteratorState = function()
|
|
597
|
+
{
|
|
598
|
+
return this.invalidIteratorState;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
XPathResult.prototype.getSnapshotLength = function()
|
|
602
|
+
{
|
|
603
|
+
return this.snapshotLength;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
XPathResult.prototype.getResultType = function()
|
|
607
|
+
{
|
|
608
|
+
return this.resultType;
|
|
609
|
+
}
|
|
610
|
+
}
|