| Index: Source/core/page/ImageBitmap.cpp | 
| diff --git a/Source/core/page/ImageBitmap.cpp b/Source/core/page/ImageBitmap.cpp | 
| index ffe3af0dfa65d59ae71c04122efe6fad942d5949..e4a738814bc82312b1d75f7dc4402634b497ba52 100644 | 
| --- a/Source/core/page/ImageBitmap.cpp | 
| +++ b/Source/core/page/ImageBitmap.cpp | 
| @@ -35,6 +35,8 @@ static inline PassRefPtr<Image> cropImage(Image* image, const IntRect& cropRect) | 
| ImageBitmap::ImageBitmap(HTMLImageElement* image, const IntRect& cropRect) | 
| : m_cropRect(cropRect) | 
| , m_imageElement(image) | 
| +    , m_bitmap(0) | 
| +    , m_derivedFromCanvas(false) | 
| { | 
| m_imageElement->addClient(this); | 
|  | 
| @@ -49,6 +51,7 @@ ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect) | 
| : m_cropRect(cropRect) | 
| , m_imageElement(0) | 
| , m_bitmapOffset(IntPoint()) | 
| +    , m_derivedFromCanvas(false) | 
| { | 
| IntRect videoRect = IntRect(IntPoint(), video->player()->naturalSize()); | 
| IntRect srcRect = intersection(cropRect, videoRect); | 
| @@ -68,16 +71,13 @@ ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect) | 
| ImageBitmap::ImageBitmap(HTMLCanvasElement* canvas, const IntRect& cropRect) | 
| : m_cropRect(cropRect) | 
| , m_imageElement(0) | 
| +    , m_bitmap(canvas->buffer()->imageSnapshot()) | 
| , m_bitmapOffset(IntPoint()) | 
| +    , m_derivedFromCanvas(true) | 
| { | 
| -    IntSize canvasSize = canvas->size(); | 
| -    IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), canvasSize)); | 
| -    IntRect dstRect(IntPoint(), srcRect.size()); | 
| - | 
| -    m_buffer = ImageBuffer::create(canvasSize); | 
| -    m_buffer->context()->drawImageBuffer(canvas->buffer(), dstRect, srcRect); | 
| -    m_bitmap = m_buffer->copyImage(DontCopyBackingStore); | 
| +    IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), canvas->size())); | 
| m_bitmapRect = IntRect(IntPoint(max(0, -cropRect.x()), max(0, -cropRect.y())), srcRect.size()); | 
| +    m_bitmapOffset = srcRect.location(); | 
|  | 
| ScriptWrappable::init(this); | 
| } | 
| @@ -86,6 +86,7 @@ ImageBitmap::ImageBitmap(ImageData* data, const IntRect& cropRect) | 
| : m_cropRect(cropRect) | 
| , m_imageElement(0) | 
| , m_bitmapOffset(IntPoint()) | 
| +    , m_derivedFromCanvas(false) | 
| { | 
| IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), data->size())); | 
|  | 
| @@ -103,19 +104,24 @@ ImageBitmap::ImageBitmap(ImageBitmap* bitmap, const IntRect& cropRect) | 
| : m_cropRect(cropRect) | 
| , m_imageElement(bitmap->imageElement()) | 
| , m_bitmapOffset(IntPoint()) | 
| +    , m_derivedFromCanvas(bitmap->derivedFromCanvas()) | 
| { | 
| IntRect oldBitmapRect = bitmap->bitmapRect(); | 
| IntRect srcRect = intersection(cropRect, oldBitmapRect); | 
| m_bitmapRect = IntRect(IntPoint(max(0, oldBitmapRect.x() - cropRect.x()), max(0, oldBitmapRect.y() - cropRect.y())), srcRect.size()); | 
|  | 
| if (m_imageElement) { | 
| -        m_imageElement->addClient(this); | 
| m_bitmap = 0; | 
| +        m_imageElement->addClient(this); | 
| +        m_bitmapOffset = srcRect.location(); | 
| +    } else if (m_derivedFromCanvas) { | 
| +        m_bitmap = bitmap->bitmapImage(); | 
| m_bitmapOffset = srcRect.location(); | 
| } else { | 
| -        IntRect adjustedCropRect(IntPoint(cropRect.x() -oldBitmapRect.x(), cropRect.y() - oldBitmapRect.y()), cropRect.size()); | 
| +        IntRect adjustedCropRect(IntPoint(cropRect.x() - oldBitmapRect.x(), cropRect.y() - oldBitmapRect.y()), cropRect.size()); | 
| m_bitmap = cropImage(bitmap->bitmapImage().get(), adjustedCropRect); | 
| } | 
| + | 
| ScriptWrappable::init(this); | 
| } | 
|  | 
| @@ -170,6 +176,8 @@ void ImageBitmap::notifyImageSourceChanged() | 
| PassRefPtr<Image> ImageBitmap::bitmapImage() const | 
| { | 
| ASSERT((m_imageElement || m_bitmap) && (!m_imageElement || !m_bitmap)); | 
| +    ASSERT((m_imageElement || m_derivedFromCanvas) && (!m_imageElement || !m_derivedFromCanvas)); | 
| + | 
| if (m_imageElement) | 
| return m_imageElement->cachedImage()->image(); | 
| return m_bitmap; | 
|  |