Align our XPath API with the specification and other browsers
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Sep 2019 22:27:34 +0000 (22:27 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Sep 2019 22:27:34 +0000 (22:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=201660

Reviewed by Geoffrey Garen.

LayoutTests/imported/w3c:

Rebaseline WPT tests now that more checks are passing.

* web-platform-tests/dom/interfaces-expected.txt:

Source/WebCore:

Align our XPath API with the specification and other browsers:
- Document/XPathEvaluator.createExpression()'s first parameter should be mandatory
- Document/XPathEvaluator.evaluate()'s first 2 parameters should be mandatory
- XPathExpression.evaluate()'s first parameter should be mandatory

I have confirmed in the latest Chrome and Firefox that they match the specification.

No new tests, rebaselined existing test.

* dom/Document.cpp:
(WebCore::Document::evaluate):
* dom/Document.h:
* dom/Document.idl:
* inspector/InspectorNodeFinder.cpp:
(WebCore::InspectorNodeFinder::searchUsingXPath):
* xml/XPathEvaluator.cpp:
(WebCore::XPathEvaluator::evaluate):
* xml/XPathEvaluator.h:
* xml/XPathEvaluator.idl:
* xml/XPathExpression.cpp:
(WebCore::XPathExpression::evaluate):
* xml/XPathExpression.h:
* xml/XPathExpression.idl:
* xml/XPathUtil.cpp:
(WebCore::XPath::isValidContextNode):
* xml/XPathUtil.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249779 268f45cc-cd09-0410-ab3c-d52691b4dbfc

19 files changed:
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/Document.h
Source/WebCore/dom/Document.idl
Source/WebCore/inspector/InspectorNodeFinder.cpp
Source/WebCore/xml/XPathEvaluator.cpp
Source/WebCore/xml/XPathEvaluator.h
Source/WebCore/xml/XPathEvaluator.idl
Source/WebCore/xml/XPathExpression.cpp
Source/WebCore/xml/XPathExpression.h
Source/WebCore/xml/XPathExpression.idl
Source/WebCore/xml/XPathUtil.cpp
Source/WebCore/xml/XPathUtil.h
Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDocumentGtk.cpp
Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMXPathExpression.cpp
Source/WebKitLegacy/mac/DOM/DOMDocument.mm
Source/WebKitLegacy/mac/DOM/DOMXPathExpression.mm

index 21a048b..3320b43 100644 (file)
@@ -1,3 +1,14 @@
+2019-09-11  Chris Dumez  <cdumez@apple.com>
+
+        Align our XPath API with the specification and other browsers
+        https://bugs.webkit.org/show_bug.cgi?id=201660
+
+        Reviewed by Geoffrey Garen.
+
+        Rebaseline WPT tests now that more checks are passing.
+
+        * web-platform-tests/dom/interfaces-expected.txt:
+
 2019-09-11  Frederic Wang  <fwang@igalia.com>
 
         Bug 201603 - Synchronize MathML WPT tests against upstream
index a98e085..fbb4c5c 100644 (file)
@@ -341,9 +341,9 @@ PASS Document interface: operation prepend([object Object],[object Object])
 PASS Document interface: operation append([object Object],[object Object]) 
 PASS Document interface: operation querySelector(DOMString) 
 PASS Document interface: operation querySelectorAll(DOMString) 
-FAIL Document interface: operation createExpression(DOMString, XPathNSResolver) assert_equals: property has wrong .length expected 1 but got 0
+PASS Document interface: operation createExpression(DOMString, XPathNSResolver) 
 PASS Document interface: operation createNSResolver(Node) 
-FAIL Document interface: operation evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult) assert_equals: property has wrong .length expected 2 but got 0
+PASS Document interface: operation evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult) 
 PASS Document must be primary interface of new Document() 
 PASS Stringification of new Document() 
 PASS Document interface: new Document() must inherit property "implementation" with the proper type 
@@ -406,15 +406,11 @@ PASS Document interface: calling querySelector(DOMString) on new Document() with
 PASS Document interface: new Document() must inherit property "querySelectorAll(DOMString)" with the proper type 
 PASS Document interface: calling querySelectorAll(DOMString) on new Document() with too few arguments must throw TypeError 
 PASS Document interface: new Document() must inherit property "createExpression(DOMString, XPathNSResolver)" with the proper type 
-FAIL Document interface: calling createExpression(DOMString, XPathNSResolver) on new Document() with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
-            fn.apply(obj, args);
-        }" did not throw
+PASS Document interface: calling createExpression(DOMString, XPathNSResolver) on new Document() with too few arguments must throw TypeError 
 PASS Document interface: new Document() must inherit property "createNSResolver(Node)" with the proper type 
 PASS Document interface: calling createNSResolver(Node) on new Document() with too few arguments must throw TypeError 
 PASS Document interface: new Document() must inherit property "evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult)" with the proper type 
-FAIL Document interface: calling evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult) on new Document() with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "NotSupportedError: The operation is not supported." ("NotSupportedError") expected object "TypeError" ("TypeError")
+PASS Document interface: calling evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult) on new Document() with too few arguments must throw TypeError 
 PASS Node interface: new Document() must inherit property "ELEMENT_NODE" with the proper type 
 PASS Node interface: new Document() must inherit property "ATTRIBUTE_NODE" with the proper type 
 PASS Node interface: new Document() must inherit property "TEXT_NODE" with the proper type 
@@ -549,15 +545,11 @@ PASS Document interface: calling querySelector(DOMString) on xmlDoc with too few
 PASS Document interface: xmlDoc must inherit property "querySelectorAll(DOMString)" with the proper type 
 PASS Document interface: calling querySelectorAll(DOMString) on xmlDoc with too few arguments must throw TypeError 
 PASS Document interface: xmlDoc must inherit property "createExpression(DOMString, XPathNSResolver)" with the proper type 
-FAIL Document interface: calling createExpression(DOMString, XPathNSResolver) on xmlDoc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
-            fn.apply(obj, args);
-        }" did not throw
+PASS Document interface: calling createExpression(DOMString, XPathNSResolver) on xmlDoc with too few arguments must throw TypeError 
 PASS Document interface: xmlDoc must inherit property "createNSResolver(Node)" with the proper type 
 PASS Document interface: calling createNSResolver(Node) on xmlDoc with too few arguments must throw TypeError 
 PASS Document interface: xmlDoc must inherit property "evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult)" with the proper type 
-FAIL Document interface: calling evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult) on xmlDoc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "NotSupportedError: The operation is not supported." ("NotSupportedError") expected object "TypeError" ("TypeError")
+PASS Document interface: calling evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult) on xmlDoc with too few arguments must throw TypeError 
 PASS Node interface: xmlDoc must inherit property "ELEMENT_NODE" with the proper type 
 PASS Node interface: xmlDoc must inherit property "ATTRIBUTE_NODE" with the proper type 
 PASS Node interface: xmlDoc must inherit property "TEXT_NODE" with the proper type 
@@ -1779,7 +1771,7 @@ PASS XPathExpression interface object name
 PASS XPathExpression interface: existence and properties of interface prototype object 
 PASS XPathExpression interface: existence and properties of interface prototype object's "constructor" property 
 PASS XPathExpression interface: existence and properties of interface prototype object's @@unscopables property 
-FAIL XPathExpression interface: operation evaluate(Node, unsigned short, XPathResult) assert_equals: property has wrong .length expected 1 but got 0
+PASS XPathExpression interface: operation evaluate(Node, unsigned short, XPathResult) 
 PASS XPathNSResolver interface: existence and properties of interface object 
 PASS XPathNSResolver interface: existence and properties of interface prototype object 
 PASS XPathNSResolver interface: existence and properties of interface prototype object's "constructor" property 
@@ -1791,8 +1783,8 @@ PASS XPathEvaluator interface object name
 PASS XPathEvaluator interface: existence and properties of interface prototype object 
 PASS XPathEvaluator interface: existence and properties of interface prototype object's "constructor" property 
 PASS XPathEvaluator interface: existence and properties of interface prototype object's @@unscopables property 
-FAIL XPathEvaluator interface: operation createExpression(DOMString, XPathNSResolver) assert_equals: property has wrong .length expected 1 but got 0
+PASS XPathEvaluator interface: operation createExpression(DOMString, XPathNSResolver) 
 FAIL XPathEvaluator interface: operation createNSResolver(Node) assert_equals: property has wrong .length expected 1 but got 0
-FAIL XPathEvaluator interface: operation evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult) assert_equals: property has wrong .length expected 2 but got 0
+PASS XPathEvaluator interface: operation evaluate(DOMString, Node, XPathNSResolver, unsigned short, XPathResult) 
 PASS Window interface: attribute event 
 
index 499280a..959a680 100644 (file)
@@ -1,3 +1,37 @@
+2019-09-11  Chris Dumez  <cdumez@apple.com>
+
+        Align our XPath API with the specification and other browsers
+        https://bugs.webkit.org/show_bug.cgi?id=201660
+
+        Reviewed by Geoffrey Garen.
+
+        Align our XPath API with the specification and other browsers:
+        - Document/XPathEvaluator.createExpression()'s first parameter should be mandatory
+        - Document/XPathEvaluator.evaluate()'s first 2 parameters should be mandatory
+        - XPathExpression.evaluate()'s first parameter should be mandatory
+
+        I have confirmed in the latest Chrome and Firefox that they match the specification.
+        
+        No new tests, rebaselined existing test.
+
+        * dom/Document.cpp:
+        (WebCore::Document::evaluate):
+        * dom/Document.h:
+        * dom/Document.idl:
+        * inspector/InspectorNodeFinder.cpp:
+        (WebCore::InspectorNodeFinder::searchUsingXPath):
+        * xml/XPathEvaluator.cpp:
+        (WebCore::XPathEvaluator::evaluate):
+        * xml/XPathEvaluator.h:
+        * xml/XPathEvaluator.idl:
+        * xml/XPathExpression.cpp:
+        (WebCore::XPathExpression::evaluate):
+        * xml/XPathExpression.h:
+        * xml/XPathExpression.idl:
+        * xml/XPathUtil.cpp:
+        (WebCore::XPath::isValidContextNode):
+        * xml/XPathUtil.h:
+
 2019-09-11  Truitt Savell  <tsavell@apple.com>
 
         Unreviewed, rolling out r249753.
index c86aa99..d6a067c 100644 (file)
@@ -5765,7 +5765,7 @@ Ref<XPathNSResolver> Document::createNSResolver(Node* nodeResolver)
     return m_xpathEvaluator->createNSResolver(nodeResolver);
 }
 
-ExceptionOr<Ref<XPathResult>> Document::evaluate(const String& expression, Node* contextNode, RefPtr<XPathNSResolver>&& resolver, unsigned short type, XPathResult* result)
+ExceptionOr<Ref<XPathResult>> Document::evaluate(const String& expression, Node& contextNode, RefPtr<XPathNSResolver>&& resolver, unsigned short type, XPathResult* result)
 {
     if (!m_xpathEvaluator)
         m_xpathEvaluator = XPathEvaluator::create();
index b541062..4dbf302 100644 (file)
@@ -1039,7 +1039,7 @@ public:
     // XPathEvaluator methods
     WEBCORE_EXPORT ExceptionOr<Ref<XPathExpression>> createExpression(const String& expression, RefPtr<XPathNSResolver>&&);
     WEBCORE_EXPORT Ref<XPathNSResolver> createNSResolver(Node* nodeResolver);
-    WEBCORE_EXPORT ExceptionOr<Ref<XPathResult>> evaluate(const String& expression, Node* contextNode, RefPtr<XPathNSResolver>&&, unsigned short type, XPathResult*);
+    WEBCORE_EXPORT ExceptionOr<Ref<XPathResult>> evaluate(const String& expression, Node& contextNode, RefPtr<XPathNSResolver>&&, unsigned short type, XPathResult*);
 
     bool hasNodesWithNonFinalStyle() const { return m_hasNodesWithNonFinalStyle; }
     void setHasNodesWithNonFinalStyle() { m_hasNodesWithNonFinalStyle = true; }
index f467576..2bfadf6 100644 (file)
@@ -136,9 +136,9 @@ typedef (
     DOMSelection? getSelection();
 
     // XPath extensions (https://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator).
-    [MayThrowException] XPathExpression createExpression(optional DOMString expression = "undefined", optional XPathNSResolver? resolver); // FIXME: Using "undefined" as default parameter value is wrong.
+    [MayThrowException] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver);
     XPathNSResolver createNSResolver(Node? nodeResolver);
-    [MayThrowException] XPathResult evaluate(optional DOMString expression = "undefined", optional Node? contextNode, optional XPathNSResolver? resolver, optional unsigned short type = 0, optional XPathResult? inResult); // FIXME: Using "undefined" as default parameter value is wrong.
+    [MayThrowException] XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver, optional unsigned short type = 0, optional XPathResult? inResult);
 
     // Extensions from Pointer Lock API (https://www.w3.org/TR/pointerlock/#extensions-to-the-document-interface).
     [NotEnumerable, Conditional=POINTER_LOCK] attribute EventHandler onpointerlockchange; // FIXME: Should be enumerable.
index 191a6a7..e03eb0c 100644 (file)
@@ -158,7 +158,7 @@ bool InspectorNodeFinder::matchesElement(const Element& element)
 
 void InspectorNodeFinder::searchUsingXPath(Node& parentNode)
 {
-    auto evaluateResult = parentNode.document().evaluate(m_query, &parentNode, nullptr, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE, nullptr);
+    auto evaluateResult = parentNode.document().evaluate(m_query, parentNode, nullptr, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE, nullptr);
     if (evaluateResult.hasException())
         return;
     auto result = evaluateResult.releaseReturnValue();
index 0cc1d5d..25c0cbf 100644 (file)
@@ -46,7 +46,7 @@ Ref<XPathNSResolver> XPathEvaluator::createNSResolver(Node* nodeResolver)
     return NativeXPathNSResolver::create(nodeResolver);
 }
 
-ExceptionOr<Ref<XPathResult>> XPathEvaluator::evaluate(const String& expression, Node* contextNode, RefPtr<XPathNSResolver>&& resolver, unsigned short type, XPathResult* result)
+ExceptionOr<Ref<XPathResult>> XPathEvaluator::evaluate(const String& expression, Node& contextNode, RefPtr<XPathNSResolver>&& resolver, unsigned short type, XPathResult* result)
 {
     if (!isValidContextNode(contextNode))
         return Exception { NotSupportedError };
index 4a47854..6c3f91c 100644 (file)
@@ -41,7 +41,7 @@ public:
 
     ExceptionOr<Ref<XPathExpression>> createExpression(const String& expression, RefPtr<XPathNSResolver>&&);
     Ref<XPathNSResolver> createNSResolver(Node* nodeResolver);
-    ExceptionOr<Ref<XPathResult>> evaluate(const String& expression, Node* contextNode, RefPtr<XPathNSResolver>&&, unsigned short type, XPathResult*);
+    ExceptionOr<Ref<XPathResult>> evaluate(const String& expression, Node& contextNode, RefPtr<XPathNSResolver>&&, unsigned short type, XPathResult*);
 
 private:
     XPathEvaluator() = default;
index faad618..f2bd6cc 100644 (file)
     Constructor,
     ImplementationLacksVTable,
 ] interface XPathEvaluator {
-    // FIXME: Using "undefined" as default parameter value is wrong.
-    [MayThrowException] XPathExpression createExpression(optional DOMString expression = "undefined", optional XPathNSResolver? resolver);
+    [MayThrowException] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver);
 
     XPathNSResolver createNSResolver(optional Node? nodeResolver);
 
-    // FIXME: Using "undefined" as default parameter value is wrong.
-    [MayThrowException] XPathResult evaluate(optional DOMString expression = "undefined", optional Node? contextNode, optional XPathNSResolver? resolver, optional unsigned short type = 0, optional XPathResult? inResult);
+    [MayThrowException] XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver, optional unsigned short type = 0, optional XPathResult? inResult);
 };
index 12055a3..662be9e 100644 (file)
@@ -54,17 +54,17 @@ ExceptionOr<Ref<XPathExpression>> XPathExpression::createExpression(const String
 XPathExpression::~XPathExpression() = default;
 
 // FIXME: Why does this take an XPathResult that it ignores?
-ExceptionOr<Ref<XPathResult>> XPathExpression::evaluate(Node* contextNode, unsigned short type, XPathResult*)
+ExceptionOr<Ref<XPathResult>> XPathExpression::evaluate(Node& contextNode, unsigned short type, XPathResult*)
 {
     if (!isValidContextNode(contextNode))
         return Exception { NotSupportedError };
 
     EvaluationContext& evaluationContext = Expression::evaluationContext();
-    evaluationContext.node = contextNode;
+    evaluationContext.node = &contextNode;
     evaluationContext.size = 1;
     evaluationContext.position = 1;
     evaluationContext.hadTypeConversionError = false;
-    auto result = XPathResult::create(contextNode->document(), m_topExpression->evaluate());
+    auto result = XPathResult::create(contextNode.document(), m_topExpression->evaluate());
     evaluationContext.node = nullptr; // Do not hold a reference to the context node, as this may prevent the whole document from being destroyed in time.
 
     if (evaluationContext.hadTypeConversionError)
index 5a478a8..8c25202 100644 (file)
@@ -43,7 +43,7 @@ public:
     static ExceptionOr<Ref<XPathExpression>> createExpression(const String& expression, RefPtr<XPathNSResolver>&&);
     WEBCORE_EXPORT ~XPathExpression();
 
-    WEBCORE_EXPORT ExceptionOr<Ref<XPathResult>> evaluate(Node* contextNode, unsigned short type, XPathResult*);
+    WEBCORE_EXPORT ExceptionOr<Ref<XPathResult>> evaluate(Node& contextNode, unsigned short type, XPathResult*);
 
 private:
     explicit XPathExpression(std::unique_ptr<XPath::Expression>);
index 19758dc..92c1a4f 100644 (file)
@@ -22,5 +22,5 @@
     ExportToWrappedFunction,
     ImplementationLacksVTable,
 ] interface XPathExpression {
-    [MayThrowException] XPathResult evaluate(optional Node? contextNode = null, optional unsigned short type = 0, optional XPathResult? inResult = null);
+    [MayThrowException] XPathResult evaluate(Node contextNode, optional unsigned short type = 0, optional XPathResult? inResult = null);
 };
index ab4e954..83dfbdc 100644 (file)
@@ -54,11 +54,9 @@ String stringValue(Node* node)
     return String();
 }
 
-bool isValidContextNode(Node* node)
+bool isValidContextNode(Node& node)
 {
-    if (!node)
-        return false;
-    switch (node->nodeType()) {
+    switch (node.nodeType()) {
         case Node::ATTRIBUTE_NODE:
         case Node::CDATA_SECTION_NODE:
         case Node::COMMENT_NODE:
index 0b05a60..ac90136 100644 (file)
@@ -41,7 +41,7 @@ namespace WebCore {
         String stringValue(Node*);
 
         /* @return whether the given node is a valid context node */
-        bool isValidContextNode(Node*);
+        bool isValidContextNode(Node&);
 
     } // namespace XPath
 
index 3849f06..1d13178 100644 (file)
@@ -1160,7 +1160,7 @@ WebKitDOMXPathResult* webkit_dom_document_evaluate(WebKitDOMDocument* self, cons
     WebCore::JSMainThreadNullState state;
     g_return_val_if_fail(WEBKIT_DOM_IS_DOCUMENT(self), 0);
     g_return_val_if_fail(expression, 0);
-    g_return_val_if_fail(WEBKIT_DOM_IS_NODE(contextNode), 0);
+    g_return_val_if_fail(contextNode && WEBKIT_DOM_IS_NODE(contextNode), 0);
     g_return_val_if_fail(!resolver || WEBKIT_DOM_IS_XPATH_NS_RESOLVER(resolver), 0);
     g_return_val_if_fail(!inResult || WEBKIT_DOM_IS_XPATH_RESULT(inResult), 0);
     g_return_val_if_fail(!error || !*error, 0);
@@ -1169,7 +1169,7 @@ WebKitDOMXPathResult* webkit_dom_document_evaluate(WebKitDOMDocument* self, cons
     WebCore::Node* convertedContextNode = WebKit::core(contextNode);
     RefPtr<WebCore::XPathNSResolver> convertedResolver = WebKit::core(resolver);
     WebCore::XPathResult* convertedInResult = WebKit::core(inResult);
-    auto result = item->evaluate(convertedExpression, convertedContextNode, WTFMove(convertedResolver), type, convertedInResult);
+    auto result = item->evaluate(convertedExpression, *convertedContextNode, WTFMove(convertedResolver), type, convertedInResult);
     if (result.hasException()) {
         auto description = WebCore::DOMException::description(result.releaseException().code());
         g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), description.legacyCode, description.name);
index 9c91d54..3ebc292 100644 (file)
@@ -108,13 +108,13 @@ WebKitDOMXPathResult* webkit_dom_xpath_expression_evaluate(WebKitDOMXPathExpress
 {
     WebCore::JSMainThreadNullState state;
     g_return_val_if_fail(WEBKIT_DOM_IS_XPATH_EXPRESSION(self), 0);
-    g_return_val_if_fail(WEBKIT_DOM_IS_NODE(contextNode), 0);
+    g_return_val_if_fail(contextNode && WEBKIT_DOM_IS_NODE(contextNode), 0);
     g_return_val_if_fail(WEBKIT_DOM_IS_XPATH_RESULT(inResult), 0);
     g_return_val_if_fail(!error || !*error, 0);
     WebCore::XPathExpression* item = WebKit::core(self);
     WebCore::Node* convertedContextNode = WebKit::core(contextNode);
     WebCore::XPathResult* convertedInResult = WebKit::core(inResult);
-    auto result = item->evaluate(convertedContextNode, type, convertedInResult);
+    auto result = item->evaluate(*convertedContextNode, type, convertedInResult);
     if (result.hasException()) {
         auto description = WebCore::DOMException::description(result.releaseException().code());
         g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), description.legacyCode, description.name);
index 3b9e239..590db50 100644 (file)
@@ -601,8 +601,11 @@ static RefPtr<WebCore::XPathNSResolver> wrap(id <DOMXPathNSResolver> resolver)
 
 - (DOMXPathResult *)evaluate:(NSString *)expression contextNode:(DOMNode *)contextNode resolver:(id <DOMXPathNSResolver>)resolver type:(unsigned short)type inResult:(DOMXPathResult *)inResult
 {
+    if (!contextNode)
+        return nullptr;
+
     WebCore::JSMainThreadNullState state;
-    return kit(raiseOnDOMError(IMPL->evaluate(expression, core(contextNode), wrap(resolver), type, core(inResult))).ptr());
+    return kit(raiseOnDOMError(IMPL->evaluate(expression, *core(contextNode), wrap(resolver), type, core(inResult))).ptr());
 }
 
 - (BOOL)execCommand:(NSString *)command userInterface:(BOOL)userInterface value:(NSString *)value
index ac65b00..aedf35a 100644 (file)
 
 - (DOMXPathResult *)evaluate:(DOMNode *)contextNode type:(unsigned short)type inResult:(DOMXPathResult *)inResult
 {
+    if (!contextNode)
+        return nullptr;
+
     WebCore::JSMainThreadNullState state;
-    return kit(raiseOnDOMError(IMPL->evaluate(core(contextNode), type, core(inResult))).ptr());
+    return kit(raiseOnDOMError(IMPL->evaluate(*core(contextNode), type, core(inResult))).ptr());
 }
 
 @end