Changeset 205653 in webkit
- Timestamp:
- Sep 8, 2016 11:48:15 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 5 deleted
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r205652 r205653 1 2016-09-08 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r205652. 4 https://bugs.webkit.org/show_bug.cgi?id=161748 5 6 Crashing under ASan (Requested by yusukesuzuki on #webkit). 7 8 Reverted changeset: 9 10 "ScriptRunner should be driven by PendingScript rather than 11 ScriptElement" 12 https://bugs.webkit.org/show_bug.cgi?id=161726 13 http://trac.webkit.org/changeset/205652 14 1 15 2016-09-08 Yusuke Suzuki <utatane.tea@gmail.com> 2 16 -
trunk/Source/WebCore/ChangeLog
r205652 r205653 1 2016-09-08 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r205652. 4 https://bugs.webkit.org/show_bug.cgi?id=161748 5 6 Crashing under ASan (Requested by yusukesuzuki on #webkit). 7 8 Reverted changeset: 9 10 "ScriptRunner should be driven by PendingScript rather than 11 ScriptElement" 12 https://bugs.webkit.org/show_bug.cgi?id=161726 13 http://trac.webkit.org/changeset/205652 14 1 15 2016-09-08 Yusuke Suzuki <utatane.tea@gmail.com> 2 16 -
trunk/Source/WebCore/dom/ScriptElement.cpp
r205652 r205653 76 76 } 77 77 78 ScriptElement::~ScriptElement() 79 { 80 stopLoadRequest(); 81 } 82 78 83 bool ScriptElement::shouldCallFinishedInsertingSubtree(ContainerNode& insertionPoint) 79 84 { … … 241 246 m_willExecuteInOrder = true; 242 247 document.scriptRunner()->queueScriptForExecution(this, *m_loadableScript, ScriptRunner::IN_ORDER_EXECUTION); 248 m_loadableScript->addClient(*this); 243 249 } else if (hasSourceAttribute()) { 244 250 ASSERT(m_loadableScript); 245 251 m_element.document().scriptRunner()->queueScriptForExecution(this, *m_loadableScript, ScriptRunner::ASYNC_EXECUTION); 252 m_loadableScript->addClient(*this); 246 253 } else { 247 254 // Reset line numbering for nested writes. … … 330 337 } 331 338 339 void ScriptElement::stopLoadRequest() 340 { 341 if (m_loadableScript) { 342 if (!m_willBeParserExecuted) 343 m_loadableScript->removeClient(*this); 344 m_loadableScript = nullptr; 345 } 346 } 347 332 348 void ScriptElement::executeScriptAndDispatchEvent(LoadableScript& loadableScript) 333 349 { … … 343 359 } 344 360 345 void ScriptElement::executeScriptForScriptRunner(PendingScript& pendingScript) 346 { 361 void ScriptElement::executeScriptForScriptRunner(LoadableScript& loadableScript) 362 { 363 ASSERT(!m_willBeParserExecuted); 364 executeScriptAndDispatchEvent(loadableScript); 365 loadableScript.removeClient(*this); 366 } 367 368 void ScriptElement::executeScriptForHTMLScriptRunner(PendingScript& pendingScript) 369 { 370 IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer(&m_element.document()); 347 371 if (auto* loadableScript = pendingScript.loadableScript()) 348 372 executeScriptAndDispatchEvent(*loadableScript); … … 354 378 } 355 379 380 void ScriptElement::notifyFinished(LoadableScript&) 381 { 382 ASSERT(!m_willBeParserExecuted); 383 384 // LoadableScript possibly invokes this notifyFinished() more than 385 // once because ScriptElement doesn't unsubscribe itself from 386 // LoadableScript here and does it in execute() instead. 387 // We use m_loadableScript to check if this function is already called. 388 if (!m_loadableScript) 389 return; 390 391 if (m_willExecuteInOrder) 392 m_element.document().scriptRunner()->notifyScriptReady(this, ScriptRunner::IN_ORDER_EXECUTION); 393 else 394 m_element.document().scriptRunner()->notifyScriptReady(this, ScriptRunner::ASYNC_EXECUTION); 395 396 m_loadableScript = nullptr; 397 } 398 356 399 bool ScriptElement::ignoresLoadRequest() const 357 400 { -
trunk/Source/WebCore/dom/ScriptElement.h
r205652 r205653 39 39 class ScriptSourceCode; 40 40 41 class ScriptElement {41 class ScriptElement : private LoadableScriptClient { 42 42 public: 43 virtual ~ScriptElement() { }43 virtual ~ScriptElement(); 44 44 45 45 Element& element() { return m_element; } … … 53 53 void executeScript(const ScriptSourceCode&); 54 54 55 void executeScriptForScriptRunner(PendingScript&); 55 void executeScriptForScriptRunner(LoadableScript&); 56 void executeScriptForHTMLScriptRunner(PendingScript&); 56 57 57 58 // XML parser calls these … … 63 64 bool readyToBeParserExecuted() const { return m_readyToBeParserExecuted; } 64 65 bool willExecuteWhenDocumentFinishedParsing() const { return m_willExecuteWhenDocumentFinishedParsing; } 65 bool willExecuteInOrder() const { return m_willExecuteInOrder; }66 66 LoadableScript* loadableScript() { return m_loadableScript.get(); } 67 67 … … 93 93 94 94 bool requestClassicScript(const String& sourceURL); 95 void stopLoadRequest(); 96 97 void notifyFinished(LoadableScript&) override; 95 98 96 99 virtual String sourceAttributeValue() const = 0; -
trunk/Source/WebCore/dom/ScriptRunner.cpp
r205652 r205653 41 41 ScriptRunner::~ScriptRunner() 42 42 { 43 for (auto& pendingScript : m_scriptsToExecuteSoon) { 44 UNUSED_PARAM(pendingScript); 43 for (size_t i = 0; i < m_scriptsToExecuteSoon.size(); ++i) 45 44 m_document.decrementLoadEventDelayCount(); 46 } 47 for (auto& pendingScript : m_scriptsToExecuteInOrder) { 48 if (pendingScript->watchingForLoad()) 49 pendingScript->clearClient(); 45 for (size_t i = 0; i < m_scriptsToExecuteInOrder.size(); ++i) 50 46 m_document.decrementLoadEventDelayCount(); 51 } 52 for (auto& pendingScript : m_pendingAsyncScripts) { 53 if (pendingScript->watchingForLoad()) 54 const_cast<PendingScript&>(pendingScript.get()).clearClient(); 47 for (unsigned i = 0; i < m_pendingAsyncScripts.size(); ++i) 55 48 m_document.decrementLoadEventDelayCount(); 56 }57 49 } 58 50 … … 66 58 m_document.incrementLoadEventDelayCount(); 67 59 68 Ref<PendingScript> pendingScript = PendingScript::create(element, loadableScript);69 60 switch (executionType) { 70 61 case ASYNC_EXECUTION: 71 m_pendingAsyncScripts.add( pendingScript.copyRef());62 m_pendingAsyncScripts.add(scriptElement, PendingScript::create(element, loadableScript)); 72 63 break; 73 64 74 65 case IN_ORDER_EXECUTION: 75 m_scriptsToExecuteInOrder.append( pendingScript.copyRef());66 m_scriptsToExecuteInOrder.append(PendingScript::create(element, loadableScript)); 76 67 break; 77 68 } 78 pendingScript->setClient(this);79 69 } 80 70 … … 90 80 } 91 81 92 void ScriptRunner::notify Finished(PendingScript& pendingScript)82 void ScriptRunner::notifyScriptReady(ScriptElement* scriptElement, ExecutionType executionType) 93 83 { 94 auto* scriptElement = toScriptElementIfPossible(&pendingScript.element()); 95 ASSERT(scriptElement); 96 if (scriptElement->willExecuteInOrder()) 84 switch (executionType) { 85 case ASYNC_EXECUTION: 86 ASSERT(m_pendingAsyncScripts.contains(scriptElement)); 87 m_scriptsToExecuteSoon.append(m_pendingAsyncScripts.take(scriptElement)->ptr()); 88 break; 89 90 case IN_ORDER_EXECUTION: 97 91 ASSERT(!m_scriptsToExecuteInOrder.isEmpty()); 98 else { 99 ASSERT(m_pendingAsyncScripts.contains(pendingScript)); 100 m_scriptsToExecuteSoon.append(m_pendingAsyncScripts.take(pendingScript)->ptr()); 92 break; 101 93 } 102 pendingScript.clearClient();103 94 m_timer.startOneShot(0); 104 95 } … … 126 117 ASSERT(scriptElement); 127 118 ASSERT(script->needsLoading()); 128 scriptElement->executeScriptForScriptRunner(*script );119 scriptElement->executeScriptForScriptRunner(*script->loadableScript()); 129 120 m_document.decrementLoadEventDelayCount(); 130 121 } -
trunk/Source/WebCore/dom/ScriptRunner.h
r205652 r205653 26 26 #pragma once 27 27 28 #include "PendingScriptClient.h"29 28 #include "Timer.h" 30 #include <wtf/Hash Set.h>29 #include <wtf/HashMap.h> 31 30 #include <wtf/Noncopyable.h> 32 31 #include <wtf/Vector.h> … … 39 38 class LoadableScript; 40 39 41 class ScriptRunner : private PendingScriptClient{40 class ScriptRunner { 42 41 WTF_MAKE_NONCOPYABLE(ScriptRunner); WTF_MAKE_FAST_ALLOCATED; 43 42 public: … … 55 54 void timerFired(); 56 55 57 void notifyFinished(PendingScript&) override;58 59 56 Document& m_document; 60 57 Vector<Ref<PendingScript>> m_scriptsToExecuteInOrder; 61 58 Vector<RefPtr<PendingScript>> m_scriptsToExecuteSoon; // http://www.whatwg.org/specs/web-apps/current-work/#set-of-scripts-that-will-execute-as-soon-as-possible 62 Hash Set<Ref<PendingScript>> m_pendingAsyncScripts;59 HashMap<ScriptElement*, Ref<PendingScript>> m_pendingAsyncScripts; 63 60 Timer m_timer; 64 61 }; -
trunk/Source/WebCore/html/parser/HTMLScriptRunner.cpp
r205652 r205653 122 122 if (auto* scriptElement = toScriptElementIfPossible(&pendingScript->element())) { 123 123 NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); 124 scriptElement->executeScriptFor ScriptRunner(*pendingScript);124 scriptElement->executeScriptForHTMLScriptRunner(*pendingScript); 125 125 } 126 126 ASSERT(!isExecutingScript());
Note: See TracChangeset
for help on using the changeset viewer.