OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 23 matching lines...) Expand all Loading... |
34 #include "RuntimeEnabledFeatures.h" | 34 #include "RuntimeEnabledFeatures.h" |
35 #include "bindings/v8/ScriptValue.h" | 35 #include "bindings/v8/ScriptValue.h" |
36 #include "bindings/v8/V8Binding.h" | 36 #include "bindings/v8/V8Binding.h" |
37 #include "bindings/v8/V8DOMWrapper.h" | 37 #include "bindings/v8/V8DOMWrapper.h" |
38 #include "bindings/v8/custom/V8PromiseCustom.h" | 38 #include "bindings/v8/custom/V8PromiseCustom.h" |
39 | 39 |
40 #include <v8.h> | 40 #include <v8.h> |
41 | 41 |
42 namespace WebCore { | 42 namespace WebCore { |
43 | 43 |
44 ScriptPromiseResolver::ScriptPromiseResolver(ExecutionContext* context) | 44 ScriptPromiseResolver::ScriptPromiseResolver(ScriptState* scriptState) |
45 : m_isolate(toIsolate(context)) | 45 : m_scriptState(scriptState) |
46 { | 46 { |
47 ASSERT(context); | 47 v8::Isolate* isolate = m_scriptState->isolate(); |
48 v8::Isolate* isolate = toIsolate(context); | 48 ASSERT(!m_scriptState->contextIsEmpty()); |
49 ASSERT(isolate->InContext()); | 49 ASSERT(isolate->InContext()); |
50 if (RuntimeEnabledFeatures::scriptPromiseOnV8PromiseEnabled()) { | 50 if (RuntimeEnabledFeatures::scriptPromiseOnV8PromiseEnabled()) { |
51 m_resolver = ScriptValue(v8::Promise::Resolver::New(isolate), isolate); | 51 m_resolver = ScriptValue(scriptState, v8::Promise::Resolver::New(isolate
)); |
52 } else { | 52 } else { |
53 v8::Handle<v8::Context> v8Context = toV8Context(context, DOMWrapperWorld
::current(isolate)); | 53 m_promise = ScriptPromise(scriptState, V8PromiseCustom::createPromise(m_
scriptState->context()->Global(), isolate)); |
54 v8::Handle<v8::Object> creationContext = v8Context.IsEmpty() ? v8::Objec
t::New(isolate) : v8Context->Global(); | |
55 m_promise = ScriptPromise(V8PromiseCustom::createPromise(creationContext
, isolate), isolate); | |
56 } | 54 } |
57 } | 55 } |
58 | 56 |
59 ScriptPromiseResolver::ScriptPromiseResolver(v8::Isolate* isolate) | |
60 : m_isolate(isolate) | |
61 { | |
62 ASSERT(isolate->InContext()); | |
63 if (RuntimeEnabledFeatures::scriptPromiseOnV8PromiseEnabled()) { | |
64 m_resolver = ScriptValue(v8::Promise::Resolver::New(isolate), isolate); | |
65 } else { | |
66 m_promise = ScriptPromise(V8PromiseCustom::createPromise(v8::Object::New
(isolate), isolate), isolate); | |
67 } | |
68 } | |
69 | |
70 ScriptPromiseResolver::~ScriptPromiseResolver() | 57 ScriptPromiseResolver::~ScriptPromiseResolver() |
71 { | 58 { |
72 // We don't call "reject" here because it requires a caller | 59 // We don't call "reject" here because it requires a caller |
73 // to be in a v8 context. | 60 // to be in a v8 context. |
74 | 61 |
75 m_promise.clear(); | 62 m_promise.clear(); |
76 m_resolver.clear(); | 63 m_resolver.clear(); |
77 } | 64 } |
78 | 65 |
79 ScriptPromise ScriptPromiseResolver::promise() | 66 ScriptPromise ScriptPromiseResolver::promise() |
80 { | 67 { |
81 ASSERT(m_isolate->InContext()); | 68 ASSERT(!m_scriptState->contextIsEmpty()); |
| 69 ASSERT(m_scriptState->isolate()->InContext()); |
82 if (!m_resolver.isEmpty()) { | 70 if (!m_resolver.isEmpty()) { |
83 v8::Local<v8::Promise::Resolver> v8Resolver = m_resolver.v8Value().As<v8
::Promise::Resolver>(); | 71 v8::Local<v8::Promise::Resolver> v8Resolver = m_resolver.v8Value().As<v8
::Promise::Resolver>(); |
84 return ScriptPromise(v8Resolver->GetPromise(), m_isolate); | 72 return ScriptPromise(m_scriptState.get(), v8Resolver->GetPromise()); |
85 } | 73 } |
86 return m_promise; | 74 return m_promise; |
87 } | 75 } |
88 | 76 |
89 PassRefPtr<ScriptPromiseResolver> ScriptPromiseResolver::create(ExecutionContext
* context) | 77 PassRefPtr<ScriptPromiseResolver> ScriptPromiseResolver::create(ScriptState* scr
iptState) |
90 { | 78 { |
91 ASSERT(context); | 79 ASSERT(scriptState->isolate()->InContext()); |
92 ASSERT(toIsolate(context)->InContext()); | 80 return adoptRef(new ScriptPromiseResolver(scriptState)); |
93 return adoptRef(new ScriptPromiseResolver(context)); | |
94 } | |
95 | |
96 PassRefPtr<ScriptPromiseResolver> ScriptPromiseResolver::create(v8::Isolate* iso
late) | |
97 { | |
98 ASSERT(isolate->InContext()); | |
99 return adoptRef(new ScriptPromiseResolver(isolate)); | |
100 } | 81 } |
101 | 82 |
102 void ScriptPromiseResolver::resolve(v8::Handle<v8::Value> value) | 83 void ScriptPromiseResolver::resolve(v8::Handle<v8::Value> value) |
103 { | 84 { |
104 ASSERT(m_isolate->InContext()); | 85 ASSERT(m_scriptState->isolate()->InContext()); |
105 if (!m_resolver.isEmpty()) { | 86 if (!m_resolver.isEmpty()) { |
106 m_resolver.v8Value().As<v8::Promise::Resolver>()->Resolve(value); | 87 m_resolver.v8Value().As<v8::Promise::Resolver>()->Resolve(value); |
107 } else if (!m_promise.isEmpty()) { | 88 } else if (!m_promise.isEmpty()) { |
108 v8::Local<v8::Object> promise = m_promise.v8Value().As<v8::Object>(); | 89 v8::Local<v8::Object> promise = m_promise.v8Value().As<v8::Object>(); |
109 ASSERT(V8PromiseCustom::isPromise(promise, m_isolate)); | 90 ASSERT(V8PromiseCustom::isPromise(promise, m_scriptState->isolate())); |
110 V8PromiseCustom::resolve(promise, value, m_isolate); | 91 V8PromiseCustom::resolve(promise, value, m_scriptState->isolate()); |
111 } | 92 } |
112 m_promise.clear(); | 93 m_promise.clear(); |
113 m_resolver.clear(); | 94 m_resolver.clear(); |
114 } | 95 } |
115 | 96 |
116 void ScriptPromiseResolver::reject(v8::Handle<v8::Value> value) | 97 void ScriptPromiseResolver::reject(v8::Handle<v8::Value> value) |
117 { | 98 { |
118 ASSERT(m_isolate->InContext()); | 99 ASSERT(m_scriptState->isolate()->InContext()); |
119 if (!m_resolver.isEmpty()) { | 100 if (!m_resolver.isEmpty()) { |
120 m_resolver.v8Value().As<v8::Promise::Resolver>()->Reject(value); | 101 m_resolver.v8Value().As<v8::Promise::Resolver>()->Reject(value); |
121 } else if (!m_promise.isEmpty()) { | 102 } else if (!m_promise.isEmpty()) { |
122 v8::Local<v8::Object> promise = m_promise.v8Value().As<v8::Object>(); | 103 v8::Local<v8::Object> promise = m_promise.v8Value().As<v8::Object>(); |
123 ASSERT(V8PromiseCustom::isPromise(promise, m_isolate)); | 104 ASSERT(V8PromiseCustom::isPromise(promise, m_scriptState->isolate())); |
124 V8PromiseCustom::reject(promise, value, m_isolate); | 105 V8PromiseCustom::reject(promise, value, m_scriptState->isolate()); |
125 } | 106 } |
126 m_promise.clear(); | 107 m_promise.clear(); |
127 m_resolver.clear(); | 108 m_resolver.clear(); |
128 } | 109 } |
129 | 110 |
130 } // namespace WebCore | 111 } // namespace WebCore |
OLD | NEW |