Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: Source/bindings/v8/ScriptPromiseResolver.cpp

Issue 26004002: Decouple ScriptPromise creation from ScriptPromiseResolver. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 24 matching lines...) Expand all
35 #include "bindings/v8/ScriptState.h" 35 #include "bindings/v8/ScriptState.h"
36 #include "bindings/v8/ScriptValue.h" 36 #include "bindings/v8/ScriptValue.h"
37 #include "bindings/v8/V8Binding.h" 37 #include "bindings/v8/V8Binding.h"
38 #include "bindings/v8/V8DOMWrapper.h" 38 #include "bindings/v8/V8DOMWrapper.h"
39 #include "bindings/v8/custom/V8PromiseCustom.h" 39 #include "bindings/v8/custom/V8PromiseCustom.h"
40 40
41 #include <v8.h> 41 #include <v8.h>
42 42
43 namespace WebCore { 43 namespace WebCore {
44 44
45 ScriptPromiseResolver::ScriptPromiseResolver(v8::Handle<v8::Object> creationCont ext, v8::Isolate* isolate) 45 ScriptPromiseResolver::ScriptPromiseResolver(ScriptPromise promise, v8::Isolate* isolate)
46 : m_isolate(isolate) 46 : m_isolate(isolate)
47 , m_promiseForExposeDetached(false) 47 , m_promise(promise)
48 , m_promiseForResolveDetached(false)
49 { 48 {
50 ASSERT(RuntimeEnabledFeatures::promiseEnabled()); 49 ASSERT(RuntimeEnabledFeatures::promiseEnabled());
51 v8::Local<v8::Object> promise = V8PromiseCustom::createPromise(creationConte xt, isolate);
52 m_promise = ScriptPromise(promise, isolate);
53 } 50 }
54 51
55 ScriptPromiseResolver::~ScriptPromiseResolver() 52 ScriptPromiseResolver::~ScriptPromiseResolver()
56 { 53 {
57 // We don't call "detach" here because it requires a caller 54 // We don't call "reject" here because it requires a caller
58 // to be in a v8 context. 55 // to be in a v8 context.
59 56
60 detachPromiseForExpose(); 57 m_promise.clear();
61 detachPromiseForResolve();
62 } 58 }
63 59
64 void ScriptPromiseResolver::detachPromise() 60 PassRefPtr<ScriptPromiseResolver> ScriptPromiseResolver::create(ScriptPromise pr omise, ExecutionContext* context)
65 {
66 detachPromiseForExpose();
67 }
68
69 void ScriptPromiseResolver::detachPromiseForExpose()
70 {
71 m_promiseForExposeDetached = true;
72 if (m_promiseForResolveDetached)
73 m_promise.clear();
74 }
75
76 void ScriptPromiseResolver::detachPromiseForResolve()
77 {
78 m_promiseForResolveDetached = true;
79 if (m_promiseForExposeDetached)
80 m_promise.clear();
81 }
82
83 PassRefPtr<ScriptPromiseResolver> ScriptPromiseResolver::create(ExecutionContext * context)
84 { 61 {
85 ASSERT(v8::Context::InContext()); 62 ASSERT(v8::Context::InContext());
86 ASSERT(context); 63 ASSERT(context);
87 return adoptRef(new ScriptPromiseResolver(toV8Context(context, DOMWrapperWor ld::current())->Global(), toIsolate(context))); 64 return adoptRef(new ScriptPromiseResolver(promise, toIsolate(context)));
88 } 65 }
89 66
90 PassRefPtr<ScriptPromiseResolver> ScriptPromiseResolver::create() 67 PassRefPtr<ScriptPromiseResolver> ScriptPromiseResolver::create(ScriptPromise pr omise)
91 { 68 {
92 ASSERT(v8::Context::InContext()); 69 ASSERT(v8::Context::InContext());
93 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 70 v8::Isolate* isolate = v8::Isolate::GetCurrent();
94 return adoptRef(new ScriptPromiseResolver(v8::Object::New(), isolate)); 71 return adoptRef(new ScriptPromiseResolver(promise, isolate));
95 } 72 }
96 73
97 bool ScriptPromiseResolver::isPending() const 74 bool ScriptPromiseResolver::isPending() const
98 { 75 {
99 ASSERT(v8::Context::InContext()); 76 ASSERT(v8::Context::InContext());
100 if (m_promiseForResolveDetached) 77 if (m_promise.hasNoValue())
101 return false; 78 return false;
102 ASSERT(!m_promise.hasNoValue());
103 v8::Local<v8::Object> promise = m_promise.v8Value().As<v8::Object>(); 79 v8::Local<v8::Object> promise = m_promise.v8Value().As<v8::Object>();
104 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); 80 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise);
105 V8PromiseCustom::PromiseState state = V8PromiseCustom::getState(internal); 81 V8PromiseCustom::PromiseState state = V8PromiseCustom::getState(internal);
106 return state == V8PromiseCustom::Pending; 82 return state == V8PromiseCustom::Pending;
107 } 83 }
108 84
109 void ScriptPromiseResolver::detach()
110 {
111 ASSERT(v8::Context::InContext());
112 detachPromiseForExpose();
113 reject(v8::Undefined(m_isolate));
114 detachPromiseForResolve();
115 }
116
117 void ScriptPromiseResolver::fulfill(v8::Handle<v8::Value> value)
118 {
119 resolve(value);
120 }
121
122 void ScriptPromiseResolver::resolve(v8::Handle<v8::Value> value) 85 void ScriptPromiseResolver::resolve(v8::Handle<v8::Value> value)
123 { 86 {
124 ASSERT(v8::Context::InContext()); 87 ASSERT(v8::Context::InContext());
125 if (!isPending()) 88 if (!isPending())
126 return; 89 return;
127 V8PromiseCustom::resolve(m_promise.v8Value().As<v8::Object>(), value, m_isol ate); 90 V8PromiseCustom::resolve(m_promise.v8Value().As<v8::Object>(), value, m_isol ate);
128 detachPromiseForResolve(); 91 m_promise.clear();
129 } 92 }
130 93
131 void ScriptPromiseResolver::reject(v8::Handle<v8::Value> value) 94 void ScriptPromiseResolver::reject(v8::Handle<v8::Value> value)
132 { 95 {
133 ASSERT(v8::Context::InContext()); 96 ASSERT(v8::Context::InContext());
134 if (!isPending()) 97 if (!isPending())
135 return; 98 return;
136 V8PromiseCustom::reject(m_promise.v8Value().As<v8::Object>(), value, m_isola te); 99 V8PromiseCustom::reject(m_promise.v8Value().As<v8::Object>(), value, m_isola te);
137 detachPromiseForResolve(); 100 m_promise.clear();
138 }
139
140 void ScriptPromiseResolver::fulfill(ScriptValue value)
141 {
142 resolve(value);
143 } 101 }
144 102
145 void ScriptPromiseResolver::resolve(ScriptValue value) 103 void ScriptPromiseResolver::resolve(ScriptValue value)
146 { 104 {
147 ASSERT(v8::Context::InContext()); 105 ASSERT(v8::Context::InContext());
148 resolve(value.v8Value()); 106 resolve(value.v8Value());
149 } 107 }
150 108
151 void ScriptPromiseResolver::reject(ScriptValue value) 109 void ScriptPromiseResolver::reject(ScriptValue value)
152 { 110 {
153 ASSERT(v8::Context::InContext()); 111 ASSERT(v8::Context::InContext());
154 reject(value.v8Value()); 112 reject(value.v8Value());
155 } 113 }
156 114
157 } // namespace WebCore 115 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698