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

Side by Side Diff: third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp

Issue 1775613002: Throw a RangeError exception from get/createImageData when out of memory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix assert in test Created 4 years, 9 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 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/canvas2d/BaseRenderingContext2D.h" 5 #include "modules/canvas2d/BaseRenderingContext2D.h"
6 6
7 #include "bindings/core/v8/ExceptionMessages.h" 7 #include "bindings/core/v8/ExceptionMessages.h"
8 #include "bindings/core/v8/ExceptionState.h" 8 #include "bindings/core/v8/ExceptionState.h"
9 #include "bindings/core/v8/ExceptionStatePlaceholder.h" 9 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
10 #include "core/css/parser/CSSParser.h" 10 #include "core/css/parser/CSSParser.h"
(...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 static_cast<SkRect>(canvasRect).roundOut(&canvasIRect); 1133 static_cast<SkRect>(canvasRect).roundOut(&canvasIRect);
1134 if (!canvasIRect.intersect(transformedClipBounds)) 1134 if (!canvasIRect.intersect(transformedClipBounds))
1135 return false; 1135 return false;
1136 1136
1137 if (dirtyRect) 1137 if (dirtyRect)
1138 *dirtyRect = canvasIRect; 1138 *dirtyRect = canvasIRect;
1139 1139
1140 return true; 1140 return true;
1141 } 1141 }
1142 1142
1143 ImageData* BaseRenderingContext2D::createImageData(ImageData* imageData) const 1143 ImageData* BaseRenderingContext2D::createImageData(ImageData* imageData, Excepti onState &exceptionState) const
1144 { 1144 {
1145 return ImageData::create(imageData->size()); 1145 ImageData* result = ImageData::create(imageData->size());
1146 if (!result)
1147 exceptionState.throwRangeError("Out of memory at ImageData creation");
1148 return result;
1146 } 1149 }
1147 1150
1148 ImageData* BaseRenderingContext2D::createImageData(double sw, double sh, Excepti onState& exceptionState) const 1151 ImageData* BaseRenderingContext2D::createImageData(double sw, double sh, Excepti onState& exceptionState) const
1149 { 1152 {
1150 if (!sw || !sh) { 1153 if (!sw || !sh) {
1151 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s is 0.", sw ? "height" : "width")); 1154 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s is 0.", sw ? "height" : "width"));
1152 return nullptr; 1155 return nullptr;
1153 } 1156 }
1154 1157
1155 FloatSize logicalSize(fabs(sw), fabs(sh)); 1158 FloatSize logicalSize(fabs(sw), fabs(sh));
1156 if (!logicalSize.isExpressibleAsIntSize()) 1159 if (!logicalSize.isExpressibleAsIntSize())
1157 return nullptr; 1160 return nullptr;
1158 1161
1159 IntSize size = expandedIntSize(logicalSize); 1162 IntSize size = expandedIntSize(logicalSize);
1160 if (size.width() < 1) 1163 if (size.width() < 1)
1161 size.setWidth(1); 1164 size.setWidth(1);
1162 if (size.height() < 1) 1165 if (size.height() < 1)
1163 size.setHeight(1); 1166 size.setHeight(1);
1164 1167
1165 return ImageData::create(size); 1168 ImageData* result = ImageData::create(size);
1169 if (!result)
1170 exceptionState.throwRangeError("Out of memory at ImageData creation");
1171 return result;
1166 } 1172 }
1167 1173
1168 ImageData* BaseRenderingContext2D::getImageData(double sx, double sy, double sw, double sh, ExceptionState& exceptionState) const 1174 ImageData* BaseRenderingContext2D::getImageData(double sx, double sy, double sw, double sh, ExceptionState& exceptionState) const
1169 { 1175 {
1170 if (!originClean()) 1176 if (!originClean())
1171 exceptionState.throwSecurityError("The canvas has been tainted by cross- origin data."); 1177 exceptionState.throwSecurityError("The canvas has been tainted by cross- origin data.");
1172 else if (!sw || !sh) 1178 else if (!sw || !sh)
1173 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s is 0.", sw ? "height" : "width")); 1179 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s is 0.", sw ? "height" : "width"));
1174 1180
1175 if (exceptionState.hadException()) 1181 if (exceptionState.hadException())
(...skipping 11 matching lines...) Expand all
1187 FloatRect logicalRect(sx, sy, sw, sh); 1193 FloatRect logicalRect(sx, sy, sw, sh);
1188 if (logicalRect.width() < 1) 1194 if (logicalRect.width() < 1)
1189 logicalRect.setWidth(1); 1195 logicalRect.setWidth(1);
1190 if (logicalRect.height() < 1) 1196 if (logicalRect.height() < 1)
1191 logicalRect.setHeight(1); 1197 logicalRect.setHeight(1);
1192 if (!logicalRect.isExpressibleAsIntRect()) 1198 if (!logicalRect.isExpressibleAsIntRect())
1193 return nullptr; 1199 return nullptr;
1194 1200
1195 IntRect imageDataRect = enclosingIntRect(logicalRect); 1201 IntRect imageDataRect = enclosingIntRect(logicalRect);
1196 ImageBuffer* buffer = imageBuffer(); 1202 ImageBuffer* buffer = imageBuffer();
1197 if (!buffer || isContextLost()) 1203 if (!buffer || isContextLost()) {
1198 return ImageData::create(imageDataRect.size()); 1204 ImageData* result = ImageData::create(imageDataRect.size());
1205 if (!result)
1206 exceptionState.throwRangeError("Out of memory at ImageData creation" );
1207 return result;
1208 }
1199 1209
1200 WTF::ArrayBufferContents contents; 1210 WTF::ArrayBufferContents contents;
1201 if (!buffer->getImageData(Unmultiplied, imageDataRect, contents)) 1211 if (!buffer->getImageData(Unmultiplied, imageDataRect, contents)) {
1212 exceptionState.throwRangeError("Out of memory at ImageData creation");
1202 return nullptr; 1213 return nullptr;
1214 }
1203 1215
1204 RefPtr<DOMArrayBuffer> arrayBuffer = DOMArrayBuffer::create(contents); 1216 RefPtr<DOMArrayBuffer> arrayBuffer = DOMArrayBuffer::create(contents);
1205 return ImageData::create( 1217 return ImageData::create(
1206 imageDataRect.size(), 1218 imageDataRect.size(),
1207 DOMUint8ClampedArray::create(arrayBuffer, 0, arrayBuffer->byteLength())) ; 1219 DOMUint8ClampedArray::create(arrayBuffer, 0, arrayBuffer->byteLength())) ;
1208 } 1220 }
1209 1221
1210 void BaseRenderingContext2D::putImageData(ImageData* data, double dx, double dy, ExceptionState& exceptionState) 1222 void BaseRenderingContext2D::putImageData(ImageData* data, double dx, double dy, ExceptionState& exceptionState)
1211 { 1223 {
1212 putImageData(data, dx, dy, 0, 0, data->width(), data->height(), exceptionSta te); 1224 putImageData(data, dx, dy, 0, 0, data->width(), data->height(), exceptionSta te);
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1357 1369
1358 imageBuffer()->willOverwriteCanvas(); 1370 imageBuffer()->willOverwriteCanvas();
1359 } 1371 }
1360 1372
1361 DEFINE_TRACE(BaseRenderingContext2D) 1373 DEFINE_TRACE(BaseRenderingContext2D)
1362 { 1374 {
1363 visitor->trace(m_stateStack); 1375 visitor->trace(m_stateStack);
1364 } 1376 }
1365 1377
1366 } // namespace blink 1378 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698