Get rid of custom bindings code for XMLHttpRequest.open()
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 20 Jul 2016 22:03:36 +0000 (22:03 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 20 Jul 2016 22:03:36 +0000 (22:03 +0000)
https://bugs.webkit.org/show_bug.cgi?id=159984

Reviewed by Ryosuke Niwa.

Get rid of custom bindings code for XMLHttpRequest.open() as the
bindings generator is able to generate it.

Relevant specification:
- https://xhr.spec.whatwg.org/#xmlhttprequest

The issue is that legacy content prevents treating the 'async' argument
being undefined identical from it being omitted. However, this can be
achieved by using overloading in IDL, like in the specification.

No new tests, already covered by the following tests:
- http/tests/xmlhttprequest/basic-auth.html
- http/tests/xmlhttprequest/open-async-overload.html

* bindings/js/JSXMLHttpRequestCustom.cpp:
(WebCore::SendFunctor::SendFunctor): Deleted.
(WebCore::SendFunctor::line): Deleted.
(WebCore::SendFunctor::column): Deleted.
(WebCore::SendFunctor::url): Deleted.
(WebCore::SendFunctor::operator()): Deleted.
* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::open):
* xml/XMLHttpRequest.h:
* xml/XMLHttpRequest.idl:

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

Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp
Source/WebCore/xml/XMLHttpRequest.cpp
Source/WebCore/xml/XMLHttpRequest.h
Source/WebCore/xml/XMLHttpRequest.idl

index 49599cf..6c02c17 100644 (file)
@@ -1,3 +1,35 @@
+2016-07-20  Chris Dumez  <cdumez@apple.com>
+
+        Get rid of custom bindings code for XMLHttpRequest.open()
+        https://bugs.webkit.org/show_bug.cgi?id=159984
+
+        Reviewed by Ryosuke Niwa.
+
+        Get rid of custom bindings code for XMLHttpRequest.open() as the
+        bindings generator is able to generate it.
+
+        Relevant specification:
+        - https://xhr.spec.whatwg.org/#xmlhttprequest
+
+        The issue is that legacy content prevents treating the 'async' argument
+        being undefined identical from it being omitted. However, this can be
+        achieved by using overloading in IDL, like in the specification.
+
+        No new tests, already covered by the following tests:
+        - http/tests/xmlhttprequest/basic-auth.html
+        - http/tests/xmlhttprequest/open-async-overload.html
+
+        * bindings/js/JSXMLHttpRequestCustom.cpp:
+        (WebCore::SendFunctor::SendFunctor): Deleted.
+        (WebCore::SendFunctor::line): Deleted.
+        (WebCore::SendFunctor::column): Deleted.
+        (WebCore::SendFunctor::url): Deleted.
+        (WebCore::SendFunctor::operator()): Deleted.
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::open):
+        * xml/XMLHttpRequest.h:
+        * xml/XMLHttpRequest.idl:
+
 2016-07-20  Rawinder Singh  <rawinder.singh-webkit@cisra.canon.com.au>
 
         Mark overriden methods in WebCore/svg final classes as final
index 74ccb96..44225f3 100644 (file)
@@ -71,35 +71,6 @@ void JSXMLHttpRequest::visitAdditionalChildren(SlotVisitor& visitor)
         visitor.addOpaqueRoot(responseBlob);
 }
 
-// Custom functions
-JSValue JSXMLHttpRequest::open(ExecState& state)
-{
-    if (state.argumentCount() < 2)
-        return state.vm().throwException(&state, createNotEnoughArgumentsError(&state));
-
-    const URL& url = wrapped().scriptExecutionContext()->completeURL(state.uncheckedArgument(1).toString(&state)->value(&state));
-    String method = state.uncheckedArgument(0).toString(&state)->value(&state);
-
-    ExceptionCode ec = 0;
-    if (state.argumentCount() >= 3) {
-        bool async = state.uncheckedArgument(2).toBoolean(&state);
-        if (!state.argument(3).isUndefined()) {
-            String user = valueToStringWithNullCheck(&state, state.uncheckedArgument(3));
-
-            if (!state.argument(4).isUndefined()) {
-                String password = valueToStringWithNullCheck(&state, state.uncheckedArgument(4));
-                wrapped().open(method, url, async, user, password, ec);
-            } else
-                wrapped().open(method, url, async, user, ec);
-        } else
-            wrapped().open(method, url, async, ec);
-    } else
-        wrapped().open(method, url, ec);
-
-    setDOMException(&state, ec);
-    return jsUndefined();
-}
-
 class SendFunctor {
 public:
     SendFunctor()
index e719df2..ef49433 100644 (file)
@@ -421,9 +421,10 @@ bool XMLHttpRequest::isAllowedHTTPHeader(const String& name)
     return true;
 }
 
-void XMLHttpRequest::open(const String& method, const URL& url, ExceptionCode& ec)
+void XMLHttpRequest::open(const String& method, const String& url, ExceptionCode& ec)
 {
-    open(method, url, true, ec);
+    // If the async argument is omitted, set async to true.
+    return open(method, scriptExecutionContext()->completeURL(url), true, ec);
 }
 
 void XMLHttpRequest::open(const String& method, const URL& url, bool async, ExceptionCode& ec)
@@ -495,19 +496,14 @@ void XMLHttpRequest::open(const String& method, const URL& url, bool async, Exce
         m_state = OPENED;
 }
 
-void XMLHttpRequest::open(const String& method, const URL& url, bool async, const String& user, ExceptionCode& ec)
+void XMLHttpRequest::open(const String& method, const String& url, bool async, const String& user, const String& password, ExceptionCode& ec)
 {
-    URL urlWithCredentials(url);
-    urlWithCredentials.setUser(user);
-
-    open(method, urlWithCredentials, async, ec);
-}
-
-void XMLHttpRequest::open(const String& method, const URL& url, bool async, const String& user, const String& password, ExceptionCode& ec)
-{
-    URL urlWithCredentials(url);
-    urlWithCredentials.setUser(user);
-    urlWithCredentials.setPass(password);
+    URL urlWithCredentials = scriptExecutionContext()->completeURL(url);
+    if (!user.isNull()) {
+        urlWithCredentials.setUser(user);
+        if (!password.isNull())
+            urlWithCredentials.setPass(password);
+    }
 
     open(method, urlWithCredentials, async, ec);
 }
index 9b33fb6..e49ffd5 100644 (file)
@@ -69,10 +69,9 @@ public:
     State readyState() const;
     bool withCredentials() const { return m_includeCredentials; }
     void setWithCredentials(bool, ExceptionCode&);
-    void open(const String& method, const URL&, ExceptionCode&);
+    void open(const String& method, const String& url, ExceptionCode&);
     void open(const String& method, const URL&, bool async, ExceptionCode&);
-    void open(const String& method, const URL&, bool async, const String& user, ExceptionCode&);
-    void open(const String& method, const URL&, bool async, const String& user, const String& password, ExceptionCode&);
+    void open(const String& method, const String&, bool async, const String& user, const String& password, ExceptionCode&);
     void send(ExceptionCode&);
     void send(Document*, ExceptionCode&);
     void send(const String&, ExceptionCode&);
index fa89466..ee51f37 100644 (file)
@@ -59,7 +59,9 @@ enum XMLHttpRequestResponseType {
 
     [SetterRaisesException] attribute boolean withCredentials;
 
-    [Custom, RaisesException] void open(DOMString method, DOMString url, optional boolean async, optional DOMString user, optional DOMString password);
+    // Use overloading rather than "boolean async = true" because legacy content prevents treating the 'async' argument being undefined identical from it being omitted.
+    [RaisesException] void open(DOMString method, DOMString url);
+    [RaisesException] void open(DOMString method, DOMString url, boolean async, optional DOMString? user = null, optional DOMString? password = null);
 
     [RaisesException] void setRequestHeader(DOMString header, DOMString value);