OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "bindings/v8/ScriptPromiseResolverWithContext.h" | 6 #include "bindings/v8/ScriptPromiseResolverWithContext.h" |
7 | 7 |
| 8 #include "bindings/v8/V8PerIsolateData.h" |
| 9 |
8 namespace WebCore { | 10 namespace WebCore { |
9 | 11 |
| 12 class ScriptPromiseResolverWithContext::RetainThis : public RefCounted<RetainThi
s> { |
| 13 public: |
| 14 static PassRefPtr<RetainThis> create(ScriptPromiseResolverWithContext* resol
ver) |
| 15 { |
| 16 return adoptRef(new RetainThis(resolver)); |
| 17 } |
| 18 |
| 19 private: |
| 20 RetainThis(ScriptPromiseResolverWithContext* resolver) : m_resolver(resolver
) { } |
| 21 RefPtr<ScriptPromiseResolverWithContext> m_resolver; |
| 22 }; |
| 23 |
10 ScriptPromiseResolverWithContext::ScriptPromiseResolverWithContext(NewScriptStat
e* scriptState) | 24 ScriptPromiseResolverWithContext::ScriptPromiseResolverWithContext(NewScriptStat
e* scriptState) |
11 : ActiveDOMObject(scriptState->executionContext()) | 25 : ActiveDOMObject(scriptState->executionContext()) |
12 , m_state(Pending) | 26 , m_state(Pending) |
13 , m_scriptState(scriptState) | 27 , m_scriptState(scriptState) |
14 , m_timer(this, &ScriptPromiseResolverWithContext::resolveOrRejectImmediatel
y) | 28 , m_timer(this, &ScriptPromiseResolverWithContext::onTimerFired) |
15 , m_resolver(ScriptPromiseResolver::create(m_scriptState->executionContext()
)) { } | 29 , m_resolver(ScriptPromiseResolver::create(m_scriptState->executionContext()
)) { } |
16 | 30 |
| 31 ScriptPromiseResolverWithContext::~ScriptPromiseResolverWithContext() |
| 32 { |
| 33 } |
| 34 |
17 void ScriptPromiseResolverWithContext::suspend() | 35 void ScriptPromiseResolverWithContext::suspend() |
18 { | 36 { |
19 m_timer.stop(); | 37 m_timer.stop(); |
20 } | 38 } |
21 | 39 |
22 void ScriptPromiseResolverWithContext::resume() | 40 void ScriptPromiseResolverWithContext::resume() |
23 { | 41 { |
24 if (m_state == Resolving || m_state == Rejecting) | 42 if (m_state == Resolving || m_state == Rejecting) |
25 m_timer.startOneShot(0, FROM_HERE); | 43 m_timer.startOneShot(0, FROM_HERE); |
26 } | 44 } |
27 | 45 |
28 void ScriptPromiseResolverWithContext::stop() | 46 void ScriptPromiseResolverWithContext::stop() |
29 { | 47 { |
30 m_timer.stop(); | 48 m_timer.stop(); |
31 clear(); | 49 clear(); |
32 } | 50 } |
33 | 51 |
34 void ScriptPromiseResolverWithContext::resolveOrRejectImmediately(Timer<ScriptPr
omiseResolverWithContext>*) | 52 void ScriptPromiseResolverWithContext::onTimerFired(Timer<ScriptPromiseResolverW
ithContext>*) |
| 53 { |
| 54 RefPtr<ScriptPromiseResolverWithContext> protect(this); |
| 55 NewScriptState::Scope scope(m_scriptState.get()); |
| 56 v8::Isolate* isolate = m_scriptState->isolate(); |
| 57 resolveOrRejectImmediately(); |
| 58 |
| 59 v8::V8::RunMicrotasks(isolate); |
| 60 } |
| 61 |
| 62 void ScriptPromiseResolverWithContext::resolveOrRejectImmediately() |
35 { | 63 { |
36 ASSERT(!executionContext()->activeDOMObjectsAreStopped()); | 64 ASSERT(!executionContext()->activeDOMObjectsAreStopped()); |
37 ASSERT(!executionContext()->activeDOMObjectsAreSuspended()); | 65 ASSERT(!executionContext()->activeDOMObjectsAreSuspended()); |
38 if (m_state == Resolving) { | 66 if (m_state == Resolving) { |
39 NewScriptState::Scope scope(m_scriptState.get()); | |
40 m_resolver->resolve(m_value.newLocal(m_scriptState->isolate())); | 67 m_resolver->resolve(m_value.newLocal(m_scriptState->isolate())); |
41 } else { | 68 } else { |
42 ASSERT(m_state == Rejecting); | 69 ASSERT(m_state == Rejecting); |
43 NewScriptState::Scope scope(m_scriptState.get()); | |
44 m_resolver->reject(m_value.newLocal(m_scriptState->isolate())); | 70 m_resolver->reject(m_value.newLocal(m_scriptState->isolate())); |
45 } | 71 } |
46 m_state = ResolvedOrRejected; | |
47 clear(); | 72 clear(); |
48 } | 73 } |
49 | 74 |
| 75 void ScriptPromiseResolverWithContext::retainThis() |
| 76 { |
| 77 // This creates a cyclic reference intentionally to keep this object |
| 78 // during waiting for the timer. |
| 79 // The reference will be cleared in clear(). |
| 80 m_retainThis = RetainThis::create(this); |
| 81 } |
| 82 |
50 void ScriptPromiseResolverWithContext::clear() | 83 void ScriptPromiseResolverWithContext::clear() |
51 { | 84 { |
| 85 m_state = ResolvedOrRejected; |
52 m_resolver.clear(); | 86 m_resolver.clear(); |
53 m_value.clear(); | 87 m_value.clear(); |
| 88 m_retainThis.clear(); |
| 89 // |this| may be deleted here. |
54 } | 90 } |
55 | 91 |
56 } // namespace WebCore | 92 } // namespace WebCore |
OLD | NEW |