Chromium Code Reviews| Index: third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.cpp |
| diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.cpp |
| index 383f23f3ab505995f8a3c309f5c4bedbc95a6e94..9617a9c46f2c454f75aa2d8f64c3c1fb247e93fd 100644 |
| --- a/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.cpp |
| +++ b/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.cpp |
| @@ -60,9 +60,6 @@ HTMLParserScheduler::HTMLParserScheduler(HTMLDocumentParser* parser, |
| WebTaskRunner* loadingTaskRunner) |
| : m_parser(parser), |
| m_loadingTaskRunner(loadingTaskRunner->clone()), |
| - m_cancellableContinueParse(CancellableTaskFactory::create( |
| - this, |
| - &HTMLParserScheduler::continueParsing)), |
| m_isSuspendedWithActiveTimer(false) {} |
| HTMLParserScheduler::~HTMLParserScheduler() {} |
| @@ -71,32 +68,39 @@ DEFINE_TRACE(HTMLParserScheduler) { |
| visitor->trace(m_parser); |
| } |
| +bool HTMLParserScheduler::isScheduledForResume() const { |
| + return m_isSuspendedWithActiveTimer || |
| + m_cancellableContinueParseTaskHandle.isActive(); |
| +} |
| + |
| void HTMLParserScheduler::scheduleForResume() { |
| - ASSERT(!m_isSuspendedWithActiveTimer); |
| - m_loadingTaskRunner->postTask(BLINK_FROM_HERE, |
| - m_cancellableContinueParse->cancelAndCreate()); |
| + DCHECK(!m_isSuspendedWithActiveTimer); |
| + // wrapWeakPersistent(this) is safe because a posted task is canceled when the |
| + // task handle is destroyed on the dtor of this HTMLParserScheduler. |
|
tzik
2016/11/17 06:20:15
ditto
nhiroki
2016/11/17 08:10:16
Done.
|
| + m_cancellableContinueParseTaskHandle = |
| + m_loadingTaskRunner->postCancellableTask( |
| + BLINK_FROM_HERE, WTF::bind(&HTMLParserScheduler::continueParsing, |
| + wrapWeakPersistent(this))); |
| } |
| void HTMLParserScheduler::suspend() { |
| - ASSERT(!m_isSuspendedWithActiveTimer); |
| - if (!m_cancellableContinueParse->isPending()) |
| + DCHECK(!m_isSuspendedWithActiveTimer); |
| + if (!m_cancellableContinueParseTaskHandle.isActive()) |
| return; |
| m_isSuspendedWithActiveTimer = true; |
| - m_cancellableContinueParse->cancel(); |
| + m_cancellableContinueParseTaskHandle.cancel(); |
| } |
| void HTMLParserScheduler::resume() { |
| - ASSERT(!m_cancellableContinueParse->isPending()); |
| + DCHECK(!m_cancellableContinueParseTaskHandle.isActive()); |
| if (!m_isSuspendedWithActiveTimer) |
| return; |
| m_isSuspendedWithActiveTimer = false; |
| - |
| - m_loadingTaskRunner->postTask(BLINK_FROM_HERE, |
| - m_cancellableContinueParse->cancelAndCreate()); |
| + scheduleForResume(); |
| } |
| void HTMLParserScheduler::detach() { |
| - m_cancellableContinueParse->cancel(); |
| + m_cancellableContinueParseTaskHandle.cancel(); |
| m_isSuspendedWithActiveTimer = false; |
| } |
| @@ -139,7 +143,7 @@ bool HTMLParserScheduler::yieldIfNeeded(const SpeculationsPumpSession& session, |
| } |
| void HTMLParserScheduler::forceResumeAfterYield() { |
| - ASSERT(!m_cancellableContinueParse->isPending()); |
| + DCHECK(!m_cancellableContinueParseTaskHandle.isActive()); |
| m_isSuspendedWithActiveTimer = true; |
| } |