| 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 , m_forceAsync(!parserInserted) | 68 , m_forceAsync(!parserInserted) |
| 69 , m_willExecuteInOrder(false) | 69 , m_willExecuteInOrder(false) |
| 70 { | 70 { |
| 71 ASSERT(m_element); | 71 ASSERT(m_element); |
| 72 if (parserInserted && element->document().scriptableDocumentParser() && !ele
ment->document().isInDocumentWrite()) | 72 if (parserInserted && element->document().scriptableDocumentParser() && !ele
ment->document().isInDocumentWrite()) |
| 73 m_startLineNumber = element->document().scriptableDocumentParser()->line
Number(); | 73 m_startLineNumber = element->document().scriptableDocumentParser()->line
Number(); |
| 74 } | 74 } |
| 75 | 75 |
| 76 ScriptLoader::~ScriptLoader() | 76 ScriptLoader::~ScriptLoader() |
| 77 { | 77 { |
| 78 m_pendingScript.stopWatchingForLoad(this); | 78 stopLoadRequest(); |
| 79 } | 79 } |
| 80 | 80 |
| 81 void ScriptLoader::didNotifySubtreeInsertionsToDocument() | 81 void ScriptLoader::didNotifySubtreeInsertionsToDocument() |
| 82 { | 82 { |
| 83 if (!m_parserInserted) | 83 if (!m_parserInserted) |
| 84 prepareScript(); // FIXME: Provide a real starting line number here. | 84 prepareScript(); // FIXME: Provide a real starting line number here. |
| 85 } | 85 } |
| 86 | 86 |
| 87 void ScriptLoader::childrenChanged() | 87 void ScriptLoader::childrenChanged() |
| 88 { | 88 { |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 if (client->hasSourceAttribute() && client->deferAttributeValue() && m_parse
rInserted && !client->asyncAttributeValue()) { | 228 if (client->hasSourceAttribute() && client->deferAttributeValue() && m_parse
rInserted && !client->asyncAttributeValue()) { |
| 229 m_willExecuteWhenDocumentFinishedParsing = true; | 229 m_willExecuteWhenDocumentFinishedParsing = true; |
| 230 m_willBeParserExecuted = true; | 230 m_willBeParserExecuted = true; |
| 231 } else if (client->hasSourceAttribute() && m_parserInserted && !client->asyn
cAttributeValue()) { | 231 } else if (client->hasSourceAttribute() && m_parserInserted && !client->asyn
cAttributeValue()) { |
| 232 m_willBeParserExecuted = true; | 232 m_willBeParserExecuted = true; |
| 233 } else if (!client->hasSourceAttribute() && m_parserInserted && !elementDocu
ment.isRenderingReady()) { | 233 } else if (!client->hasSourceAttribute() && m_parserInserted && !elementDocu
ment.isRenderingReady()) { |
| 234 m_willBeParserExecuted = true; | 234 m_willBeParserExecuted = true; |
| 235 m_readyToBeParserExecuted = true; | 235 m_readyToBeParserExecuted = true; |
| 236 } else if (client->hasSourceAttribute() && !client->asyncAttributeValue() &&
!m_forceAsync) { | 236 } else if (client->hasSourceAttribute() && !client->asyncAttributeValue() &&
!m_forceAsync) { |
| 237 m_willExecuteInOrder = true; | 237 m_willExecuteInOrder = true; |
| 238 m_pendingScript = PendingScript(m_element, m_resource.get()); | 238 contextDocument->scriptRunner()->queueScriptForExecution(this, m_resourc
e, ScriptRunner::IN_ORDER_EXECUTION); |
| 239 contextDocument->scriptRunner()->queueScriptForExecution(this, ScriptRun
ner::IN_ORDER_EXECUTION); | 239 m_resource->addClient(this); |
| 240 // Note that watchForLoad can immediately call notifyFinished. | |
| 241 m_pendingScript.watchForLoad(this); | |
| 242 } else if (client->hasSourceAttribute()) { | 240 } else if (client->hasSourceAttribute()) { |
| 243 m_pendingScript = PendingScript(m_element, m_resource.get()); | 241 contextDocument->scriptRunner()->queueScriptForExecution(this, m_resourc
e, ScriptRunner::ASYNC_EXECUTION); |
| 244 contextDocument->scriptRunner()->queueScriptForExecution(this, ScriptRun
ner::ASYNC_EXECUTION); | 242 m_resource->addClient(this); |
| 245 // Note that watchForLoad can immediately call notifyFinished. | |
| 246 m_pendingScript.watchForLoad(this); | |
| 247 } else { | 243 } else { |
| 248 // Reset line numbering for nested writes. | 244 // Reset line numbering for nested writes. |
| 249 TextPosition position = elementDocument.isInDocumentWrite() ? TextPositi
on() : scriptStartPosition; | 245 TextPosition position = elementDocument.isInDocumentWrite() ? TextPositi
on() : scriptStartPosition; |
| 250 KURL scriptURL = (!elementDocument.isInDocumentWrite() && m_parserInsert
ed) ? elementDocument.url() : KURL(); | 246 KURL scriptURL = (!elementDocument.isInDocumentWrite() && m_parserInsert
ed) ? elementDocument.url() : KURL(); |
| 251 executeScript(ScriptSourceCode(scriptContent(), scriptURL, position)); | 247 executeScript(ScriptSourceCode(scriptContent(), scriptURL, position)); |
| 252 } | 248 } |
| 253 | 249 |
| 254 return true; | 250 return true; |
| 255 } | 251 } |
| 256 | 252 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 // block's source and the script block's type. | 349 // block's source and the script block's type. |
| 354 // Note: This is where the script is compiled and actually executed. | 350 // Note: This is where the script is compiled and actually executed. |
| 355 frame->script().executeScriptInMainWorld(sourceCode, corsCheck, compilationF
inishTime); | 351 frame->script().executeScriptInMainWorld(sourceCode, corsCheck, compilationF
inishTime); |
| 356 | 352 |
| 357 if (isHTMLScriptLoader(m_element)) { | 353 if (isHTMLScriptLoader(m_element)) { |
| 358 ASSERT(contextDocument->currentScript() == m_element); | 354 ASSERT(contextDocument->currentScript() == m_element); |
| 359 contextDocument->popCurrentScript(); | 355 contextDocument->popCurrentScript(); |
| 360 } | 356 } |
| 361 } | 357 } |
| 362 | 358 |
| 363 void ScriptLoader::execute() | 359 void ScriptLoader::stopLoadRequest() |
| 360 { |
| 361 if (m_resource) { |
| 362 if (!m_willBeParserExecuted) |
| 363 m_resource->removeClient(this); |
| 364 m_resource = 0; |
| 365 } |
| 366 } |
| 367 |
| 368 void ScriptLoader::execute(ScriptResource* resource) |
| 364 { | 369 { |
| 365 ASSERT(!m_willBeParserExecuted); | 370 ASSERT(!m_willBeParserExecuted); |
| 366 ASSERT(m_pendingScript.resource()); | 371 ASSERT(resource); |
| 367 bool errorOccurred = false; | 372 if (resource->errorOccurred()) { |
| 368 ScriptSourceCode source = m_pendingScript.getSource(KURL(), errorOccurred); | |
| 369 RefPtr<Element> element = m_pendingScript.releaseElementAndClear(); | |
| 370 if (errorOccurred) { | |
| 371 dispatchErrorEvent(); | 373 dispatchErrorEvent(); |
| 372 } else if (!m_resource->wasCanceled()) { | 374 } else if (!resource->wasCanceled()) { |
| 373 executeScript(source); | 375 executeScript(ScriptSourceCode(resource)); |
| 374 dispatchLoadEvent(); | 376 dispatchLoadEvent(); |
| 375 } | 377 } |
| 376 m_resource = 0; | 378 resource->removeClient(this); |
| 377 } | 379 } |
| 378 | 380 |
| 379 void ScriptLoader::notifyFinished(Resource* resource) | 381 void ScriptLoader::notifyFinished(Resource* resource) |
| 380 { | 382 { |
| 381 ASSERT(!m_willBeParserExecuted); | 383 ASSERT(!m_willBeParserExecuted); |
| 382 | 384 |
| 383 RefPtrWillBeRawPtr<Document> elementDocument(m_element->document()); | 385 RefPtrWillBeRawPtr<Document> elementDocument(m_element->document()); |
| 384 RefPtrWillBeRawPtr<Document> contextDocument = elementDocument->contextDocum
ent().get(); | 386 RefPtrWillBeRawPtr<Document> contextDocument = elementDocument->contextDocum
ent().get(); |
| 385 if (!contextDocument) | 387 if (!contextDocument) |
| 386 return; | 388 return; |
| 387 | 389 |
| 390 // Resource possibly invokes this notifyFinished() more than |
| 391 // once because ScriptLoader doesn't unsubscribe itself from |
| 392 // Resource here and does it in execute() instead. |
| 393 // We use m_resource to check if this function is already called. |
| 388 ASSERT_UNUSED(resource, resource == m_resource); | 394 ASSERT_UNUSED(resource, resource == m_resource); |
| 389 | 395 if (!m_resource) |
| 396 return; |
| 390 if (m_resource->errorOccurred()) { | 397 if (m_resource->errorOccurred()) { |
| 391 dispatchErrorEvent(); | 398 dispatchErrorEvent(); |
| 392 contextDocument->scriptRunner()->notifyScriptLoadError(this, m_willExecu
teInOrder ? ScriptRunner::IN_ORDER_EXECUTION : ScriptRunner::ASYNC_EXECUTION); | 399 contextDocument->scriptRunner()->notifyScriptLoadError(this, m_willExecu
teInOrder ? ScriptRunner::IN_ORDER_EXECUTION : ScriptRunner::ASYNC_EXECUTION); |
| 393 return; | 400 return; |
| 394 } | 401 } |
| 395 if (m_willExecuteInOrder) | 402 if (m_willExecuteInOrder) |
| 396 contextDocument->scriptRunner()->notifyScriptReady(this, ScriptRunner::I
N_ORDER_EXECUTION); | 403 contextDocument->scriptRunner()->notifyScriptReady(this, ScriptRunner::I
N_ORDER_EXECUTION); |
| 397 else | 404 else |
| 398 contextDocument->scriptRunner()->notifyScriptReady(this, ScriptRunner::A
SYNC_EXECUTION); | 405 contextDocument->scriptRunner()->notifyScriptReady(this, ScriptRunner::A
SYNC_EXECUTION); |
| 399 | 406 |
| 400 m_pendingScript.stopWatchingForLoad(this); | 407 m_resource = 0; |
| 401 } | 408 } |
| 402 | 409 |
| 403 bool ScriptLoader::ignoresLoadRequest() const | 410 bool ScriptLoader::ignoresLoadRequest() const |
| 404 { | 411 { |
| 405 return m_alreadyStarted || m_isExternalScript || m_parserInserted || !elemen
t() || !element()->inDocument(); | 412 return m_alreadyStarted || m_isExternalScript || m_parserInserted || !elemen
t() || !element()->inDocument(); |
| 406 } | 413 } |
| 407 | 414 |
| 408 bool ScriptLoader::isScriptForEventSupported() const | 415 bool ScriptLoader::isScriptForEventSupported() const |
| 409 { | 416 { |
| 410 String eventAttribute = client()->eventAttributeValue(); | 417 String eventAttribute = client()->eventAttributeValue(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 if (isHTMLScriptLoader(element)) | 450 if (isHTMLScriptLoader(element)) |
| 444 return toHTMLScriptElement(element)->loader(); | 451 return toHTMLScriptElement(element)->loader(); |
| 445 | 452 |
| 446 if (isSVGScriptLoader(element)) | 453 if (isSVGScriptLoader(element)) |
| 447 return toSVGScriptElement(element)->loader(); | 454 return toSVGScriptElement(element)->loader(); |
| 448 | 455 |
| 449 return 0; | 456 return 0; |
| 450 } | 457 } |
| 451 | 458 |
| 452 } | 459 } |
| OLD | NEW |