Changeset 278543 in webkit
- Timestamp:
- Jun 6, 2021 9:22:38 PM (3 years ago)
- Location:
- trunk/Source
- Files:
-
- 1 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r278521 r278543 1 2021-06-06 Chris Dumez <cdumez@apple.com> 2 3 Stop using legacy EventLoopDeferrableTask 4 https://bugs.webkit.org/show_bug.cgi?id=226700 5 6 Reviewed by Darin Adler. 7 8 Introduce new WTF::CancellableTask type which is a wrapper around a WTF::Function. 9 It can create a handle for the task and this handle can be used to check if the 10 task is still pending and to cancel it. This is useful when scheduling tasks in the 11 event loop for example as there are cases where we need to know if a task we 12 scheduled is still pending (to avoid double scheduling) or where we need to cancel 13 a previously scheduled task. 14 15 * WTF.xcodeproj/project.pbxproj: 16 * wtf/CMakeLists.txt: 17 * wtf/CancellableTask.h: Added. 18 (WTF::CancellableTask::CancellableTask): 19 (WTF::CancellableTask::operator()): 20 (WTF::CancellableTask::isPending const): 21 (WTF::CancellableTask::cancel): 22 (WTF::CancellableTask::Handle::Handle): 23 (WTF::CancellableTask::Handle::isPending const): 24 (WTF::CancellableTask::Handle::cancel): 25 (WTF::CancellableTask::createHandle): 26 1 27 2021-06-04 Chris Dumez <cdumez@apple.com> 2 28 -
trunk/Source/WTF/WTF.xcodeproj/project.pbxproj
r278404 r278543 379 379 4427C5A921F6D6C300A612A4 /* ASCIICType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ASCIICType.cpp; sourceTree = "<group>"; }; 380 380 4468567225094FE8008CCA05 /* ThreadSanitizerSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadSanitizerSupport.h; sourceTree = "<group>"; }; 381 46209A27266D543A007F8F4A /* CancellableTask.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CancellableTask.h; sourceTree = "<group>"; }; 381 382 46BA9EAB1F4CD61E009A2BBC /* CompletionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompletionHandler.h; sourceTree = "<group>"; }; 382 383 46BEB6E922FFDDD500269867 /* RefCounted.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RefCounted.cpp; sourceTree = "<group>"; }; … … 654 655 A8A47323151A825B004123FF /* StringBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringBuffer.h; sourceTree = "<group>"; }; 655 656 A8A47324151A825B004123FF /* StringBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringBuilder.cpp; sourceTree = "<group>"; }; 657 A8A47325151A825B004123EE /* StringBuilderInternals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringBuilderInternals.h; sourceTree = "<group>"; }; 656 658 A8A47325151A825B004123FF /* StringBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringBuilder.h; sourceTree = "<group>"; }; 657 A8A47325151A825B004123EE /* StringBuilderInternals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringBuilderInternals.h; sourceTree = "<group>"; };658 659 A8A47326151A825B004123FF /* StringConcatenate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringConcatenate.h; sourceTree = "<group>"; }; 659 660 A8A47327151A825B004123FF /* StringHash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringHash.h; sourceTree = "<group>"; }; … … 984 985 0F5F3D681F3FEBA600B115A2 /* CagedUniquePtr.h */, 985 986 413FE8F51F8D2EAB00F6D7D7 /* CallbackAggregator.h */, 987 46209A27266D543A007F8F4A /* CancellableTask.h */, 986 988 A8A4726A151A825A004123FF /* CheckedArithmetic.h */, 987 989 A8A4726B151A825A004123FF /* CheckedBoolean.h */, -
trunk/Source/WTF/wtf/CMakeLists.txt
r278404 r278543 27 27 CagedUniquePtr.h 28 28 CallbackAggregator.h 29 CancellableTask.h 29 30 CheckedArithmetic.h 30 31 CheckedBoolean.h -
trunk/Source/WebCore/ChangeLog
r278542 r278543 1 2021-06-06 Chris Dumez <cdumez@apple.com> 2 3 Stop using legacy EventLoopDeferrableTask 4 https://bugs.webkit.org/show_bug.cgi?id=226700 5 6 Reviewed by Darin Adler. 7 8 Stop using legacy EventLoopDeferrableTask and drop the class entirely. Call sites are 9 now using the HTML event loop directly and using WTF::CancellableTask to wrap the task 10 they schedule. This achieves the same result as EventLoopDeferrableTask but is more 11 lightweight and flexible. 12 13 * animation/DocumentTimelinesController.cpp: 14 (WebCore::DocumentTimelinesController::DocumentTimelinesController): 15 (WebCore::DocumentTimelinesController::detachFromDocument): 16 (WebCore::DocumentTimelinesController::cacheCurrentTime): 17 * animation/DocumentTimelinesController.h: 18 * dom/ActiveDOMObject.h: 19 * html/HTMLMediaElement.cpp: 20 (WebCore::HTMLMediaElement::HTMLMediaElement): 21 (WebCore::HTMLMediaElement::~HTMLMediaElement): 22 (WebCore::HTMLMediaElement::scheduleCheckPlaybackTargetCompatability): 23 (WebCore::HTMLMediaElement::seekWithTolerance): 24 (WebCore::HTMLMediaElement::setVolume): 25 (WebCore::HTMLMediaElement::scheduleConfigureTextTracks): 26 (WebCore::HTMLMediaElement::scheduleMediaEngineWasUpdated): 27 (WebCore::HTMLMediaElement::scheduleUpdatePlayState): 28 (WebCore::HTMLMediaElement::cancelPendingTasks): 29 (WebCore::HTMLMediaElement::closeTaskQueues): 30 (WebCore::HTMLMediaElement::suspend): 31 (WebCore::HTMLMediaElement::resume): 32 (WebCore::HTMLMediaElement::markCaptionAndSubtitleTracksAsUnconfigured): 33 (WebCore::HTMLMediaElement::mediaPlayerBufferedTimeRangesChanged): 34 (WebCore::HTMLMediaElement::scheduleUpdateMediaState): 35 (WebCore::HTMLMediaElement::playbackControlsManagerBehaviorRestrictionsTimerFired): 36 * html/HTMLMediaElement.h: 37 * platform/DeferrableTask.h: 38 1 39 2021-06-06 Wenson Hsieh <wenson_hsieh@apple.com> 2 40 -
trunk/Source/WebCore/animation/DocumentTimelinesController.cpp
r278538 r278543 44 44 45 45 DocumentTimelinesController::DocumentTimelinesController(Document& document) 46 : m_currentTimeClearingTask(&document) 47 , m_document(document) 46 : m_document(document) 48 47 { 49 48 if (auto* page = document.page()) { … … 55 54 DocumentTimelinesController::~DocumentTimelinesController() 56 55 { 56 m_currentTimeClearingTask.cancel(); 57 57 } 58 58 … … 74 74 void DocumentTimelinesController::detachFromDocument() 75 75 { 76 m_currentTimeClearingTask.c lose();76 m_currentTimeClearingTask.cancel(); 77 77 78 78 while (!m_timelines.computesEmpty()) … … 234 234 // fire syncronously if no JS is running. 235 235 m_waitingOnVMIdle = true; 236 if (!m_currentTimeClearingTask.isPending()) 237 m_currentTimeClearingTask.scheduleTask(std::bind(&DocumentTimelinesController::maybeClearCachedCurrentTime, this)); 236 if (!m_currentTimeClearingTask.isPending()) { 237 CancellableTask task(std::bind(&DocumentTimelinesController::maybeClearCachedCurrentTime, this)); 238 m_currentTimeClearingTask = task.createHandle(); 239 m_document.eventLoop().queueTask(TaskSource::InternalAsyncTask, WTFMove(task)); 240 } 238 241 // We extent the associated Document's lifecycle until the VM became idle since the DocumentTimelinesController 239 242 // is owned by the Document. -
trunk/Source/WebCore/animation/DocumentTimelinesController.h
r278538 r278543 26 26 #pragma once 27 27 28 #include "DeferrableTask.h"29 28 #include "ReducedResolutionSeconds.h" 30 29 #include "Timer.h" 30 #include <wtf/CancellableTask.h> 31 31 #include <wtf/Markable.h> 32 32 #include <wtf/Seconds.h> … … 68 68 69 69 WeakHashSet<DocumentTimeline> m_timelines; 70 EventLoopDeferrableTaskm_currentTimeClearingTask;70 CancellableTask::Handle m_currentTimeClearingTask; 71 71 Document& m_document; 72 72 Markable<Seconds, Seconds::MarkableTraits> m_cachedCurrentTime; -
trunk/Source/WebCore/dom/ActiveDOMObject.h
r278372 r278543 30 30 #include "TaskSource.h" 31 31 #include <wtf/Assertions.h> 32 #include <wtf/CancellableTask.h> 32 33 #include <wtf/Forward.h> 33 34 #include <wtf/Function.h> … … 111 112 } 112 113 114 template<typename T> 115 static CancellableTask::Handle queueCancellableTaskKeepingObjectAlive(T& object, TaskSource source, Function<void()>&& task) 116 { 117 CancellableTask cancellableTask(WTFMove(task)); 118 auto taskHandle = cancellableTask.createHandle(); 119 object.queueTaskInEventLoop(source, [protectedObject = makeRef(object), activity = object.ActiveDOMObject::makePendingActivity(object), cancellableTask = WTFMove(cancellableTask)]() mutable { 120 cancellableTask(); 121 }); 122 return taskHandle; 123 } 124 113 125 template<typename EventTargetType, typename EventType> 114 126 static void queueTaskToDispatchEvent(EventTargetType& target, TaskSource source, Ref<EventType>&& event) -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r278538 r278543 395 395 , m_playbackControlsManagerBehaviorRestrictionsTimer(*this, &HTMLMediaElement::playbackControlsManagerBehaviorRestrictionsTimerFired) 396 396 , m_seekToPlaybackPositionEndedTimer(*this, &HTMLMediaElement::seekToPlaybackPositionEndedTimerFired) 397 , m_configureTextTracksTask(&document)398 , m_checkPlaybackTargetCompatibilityTask(&document)399 , m_updateMediaStateTask(&document)400 , m_mediaEngineUpdatedTask(&document)401 , m_updatePlayStateTask(&document)402 , m_resumeTask(&document)403 , m_seekTask(&document)404 , m_playbackControlsManagerBehaviorRestrictionsTask(&document)405 , m_bufferedTimeRangesChangedTask(&document)406 397 , m_resourceSelectionTaskQueue(&document) 407 398 , m_asyncEventQueue(EventLoopEventQueue::create(*this)) 408 #if PLATFORM(IOS_FAMILY)409 , m_volumeRevertTask(&document)410 #endif411 399 , m_lastTimeUpdateEventMovieTime(MediaTime::positiveInfiniteTime()) 412 400 , m_firstTimePlaying(true) … … 580 568 m_isolatedWorld->clearWrappers(); 581 569 582 m_seekTask.c lose();583 m_resumeTask.c lose();584 m_playbackControlsManagerBehaviorRestrictionsTask.c lose();570 m_seekTask.cancel(); 571 m_resumeTask.cancel(); 572 m_playbackControlsManagerBehaviorRestrictionsTask.cancel(); 585 573 m_resourceSelectionTaskQueue.close(); 586 574 … … 997 985 998 986 ALWAYS_LOG(LOGIDENTIFIER); 999 m_checkPlaybackTargetCompatibilityTask .scheduleTask([this] {987 m_checkPlaybackTargetCompatibilityTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this] { 1000 988 checkPlaybackTargetCompatibility(); 1001 989 }); … … 2976 2964 if (m_seekTask.isPending()) { 2977 2965 INFO_LOG(LOGIDENTIFIER, "cancelling pending seeks"); 2978 m_seekTask.cancel Task();2966 m_seekTask.cancel(); 2979 2967 if (m_pendingSeek) { 2980 2968 now = m_pendingSeek->now; … … 2998 2986 if (fromDOM) { 2999 2987 INFO_LOG(LOGIDENTIFIER, "enqueuing seek from ", now, " to ", time); 3000 m_seekTask .scheduleTask(std::bind(&HTMLMediaElement::seekTask, this));2988 m_seekTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, std::bind(&HTMLMediaElement::seekTask, this)); 3001 2989 } else 3002 2990 seekTask(); … … 3713 3701 return { }; 3714 3702 3715 m_volumeRevertTask .scheduleTask([this, oldVolume] {3703 m_volumeRevertTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, oldVolume] { 3716 3704 m_volume = oldVolume; 3717 3705 }); … … 4503 4491 auto logSiteIdentifier = LOGIDENTIFIER; 4504 4492 ALWAYS_LOG(logSiteIdentifier, "task scheduled"); 4505 m_configureTextTracksTask .scheduleTask([this, logSiteIdentifier] {4493 m_configureTextTracksTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, logSiteIdentifier] { 4506 4494 UNUSED_PARAM(logSiteIdentifier); 4507 4495 ALWAYS_LOG(logSiteIdentifier, "lambda(), task fired"); … … 5051 5039 auto logSiteIdentifier = LOGIDENTIFIER; 5052 5040 ALWAYS_LOG(logSiteIdentifier, "task scheduled"); 5053 m_mediaEngineUpdatedTask .scheduleTask([this, logSiteIdentifier] {5041 m_mediaEngineUpdatedTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, logSiteIdentifier] { 5054 5042 UNUSED_PARAM(logSiteIdentifier); 5055 5043 ALWAYS_LOG(logSiteIdentifier, "lambda(), task fired"); … … 5344 5332 auto logSiteIdentifier = LOGIDENTIFIER; 5345 5333 ALWAYS_LOG(logSiteIdentifier, "task scheduled"); 5346 m_updatePlayStateTask .scheduleTask([this, logSiteIdentifier] {5334 m_updatePlayStateTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, logSiteIdentifier] { 5347 5335 UNUSED_PARAM(logSiteIdentifier); 5348 5336 ALWAYS_LOG(logSiteIdentifier, "lambda(), task fired"); … … 5476 5464 void HTMLMediaElement::cancelPendingTasks() 5477 5465 { 5478 m_configureTextTracksTask.cancelTask(); 5479 m_checkPlaybackTargetCompatibilityTask.cancelTask(); 5480 m_updateMediaStateTask.cancelTask(); 5481 m_mediaEngineUpdatedTask.cancelTask(); 5482 m_updatePlayStateTask.cancelTask(); 5466 m_configureTextTracksTask.cancel(); 5467 m_checkPlaybackTargetCompatibilityTask.cancel(); 5468 m_updateMediaStateTask.cancel(); 5469 m_mediaEngineUpdatedTask.cancel(); 5470 m_updatePlayStateTask.cancel(); 5471 m_resumeTask.cancel(); 5472 m_seekTask.cancel(); 5473 m_playbackControlsManagerBehaviorRestrictionsTask.cancel(); 5483 5474 #if PLATFORM(IOS_FAMILY) 5484 m_volumeRevertTask.cancel Task();5475 m_volumeRevertTask.cancel(); 5485 5476 #endif 5486 5477 } … … 5638 5629 void HTMLMediaElement::closeTaskQueues() 5639 5630 { 5640 m_configureTextTracksTask.close(); 5641 m_checkPlaybackTargetCompatibilityTask.close(); 5642 m_updateMediaStateTask.close(); 5643 m_mediaEngineUpdatedTask.close(); 5644 m_updatePlayStateTask.close(); 5645 m_resumeTask.close(); 5646 m_seekTask.close(); 5647 m_playbackControlsManagerBehaviorRestrictionsTask.close(); 5648 m_seekTask.close(); 5649 m_resumeTask.close(); 5631 cancelPendingTasks(); 5650 5632 m_resourceSelectionTaskQueue.close(); 5651 5633 m_asyncEventQueue->close(); 5652 #if PLATFORM(IOS_FAMILY)5653 m_volumeRevertTask.close();5654 #endif5655 5634 } 5656 5635 … … 5686 5665 Ref<HTMLMediaElement> protectedThis(*this); 5687 5666 5688 m_resumeTask.cancel Task();5667 m_resumeTask.cancel(); 5689 5668 5690 5669 switch (reason) { … … 5725 5704 // This behavior is not specified but it seems like a sensible thing to do. 5726 5705 // As it is not safe to immedately start loading now, let's schedule a load. 5727 m_resumeTask .scheduleTask(std::bind(&HTMLMediaElement::prepareForLoad, this));5706 m_resumeTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, std::bind(&HTMLMediaElement::prepareForLoad, this)); 5728 5707 } 5729 5708 … … 6637 6616 6638 6617 m_processingPreferenceChange = true; 6639 m_configureTextTracksTask.cancel Task();6618 m_configureTextTracksTask.cancel(); 6640 6619 if (mode == Immediately) { 6641 6620 Ref<HTMLMediaElement> protectedThis(*this); // configureTextTracks calls methods that can trigger arbitrary DOM mutations. … … 7158 7137 auto logSiteIdentifier = LOGIDENTIFIER; 7159 7138 ALWAYS_LOG(logSiteIdentifier, "task scheduled"); 7160 m_bufferedTimeRangesChangedTask .scheduleTask([this, logSiteIdentifier] {7139 m_bufferedTimeRangesChangedTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, logSiteIdentifier] { 7161 7140 UNUSED_PARAM(logSiteIdentifier); 7162 7141 ALWAYS_LOG(logSiteIdentifier, "lambda(), task fired"); … … 7789 7768 auto logSiteIdentifier = LOGIDENTIFIER; 7790 7769 ALWAYS_LOG(logSiteIdentifier, "task scheduled"); 7791 m_updateMediaStateTask .scheduleTask([this, logSiteIdentifier] {7770 m_updateMediaStateTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, logSiteIdentifier] { 7792 7771 UNUSED_PARAM(logSiteIdentifier); 7793 7772 ALWAYS_LOG(logSiteIdentifier, "lambda(), task fired"); … … 8063 8042 return; 8064 8043 8065 RefPtr<HTMLMediaElement> protectedThis(this); 8066 m_playbackControlsManagerBehaviorRestrictionsTask.scheduleTask([protectedThis] () { 8067 auto& mediaElementSession = protectedThis->mediaSession(); 8068 if (protectedThis->isPlaying() || mediaElementSession.state() == PlatformMediaSession::Autoplaying || mediaElementSession.state() == PlatformMediaSession::Playing) 8044 m_playbackControlsManagerBehaviorRestrictionsTask = queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this] () { 8045 auto& mediaElementSession = mediaSession(); 8046 if (isPlaying() || mediaElementSession.state() == PlatformMediaSession::Autoplaying || mediaElementSession.state() == PlatformMediaSession::Playing) 8069 8047 return; 8070 8048 8071 8049 mediaElementSession.addBehaviorRestriction(MediaElementSession::RequirePlaybackToControlControlsManager); 8072 protectedThis->schedulePlaybackControlsManagerUpdate();8050 schedulePlaybackControlsManagerUpdate(); 8073 8051 }); 8074 8052 } -
trunk/Source/WebCore/html/HTMLMediaElement.h
r278538 r278543 32 32 #include "AutoplayEvent.h" 33 33 #include "CaptionUserPreferences.h" 34 #include "DeferrableTask.h"35 34 #include "EventLoopEventQueue.h" 36 35 #include "HTMLElement.h" … … 942 941 Timer m_playbackControlsManagerBehaviorRestrictionsTimer; 943 942 Timer m_seekToPlaybackPositionEndedTimer; 944 EventLoopDeferrableTaskm_configureTextTracksTask;945 EventLoopDeferrableTaskm_checkPlaybackTargetCompatibilityTask;946 EventLoopDeferrableTaskm_updateMediaStateTask;947 EventLoopDeferrableTaskm_mediaEngineUpdatedTask;948 EventLoopDeferrableTaskm_updatePlayStateTask;949 EventLoopDeferrableTaskm_resumeTask;950 EventLoopDeferrableTaskm_seekTask;951 EventLoopDeferrableTaskm_playbackControlsManagerBehaviorRestrictionsTask;952 EventLoopDeferrableTaskm_bufferedTimeRangesChangedTask;943 CancellableTask::Handle m_configureTextTracksTask; 944 CancellableTask::Handle m_checkPlaybackTargetCompatibilityTask; 945 CancellableTask::Handle m_updateMediaStateTask; 946 CancellableTask::Handle m_mediaEngineUpdatedTask; 947 CancellableTask::Handle m_updatePlayStateTask; 948 CancellableTask::Handle m_resumeTask; 949 CancellableTask::Handle m_seekTask; 950 CancellableTask::Handle m_playbackControlsManagerBehaviorRestrictionsTask; 951 CancellableTask::Handle m_bufferedTimeRangesChangedTask; 953 952 EventLoopTaskQueue m_resourceSelectionTaskQueue; 954 953 RefPtr<TimeRanges> m_playedTimeRanges; 955 954 UniqueRef<EventLoopEventQueue> m_asyncEventQueue; 956 955 #if PLATFORM(IOS_FAMILY) 957 EventLoopDeferrableTaskm_volumeRevertTask;956 CancellableTask::Handle m_volumeRevertTask; 958 957 #endif 959 958 -
trunk/Source/WebCore/platform/DeferrableTask.h
r278426 r278543 26 26 #pragma once 27 27 28 #include "ContextDestructionObserver.h"29 #include "EventLoop.h"30 28 #include "GenericTaskQueue.h" 31 #include "ScriptExecutionContext.h"32 29 33 30 namespace WebCore { 34 31 35 class DeferrableTaskBase : public CanMakeWeakPtr<DeferrableTaskBase> {32 class MainThreadDeferrableTask : public CanMakeWeakPtr<MainThreadDeferrableTask> { 36 33 public: 34 MainThreadDeferrableTask() = default; 35 37 36 void close() 38 37 { … … 49 48 bool isPending() const { return m_isPending; } 50 49 51 protected:52 ~DeferrableTaskBase() = default;53 bool isClosed() const { return m_isClosed; }54 void setIsPending(bool isPending) { m_isPending = isPending; }55 56 private:57 bool m_isPending { false };58 bool m_isClosed { false };59 };60 61 class MainThreadDeferrableTask : public DeferrableTaskBase {62 public:63 MainThreadDeferrableTask()64 : m_dispatcher()65 { }66 67 50 void scheduleTask(Function<void()>&& task) 68 51 { 69 if ( isClosed())52 if (m_isClosed) 70 53 return; 71 54 72 55 cancelTask(); 73 56 74 setIsPending(true);57 m_isPending = true; 75 58 m_dispatcher.postTask([weakThis = makeWeakPtr(*this), task = WTFMove(task)] { 76 59 if (!weakThis) 77 60 return; 78 61 ASSERT(weakThis->isPending()); 79 weakThis-> setIsPending(false);62 weakThis->m_isPending = false; 80 63 task(); 81 64 }); … … 84 67 private: 85 68 MainThreadTaskDispatcher m_dispatcher; 69 bool m_isPending { false }; 70 bool m_isClosed { false }; 86 71 }; 87 72 88 // Similar to DeferrableTask but based on the HTML event loop. 89 class EventLoopDeferrableTask : public DeferrableTaskBase, private ContextDestructionObserver { 90 public: 91 EventLoopDeferrableTask(ScriptExecutionContext* context) 92 : ContextDestructionObserver(context) 93 { } 94 95 // FIXME: Pass TaskSource instead of assuming TaskSource::MediaElement. 96 void scheduleTask(Function<void()>&& task) 97 { 98 if (isClosed() || !scriptExecutionContext()) 99 return; 100 101 cancelTask(); 102 103 setIsPending(true); 104 scriptExecutionContext()->eventLoop().queueTask(TaskSource::MediaElement, [weakThis = makeWeakPtr(*this), task = WTFMove(task)] { 105 if (!weakThis) 106 return; 107 ASSERT(weakThis->isPending()); 108 weakThis->setIsPending(false); 109 task(); 110 }); 111 } 112 }; 113 114 } 73 } // namespace WebCore
Note: See TracChangeset
for help on using the changeset viewer.