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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 |
OLD | NEW |