Index: Source/modules/webmidi/MIDIAccessInitializer.cpp |
diff --git a/Source/modules/webmidi/MIDIAccessInitializer.cpp b/Source/modules/webmidi/MIDIAccessInitializer.cpp |
index b1fda8518b9de403711e7e3cf868bc9992bff26a..19e7bcd18d8e1f4c35ae3582cfe29231b7ec1a60 100644 |
--- a/Source/modules/webmidi/MIDIAccessInitializer.cpp |
+++ b/Source/modules/webmidi/MIDIAccessInitializer.cpp |
@@ -20,6 +20,7 @@ namespace blink { |
MIDIAccessInitializer::MIDIAccessInitializer(ScriptState* scriptState, const MIDIOptions& options) |
: ScriptPromiseResolver(scriptState) |
, m_requestSysex(false) |
+ , m_hasBeenDisposed(false) |
{ |
#if ENABLE(OILPAN) |
// A prefinalizer has already been registered (as a LifecycleObserver); |
@@ -43,14 +44,27 @@ MIDIAccessInitializer::~MIDIAccessInitializer() |
#endif |
} |
+void MIDIAccessInitializer::contextDestroyed() |
+{ |
+ dispose(); |
+} |
+ |
void MIDIAccessInitializer::dispose() |
{ |
+ if (m_hasBeenDisposed) |
+ return; |
+ |
+ if (!executionContext()) |
+ return; |
+ |
// It is safe to cancel a request which is already finished or cancelled. |
Document* document = toDocument(executionContext()); |
ASSERT(document); |
if (MIDIController* controller = MIDIController::from(document->frame())) |
controller->cancelSysexPermissionRequest(this); |
+ m_hasBeenDisposed = true; |
+ |
#if ENABLE(OILPAN) |
// Delegate to LifecycleObserver's prefinalizer. |
LifecycleObserver::dispose(); |