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

Side by Side Diff: Source/modules/imagebitmap/ImageBitmapFactories.cpp

Issue 273683006: ScriptPromise should understand the ScriptState from which the ScriptPromise is generated (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 7 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 | Annotate | Revision Log
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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 return IntSize(); 58 return IntSize();
59 } 59 }
60 60
61 static IntSize sizeFor(HTMLVideoElement* video) 61 static IntSize sizeFor(HTMLVideoElement* video)
62 { 62 {
63 if (MediaPlayer* player = video->player()) 63 if (MediaPlayer* player = video->player())
64 return player->naturalSize(); 64 return player->naturalSize();
65 return IntSize(); 65 return IntSize();
66 } 66 }
67 67
68 static ScriptPromise fulfillImageBitmap(ExecutionContext* context, PassRefPtrWil lBeRawPtr<ImageBitmap> imageBitmap) 68 static ScriptPromise fulfillImageBitmap(ScriptState* scriptState, PassRefPtrWill BeRawPtr<ImageBitmap> imageBitmap)
69 { 69 {
70 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(conte xt); 70 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
71 ScriptPromise promise = resolver->promise(); 71 ScriptPromise promise = resolver->promise();
72 if (imageBitmap) { 72 if (imageBitmap) {
73 resolver->resolve(imageBitmap); 73 resolver->resolve(imageBitmap);
74 } else { 74 } else {
75 resolver->reject(ScriptValue(v8::Null(toIsolate(context)), toIsolate(con text))); 75 resolver->reject(ScriptValue(v8::Null(scriptState->isolate()), scriptSta te->isolate()));
76 } 76 }
77 return promise; 77 return promise;
78 } 78 }
79 79
80 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, HTMLImageElement* image, ExceptionState& exceptionState) 80 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, HTMLImageElement* image, ExceptionState& exceptionStat e)
81 { 81 {
82 LayoutSize s = sizeFor(image); 82 LayoutSize s = sizeFor(image);
83 return createImageBitmap(eventTarget, image, 0, 0, s.width(), s.height(), ex ceptionState); 83 return createImageBitmap(scriptState, eventTarget, image, 0, 0, s.width(), s .height(), exceptionState);
84 } 84 }
85 85
86 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, HTMLImageElement* image, int sx, int sy, int sw, int sh, ExceptionState& excepti onState) 86 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, HTMLImageElement* image, int sx, int sy, int sw, int s h, ExceptionState& exceptionState)
87 { 87 {
88 // This variant does not work in worker threads. 88 // This variant does not work in worker threads.
89 ASSERT(eventTarget.toDOMWindow()); 89 ASSERT(eventTarget.toDOMWindow());
90 90
91 if (!image->cachedImage()) { 91 if (!image->cachedImage()) {
92 exceptionState.throwDOMException(InvalidStateError, "No image can be ret rieved from the provided element."); 92 exceptionState.throwDOMException(InvalidStateError, "No image can be ret rieved from the provided element.");
93 return ScriptPromise(); 93 return ScriptPromise();
94 } 94 }
95 if (image->cachedImage()->image()->isSVGImage()) { 95 if (image->cachedImage()->image()->isSVGImage()) {
96 exceptionState.throwDOMException(InvalidStateError, "The image element c ontains an SVG image, which is unsupported."); 96 exceptionState.throwDOMException(InvalidStateError, "The image element c ontains an SVG image, which is unsupported.");
97 return ScriptPromise(); 97 return ScriptPromise();
98 } 98 }
99 if (!sw || !sh) { 99 if (!sw || !sh) {
100 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width")); 100 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width"));
101 return ScriptPromise(); 101 return ScriptPromise();
102 } 102 }
103 if (!image->cachedImage()->image()->currentFrameHasSingleSecurityOrigin()) { 103 if (!image->cachedImage()->image()->currentFrameHasSingleSecurityOrigin()) {
104 exceptionState.throwSecurityError("The source image contains image data from multiple origins."); 104 exceptionState.throwSecurityError("The source image contains image data from multiple origins.");
105 return ScriptPromise(); 105 return ScriptPromise();
106 } 106 }
107 if (!image->cachedImage()->passesAccessControlCheck(eventTarget.toDOMWindow( )->document()->securityOrigin()) && eventTarget.toDOMWindow()->document()->secur ityOrigin()->taintsCanvas(image->src())) { 107 if (!image->cachedImage()->passesAccessControlCheck(eventTarget.toDOMWindow( )->document()->securityOrigin()) && eventTarget.toDOMWindow()->document()->secur ityOrigin()->taintsCanvas(image->src())) {
108 exceptionState.throwSecurityError("Cross-origin access to the source ima ge is denied."); 108 exceptionState.throwSecurityError("Cross-origin access to the source ima ge is denied.");
109 return ScriptPromise(); 109 return ScriptPromise();
110 } 110 }
111 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082 111 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
112 return fulfillImageBitmap(eventTarget.executionContext(), ImageBitmap::creat e(image, IntRect(sx, sy, sw, sh))); 112 return fulfillImageBitmap(scriptState, ImageBitmap::create(image, IntRect(sx , sy, sw, sh)));
113 } 113 }
114 114
115 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, HTMLVideoElement* video, ExceptionState& exceptionState) 115 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, HTMLVideoElement* video, ExceptionState& exceptionStat e)
116 { 116 {
117 IntSize s = sizeFor(video); 117 IntSize s = sizeFor(video);
118 return createImageBitmap(eventTarget, video, 0, 0, s.width(), s.height(), ex ceptionState); 118 return createImageBitmap(scriptState, eventTarget, video, 0, 0, s.width(), s .height(), exceptionState);
119 } 119 }
120 120
121 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, HTMLVideoElement* video, int sx, int sy, int sw, int sh, ExceptionState& excepti onState) 121 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, HTMLVideoElement* video, int sx, int sy, int sw, int s h, ExceptionState& exceptionState)
122 { 122 {
123 // This variant does not work in worker threads. 123 // This variant does not work in worker threads.
124 ASSERT(eventTarget.toDOMWindow()); 124 ASSERT(eventTarget.toDOMWindow());
125 125
126 if (!video->player()) { 126 if (!video->player()) {
127 exceptionState.throwDOMException(InvalidStateError, "No player can be re trieved from the provided video element."); 127 exceptionState.throwDOMException(InvalidStateError, "No player can be re trieved from the provided video element.");
128 return ScriptPromise(); 128 return ScriptPromise();
129 } 129 }
130 if (video->networkState() == HTMLMediaElement::NETWORK_EMPTY) { 130 if (video->networkState() == HTMLMediaElement::NETWORK_EMPTY) {
131 exceptionState.throwDOMException(InvalidStateError, "The provided elemen t has not retrieved data."); 131 exceptionState.throwDOMException(InvalidStateError, "The provided elemen t has not retrieved data.");
132 return ScriptPromise(); 132 return ScriptPromise();
133 } 133 }
134 if (video->player()->readyState() <= MediaPlayer::HaveMetadata) { 134 if (video->player()->readyState() <= MediaPlayer::HaveMetadata) {
135 exceptionState.throwDOMException(InvalidStateError, "The provided elemen t's player has no current data."); 135 exceptionState.throwDOMException(InvalidStateError, "The provided elemen t's player has no current data.");
136 return ScriptPromise(); 136 return ScriptPromise();
137 } 137 }
138 if (!sw || !sh) { 138 if (!sw || !sh) {
139 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width")); 139 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width"));
140 return ScriptPromise(); 140 return ScriptPromise();
141 } 141 }
142 if (!video->hasSingleSecurityOrigin()) { 142 if (!video->hasSingleSecurityOrigin()) {
143 exceptionState.throwSecurityError("The source video contains image data from multiple origins."); 143 exceptionState.throwSecurityError("The source video contains image data from multiple origins.");
144 return ScriptPromise(); 144 return ScriptPromise();
145 } 145 }
146 if (!video->player()->didPassCORSAccessCheck() && eventTarget.toDOMWindow()- >document()->securityOrigin()->taintsCanvas(video->currentSrc())) { 146 if (!video->player()->didPassCORSAccessCheck() && eventTarget.toDOMWindow()- >document()->securityOrigin()->taintsCanvas(video->currentSrc())) {
147 exceptionState.throwSecurityError("Cross-origin access to the source vid eo is denied."); 147 exceptionState.throwSecurityError("Cross-origin access to the source vid eo is denied.");
148 return ScriptPromise(); 148 return ScriptPromise();
149 } 149 }
150 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082 150 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
151 return fulfillImageBitmap(eventTarget.executionContext(), ImageBitmap::creat e(video, IntRect(sx, sy, sw, sh))); 151 return fulfillImageBitmap(scriptState, ImageBitmap::create(video, IntRect(sx , sy, sw, sh)));
152 } 152 }
153 153
154 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, CanvasRenderingContext2D* context, ExceptionState& exceptionState) 154 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, CanvasRenderingContext2D* context, ExceptionState& exc eptionState)
155 { 155 {
156 return createImageBitmap(eventTarget, context->canvas(), exceptionState); 156 return createImageBitmap(scriptState, eventTarget, context->canvas(), except ionState);
157 } 157 }
158 158
159 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, CanvasRenderingContext2D* context, int sx, int sy, int sw, int sh, ExceptionStat e& exceptionState) 159 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, CanvasRenderingContext2D* context, int sx, int sy, int sw, int sh, ExceptionState& exceptionState)
160 { 160 {
161 return createImageBitmap(eventTarget, context->canvas(), sx, sy, sw, sh, exc eptionState); 161 return createImageBitmap(scriptState, eventTarget, context->canvas(), sx, sy , sw, sh, exceptionState);
162 } 162 }
163 163
164 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, HTMLCanvasElement* canvas, ExceptionState& exceptionState) 164 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, HTMLCanvasElement* canvas, ExceptionState& exceptionSt ate)
165 { 165 {
166 return createImageBitmap(eventTarget, canvas, 0, 0, canvas->width(), canvas- >height(), exceptionState); 166 return createImageBitmap(scriptState, eventTarget, canvas, 0, 0, canvas->wid th(), canvas->height(), exceptionState);
167 } 167 }
168 168
169 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, HTMLCanvasElement* canvas, int sx, int sy, int sw, int sh, ExceptionState& excep tionState) 169 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, HTMLCanvasElement* canvas, int sx, int sy, int sw, int sh, ExceptionState& exceptionState)
170 { 170 {
171 // This variant does not work in worker threads. 171 // This variant does not work in worker threads.
172 ASSERT(eventTarget.toDOMWindow()); 172 ASSERT(eventTarget.toDOMWindow());
173 173
174 if (!canvas->originClean()) { 174 if (!canvas->originClean()) {
175 exceptionState.throwSecurityError("The canvas element provided is tainte d with cross-origin data."); 175 exceptionState.throwSecurityError("The canvas element provided is tainte d with cross-origin data.");
176 return ScriptPromise(); 176 return ScriptPromise();
177 } 177 }
178 if (!sw || !sh) { 178 if (!sw || !sh) {
179 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width")); 179 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width"));
180 return ScriptPromise(); 180 return ScriptPromise();
181 } 181 }
182 182
183 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082 183 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
184 return fulfillImageBitmap(eventTarget.executionContext(), canvas->buffer() ? ImageBitmap::create(canvas, IntRect(sx, sy, sw, sh)) : nullptr); 184 return fulfillImageBitmap(scriptState, canvas->buffer() ? ImageBitmap::creat e(canvas, IntRect(sx, sy, sw, sh)) : nullptr);
185 } 185 }
186 186
187 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, Blob* blob, ExceptionState& exceptionState) 187 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, Blob* blob, ExceptionState& exceptionState)
188 { 188 {
189 RefPtrWillBeRawPtr<ImageBitmapLoader> loader = ImageBitmapFactories::ImageBi tmapLoader::create(from(eventTarget), eventTarget.executionContext(), IntRect()) ; 189 RefPtrWillBeRawPtr<ImageBitmapLoader> loader = ImageBitmapFactories::ImageBi tmapLoader::create(from(eventTarget), eventTarget.executionContext(), IntRect()) ;
190 ScriptPromise promise = loader->promise(); 190 ScriptPromise promise = loader->promise();
191 from(eventTarget).addLoader(loader); 191 from(eventTarget).addLoader(loader);
192 loader->loadBlobAsync(eventTarget.executionContext(), blob); 192 loader->loadBlobAsync(eventTarget.executionContext(), blob);
193 return promise; 193 return promise;
194 } 194 }
195 195
196 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, Blob* blob, int sx, int sy, int sw, int sh, ExceptionState& exceptionState) 196 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, Blob* blob, int sx, int sy, int sw, int sh, ExceptionS tate& exceptionState)
197 { 197 {
198 if (!sw || !sh) { 198 if (!sw || !sh) {
199 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width")); 199 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width"));
200 return ScriptPromise(); 200 return ScriptPromise();
201 } 201 }
202 RefPtrWillBeRawPtr<ImageBitmapLoader> loader = ImageBitmapFactories::ImageBi tmapLoader::create(from(eventTarget), eventTarget.executionContext(), IntRect(sx , sy, sw, sh)); 202 RefPtrWillBeRawPtr<ImageBitmapLoader> loader = ImageBitmapFactories::ImageBi tmapLoader::create(from(eventTarget), eventTarget.executionContext(), IntRect(sx , sy, sw, sh));
203 ScriptPromise promise = loader->promise(); 203 ScriptPromise promise = loader->promise();
204 from(eventTarget).addLoader(loader); 204 from(eventTarget).addLoader(loader);
205 loader->loadBlobAsync(eventTarget.executionContext(), blob); 205 loader->loadBlobAsync(eventTarget.executionContext(), blob);
206 return promise; 206 return promise;
207 } 207 }
208 208
209 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, ImageData* data, ExceptionState& exceptionState) 209 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, ImageData* data, ExceptionState& exceptionState)
210 { 210 {
211 return createImageBitmap(eventTarget, data, 0, 0, data->width(), data->heigh t(), exceptionState); 211 return createImageBitmap(scriptState, eventTarget, data, 0, 0, data->width() , data->height(), exceptionState);
212 } 212 }
213 213
214 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, ImageData* data, int sx, int sy, int sw, int sh, ExceptionState& exceptionState) 214 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, ImageData* data, int sx, int sy, int sw, int sh, Excep tionState& exceptionState)
215 { 215 {
216 if (!sw || !sh) { 216 if (!sw || !sh) {
217 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width")); 217 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width"));
218 return ScriptPromise(); 218 return ScriptPromise();
219 } 219 }
220 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082 220 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
221 return fulfillImageBitmap(eventTarget.executionContext(), ImageBitmap::creat e(data, IntRect(sx, sy, sw, sh))); 221 return fulfillImageBitmap(scriptState, ImageBitmap::create(data, IntRect(sx, sy, sw, sh)));
222 } 222 }
223 223
224 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, ImageBitmap* bitmap, ExceptionState& exceptionState) 224 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, ImageBitmap* bitmap, ExceptionState& exceptionState)
225 { 225 {
226 return createImageBitmap(eventTarget, bitmap, 0, 0, bitmap->width(), bitmap- >height(), exceptionState); 226 return createImageBitmap(scriptState, eventTarget, bitmap, 0, 0, bitmap->wid th(), bitmap->height(), exceptionState);
227 } 227 }
228 228
229 ScriptPromise ImageBitmapFactories::createImageBitmap(EventTarget& eventTarget, ImageBitmap* bitmap, int sx, int sy, int sw, int sh, ExceptionState& exceptionSt ate) 229 ScriptPromise ImageBitmapFactories::createImageBitmap(ScriptState* scriptState, EventTarget& eventTarget, ImageBitmap* bitmap, int sx, int sy, int sw, int sh, E xceptionState& exceptionState)
230 { 230 {
231 if (!sw || !sh) { 231 if (!sw || !sh) {
232 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width")); 232 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s provided is 0.", sw ? "height" : "width"));
233 return ScriptPromise(); 233 return ScriptPromise();
234 } 234 }
235 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082 235 // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
236 return fulfillImageBitmap(eventTarget.executionContext(), ImageBitmap::creat e(bitmap, IntRect(sx, sy, sw, sh))); 236 return fulfillImageBitmap(scriptState, ImageBitmap::create(bitmap, IntRect(s x, sy, sw, sh)));
237 } 237 }
238 238
239 const char* ImageBitmapFactories::supplementName() 239 const char* ImageBitmapFactories::supplementName()
240 { 240 {
241 return "ImageBitmapFactories"; 241 return "ImageBitmapFactories";
242 } 242 }
243 243
244 ImageBitmapFactories& ImageBitmapFactories::from(EventTarget& eventTarget) 244 ImageBitmapFactories& ImageBitmapFactories::from(EventTarget& eventTarget)
245 { 245 {
246 if (DOMWindow* window = eventTarget.toDOMWindow()) 246 if (DOMWindow* window = eventTarget.toDOMWindow())
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 { 333 {
334 rejectPromise(); 334 rejectPromise();
335 } 335 }
336 336
337 void ImageBitmapFactories::ImageBitmapLoader::trace(Visitor* visitor) 337 void ImageBitmapFactories::ImageBitmapLoader::trace(Visitor* visitor)
338 { 338 {
339 visitor->trace(m_factory); 339 visitor->trace(m_factory);
340 } 340 }
341 341
342 } // namespace WebCore 342 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/modules/imagebitmap/ImageBitmapFactories.h ('k') | Source/modules/imagebitmap/ImageBitmapFactories.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698