| 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 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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 , m_startLineNumber(WTF::OrdinalNumber::beforeFirst()) | 58 , m_startLineNumber(WTF::OrdinalNumber::beforeFirst()) |
| 59 , m_parserInserted(parserInserted) | 59 , m_parserInserted(parserInserted) |
| 60 , m_isExternalScript(false) | 60 , m_isExternalScript(false) |
| 61 , m_alreadyStarted(alreadyStarted) | 61 , m_alreadyStarted(alreadyStarted) |
| 62 , m_haveFiredLoad(false) | 62 , m_haveFiredLoad(false) |
| 63 , m_willBeParserExecuted(false) | 63 , m_willBeParserExecuted(false) |
| 64 , m_readyToBeParserExecuted(false) | 64 , m_readyToBeParserExecuted(false) |
| 65 , m_willExecuteWhenDocumentFinishedParsing(false) | 65 , m_willExecuteWhenDocumentFinishedParsing(false) |
| 66 , m_forceAsync(!parserInserted) | 66 , m_forceAsync(!parserInserted) |
| 67 , m_willExecuteInOrder(false) | 67 , m_willExecuteInOrder(false) |
| 68 , m_isPotentiallyCORSEnabled(false) | |
| 69 { | 68 { |
| 70 ASSERT(m_element); | 69 ASSERT(m_element); |
| 71 if (parserInserted && element->document().scriptableDocumentParser() && !ele
ment->document().isInDocumentWrite()) | 70 if (parserInserted && element->document().scriptableDocumentParser() && !ele
ment->document().isInDocumentWrite()) |
| 72 m_startLineNumber = element->document().scriptableDocumentParser()->line
Number(); | 71 m_startLineNumber = element->document().scriptableDocumentParser()->line
Number(); |
| 73 } | 72 } |
| 74 | 73 |
| 75 ScriptLoader::~ScriptLoader() | 74 ScriptLoader::~ScriptLoader() |
| 76 { | 75 { |
| 77 stopLoadRequest(); | 76 stopLoadRequest(); |
| 78 } | 77 } |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 m_willExecuteInOrder = true; | 233 m_willExecuteInOrder = true; |
| 235 contextDocument->scriptRunner()->queueScriptForExecution(this, m_resourc
e, ScriptRunner::IN_ORDER_EXECUTION); | 234 contextDocument->scriptRunner()->queueScriptForExecution(this, m_resourc
e, ScriptRunner::IN_ORDER_EXECUTION); |
| 236 m_resource->addClient(this); | 235 m_resource->addClient(this); |
| 237 } else if (client->hasSourceAttribute()) { | 236 } else if (client->hasSourceAttribute()) { |
| 238 contextDocument->scriptRunner()->queueScriptForExecution(this, m_resourc
e, ScriptRunner::ASYNC_EXECUTION); | 237 contextDocument->scriptRunner()->queueScriptForExecution(this, m_resourc
e, ScriptRunner::ASYNC_EXECUTION); |
| 239 m_resource->addClient(this); | 238 m_resource->addClient(this); |
| 240 } else { | 239 } else { |
| 241 // Reset line numbering for nested writes. | 240 // Reset line numbering for nested writes. |
| 242 TextPosition position = elementDocument.isInDocumentWrite() ? TextPositi
on() : scriptStartPosition; | 241 TextPosition position = elementDocument.isInDocumentWrite() ? TextPositi
on() : scriptStartPosition; |
| 243 KURL scriptURL = (!elementDocument.isInDocumentWrite() && m_parserInsert
ed) ? elementDocument.url() : KURL(); | 242 KURL scriptURL = (!elementDocument.isInDocumentWrite() && m_parserInsert
ed) ? elementDocument.url() : KURL(); |
| 244 if (!executePotentiallyCrossOriginScript(ScriptSourceCode(scriptContent(
), scriptURL, position))) | 243 executeScript(ScriptSourceCode(scriptContent(), scriptURL, position)); |
| 245 return false; | |
| 246 } | 244 } |
| 247 | 245 |
| 248 return true; | 246 return true; |
| 249 } | 247 } |
| 250 | 248 |
| 251 bool ScriptLoader::fetchScript(const String& sourceUrl) | 249 bool ScriptLoader::fetchScript(const String& sourceUrl) |
| 252 { | 250 { |
| 253 ASSERT(m_element); | 251 ASSERT(m_element); |
| 254 | 252 |
| 255 RefPtr<Document> elementDocument(m_element->document()); | 253 RefPtr<Document> elementDocument(m_element->document()); |
| 256 if (!m_element->dispatchBeforeLoadEvent(sourceUrl)) | 254 if (!m_element->dispatchBeforeLoadEvent(sourceUrl)) |
| 257 return false; | 255 return false; |
| 258 if (!m_element->inDocument() || m_element->document() != elementDocument) | 256 if (!m_element->inDocument() || m_element->document() != elementDocument) |
| 259 return false; | 257 return false; |
| 260 | 258 |
| 261 ASSERT(!m_resource); | 259 ASSERT(!m_resource); |
| 262 if (!stripLeadingAndTrailingHTMLSpaces(sourceUrl).isEmpty()) { | 260 if (!stripLeadingAndTrailingHTMLSpaces(sourceUrl).isEmpty()) { |
| 263 FetchRequest request(ResourceRequest(elementDocument->completeURL(source
Url)), m_element->localName()); | 261 FetchRequest request(ResourceRequest(elementDocument->completeURL(source
Url)), m_element->localName()); |
| 264 | 262 |
| 265 String crossOriginMode = m_element->fastGetAttribute(HTMLNames::crossori
ginAttr); | 263 String crossOriginMode = m_element->fastGetAttribute(HTMLNames::crossori
ginAttr); |
| 266 if (!crossOriginMode.isNull()) { | 264 if (!crossOriginMode.isNull()) { |
| 267 StoredCredentials allowCredentials = equalIgnoringCase(crossOriginMo
de, "use-credentials") ? AllowStoredCredentials : DoNotAllowStoredCredentials; | 265 StoredCredentials allowCredentials = equalIgnoringCase(crossOriginMo
de, "use-credentials") ? AllowStoredCredentials : DoNotAllowStoredCredentials; |
| 268 request.setCrossOriginAccessControl(elementDocument->securityOrigin(
), allowCredentials); | 266 request.setCrossOriginAccessControl(elementDocument->securityOrigin(
), allowCredentials); |
| 269 m_isPotentiallyCORSEnabled = true; | |
| 270 } | 267 } |
| 271 request.setCharset(scriptCharset()); | 268 request.setCharset(scriptCharset()); |
| 272 | 269 |
| 273 bool isValidScriptNonce = elementDocument->contentSecurityPolicy()->allo
wScriptNonce(m_element->fastGetAttribute(HTMLNames::nonceAttr)); | 270 bool isValidScriptNonce = elementDocument->contentSecurityPolicy()->allo
wScriptNonce(m_element->fastGetAttribute(HTMLNames::nonceAttr)); |
| 274 if (isValidScriptNonce) | 271 if (isValidScriptNonce) |
| 275 request.setContentSecurityCheck(DoNotCheckContentSecurityPolicy); | 272 request.setContentSecurityCheck(DoNotCheckContentSecurityPolicy); |
| 276 | 273 |
| 277 m_resource = elementDocument->fetcher()->fetchScript(request); | 274 m_resource = elementDocument->fetcher()->fetchScript(request); |
| 278 m_isExternalScript = true; | 275 m_isExternalScript = true; |
| 279 } | 276 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 ASSERT(resource); | 353 ASSERT(resource); |
| 357 if (resource->errorOccurred()) { | 354 if (resource->errorOccurred()) { |
| 358 dispatchErrorEvent(); | 355 dispatchErrorEvent(); |
| 359 } else if (!resource->wasCanceled()) { | 356 } else if (!resource->wasCanceled()) { |
| 360 executeScript(ScriptSourceCode(resource)); | 357 executeScript(ScriptSourceCode(resource)); |
| 361 dispatchLoadEvent(); | 358 dispatchLoadEvent(); |
| 362 } | 359 } |
| 363 resource->removeClient(this); | 360 resource->removeClient(this); |
| 364 } | 361 } |
| 365 | 362 |
| 366 bool ScriptLoader::executePotentiallyCrossOriginScript(const ScriptSourceCode& s
ourceCode) | |
| 367 { | |
| 368 if (sourceCode.resource() | |
| 369 && isPotentiallyCORSEnabled() | |
| 370 && !m_element->document().fetcher()->canAccess(sourceCode.resource(), Po
tentiallyCORSEnabled)) { | |
| 371 dispatchErrorEvent(); | |
| 372 return false; | |
| 373 } | |
| 374 executeScript(sourceCode); | |
| 375 return true; | |
| 376 } | |
| 377 | |
| 378 void ScriptLoader::notifyFinished(Resource* resource) | 363 void ScriptLoader::notifyFinished(Resource* resource) |
| 379 { | 364 { |
| 380 ASSERT(!m_willBeParserExecuted); | 365 ASSERT(!m_willBeParserExecuted); |
| 381 | 366 |
| 382 RefPtr<Document> elementDocument(m_element->document()); | 367 RefPtr<Document> elementDocument(m_element->document()); |
| 383 RefPtr<Document> contextDocument = elementDocument->contextDocument().get(); | 368 RefPtr<Document> contextDocument = elementDocument->contextDocument().get(); |
| 384 if (!contextDocument) | 369 if (!contextDocument) |
| 385 return; | 370 return; |
| 386 | 371 |
| 387 // Resource possibly invokes this notifyFinished() more than | 372 // Resource possibly invokes this notifyFinished() more than |
| 388 // once because ScriptLoader doesn't unsubscribe itself from | 373 // once because ScriptLoader doesn't unsubscribe itself from |
| 389 // Resource here and does it in execute() instead. | 374 // Resource here and does it in execute() instead. |
| 390 // We use m_resource to check if this function is already called. | 375 // We use m_resource to check if this function is already called. |
| 391 ASSERT_UNUSED(resource, resource == m_resource); | 376 ASSERT_UNUSED(resource, resource == m_resource); |
| 392 if (!m_resource) | 377 if (!m_resource) |
| 393 return; | 378 return; |
| 394 CORSEnabled corsEnabled = isPotentiallyCORSEnabled() ? PotentiallyCORSEnable
d : NotCORSEnabled; | 379 if (m_resource->errorOccurred()) { |
| 395 if (!elementDocument->fetcher()->canAccess(m_resource.get(), corsEnabled)) { | |
| 396 dispatchErrorEvent(); | 380 dispatchErrorEvent(); |
| 397 contextDocument->scriptRunner()->notifyScriptLoadError(this, m_willExecu
teInOrder ? ScriptRunner::IN_ORDER_EXECUTION : ScriptRunner::ASYNC_EXECUTION); | 381 contextDocument->scriptRunner()->notifyScriptLoadError(this, m_willExecu
teInOrder ? ScriptRunner::IN_ORDER_EXECUTION : ScriptRunner::ASYNC_EXECUTION); |
| 398 return; | 382 return; |
| 399 } | 383 } |
| 400 | |
| 401 if (m_willExecuteInOrder) | 384 if (m_willExecuteInOrder) |
| 402 contextDocument->scriptRunner()->notifyScriptReady(this, ScriptRunner::I
N_ORDER_EXECUTION); | 385 contextDocument->scriptRunner()->notifyScriptReady(this, ScriptRunner::I
N_ORDER_EXECUTION); |
| 403 else | 386 else |
| 404 contextDocument->scriptRunner()->notifyScriptReady(this, ScriptRunner::A
SYNC_EXECUTION); | 387 contextDocument->scriptRunner()->notifyScriptReady(this, ScriptRunner::A
SYNC_EXECUTION); |
| 405 | 388 |
| 406 m_resource = 0; | 389 m_resource = 0; |
| 407 } | 390 } |
| 408 | 391 |
| 409 bool ScriptLoader::ignoresLoadRequest() const | 392 bool ScriptLoader::ignoresLoadRequest() const |
| 410 { | 393 { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 if (isHTMLScriptLoader(element)) | 432 if (isHTMLScriptLoader(element)) |
| 450 return toHTMLScriptElement(element)->loader(); | 433 return toHTMLScriptElement(element)->loader(); |
| 451 | 434 |
| 452 if (isSVGScriptLoader(element)) | 435 if (isSVGScriptLoader(element)) |
| 453 return toSVGScriptElement(element)->loader(); | 436 return toSVGScriptElement(element)->loader(); |
| 454 | 437 |
| 455 return 0; | 438 return 0; |
| 456 } | 439 } |
| 457 | 440 |
| 458 } | 441 } |
| OLD | NEW |