CanvasImageDecoder::CanvasImageDecoder(
    mojo::ScopedDataPipeConsumerHandle handle,
    PassOwnPtr<ImageDecoderCallback> callback)
    : callback_(callback), weak_factory_(this) {
  CHECK(callback_);
  if (!handle.is_valid()) {
    base::MessageLoop::current()->PostTask(
        FROM_HERE, base::Bind(&CanvasImageDecoder::RejectCallback,
                              weak_factory_.GetWeakPtr()));
    return;
  }

  buffer_ = SharedBuffer::create();
  drainer_ = adoptPtr(new mojo::common::DataPipeDrainer(this, handle.Pass()));
}