WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
26005
Optimization for XPath //* does not preserve context size
https://bugs.webkit.org/show_bug.cgi?id=26005
Summary
Optimization for XPath //* does not preserve context size
Alexey Proskuryakov
Reported
2009-05-25 00:33:46 PDT
//* is an abbreviated form for /descendant-or-self::node()/child::*. When applying predicates to the last step, the context should contain all children elements of a given node, so e.g. //*[2] locates all second children elements in document. We wrongfully optimize this to /descendant:node()/self::*, so the context for predicates always contains a single element.
Attachments
test case
(4.14 KB, text/html)
2009-05-25 00:37 PDT
,
Alexey Proskuryakov
no flags
Details
test case showing before and after dom append
(590 bytes, text/html)
2009-05-27 06:01 PDT
,
Phred
no flags
Details
proposed fix
(29.73 KB, patch)
2009-05-28 03:05 PDT
,
Alexey Proskuryakov
darin
: review+
Details
Formatted Diff
Diff
Show Obsolete
(1)
View All
Add attachment
proposed patch, testcase, etc.
Alexey Proskuryakov
Comment 1
2009-05-25 00:37:14 PDT
Created
attachment 30645
[details]
test case
Phred
Comment 2
2009-05-27 06:01:25 PDT
Created
attachment 30705
[details]
test case showing before and after dom append As best I can discern the spec
http://www.w3.org/TR/xpath#path-abbrev
: "//para selects all the para descendants of the document root and thus selects all para elements in the same document as the context node" There exist no parent document for the context node in the original URL, thus there should be no answer (null). Firefox 2 returned null and Opera currently returns null in this case. However once it is appended to the document, the answer refers to the root element as it should. The bug here is that you are executing from the current document root regardless of whether the context node exist in the document or not.
Phred
Comment 3
2009-05-27 06:08:55 PDT
The previous comment was actually meant for
Bug 25931
.
Alexey Proskuryakov
Comment 4
2009-05-28 03:05:11 PDT
Created
attachment 30733
[details]
proposed fix
Darin Adler
Comment 5
2009-05-28 09:04:54 PDT
Comment on
attachment 30733
[details]
proposed fix
> + * Copyright (C) 2005 Frerich Raabe <
raabe@kde.org
> > + * Copyright (C) 2006, 2009 Apple, Inc.
No comma in Apple Inc.
> + switch (axis) { > + case Step::AttributeAxis: > + return Node::ATTRIBUTE_NODE; > + case Step::NamespaceAxis: > + return Node::XPATH_NAMESPACE_NODE; > + default: > + return Node::ELEMENT_NODE; > + }
I like to leave out the "default" case so that gcc can warn me about unhandled enum values. This is practical when the cases end with return statements, since the default return statement can go outside the switch, perhaps with an ASSERT_NOT_REACHED().
> + // In XPath land, namespace nodes are not accessible on the attribute axis. > + if (node->namespaceURI() == "
http://www.w3.org/2000/xmlns/
") > + return false;
Since namespaces are atomic strings, comparing to an AtomicString constant may be slightly more efficient, and it would also be nice to have that string in some common place. r=me
Alexey Proskuryakov
Comment 6
2009-05-28 09:26:07 PDT
Committed <
http://trac.webkit.org/changeset/44232
>. (In reply to
comment #5
)
> No comma in Apple Inc.
Fixed.
> I like to leave out the "default" case so that gcc can warn me about unhandled > enum values. This is practical when the cases end with return statements, since > the default return statement can go outside the switch, perhaps with an > ASSERT_NOT_REACHED().
I think that in this case, leaving element axis as default is more natural.
> Since namespaces are atomic strings, comparing to an AtomicString constant may > be slightly more efficient, and it would also be nice to have that string in > some common place.
Agreed, will keep this in mind for future patches.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug