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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 if (!resolver->executionContext() || resolver->executionContext()->activeDOM
ObjectsAreStopped()) | 57 if (!resolver->executionContext() || resolver->executionContext()->activeDOM
ObjectsAreStopped()) |
58 return; | 58 return; |
59 | 59 |
60 ScriptState::Scope scope(resolver->scriptState()); | 60 ScriptState::Scope scope(resolver->scriptState()); |
61 v8::Isolate* isolate = resolver->scriptState()->isolate(); | 61 v8::Isolate* isolate = resolver->scriptState()->isolate(); |
62 resolver->reject(v8::Exception::TypeError(v8String(isolate, errorDetails))); | 62 resolver->reject(v8::Exception::TypeError(v8String(isolate, errorDetails))); |
63 } | 63 } |
64 | 64 |
65 class CryptoResultImpl::Resolver final : public ScriptPromiseResolver { | 65 class CryptoResultImpl::Resolver final : public ScriptPromiseResolver { |
66 public: | 66 public: |
67 static PassRefPtrWillBeRawPtr<Resolver> create(ScriptState* scriptState, Cry
ptoResultImpl* result) | 67 static Resolver* create(ScriptState* scriptState, CryptoResultImpl* result) |
68 { | 68 { |
69 RefPtrWillBeRawPtr<Resolver> resolver = adoptRefWillBeNoop(new Resolver(
scriptState, result)); | 69 ASSERT(scriptState->contextIsValid()); |
| 70 Resolver* resolver = new Resolver(scriptState, result); |
70 resolver->suspendIfNeeded(); | 71 resolver->suspendIfNeeded(); |
71 resolver->keepAliveWhilePending(); | 72 resolver->keepAliveWhilePending(); |
72 return resolver.release(); | 73 return resolver; |
73 } | 74 } |
74 | 75 |
75 void stop() override | 76 void stop() override |
76 { | 77 { |
77 m_result->cancel(); | 78 m_result->cancel(); |
78 m_result = nullptr; | 79 m_result = nullptr; |
79 ScriptPromiseResolver::stop(); | 80 ScriptPromiseResolver::stop(); |
80 } | 81 } |
81 | 82 |
82 DEFINE_INLINE_VIRTUAL_TRACE() | 83 DEFINE_INLINE_VIRTUAL_TRACE() |
83 { | 84 { |
84 visitor->trace(m_result); | 85 visitor->trace(m_result); |
85 ScriptPromiseResolver::trace(visitor); | 86 ScriptPromiseResolver::trace(visitor); |
86 } | 87 } |
87 | 88 |
88 private: | 89 private: |
89 Resolver(ScriptState* scriptState, CryptoResultImpl* result) | 90 Resolver(ScriptState* scriptState, CryptoResultImpl* result) |
90 : ScriptPromiseResolver(scriptState) | 91 : ScriptPromiseResolver(scriptState) |
91 , m_result(result) { } | 92 , m_result(result) { } |
92 | 93 |
93 RefPtrWillBeMember<CryptoResultImpl> m_result; | 94 Member<CryptoResultImpl> m_result; |
94 }; | 95 }; |
95 | 96 |
96 CryptoResultImpl::ResultCancel::ResultCancel() | 97 CryptoResultImpl::ResultCancel::ResultCancel() |
97 : m_cancelled(0) | 98 : m_cancelled(0) |
98 { | 99 { |
99 } | 100 } |
100 | 101 |
101 bool CryptoResultImpl::ResultCancel::cancelled() const | 102 bool CryptoResultImpl::ResultCancel::cancelled() const |
102 { | 103 { |
103 return acquireLoad(&m_cancelled); | 104 return acquireLoad(&m_cancelled); |
(...skipping 19 matching lines...) Expand all Loading... |
123 return OperationError; | 124 return OperationError; |
124 case WebCryptoErrorTypeType: | 125 case WebCryptoErrorTypeType: |
125 return V8TypeError; | 126 return V8TypeError; |
126 } | 127 } |
127 | 128 |
128 ASSERT_NOT_REACHED(); | 129 ASSERT_NOT_REACHED(); |
129 return 0; | 130 return 0; |
130 } | 131 } |
131 | 132 |
132 CryptoResultImpl::CryptoResultImpl(ScriptState* scriptState) | 133 CryptoResultImpl::CryptoResultImpl(ScriptState* scriptState) |
133 : m_cancel(ResultCancel::create()) | 134 : m_resolver(Resolver::create(scriptState, this)) |
| 135 , m_cancel(ResultCancel::create()) |
134 { | 136 { |
135 ASSERT(scriptState->contextIsValid()); | 137 // Sync cancellation state. |
136 if (scriptState->executionContext()->activeDOMObjectsAreStopped()) { | 138 if (scriptState->executionContext()->activeDOMObjectsAreStopped()) |
137 // If active dom objects have been stopped, avoid creating | |
138 // CryptoResultImpl::Resolver. | |
139 m_resolver = nullptr; | |
140 m_cancel->cancel(); | 139 m_cancel->cancel(); |
141 return; | |
142 } | |
143 m_resolver = Resolver::create(scriptState, this).get(); | |
144 } | 140 } |
145 | 141 |
146 CryptoResultImpl::~CryptoResultImpl() | 142 CryptoResultImpl::~CryptoResultImpl() |
147 { | 143 { |
148 ASSERT(!m_resolver); | 144 ASSERT(!m_resolver); |
149 } | 145 } |
150 | 146 |
151 DEFINE_TRACE(CryptoResultImpl) | 147 DEFINE_TRACE(CryptoResultImpl) |
152 { | 148 { |
153 visitor->trace(m_resolver); | 149 visitor->trace(m_resolver); |
154 CryptoResult::trace(visitor); | 150 CryptoResult::trace(visitor); |
155 } | 151 } |
156 | 152 |
157 void CryptoResultImpl::clearResolver() | 153 void CryptoResultImpl::clearResolver() |
158 { | 154 { |
159 m_resolver = nullptr; | 155 m_resolver = nullptr; |
160 } | 156 } |
161 | 157 |
162 PassRefPtrWillBeRawPtr<CryptoResultImpl> CryptoResultImpl::create(ScriptState* s
criptState) | 158 CryptoResultImpl* CryptoResultImpl::create(ScriptState* scriptState) |
163 { | 159 { |
164 return adoptRefWillBeNoop(new CryptoResultImpl(scriptState)); | 160 return new CryptoResultImpl(scriptState); |
165 } | 161 } |
166 | 162 |
167 void CryptoResultImpl::completeWithError(WebCryptoErrorType errorType, const Web
String& errorDetails) | 163 void CryptoResultImpl::completeWithError(WebCryptoErrorType errorType, const Web
String& errorDetails) |
168 { | 164 { |
169 if (!m_resolver) | 165 if (!m_resolver) |
170 return; | 166 return; |
171 | 167 |
172 ExceptionCode ec = webCryptoErrorToExceptionCode(errorType); | 168 ExceptionCode ec = webCryptoErrorToExceptionCode(errorType); |
173 | 169 |
174 // Handle TypeError separately, as it cannot be created using | 170 // Handle TypeError separately, as it cannot be created using |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 m_cancel.clear(); | 246 m_cancel.clear(); |
251 clearResolver(); | 247 clearResolver(); |
252 } | 248 } |
253 | 249 |
254 ScriptPromise CryptoResultImpl::promise() | 250 ScriptPromise CryptoResultImpl::promise() |
255 { | 251 { |
256 return m_resolver ? m_resolver->promise() : ScriptPromise(); | 252 return m_resolver ? m_resolver->promise() : ScriptPromise(); |
257 } | 253 } |
258 | 254 |
259 } // namespace blink | 255 } // namespace blink |
OLD | NEW |