| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "config.h" | 5 #include "config.h" |
| 6 #include "core/html/canvas/CanvasRenderingContext2D.h" | 6 #include "core/html/canvas/CanvasRenderingContext2D.h" |
| 7 | 7 |
| 8 #include "core/frame/FrameView.h" | 8 #include "core/frame/FrameView.h" |
| 9 #include "core/frame/ImageBitmap.h" | 9 #include "core/frame/ImageBitmap.h" |
| 10 #include "core/html/HTMLDocument.h" | 10 #include "core/html/HTMLDocument.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 HTMLCanvasElement& canvasElement() const { return *m_canvasElement; } | 78 HTMLCanvasElement& canvasElement() const { return *m_canvasElement; } |
| 79 CanvasRenderingContext2D* context2d() const { return static_cast<CanvasRende
ringContext2D*>(canvasElement().renderingContext()); } | 79 CanvasRenderingContext2D* context2d() const { return static_cast<CanvasRende
ringContext2D*>(canvasElement().renderingContext()); } |
| 80 | 80 |
| 81 void createContext(OpacityMode); | 81 void createContext(OpacityMode); |
| 82 | 82 |
| 83 private: | 83 private: |
| 84 OwnPtr<DummyPageHolder> m_dummyPageHolder; | 84 OwnPtr<DummyPageHolder> m_dummyPageHolder; |
| 85 RefPtrWillBePersistent<HTMLDocument> m_document; | 85 RefPtrWillBePersistent<HTMLDocument> m_document; |
| 86 RefPtrWillBePersistent<HTMLCanvasElement> m_canvasElement; | 86 RefPtrWillBePersistent<HTMLCanvasElement> m_canvasElement; |
| 87 | 87 |
| 88 class WrapGradients final : public NoBaseWillBeGarbageCollectedFinalized<Wra
pGradients> { |
| 89 public: |
| 90 static PassOwnPtrWillBeRawPtr<WrapGradients> create() |
| 91 { |
| 92 return adoptPtrWillBeNoop(new WrapGradients); |
| 93 } |
| 94 |
| 95 DEFINE_INLINE_TRACE() |
| 96 { |
| 97 visitor->trace(m_opaqueGradient); |
| 98 visitor->trace(m_alphaGradient); |
| 99 } |
| 100 |
| 101 StringOrCanvasGradientOrCanvasPattern m_opaqueGradient; |
| 102 StringOrCanvasGradientOrCanvasPattern m_alphaGradient; |
| 103 }; |
| 104 |
| 105 // TODO(Oilpan): avoid tedious part-object wrapper by supporting on-heap ::t
esting::Tests. |
| 106 OwnPtrWillBePersistent<WrapGradients> m_wrapGradients; |
| 107 |
| 88 protected: | 108 protected: |
| 89 // Pre-canned objects for testing | 109 // Pre-canned objects for testing |
| 90 Persistent<ImageData> m_fullImageData; | 110 Persistent<ImageData> m_fullImageData; |
| 91 Persistent<ImageData> m_partialImageData; | 111 Persistent<ImageData> m_partialImageData; |
| 92 FakeImageSource m_opaqueBitmap; | 112 FakeImageSource m_opaqueBitmap; |
| 93 FakeImageSource m_alphaBitmap; | 113 FakeImageSource m_alphaBitmap; |
| 94 StringOrCanvasGradientOrCanvasPattern m_opaqueGradient; | 114 |
| 95 StringOrCanvasGradientOrCanvasPattern m_alphaGradient; | 115 StringOrCanvasGradientOrCanvasPattern& opaqueGradient() { return m_wrapGradi
ents->m_opaqueGradient; } |
| 116 StringOrCanvasGradientOrCanvasPattern& alphaGradient() { return m_wrapGradie
nts->m_alphaGradient; } |
| 96 }; | 117 }; |
| 97 | 118 |
| 98 CanvasRenderingContext2DTest::CanvasRenderingContext2DTest() | 119 CanvasRenderingContext2DTest::CanvasRenderingContext2DTest() |
| 99 : m_opaqueBitmap(IntSize(10, 10), OpaqueBitmap) | 120 : m_wrapGradients(WrapGradients::create()) |
| 121 , m_opaqueBitmap(IntSize(10, 10), OpaqueBitmap) |
| 100 , m_alphaBitmap(IntSize(10, 10), TransparentBitmap) | 122 , m_alphaBitmap(IntSize(10, 10), TransparentBitmap) |
| 101 { } | 123 { } |
| 102 | 124 |
| 103 void CanvasRenderingContext2DTest::createContext(OpacityMode opacityMode) | 125 void CanvasRenderingContext2DTest::createContext(OpacityMode opacityMode) |
| 104 { | 126 { |
| 105 String canvasType("2d"); | 127 String canvasType("2d"); |
| 106 CanvasContextCreationAttributes attributes; | 128 CanvasContextCreationAttributes attributes; |
| 107 attributes.setAlpha(opacityMode == NonOpaque); | 129 attributes.setAlpha(opacityMode == NonOpaque); |
| 108 CanvasRenderingContext2DOrWebGLRenderingContext result; | 130 CanvasRenderingContext2DOrWebGLRenderingContext result; |
| 109 m_canvasElement->getContext(canvasType, attributes, result); | 131 m_canvasElement->getContext(canvasType, attributes, result); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 121 | 143 |
| 122 m_fullImageData = ImageData::create(IntSize(10, 10)); | 144 m_fullImageData = ImageData::create(IntSize(10, 10)); |
| 123 m_partialImageData = ImageData::create(IntSize(2, 2)); | 145 m_partialImageData = ImageData::create(IntSize(2, 2)); |
| 124 | 146 |
| 125 NonThrowableExceptionState exceptionState; | 147 NonThrowableExceptionState exceptionState; |
| 126 RefPtrWillBeRawPtr<CanvasGradient> opaqueGradient = CanvasGradient::create(F
loatPoint(0, 0), FloatPoint(10, 0)); | 148 RefPtrWillBeRawPtr<CanvasGradient> opaqueGradient = CanvasGradient::create(F
loatPoint(0, 0), FloatPoint(10, 0)); |
| 127 opaqueGradient->addColorStop(0, String("green"), exceptionState); | 149 opaqueGradient->addColorStop(0, String("green"), exceptionState); |
| 128 EXPECT_FALSE(exceptionState.hadException()); | 150 EXPECT_FALSE(exceptionState.hadException()); |
| 129 opaqueGradient->addColorStop(1, String("blue"), exceptionState); | 151 opaqueGradient->addColorStop(1, String("blue"), exceptionState); |
| 130 EXPECT_FALSE(exceptionState.hadException()); | 152 EXPECT_FALSE(exceptionState.hadException()); |
| 131 m_opaqueGradient.setCanvasGradient(opaqueGradient); | 153 this->opaqueGradient().setCanvasGradient(opaqueGradient); |
| 132 | 154 |
| 133 RefPtrWillBeRawPtr<CanvasGradient> alphaGradient = CanvasGradient::create(Fl
oatPoint(0, 0), FloatPoint(10, 0)); | 155 RefPtrWillBeRawPtr<CanvasGradient> alphaGradient = CanvasGradient::create(Fl
oatPoint(0, 0), FloatPoint(10, 0)); |
| 134 alphaGradient->addColorStop(0, String("green"), exceptionState); | 156 alphaGradient->addColorStop(0, String("green"), exceptionState); |
| 135 EXPECT_FALSE(exceptionState.hadException()); | 157 EXPECT_FALSE(exceptionState.hadException()); |
| 136 alphaGradient->addColorStop(1, String("rgba(0, 0, 255, 0.5)"), exceptionStat
e); | 158 alphaGradient->addColorStop(1, String("rgba(0, 0, 255, 0.5)"), exceptionStat
e); |
| 137 EXPECT_FALSE(exceptionState.hadException()); | 159 EXPECT_FALSE(exceptionState.hadException()); |
| 138 StringOrCanvasGradientOrCanvasPattern wrappedAlphaGradient; | 160 StringOrCanvasGradientOrCanvasPattern wrappedAlphaGradient; |
| 139 m_alphaGradient.setCanvasGradient(alphaGradient); | 161 this->alphaGradient().setCanvasGradient(alphaGradient); |
| 140 } | 162 } |
| 141 | 163 |
| 142 //============================================================================ | 164 //============================================================================ |
| 143 | 165 |
| 144 class MockImageBufferSurfaceForOverwriteTesting : public UnacceleratedImageBuffe
rSurface { | 166 class MockImageBufferSurfaceForOverwriteTesting : public UnacceleratedImageBuffe
rSurface { |
| 145 public: | 167 public: |
| 146 MockImageBufferSurfaceForOverwriteTesting(const IntSize& size, OpacityMode m
ode) : UnacceleratedImageBufferSurface(size, mode) { } | 168 MockImageBufferSurfaceForOverwriteTesting(const IntSize& size, OpacityMode m
ode) : UnacceleratedImageBufferSurface(size, mode) { } |
| 147 virtual ~MockImageBufferSurfaceForOverwriteTesting() { } | 169 virtual ~MockImageBufferSurfaceForOverwriteTesting() { } |
| 148 bool isRecording() const override { return true; } // otherwise overwrites a
re not tracked | 170 bool isRecording() const override { return true; } // otherwise overwrites a
re not tracked |
| 149 | 171 |
| 150 MOCK_METHOD0(willOverwriteCanvas, void()); | 172 MOCK_METHOD0(willOverwriteCanvas, void()); |
| 151 }; | 173 }; |
| 152 | 174 |
| 153 //============================================================================ | 175 //============================================================================ |
| 154 | 176 |
| 155 class MockCanvasObserver : public NoBaseWillBeGarbageCollectedFinalized<MockCanv
asObserver>, public CanvasObserver { | 177 class MockCanvasObserver final : public NoBaseWillBeGarbageCollectedFinalized<Mo
ckCanvasObserver>, public CanvasObserver { |
| 156 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MockCanvasObserver); | 178 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MockCanvasObserver); |
| 157 public: | 179 public: |
| 158 static PassOwnPtrWillBeRawPtr<MockCanvasObserver> create() | 180 static PassOwnPtrWillBeRawPtr<MockCanvasObserver> create() |
| 159 { | 181 { |
| 160 return adoptPtrWillBeNoop(new MockCanvasObserver); | 182 return adoptPtrWillBeNoop(new MockCanvasObserver); |
| 161 } | 183 } |
| 162 | 184 |
| 185 DEFINE_INLINE_VIRTUAL_TRACE() |
| 186 { |
| 187 CanvasObserver::trace(visitor); |
| 188 } |
| 189 |
| 190 |
| 163 virtual ~MockCanvasObserver() { } | 191 virtual ~MockCanvasObserver() { } |
| 164 MOCK_METHOD2(canvasChanged, void(HTMLCanvasElement*, const FloatRect&)); | 192 MOCK_METHOD2(canvasChanged, void(HTMLCanvasElement*, const FloatRect&)); |
| 165 MOCK_METHOD1(canvasResized, void(HTMLCanvasElement*)); | 193 MOCK_METHOD1(canvasResized, void(HTMLCanvasElement*)); |
| 166 #if !ENABLE(OILPAN) | 194 #if !ENABLE(OILPAN) |
| 167 void canvasDestroyed(HTMLCanvasElement*) override { }; | 195 void canvasDestroyed(HTMLCanvasElement*) override { }; |
| 168 #endif | 196 #endif |
| 169 }; | 197 }; |
| 170 | 198 |
| 171 //============================================================================ | 199 //============================================================================ |
| 172 | 200 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 { | 282 { |
| 255 createContext(NonOpaque); | 283 createContext(NonOpaque); |
| 256 | 284 |
| 257 TEST_OVERDRAW_1(1, fillRect(-1, -1, 12, 12)); | 285 TEST_OVERDRAW_1(1, fillRect(-1, -1, 12, 12)); |
| 258 TEST_OVERDRAW_1(1, fillRect(0, 0, 10, 10)); | 286 TEST_OVERDRAW_1(1, fillRect(0, 0, 10, 10)); |
| 259 TEST_OVERDRAW_1(0, strokeRect(0, 0, 10, 10)); // stroking instead of filling
does not overwrite | 287 TEST_OVERDRAW_1(0, strokeRect(0, 0, 10, 10)); // stroking instead of filling
does not overwrite |
| 260 TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), fillRect(0, 0, 10, 10)); | 288 TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), fillRect(0, 0, 10, 10)); |
| 261 TEST_OVERDRAW_1(0, fillRect(0, 0, 9, 9)); | 289 TEST_OVERDRAW_1(0, fillRect(0, 0, 9, 9)); |
| 262 TEST_OVERDRAW_2(0, translate(1, 1), fillRect(0, 0, 10, 10)); | 290 TEST_OVERDRAW_2(0, translate(1, 1), fillRect(0, 0, 10, 10)); |
| 263 TEST_OVERDRAW_2(1, translate(1, 1), fillRect(-1, -1, 10, 10)); | 291 TEST_OVERDRAW_2(1, translate(1, 1), fillRect(-1, -1, 10, 10)); |
| 264 TEST_OVERDRAW_2(1, setFillStyle(m_opaqueGradient), fillRect(0, 0, 10, 10)); | 292 TEST_OVERDRAW_2(1, setFillStyle(opaqueGradient()), fillRect(0, 0, 10, 10)); |
| 265 TEST_OVERDRAW_2(0, setFillStyle(m_alphaGradient), fillRect(0, 0, 10, 10)); | 293 TEST_OVERDRAW_2(0, setFillStyle(alphaGradient()), fillRect(0, 0, 10, 10)); |
| 266 TEST_OVERDRAW_3(0, setGlobalAlpha(0.5), setFillStyle(m_opaqueGradient), fill
Rect(0, 0, 10, 10)); | 294 TEST_OVERDRAW_3(0, setGlobalAlpha(0.5), setFillStyle(opaqueGradient()), fill
Rect(0, 0, 10, 10)); |
| 267 TEST_OVERDRAW_3(1, setGlobalAlpha(0.5f), setGlobalCompositeOperation(String(
"copy")), fillRect(0, 0, 10, 10)); | 295 TEST_OVERDRAW_3(1, setGlobalAlpha(0.5f), setGlobalCompositeOperation(String(
"copy")), fillRect(0, 0, 10, 10)); |
| 268 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("copy")), fillRect(0,
0, 9, 9)); | 296 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("copy")), fillRect(0,
0, 9, 9)); |
| 269 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), fillRect(0, 0, 10, 10)); | 297 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), fillRect(0, 0, 10, 10)); |
| 270 TEST_OVERDRAW_4(0, rect(0, 0, 5, 5), clip(), setGlobalCompositeOperation(Str
ing("copy")), fillRect(0, 0, 10, 10)); | 298 TEST_OVERDRAW_4(0, rect(0, 0, 5, 5), clip(), setGlobalCompositeOperation(Str
ing("copy")), fillRect(0, 0, 10, 10)); |
| 271 } | 299 } |
| 272 | 300 |
| 273 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithClearRect) | 301 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithClearRect) |
| 274 { | 302 { |
| 275 createContext(NonOpaque); | 303 createContext(NonOpaque); |
| 276 | 304 |
| 277 TEST_OVERDRAW_1(1, clearRect(0, 0, 10, 10)); | 305 TEST_OVERDRAW_1(1, clearRect(0, 0, 10, 10)); |
| 278 TEST_OVERDRAW_1(0, clearRect(0, 0, 9, 9)); | 306 TEST_OVERDRAW_1(0, clearRect(0, 0, 9, 9)); |
| 279 TEST_OVERDRAW_2(1, setGlobalAlpha(0.5f), clearRect(0, 0, 10, 10)); | 307 TEST_OVERDRAW_2(1, setGlobalAlpha(0.5f), clearRect(0, 0, 10, 10)); |
| 280 TEST_OVERDRAW_2(1, setFillStyle(m_alphaGradient), clearRect(0, 0, 10, 10)); | 308 TEST_OVERDRAW_2(1, setFillStyle(alphaGradient()), clearRect(0, 0, 10, 10)); |
| 281 TEST_OVERDRAW_2(0, translate(1, 1), clearRect(0, 0, 10, 10)); | 309 TEST_OVERDRAW_2(0, translate(1, 1), clearRect(0, 0, 10, 10)); |
| 282 TEST_OVERDRAW_2(1, translate(1, 1), clearRect(-1, -1, 10, 10)); | 310 TEST_OVERDRAW_2(1, translate(1, 1), clearRect(-1, -1, 10, 10)); |
| 283 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("destination-in")), cl
earRect(0, 0, 10, 10)); // composite op ignored | 311 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("destination-in")), cl
earRect(0, 0, 10, 10)); // composite op ignored |
| 284 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), clearRect(0, 0, 10, 10)); | 312 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), clearRect(0, 0, 10, 10)); |
| 285 } | 313 } |
| 286 | 314 |
| 287 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithDrawImage) | 315 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithDrawImage) |
| 288 { | 316 { |
| 289 createContext(NonOpaque); | 317 createContext(NonOpaque); |
| 290 NonThrowableExceptionState exceptionState; | 318 NonThrowableExceptionState exceptionState; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 302 TEST_OVERDRAW_1(0, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, ex
ceptionState)); | 330 TEST_OVERDRAW_1(0, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, ex
ceptionState)); |
| 303 EXPECT_FALSE(exceptionState.hadException()); | 331 EXPECT_FALSE(exceptionState.hadException()); |
| 304 TEST_OVERDRAW_1(0, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 9, 9, exce
ptionState)); | 332 TEST_OVERDRAW_1(0, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 9, 9, exce
ptionState)); |
| 305 EXPECT_FALSE(exceptionState.hadException()); | 333 EXPECT_FALSE(exceptionState.hadException()); |
| 306 TEST_OVERDRAW_1(1, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 11, 11, ex
ceptionState)); | 334 TEST_OVERDRAW_1(1, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 11, 11, ex
ceptionState)); |
| 307 EXPECT_FALSE(exceptionState.hadException()); | 335 EXPECT_FALSE(exceptionState.hadException()); |
| 308 TEST_OVERDRAW_2(1, translate(-1, 0), drawImage(&m_opaqueBitmap, 0, 0, 10, 10
, 1, 0, 10, 10, exceptionState)); | 336 TEST_OVERDRAW_2(1, translate(-1, 0), drawImage(&m_opaqueBitmap, 0, 0, 10, 10
, 1, 0, 10, 10, exceptionState)); |
| 309 EXPECT_FALSE(exceptionState.hadException()); | 337 EXPECT_FALSE(exceptionState.hadException()); |
| 310 TEST_OVERDRAW_2(0, translate(-1, 0), drawImage(&m_opaqueBitmap, 0, 0, 10, 10
, 0, 0, 10, 10, exceptionState)); | 338 TEST_OVERDRAW_2(0, translate(-1, 0), drawImage(&m_opaqueBitmap, 0, 0, 10, 10
, 0, 0, 10, 10, exceptionState)); |
| 311 EXPECT_FALSE(exceptionState.hadException()); | 339 EXPECT_FALSE(exceptionState.hadException()); |
| 312 TEST_OVERDRAW_2(0, setFillStyle(m_opaqueGradient), drawImage(&m_alphaBitmap,
0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage | 340 TEST_OVERDRAW_2(0, setFillStyle(opaqueGradient()), drawImage(&m_alphaBitmap,
0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage |
| 313 EXPECT_FALSE(exceptionState.hadException()); | 341 EXPECT_FALSE(exceptionState.hadException()); |
| 314 TEST_OVERDRAW_2(1, setFillStyle(m_alphaGradient), drawImage(&m_opaqueBitmap,
0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage | 342 TEST_OVERDRAW_2(1, setFillStyle(alphaGradient()), drawImage(&m_opaqueBitmap,
0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage |
| 315 EXPECT_FALSE(exceptionState.hadException()); | 343 EXPECT_FALSE(exceptionState.hadException()); |
| 316 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("copy")), drawImage(&m
_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState)); | 344 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("copy")), drawImage(&m
_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState)); |
| 317 EXPECT_FALSE(exceptionState.hadException()); | 345 EXPECT_FALSE(exceptionState.hadException()); |
| 318 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), drawImage(&m_opaqueBitmap, 0, 0
, 10, 10, 0, 0, 10, 10, exceptionState)); | 346 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), drawImage(&m_opaqueBitmap, 0, 0
, 10, 10, 0, 0, 10, 10, exceptionState)); |
| 319 EXPECT_FALSE(exceptionState.hadException()); | 347 EXPECT_FALSE(exceptionState.hadException()); |
| 320 } | 348 } |
| 321 | 349 |
| 322 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithPutImageData) | 350 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithPutImageData) |
| 323 { | 351 { |
| 324 createContext(NonOpaque); | 352 createContext(NonOpaque); |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 // The canvasChanged notification must be immediate, and not deferred until
paint time | 624 // The canvasChanged notification must be immediate, and not deferred until
paint time |
| 597 // because offscreen canvases, which are not painted, also need to emit noti
fications. | 625 // because offscreen canvases, which are not painted, also need to emit noti
fications. |
| 598 EXPECT_CALL(*observer, canvasChanged(&canvasElement(), FloatRect(0, 0, 1, 1)
)).Times(1); | 626 EXPECT_CALL(*observer, canvasChanged(&canvasElement(), FloatRect(0, 0, 1, 1)
)).Times(1); |
| 599 context2d()->fillRect(0, 0, 1, 1); | 627 context2d()->fillRect(0, 0, 1, 1); |
| 600 Mock::VerifyAndClearExpectations(observer.get()); | 628 Mock::VerifyAndClearExpectations(observer.get()); |
| 601 | 629 |
| 602 canvasElement().removeObserver(observer.get()); | 630 canvasElement().removeObserver(observer.get()); |
| 603 } | 631 } |
| 604 | 632 |
| 605 } // namespace blink | 633 } // namespace blink |
| OLD | NEW |