Skip to content

Commit a11eed9

Browse files
Dominator008jimevans
authored andcommitted
Update Wicked Good XPath to ce916fcfaf97247e3b8ec6cada64a6f6687175b4
This updates Wicked Good XPath to the 1.3.0 release. Notable changes include: 1. Fixed a bug in IE8 compatibility introduced by the 1.2 release. 2. Fixed a check for node.style so that it won't mutate the DOM on IE < 9. 3. The library now performs wgxpath.install on Document.prototype if available. This allows document.evaluate to also work on XMLDocument. Fixes #1907. Signed-off-by: Jim Evans <[email protected]>
1 parent 745e7c4 commit a11eed9

File tree

3 files changed

+41
-38
lines changed

3 files changed

+41
-38
lines changed

third_party/js/wgxpath/nameTest.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,10 @@ wgxpath.NameTest.prototype.matches = function(node) {
100100
type != goog.dom.NodeType.ATTRIBUTE) {
101101
return false;
102102
}
103+
// TODO(moz): Investigate if node.localName is necessary.
104+
var localName = goog.isDef(node.localName) ? node.localName : node.nodeName;
103105
if (this.name_ != wgxpath.NameTest.WILDCARD &&
104-
this.name_ != node.localName.toLowerCase()) {
106+
this.name_ != localName.toLowerCase()) {
105107
return false;
106108
} else {
107109
if (this.namespaceUri_ == wgxpath.NameTest.WILDCARD) {

third_party/js/wgxpath/step.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,9 +360,11 @@ wgxpath.Step.Axis = {
360360
var nodeset = new wgxpath.NodeSet();
361361
var testName = test.getName();
362362
// IE8 doesn't allow access to the style attribute using getNamedItem.
363-
// It returns an object with nodeValue = null.
364-
if (testName == 'style' && node.style &&
365-
wgxpath.userAgent.IE_DOC_PRE_9) {
363+
// It returns an object with nodeValue = null. Even worse, ".style" on
364+
// IE8 can mutate the DOM, adding an empty string attribute. Therefore
365+
// we check it last.
366+
if (testName == 'style' &&
367+
wgxpath.userAgent.IE_DOC_PRE_9 && node.style) {
366368
nodeset.add(wgxpath.IEAttrWrapper.forStyleOf(
367369
/** @type {!Node} */ (node), node.sourceIndex));
368370
return nodeset;

third_party/js/wgxpath/wgxpath.js

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,9 @@ goog.require('wgxpath.nsResolver');
4848
/**
4949
* Enum for XPathResult types.
5050
*
51-
* @private
5251
* @enum {number}
5352
*/
54-
wgxpath.XPathResultType_ = {
53+
wgxpath.XPathResultType = {
5554
ANY_TYPE: 0,
5655
NUMBER_TYPE: 1,
5756
STRING_TYPE: 2,
@@ -115,44 +114,44 @@ wgxpath.XPathExpression_ = function(expr, nsResolver) {
115114
* @private
116115
*/
117116
wgxpath.XPathResult_ = function(value, type) {
118-
if (type == wgxpath.XPathResultType_.ANY_TYPE) {
117+
if (type == wgxpath.XPathResultType.ANY_TYPE) {
119118
if (value instanceof wgxpath.NodeSet) {
120-
type = wgxpath.XPathResultType_.UNORDERED_NODE_ITERATOR_TYPE;
119+
type = wgxpath.XPathResultType.UNORDERED_NODE_ITERATOR_TYPE;
121120
} else if (typeof value == 'string') {
122-
type = wgxpath.XPathResultType_.STRING_TYPE;
121+
type = wgxpath.XPathResultType.STRING_TYPE;
123122
} else if (typeof value == 'number') {
124-
type = wgxpath.XPathResultType_.NUMBER_TYPE;
123+
type = wgxpath.XPathResultType.NUMBER_TYPE;
125124
} else if (typeof value == 'boolean') {
126-
type = wgxpath.XPathResultType_.BOOLEAN_TYPE;
125+
type = wgxpath.XPathResultType.BOOLEAN_TYPE;
127126
} else {
128127
throw Error('Unexpected evaluation result.');
129128
}
130129
}
131-
if (type != wgxpath.XPathResultType_.STRING_TYPE &&
132-
type != wgxpath.XPathResultType_.NUMBER_TYPE &&
133-
type != wgxpath.XPathResultType_.BOOLEAN_TYPE &&
130+
if (type != wgxpath.XPathResultType.STRING_TYPE &&
131+
type != wgxpath.XPathResultType.NUMBER_TYPE &&
132+
type != wgxpath.XPathResultType.BOOLEAN_TYPE &&
134133
!(value instanceof wgxpath.NodeSet)) {
135134
throw Error('value could not be converted to the specified type');
136135
}
137136
this['resultType'] = type;
138137
var nodes;
139138
switch (type) {
140-
case wgxpath.XPathResultType_.STRING_TYPE:
139+
case wgxpath.XPathResultType.STRING_TYPE:
141140
this['stringValue'] = (value instanceof wgxpath.NodeSet) ?
142141
value.string() : '' + value;
143142
break;
144-
case wgxpath.XPathResultType_.NUMBER_TYPE:
143+
case wgxpath.XPathResultType.NUMBER_TYPE:
145144
this['numberValue'] = (value instanceof wgxpath.NodeSet) ?
146145
value.number() : +value;
147146
break;
148-
case wgxpath.XPathResultType_.BOOLEAN_TYPE:
147+
case wgxpath.XPathResultType.BOOLEAN_TYPE:
149148
this['booleanValue'] = (value instanceof wgxpath.NodeSet) ?
150149
value.getLength() > 0 : !!value;
151150
break;
152-
case wgxpath.XPathResultType_.UNORDERED_NODE_ITERATOR_TYPE:
153-
case wgxpath.XPathResultType_.ORDERED_NODE_ITERATOR_TYPE:
154-
case wgxpath.XPathResultType_.UNORDERED_NODE_SNAPSHOT_TYPE:
155-
case wgxpath.XPathResultType_.ORDERED_NODE_SNAPSHOT_TYPE:
151+
case wgxpath.XPathResultType.UNORDERED_NODE_ITERATOR_TYPE:
152+
case wgxpath.XPathResultType.ORDERED_NODE_ITERATOR_TYPE:
153+
case wgxpath.XPathResultType.UNORDERED_NODE_SNAPSHOT_TYPE:
154+
case wgxpath.XPathResultType.ORDERED_NODE_SNAPSHOT_TYPE:
156155
var iter = value.iterator();
157156
nodes = [];
158157
for (var node = iter.next(); node; node = iter.next()) {
@@ -162,8 +161,8 @@ wgxpath.XPathResult_ = function(value, type) {
162161
this['snapshotLength'] = value.getLength();
163162
this['invalidIteratorState'] = false;
164163
break;
165-
case wgxpath.XPathResultType_.ANY_UNORDERED_NODE_TYPE:
166-
case wgxpath.XPathResultType_.FIRST_ORDERED_NODE_TYPE:
164+
case wgxpath.XPathResultType.ANY_UNORDERED_NODE_TYPE:
165+
case wgxpath.XPathResultType.FIRST_ORDERED_NODE_TYPE:
167166
var firstNode = value.getFirst();
168167
this['singleNodeValue'] =
169168
firstNode instanceof wgxpath.IEAttrWrapper ?
@@ -174,36 +173,36 @@ wgxpath.XPathResult_ = function(value, type) {
174173
}
175174
var index = 0;
176175
this['iterateNext'] = function() {
177-
if (type != wgxpath.XPathResultType_.UNORDERED_NODE_ITERATOR_TYPE &&
178-
type != wgxpath.XPathResultType_.ORDERED_NODE_ITERATOR_TYPE) {
176+
if (type != wgxpath.XPathResultType.UNORDERED_NODE_ITERATOR_TYPE &&
177+
type != wgxpath.XPathResultType.ORDERED_NODE_ITERATOR_TYPE) {
179178
throw Error('iterateNext called with wrong result type');
180179
}
181180
return (index >= nodes.length) ? null : nodes[index++];
182181
};
183182
this['snapshotItem'] = function(i) {
184-
if (type != wgxpath.XPathResultType_.UNORDERED_NODE_SNAPSHOT_TYPE &&
185-
type != wgxpath.XPathResultType_.ORDERED_NODE_SNAPSHOT_TYPE) {
183+
if (type != wgxpath.XPathResultType.UNORDERED_NODE_SNAPSHOT_TYPE &&
184+
type != wgxpath.XPathResultType.ORDERED_NODE_SNAPSHOT_TYPE) {
186185
throw Error('snapshotItem called with wrong result type');
187186
}
188187
return (i >= nodes.length || i < 0) ? null : nodes[i];
189188
};
190189
};
191-
wgxpath.XPathResult_['ANY_TYPE'] = wgxpath.XPathResultType_.ANY_TYPE;
192-
wgxpath.XPathResult_['NUMBER_TYPE'] = wgxpath.XPathResultType_.NUMBER_TYPE;
193-
wgxpath.XPathResult_['STRING_TYPE'] = wgxpath.XPathResultType_.STRING_TYPE;
194-
wgxpath.XPathResult_['BOOLEAN_TYPE'] = wgxpath.XPathResultType_.BOOLEAN_TYPE;
190+
wgxpath.XPathResult_['ANY_TYPE'] = wgxpath.XPathResultType.ANY_TYPE;
191+
wgxpath.XPathResult_['NUMBER_TYPE'] = wgxpath.XPathResultType.NUMBER_TYPE;
192+
wgxpath.XPathResult_['STRING_TYPE'] = wgxpath.XPathResultType.STRING_TYPE;
193+
wgxpath.XPathResult_['BOOLEAN_TYPE'] = wgxpath.XPathResultType.BOOLEAN_TYPE;
195194
wgxpath.XPathResult_['UNORDERED_NODE_ITERATOR_TYPE'] =
196-
wgxpath.XPathResultType_.UNORDERED_NODE_ITERATOR_TYPE;
195+
wgxpath.XPathResultType.UNORDERED_NODE_ITERATOR_TYPE;
197196
wgxpath.XPathResult_['ORDERED_NODE_ITERATOR_TYPE'] =
198-
wgxpath.XPathResultType_.ORDERED_NODE_ITERATOR_TYPE;
197+
wgxpath.XPathResultType.ORDERED_NODE_ITERATOR_TYPE;
199198
wgxpath.XPathResult_['UNORDERED_NODE_SNAPSHOT_TYPE'] =
200-
wgxpath.XPathResultType_.UNORDERED_NODE_SNAPSHOT_TYPE;
199+
wgxpath.XPathResultType.UNORDERED_NODE_SNAPSHOT_TYPE;
201200
wgxpath.XPathResult_['ORDERED_NODE_SNAPSHOT_TYPE'] =
202-
wgxpath.XPathResultType_.ORDERED_NODE_SNAPSHOT_TYPE;
201+
wgxpath.XPathResultType.ORDERED_NODE_SNAPSHOT_TYPE;
203202
wgxpath.XPathResult_['ANY_UNORDERED_NODE_TYPE'] =
204-
wgxpath.XPathResultType_.ANY_UNORDERED_NODE_TYPE;
203+
wgxpath.XPathResultType.ANY_UNORDERED_NODE_TYPE;
205204
wgxpath.XPathResult_['FIRST_ORDERED_NODE_TYPE'] =
206-
wgxpath.XPathResultType_.FIRST_ORDERED_NODE_TYPE;
205+
wgxpath.XPathResultType.FIRST_ORDERED_NODE_TYPE;
207206

208207

209208

@@ -230,7 +229,7 @@ wgxpath.XPathNSResolver_ = function(node) {
230229
*/
231230
wgxpath.install = function(opt_win, opt_force) {
232231
var win = opt_win || goog.global;
233-
var doc = win.document;
232+
var doc = (win.Document && win.Document.prototype) || win.document;
234233

235234
// Unless opt_force is true, installation is a noop if native XPath is
236235
// available.

0 commit comments

Comments
 (0)