[ES6] Add ScriptElement::determineScriptType
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Aug 2016 06:28:24 +0000 (06:28 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Aug 2016 06:28:24 +0000 (06:28 +0000)
https://bugs.webkit.org/show_bug.cgi?id=149576

Reviewed by Ryosuke Niwa.

Change ScriptElement::isScriptTypeSupported to ScriptElement::determineScriptType.
And introduce ScriptType, which is either "classic" or "module".
And support "module" type in ScriptElement[1, 2].
But this patch does not contain any module tag support code.
This will be implemented in the subsequent patch.

[1]: https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-module-system
[2]: https://html.spec.whatwg.org/multipage/scripting.html#attr-script-type

* dom/ScriptElement.cpp:
(WebCore::ScriptElement::determineScriptType):
(WebCore::ScriptElement::prepareScript):
(WebCore::ScriptElement::isScriptTypeSupported): Deleted.
* dom/ScriptElement.h:

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

Source/WebCore/ChangeLog
Source/WebCore/dom/ScriptElement.cpp
Source/WebCore/dom/ScriptElement.h

index b7afbd4..2572648 100644 (file)
@@ -1,3 +1,25 @@
+2016-08-05  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [ES6] Add ScriptElement::determineScriptType
+        https://bugs.webkit.org/show_bug.cgi?id=149576
+
+        Reviewed by Ryosuke Niwa.
+
+        Change ScriptElement::isScriptTypeSupported to ScriptElement::determineScriptType.
+        And introduce ScriptType, which is either "classic" or "module".
+        And support "module" type in ScriptElement[1, 2].
+        But this patch does not contain any module tag support code.
+        This will be implemented in the subsequent patch.
+
+        [1]: https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-module-system
+        [2]: https://html.spec.whatwg.org/multipage/scripting.html#attr-script-type
+
+        * dom/ScriptElement.cpp:
+        (WebCore::ScriptElement::determineScriptType):
+        (WebCore::ScriptElement::prepareScript):
+        (WebCore::ScriptElement::isScriptTypeSupported): Deleted.
+        * dom/ScriptElement.h:
+
 2016-08-05  Jonathan Bedard  <jbedard@apple.com>
 
         NULL Reference Error in ElementRuleCollector
index 69ddb35..f187111 100644 (file)
@@ -145,7 +145,7 @@ void ScriptElement::dispatchErrorEvent()
     m_element.dispatchEvent(Event::create(eventNames().errorEvent, false, false));
 }
 
-bool ScriptElement::isScriptTypeSupported(LegacyTypeSupport supportLegacyTypes) const
+Optional<ScriptElement::ScriptType> ScriptElement::determineScriptType(LegacyTypeSupport supportLegacyTypes) const
 {
     // FIXME: isLegacySupportedJavaScriptLanguage() is not valid HTML5. It is used here to maintain backwards compatibility with existing layout tests. The specific violations are:
     // - Allowing type=javascript. type= should only support MIME types, such as text/javascript.
@@ -154,18 +154,24 @@ bool ScriptElement::isScriptTypeSupported(LegacyTypeSupport supportLegacyTypes)
     String language = languageAttributeValue();
     if (type.isEmpty()) {
         if (language.isEmpty())
-            return true; // Assume text/javascript.
+            return ScriptType::Classic; // Assume text/javascript.
         if (MIMETypeRegistry::isSupportedJavaScriptMIMEType("text/" + language))
-            return true;
+            return ScriptType::Classic;
         if (isLegacySupportedJavaScriptLanguage(language))
-            return true;
-        return false;
+            return ScriptType::Classic;
+        return Nullopt;
     }
     if (MIMETypeRegistry::isSupportedJavaScriptMIMEType(type.stripWhiteSpace()))
-        return true;
+        return ScriptType::Classic;
     if (supportLegacyTypes == AllowLegacyTypeInTypeAttribute && isLegacySupportedJavaScriptLanguage(type))
-        return true;
-    return false;
+        return ScriptType::Classic;
+#if ENABLE(ES6_MODULES)
+    // https://html.spec.whatwg.org/multipage/scripting.html#attr-script-type
+    // Setting the attribute to an ASCII case-insensitive match for the string "module" means that the script is a module script.
+    if (equalLettersIgnoringASCIICase(type, "module"))
+        return ScriptType::Module;
+#endif
+    return Nullopt;
 }
 
 // http://dev.w3.org/html5/spec/Overview.html#prepare-a-script
@@ -191,7 +197,7 @@ bool ScriptElement::prepareScript(const TextPosition& scriptStartPosition, Legac
     if (!m_element.inDocument())
         return false;
 
-    if (!isScriptTypeSupported(supportLegacyTypes))
+    if (!determineScriptType(supportLegacyTypes))
         return false;
 
     if (wasParserInserted) {
index 648317e..4e79491 100644 (file)
@@ -53,7 +53,6 @@ public:
     // XML parser calls these
     virtual void dispatchLoadEvent() = 0;
     void dispatchErrorEvent();
-    bool isScriptTypeSupported(LegacyTypeSupport) const;
 
     bool haveFiredLoadEvent() const { return m_haveFiredLoad; }
     bool willBeParserExecuted() const { return m_willBeParserExecuted; }
@@ -77,6 +76,9 @@ protected:
     void handleAsyncAttribute();
 
 private:
+    // https://html.spec.whatwg.org/multipage/scripting.html#concept-script-type
+    enum class ScriptType { Classic, Module };
+    Optional<ScriptType> determineScriptType(LegacyTypeSupport) const;
     bool ignoresLoadRequest() const;
     bool isScriptForEventSupported() const;