| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 
| 3  *           (C) 1999 Antti Koivisto (koivisto@kde.org) | 3  *           (C) 1999 Antti Koivisto (koivisto@kde.org) | 
| 4  *           (C) 2001 Dirk Mueller (mueller@kde.org) | 4  *           (C) 2001 Dirk Mueller (mueller@kde.org) | 
| 5  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserv
     ed. | 5  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights | 
|  | 6  * reserved. | 
| 6  * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org> | 7  * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org> | 
| 7  * | 8  * | 
| 8  * This library is free software; you can redistribute it and/or | 9  * This library is free software; you can redistribute it and/or | 
| 9  * modify it under the terms of the GNU Library General Public | 10  * modify it under the terms of the GNU Library General Public | 
| 10  * License as published by the Free Software Foundation; either | 11  * License as published by the Free Software Foundation; either | 
| 11  * version 2 of the License, or (at your option) any later version. | 12  * version 2 of the License, or (at your option) any later version. | 
| 12  * | 13  * | 
| 13  * This library is distributed in the hope that it will be useful, | 14  * This library is distributed in the hope that it will be useful, | 
| 14  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 15  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 123 | 124 | 
| 124 void ScriptLoader::detach() { | 125 void ScriptLoader::detach() { | 
| 125   if (!m_pendingScript) | 126   if (!m_pendingScript) | 
| 126     return; | 127     return; | 
| 127   m_pendingScript->dispose(); | 128   m_pendingScript->dispose(); | 
| 128   m_pendingScript = nullptr; | 129   m_pendingScript = nullptr; | 
| 129 } | 130 } | 
| 130 | 131 | 
| 131 // Helper function. Must take a lowercase language as input. | 132 // Helper function. Must take a lowercase language as input. | 
| 132 static bool isLegacySupportedJavaScriptLanguage(const String& language) { | 133 static bool isLegacySupportedJavaScriptLanguage(const String& language) { | 
| 133   // Mozilla 1.8 accepts javascript1.0 - javascript1.7, but WinIE 7 accepts only
      javascript1.1 - javascript1.3. | 134   // Mozilla 1.8 accepts javascript1.0 - javascript1.7, but WinIE 7 accepts only | 
|  | 135   // javascript1.1 - javascript1.3. | 
| 134   // Mozilla 1.8 and WinIE 7 both accept javascript and livescript. | 136   // Mozilla 1.8 and WinIE 7 both accept javascript and livescript. | 
| 135   // WinIE 7 accepts ecmascript and jscript, but Mozilla 1.8 doesn't. | 137   // WinIE 7 accepts ecmascript and jscript, but Mozilla 1.8 doesn't. | 
| 136   // Neither Mozilla 1.8 nor WinIE 7 accept leading or trailing whitespace. | 138   // Neither Mozilla 1.8 nor WinIE 7 accept leading or trailing whitespace. | 
| 137   // We want to accept all the values that either of these browsers accept, but 
     not other values. | 139   // We want to accept all the values that either of these browsers accept, but | 
|  | 140   // not other values. | 
| 138 | 141 | 
| 139   // FIXME: This function is not HTML5 compliant. These belong in the MIME regis
     try as "text/javascript<version>" entries. | 142   // FIXME: This function is not HTML5 compliant. These belong in the MIME | 
|  | 143   // registry as "text/javascript<version>" entries. | 
| 140   DCHECK_EQ(language, language.lower()); | 144   DCHECK_EQ(language, language.lower()); | 
| 141   return language == "javascript" || language == "javascript1.0" || | 145   return language == "javascript" || language == "javascript1.0" || | 
| 142          language == "javascript1.1" || language == "javascript1.2" || | 146          language == "javascript1.1" || language == "javascript1.2" || | 
| 143          language == "javascript1.3" || language == "javascript1.4" || | 147          language == "javascript1.3" || language == "javascript1.4" || | 
| 144          language == "javascript1.5" || language == "javascript1.6" || | 148          language == "javascript1.5" || language == "javascript1.6" || | 
| 145          language == "javascript1.7" || language == "livescript" || | 149          language == "javascript1.7" || language == "livescript" || | 
| 146          language == "ecmascript" || language == "jscript"; | 150          language == "ecmascript" || language == "jscript"; | 
| 147 } | 151 } | 
| 148 | 152 | 
| 149 void ScriptLoader::dispatchErrorEvent() { | 153 void ScriptLoader::dispatchErrorEvent() { | 
| 150   m_element->dispatchEvent(Event::create(EventTypeNames::error)); | 154   m_element->dispatchEvent(Event::create(EventTypeNames::error)); | 
| 151 } | 155 } | 
| 152 | 156 | 
| 153 void ScriptLoader::dispatchLoadEvent() { | 157 void ScriptLoader::dispatchLoadEvent() { | 
| 154   if (ScriptLoaderClient* client = this->client()) | 158   if (ScriptLoaderClient* client = this->client()) | 
| 155     client->dispatchLoadEvent(); | 159     client->dispatchLoadEvent(); | 
| 156   setHaveFiredLoadEvent(true); | 160   setHaveFiredLoadEvent(true); | 
| 157 } | 161 } | 
| 158 | 162 | 
| 159 bool ScriptLoader::isValidScriptTypeAndLanguage( | 163 bool ScriptLoader::isValidScriptTypeAndLanguage( | 
| 160     const String& type, | 164     const String& type, | 
| 161     const String& language, | 165     const String& language, | 
| 162     LegacyTypeSupport supportLegacyTypes) { | 166     LegacyTypeSupport supportLegacyTypes) { | 
| 163   // FIXME: isLegacySupportedJavaScriptLanguage() is not valid HTML5. It is used
      here to maintain backwards compatibility with existing layout tests. The specif
     ic violations are: | 167   // FIXME: isLegacySupportedJavaScriptLanguage() is not valid HTML5. It is used | 
| 164   // - Allowing type=javascript. type= should only support MIME types, such as t
     ext/javascript. | 168   // here to maintain backwards compatibility with existing layout tests. The | 
| 165   // - Allowing a different set of languages for language= and type=. language= 
     supports Javascript 1.1 and 1.4-1.6, but type= does not. | 169   // specific violations are: | 
|  | 170   // - Allowing type=javascript. type= should only support MIME types, such as | 
|  | 171   //   text/javascript. | 
|  | 172   // - Allowing a different set of languages for language= and type=. language= | 
|  | 173   //   supports Javascript 1.1 and 1.4-1.6, but type= does not. | 
| 166   if (type.isEmpty()) { | 174   if (type.isEmpty()) { | 
| 167     String lowerLanguage = language.lower(); | 175     String lowerLanguage = language.lower(); | 
| 168     return language.isEmpty()  // assume text/javascript. | 176     return language.isEmpty()  // assume text/javascript. | 
| 169            || MIMETypeRegistry::isSupportedJavaScriptMIMEType("text/" + | 177            || MIMETypeRegistry::isSupportedJavaScriptMIMEType("text/" + | 
| 170                                                               lowerLanguage) || | 178                                                               lowerLanguage) || | 
| 171            isLegacySupportedJavaScriptLanguage(lowerLanguage); | 179            isLegacySupportedJavaScriptLanguage(lowerLanguage); | 
| 172   } else if (RuntimeEnabledFeatures::moduleScriptsEnabled() && | 180   } else if (RuntimeEnabledFeatures::moduleScriptsEnabled() && | 
| 173              type == "module") { | 181              type == "module") { | 
| 174     return true; | 182     return true; | 
| 175   } else if (MIMETypeRegistry::isSupportedJavaScriptMIMEType( | 183   } else if (MIMETypeRegistry::isSupportedJavaScriptMIMEType( | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 201   if (m_parserInserted) { | 209   if (m_parserInserted) { | 
| 202     wasParserInserted = true; | 210     wasParserInserted = true; | 
| 203     m_parserInserted = false; | 211     m_parserInserted = false; | 
| 204   } else { | 212   } else { | 
| 205     wasParserInserted = false; | 213     wasParserInserted = false; | 
| 206   } | 214   } | 
| 207 | 215 | 
| 208   if (wasParserInserted && !client->asyncAttributeValue()) | 216   if (wasParserInserted && !client->asyncAttributeValue()) | 
| 209     m_forceAsync = true; | 217     m_forceAsync = true; | 
| 210 | 218 | 
| 211   // FIXME: HTML5 spec says we should check that all children are either comment
     s or empty text nodes. | 219   // FIXME: HTML5 spec says we should check that all children are either | 
|  | 220   // comments or empty text nodes. | 
| 212   if (!client->hasSourceAttribute() && !m_element->hasChildren()) | 221   if (!client->hasSourceAttribute() && !m_element->hasChildren()) | 
| 213     return false; | 222     return false; | 
| 214 | 223 | 
| 215   if (!m_element->isConnected()) | 224   if (!m_element->isConnected()) | 
| 216     return false; | 225     return false; | 
| 217 | 226 | 
| 218   if (!isScriptTypeSupported(supportLegacyTypes)) | 227   if (!isScriptTypeSupported(supportLegacyTypes)) | 
| 219     return false; | 228     return false; | 
| 220 | 229 | 
| 221   if (wasParserInserted) { | 230   if (wasParserInserted) { | 
| 222     m_parserInserted = true; | 231     m_parserInserted = true; | 
| 223     m_forceAsync = false; | 232     m_forceAsync = false; | 
| 224   } | 233   } | 
| 225 | 234 | 
| 226   m_alreadyStarted = true; | 235   m_alreadyStarted = true; | 
| 227 | 236 | 
| 228   // FIXME: If script is parser inserted, verify it's still in the original docu
     ment. | 237   // FIXME: If script is parser inserted, verify it's still in the original | 
|  | 238   // document. | 
| 229   Document& elementDocument = m_element->document(); | 239   Document& elementDocument = m_element->document(); | 
| 230   Document* contextDocument = elementDocument.contextDocument(); | 240   Document* contextDocument = elementDocument.contextDocument(); | 
| 231 | 241 | 
| 232   if (!contextDocument || !contextDocument->allowExecutingScripts(m_element)) | 242   if (!contextDocument || !contextDocument->allowExecutingScripts(m_element)) | 
| 233     return false; | 243     return false; | 
| 234 | 244 | 
| 235   if (!isScriptForEventSupported()) | 245   if (!isScriptForEventSupported()) | 
| 236     return false; | 246     return false; | 
| 237 | 247 | 
| 238   if (!client->charsetAttributeValue().isEmpty()) | 248   if (!client->charsetAttributeValue().isEmpty()) | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 328         ResourceRequest(elementDocument->completeURL(sourceUrl)), | 338         ResourceRequest(elementDocument->completeURL(sourceUrl)), | 
| 329         m_element->localName()); | 339         m_element->localName()); | 
| 330 | 340 | 
| 331     CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue( | 341     CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue( | 
| 332         m_element->fastGetAttribute(HTMLNames::crossoriginAttr)); | 342         m_element->fastGetAttribute(HTMLNames::crossoriginAttr)); | 
| 333     if (crossOrigin != CrossOriginAttributeNotSet) | 343     if (crossOrigin != CrossOriginAttributeNotSet) | 
| 334       request.setCrossOriginAccessControl(elementDocument->getSecurityOrigin(), | 344       request.setCrossOriginAccessControl(elementDocument->getSecurityOrigin(), | 
| 335                                           crossOrigin); | 345                                           crossOrigin); | 
| 336     request.setCharset(scriptCharset()); | 346     request.setCharset(scriptCharset()); | 
| 337 | 347 | 
| 338     // Skip fetch-related CSP checks if dynamically injected script is whitelist
     ed and this script is not parser-inserted. | 348     // Skip fetch-related CSP checks if dynamically injected script is | 
|  | 349     // whitelisted and this script is not parser-inserted. | 
| 339     bool scriptPassesCSPDynamic = | 350     bool scriptPassesCSPDynamic = | 
| 340         (!isParserInserted() && | 351         (!isParserInserted() && | 
| 341          elementDocument->contentSecurityPolicy()->allowDynamic()); | 352          elementDocument->contentSecurityPolicy()->allowDynamic()); | 
| 342 | 353 | 
| 343     if (ContentSecurityPolicy::isNonceableElement(m_element.get())) | 354     if (ContentSecurityPolicy::isNonceableElement(m_element.get())) | 
| 344       request.setContentSecurityPolicyNonce( | 355       request.setContentSecurityPolicyNonce( | 
| 345           m_element->fastGetAttribute(HTMLNames::nonceAttr)); | 356           m_element->fastGetAttribute(HTMLNames::nonceAttr)); | 
| 346 | 357 | 
| 347     if (scriptPassesCSPDynamic) { | 358     if (scriptPassesCSPDynamic) { | 
| 348       UseCounter::count(elementDocument->frame(), | 359       UseCounter::count(elementDocument->frame(), | 
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 522         accessControlStatus = OpaqueResource; | 533         accessControlStatus = OpaqueResource; | 
| 523       else | 534       else | 
| 524         accessControlStatus = SharableCrossOrigin; | 535         accessControlStatus = SharableCrossOrigin; | 
| 525     } else if (sourceCode.resource()->passesAccessControlCheck( | 536     } else if (sourceCode.resource()->passesAccessControlCheck( | 
| 526                    m_element->document().getSecurityOrigin())) { | 537                    m_element->document().getSecurityOrigin())) { | 
| 527       accessControlStatus = SharableCrossOrigin; | 538       accessControlStatus = SharableCrossOrigin; | 
| 528     } | 539     } | 
| 529   } | 540   } | 
| 530 | 541 | 
| 531   const bool isImportedScript = contextDocument != elementDocument; | 542   const bool isImportedScript = contextDocument != elementDocument; | 
| 532   // http://www.whatwg.org/specs/web-apps/current-work/#execute-the-script-block
      step 2.3 | 543   // http://www.whatwg.org/specs/web-apps/current-work/#execute-the-script-block | 
| 533   // with additional support for HTML imports. | 544   // step 2.3 with additional support for HTML imports. | 
| 534   IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer( | 545   IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer( | 
| 535       m_isExternalScript || isImportedScript ? contextDocument : 0); | 546       m_isExternalScript || isImportedScript ? contextDocument : 0); | 
| 536 | 547 | 
| 537   if (isHTMLScriptLoader(m_element) || isSVGScriptLoader(m_element)) | 548   if (isHTMLScriptLoader(m_element) || isSVGScriptLoader(m_element)) | 
| 538     contextDocument->pushCurrentScript(m_element); | 549     contextDocument->pushCurrentScript(m_element); | 
| 539 | 550 | 
| 540   // Create a script from the script element node, using the script | 551   // Create a script from the script element node, using the script | 
| 541   // block's source and the script block's type. | 552   // block's source and the script block's type. | 
| 542   // Note: This is where the script is compiled and actually executed. | 553   // Note: This is where the script is compiled and actually executed. | 
| 543   frame->script().executeScriptInMainWorld(sourceCode, accessControlStatus); | 554   frame->script().executeScriptInMainWorld(sourceCode, accessControlStatus); | 
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 642   if (isHTMLScriptLoader(element)) | 653   if (isHTMLScriptLoader(element)) | 
| 643     return toHTMLScriptElement(element)->loader(); | 654     return toHTMLScriptElement(element)->loader(); | 
| 644 | 655 | 
| 645   if (isSVGScriptLoader(element)) | 656   if (isSVGScriptLoader(element)) | 
| 646     return toSVGScriptElement(element)->loader(); | 657     return toSVGScriptElement(element)->loader(); | 
| 647 | 658 | 
| 648   return 0; | 659   return 0; | 
| 649 } | 660 } | 
| 650 | 661 | 
| 651 }  // namespace blink | 662 }  // namespace blink | 
| OLD | NEW | 
|---|