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

Side by Side Diff: sky/engine/core/loader/CanvasImageDecoder.cpp

Issue 1213313002: Don't crash when decoding an invalid handle (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 5 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
« no previous file with comments | « sky/engine/core/loader/CanvasImageDecoder.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "base/bind.h"
6 #include "base/message_loop/message_loop.h"
5 #include "sky/engine/core/loader/CanvasImageDecoder.h" 7 #include "sky/engine/core/loader/CanvasImageDecoder.h"
6 #include "sky/engine/core/painting/CanvasImage.h" 8 #include "sky/engine/core/painting/CanvasImage.h"
7 #include "sky/engine/platform/SharedBuffer.h" 9 #include "sky/engine/platform/SharedBuffer.h"
8 #include "sky/engine/platform/image-decoders/ImageDecoder.h" 10 #include "sky/engine/platform/image-decoders/ImageDecoder.h"
9 11
10 namespace blink { 12 namespace blink {
11 13
12 PassRefPtr<CanvasImageDecoder> CanvasImageDecoder::create( 14 PassRefPtr<CanvasImageDecoder> CanvasImageDecoder::create(
13 mojo::ScopedDataPipeConsumerHandle handle, 15 mojo::ScopedDataPipeConsumerHandle handle,
14 PassOwnPtr<ImageDecoderCallback> callback) 16 PassOwnPtr<ImageDecoderCallback> callback) {
15 {
16 return adoptRef(new CanvasImageDecoder(handle.Pass(), callback)); 17 return adoptRef(new CanvasImageDecoder(handle.Pass(), callback));
17 } 18 }
18 19
19 CanvasImageDecoder::CanvasImageDecoder( 20 CanvasImageDecoder::CanvasImageDecoder(
20 mojo::ScopedDataPipeConsumerHandle handle, 21 mojo::ScopedDataPipeConsumerHandle handle,
21 PassOwnPtr<ImageDecoderCallback> callback) 22 PassOwnPtr<ImageDecoderCallback> callback)
22 : callback_(callback) { 23 : callback_(callback), weak_factory_(this) {
23 CHECK(callback_); 24 CHECK(callback_);
25 if (!handle.is_valid()) {
26 base::MessageLoop::current()->PostTask(
27 FROM_HERE, base::Bind(&CanvasImageDecoder::RejectCallback,
28 weak_factory_.GetWeakPtr()));
29 return;
30 }
31
24 buffer_ = SharedBuffer::create(); 32 buffer_ = SharedBuffer::create();
25 drainer_ = adoptPtr(new mojo::common::DataPipeDrainer(this, handle.Pass())); 33 drainer_ = adoptPtr(new mojo::common::DataPipeDrainer(this, handle.Pass()));
26 } 34 }
27 35
28 CanvasImageDecoder::~CanvasImageDecoder() { 36 CanvasImageDecoder::~CanvasImageDecoder() {
29 } 37 }
30 38
31 void CanvasImageDecoder::OnDataAvailable(const void* data, size_t num_bytes) { 39 void CanvasImageDecoder::OnDataAvailable(const void* data, size_t num_bytes) {
32 buffer_->append(static_cast<const char*>(data), num_bytes); 40 buffer_->append(static_cast<const char*>(data), num_bytes);
33 } 41 }
(...skipping 12 matching lines...) Expand all
46 if (decoder->failed() || decoder->frameCount() == 0) { 54 if (decoder->failed() || decoder->frameCount() == 0) {
47 callback_->handleEvent(nullptr); 55 callback_->handleEvent(nullptr);
48 return; 56 return;
49 } 57 }
50 58
51 RefPtr<CanvasImage> resultImage = CanvasImage::create(); 59 RefPtr<CanvasImage> resultImage = CanvasImage::create();
52 resultImage->setBitmap(decoder->frameBufferAtIndex(0)->getSkBitmap()); 60 resultImage->setBitmap(decoder->frameBufferAtIndex(0)->getSkBitmap());
53 callback_->handleEvent(resultImage.get()); 61 callback_->handleEvent(resultImage.get());
54 } 62 }
55 63
56 } // namespace blink 64 void CanvasImageDecoder::RejectCallback() {
65 callback_->handleEvent(nullptr);
66 }
67
68 } // namespace blink
OLDNEW
« no previous file with comments | « sky/engine/core/loader/CanvasImageDecoder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698