Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(366)

Side by Side Diff: third_party/WebKit/Source/core/dom/ScriptLoader.cpp

Issue 2301323003: Add deprecation warning for script fetches with invalid types (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 reserv ed.
6 * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org> 6 * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org>
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 } 114 }
115 115
116 void ScriptLoader::detach() 116 void ScriptLoader::detach()
117 { 117 {
118 if (!m_pendingScript) 118 if (!m_pendingScript)
119 return; 119 return;
120 m_pendingScript->dispose(); 120 m_pendingScript->dispose();
121 m_pendingScript = nullptr; 121 m_pendingScript = nullptr;
122 } 122 }
123 123
124 // Helper function 124 // Helper function. Must take a lowercase language as input.
125 static bool isLegacySupportedJavaScriptLanguage(const String& language) 125 static bool isLegacySupportedJavaScriptLanguage(const String& language)
126 { 126 {
127 // Mozilla 1.8 accepts javascript1.0 - javascript1.7, but WinIE 7 accepts on ly javascript1.1 - javascript1.3. 127 // Mozilla 1.8 accepts javascript1.0 - javascript1.7, but WinIE 7 accepts on ly javascript1.1 - javascript1.3.
128 // Mozilla 1.8 and WinIE 7 both accept javascript and livescript. 128 // Mozilla 1.8 and WinIE 7 both accept javascript and livescript.
129 // WinIE 7 accepts ecmascript and jscript, but Mozilla 1.8 doesn't. 129 // WinIE 7 accepts ecmascript and jscript, but Mozilla 1.8 doesn't.
130 // Neither Mozilla 1.8 nor WinIE 7 accept leading or trailing whitespace. 130 // Neither Mozilla 1.8 nor WinIE 7 accept leading or trailing whitespace.
131 // We want to accept all the values that either of these browsers accept, bu t not other values. 131 // We want to accept all the values that either of these browsers accept, bu t not other values.
132 132
133 // FIXME: This function is not HTML5 compliant. These belong in the MIME reg istry as "text/javascript<version>" entries. 133 // FIXME: This function is not HTML5 compliant. These belong in the MIME reg istry as "text/javascript<version>" entries.
134 typedef HashSet<String, CaseFoldingHash> LanguageSet; 134 DCHECK_EQ(language, language.lower());
Yoav Weiss 2016/09/05 15:06:25 Why the change here? I don't expect this function
Charlie Harrison 2016/09/05 17:15:06 I changed this so that the function could be calle
135 DEFINE_STATIC_LOCAL(LanguageSet, languages, ({ 135 return language == "javascript"
136 "javascript", 136 || language == "javascript1.0"
137 "javascript1.0", 137 || language == "javascript1.1"
138 "javascript1.1", 138 || language == "javascript1.2"
139 "javascript1.2", 139 || language == "javascript1.3"
140 "javascript1.3", 140 || language == "javascript1.4"
141 "javascript1.4", 141 || language == "javascript1.5"
142 "javascript1.5", 142 || language == "javascript1.6"
143 "javascript1.6", 143 || language == "javascript1.7"
144 "javascript1.7", 144 || language == "livescript"
145 "livescript", 145 || language == "ecmascript"
146 "ecmascript", 146 || language == "jscript";
147 "jscript",
148 }));
149
150 return languages.contains(language);
151 } 147 }
152 148
153 void ScriptLoader::dispatchErrorEvent() 149 void ScriptLoader::dispatchErrorEvent()
154 { 150 {
155 m_element->dispatchEvent(Event::create(EventTypeNames::error)); 151 m_element->dispatchEvent(Event::create(EventTypeNames::error));
156 } 152 }
157 153
158 void ScriptLoader::dispatchLoadEvent() 154 void ScriptLoader::dispatchLoadEvent()
159 { 155 {
160 if (ScriptLoaderClient* client = this->client()) 156 if (ScriptLoaderClient* client = this->client())
161 client->dispatchLoadEvent(); 157 client->dispatchLoadEvent();
162 setHaveFiredLoadEvent(true); 158 setHaveFiredLoadEvent(true);
163 } 159 }
164 160
165 bool ScriptLoader::isScriptTypeSupported(LegacyTypeSupport supportLegacyTypes) c onst 161 bool ScriptLoader::isValidScriptTypeAndLanguage(const String& type, const String & language, LegacyTypeSupport supportLegacyTypes)
166 { 162 {
167 // FIXME: isLegacySupportedJavaScriptLanguage() is not valid HTML5. It is us ed here to maintain backwards compatibility with existing layout tests. The spec ific violations are: 163 // FIXME: isLegacySupportedJavaScriptLanguage() is not valid HTML5. It is us ed here to maintain backwards compatibility with existing layout tests. The spec ific violations are:
168 // - Allowing type=javascript. type= should only support MIME types, such as text/javascript. 164 // - Allowing type=javascript. type= should only support MIME types, such as text/javascript.
169 // - Allowing a different set of languages for language= and type=. language = supports Javascript 1.1 and 1.4-1.6, but type= does not. 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.
170
171 String type = client()->typeAttributeValue();
172 String language = client()->languageAttributeValue();
173 if (type.isEmpty() && language.isEmpty())
174 return true; // Assume text/javascript.
175 if (type.isEmpty()) { 166 if (type.isEmpty()) {
176 type = "text/" + language.lower(); 167 String lowerLanguage = language.lower();
177 if (MIMETypeRegistry::isSupportedJavaScriptMIMEType(type) || isLegacySup portedJavaScriptLanguage(language)) 168 return language.isEmpty() // assume text/javascript.
178 return true; 169 || MIMETypeRegistry::isSupportedJavaScriptMIMEType("text/" + lowerLa nguage)
170 || isLegacySupportedJavaScriptLanguage(lowerLanguage);
179 } else if (RuntimeEnabledFeatures::moduleScriptsEnabled() && type == "module ") { 171 } else if (RuntimeEnabledFeatures::moduleScriptsEnabled() && type == "module ") {
180 return true; 172 return true;
181 } else if (MIMETypeRegistry::isSupportedJavaScriptMIMEType(type.stripWhiteSp ace()) || (supportLegacyTypes == AllowLegacyTypeInTypeAttribute && isLegacySuppo rtedJavaScriptLanguage(type))) { 173 } else if (MIMETypeRegistry::isSupportedJavaScriptMIMEType(type.stripWhiteSp ace()) || (supportLegacyTypes == AllowLegacyTypeInTypeAttribute && isLegacySuppo rtedJavaScriptLanguage(type.lower()))) {
182 return true; 174 return true;
183 } 175 }
184 176
185 return false; 177 return false;
186 } 178 }
187 179
180 bool ScriptLoader::isScriptTypeSupported(LegacyTypeSupport supportLegacyTypes) c onst
181 {
182 return isValidScriptTypeAndLanguage(client()->typeAttributeValue(), client() ->languageAttributeValue(), supportLegacyTypes);
183 }
184
188 // http://dev.w3.org/html5/spec/Overview.html#prepare-a-script 185 // http://dev.w3.org/html5/spec/Overview.html#prepare-a-script
189 bool ScriptLoader::prepareScript(const TextPosition& scriptStartPosition, Legacy TypeSupport supportLegacyTypes) 186 bool ScriptLoader::prepareScript(const TextPosition& scriptStartPosition, Legacy TypeSupport supportLegacyTypes)
190 { 187 {
191 if (m_alreadyStarted) 188 if (m_alreadyStarted)
192 return false; 189 return false;
193 190
194 ScriptLoaderClient* client = this->client(); 191 ScriptLoaderClient* client = this->client();
195 192
196 bool wasParserInserted; 193 bool wasParserInserted;
197 if (m_parserInserted) { 194 if (m_parserInserted) {
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 } 334 }
338 335
339 bool isSVGScriptLoader(Element* element) 336 bool isSVGScriptLoader(Element* element)
340 { 337 {
341 DCHECK(element); 338 DCHECK(element);
342 return isSVGScriptElement(*element); 339 return isSVGScriptElement(*element);
343 } 340 }
344 341
345 void ScriptLoader::logScriptMimetype(ScriptResource* resource, LocalFrame* frame , String mimetype) 342 void ScriptLoader::logScriptMimetype(ScriptResource* resource, LocalFrame* frame , String mimetype)
346 { 343 {
347 bool text = mimetype.lower().startsWith("text/"); 344 String lowerMimetype = mimetype.lower();
348 bool application = mimetype.lower().startsWith("application/"); 345 bool text = lowerMimetype.startsWith("text/");
349 bool expectedJs = MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimetype) || (text && isLegacySupportedJavaScriptLanguage(mimetype.substring(5))); 346 bool application = lowerMimetype.startsWith("application/");
347 bool expectedJs = MIMETypeRegistry::isSupportedJavaScriptMIMEType(lowerMimet ype) || (text && isLegacySupportedJavaScriptLanguage(lowerMimetype.substring(5)) );
350 bool sameOrigin = m_element->document().getSecurityOrigin()->canRequest(m_re source->url()); 348 bool sameOrigin = m_element->document().getSecurityOrigin()->canRequest(m_re source->url());
351 if (expectedJs) { 349 if (expectedJs) {
352 return; 350 return;
353 } 351 }
354 UseCounter::Feature feature = sameOrigin ? (text ? UseCounter::SameOriginTex tScript : application ? UseCounter::SameOriginApplicationScript : UseCounter::Sa meOriginOtherScript) : (text ? UseCounter::CrossOriginTextScript : application ? UseCounter::CrossOriginApplicationScript : UseCounter::CrossOriginOtherScript); 352 UseCounter::Feature feature = sameOrigin ? (text ? UseCounter::SameOriginTex tScript : application ? UseCounter::SameOriginApplicationScript : UseCounter::Sa meOriginOtherScript) : (text ? UseCounter::CrossOriginTextScript : application ? UseCounter::CrossOriginApplicationScript : UseCounter::CrossOriginOtherScript);
355 UseCounter::count(frame, feature); 353 UseCounter::count(frame, feature);
356 } 354 }
357 355
358 bool ScriptLoader::executeScript(const ScriptSourceCode& sourceCode) 356 bool ScriptLoader::executeScript(const ScriptSourceCode& sourceCode)
359 { 357 {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 if (isHTMLScriptLoader(element)) 526 if (isHTMLScriptLoader(element))
529 return toHTMLScriptElement(element)->loader(); 527 return toHTMLScriptElement(element)->loader();
530 528
531 if (isSVGScriptLoader(element)) 529 if (isSVGScriptLoader(element))
532 return toSVGScriptElement(element)->loader(); 530 return toSVGScriptElement(element)->loader();
533 531
534 return 0; 532 return 0;
535 } 533 }
536 534
537 } // namespace blink 535 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/ScriptLoader.h ('k') | third_party/WebKit/Source/core/frame/Deprecation.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698