Implement the HTML5 canvas tainting rules to prevent potential data leakage
[WebKit-https.git] / WebCore / html / HTMLCanvasElement.h
index be5f3ca34985c00bd91cbc4095fbe8f5f858d164..4fbc7f6c122aa27f86b70c733a400a17d3b6b082 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2007 Alp Toker <alp@atoker.com>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#ifndef HTMLCanvasElement_H
-#define HTMLCanvasElement_H
+#ifndef HTMLCanvasElement_h
+#define HTMLCanvasElement_h
 
 #include "HTMLElement.h"
 #include "IntSize.h"
 
-#if __APPLE__
-// FIXME: Mac-specific parts need to move to the platform directory.
+#if PLATFORM(CG)
+// FIXME: CG-specific parts need to move to the platform directory.
 typedef struct CGContext* CGContextRef;
 typedef struct CGImage* CGImageRef;
+#elif PLATFORM(QT)
+class QPixmap;
+class QPainter;
+#elif PLATFORM(CAIRO)
+typedef struct _cairo_surface cairo_surface_t;
 #endif
 
 namespace WebCore {
 
 class CanvasRenderingContext2D;
 typedef CanvasRenderingContext2D CanvasRenderingContext;
+class FloatPoint;
 class FloatRect;
+class FloatSize;
+class GraphicsContext;
+class ImageBuffer;
+class IntPoint;
+class InttRect;
+class IntSize;
 
 class HTMLCanvasElement : public HTMLElement {
 public:
     HTMLCanvasElement(Document*);
     virtual ~HTMLCanvasElement();
 
+    virtual HTMLTagStatus endTagRequirement() const;
+    virtual int tagPriority() const;
+
     int width() const { return m_size.width(); }
     int height() const { return m_size.height(); }
     void setWidth(int);
@@ -64,23 +80,38 @@ public:
 
     GraphicsContext* drawingContext() const;
 
-#if __APPLE__
+    ImageBuffer* buffer() const; 
+#if PLATFORM(CG)
     CGImageRef createPlatformImage() const;
+#elif PLATFORM(QT)
+    QPixmap createPlatformImage() const;
+#elif PLATFORM(CAIRO)
+    cairo_surface_t* createPlatformImage() const;
 #endif
+    
+    IntRect convertLogicalToDevice(const FloatRect&) const;
+    IntSize convertLogicalToDevice(const FloatSize&) const;
+    IntPoint convertLogicalToDevice(const FloatPoint&) const;
+
+    void setOriginTainted() { m_originClean = false; } 
+    bool originClean() const { return m_originClean; }
+
+    static const float MaxCanvasArea;
 
 private:
-    void createDrawingContext() const;
+    void createImageBuffer() const;
     void reset();
 
+    bool m_rendererIsCanvas;
+
     RefPtr<CanvasRenderingContext2D> m_2DContext;
     IntSize m_size;
 
-    // FIXME: Web Applications 1.0 describes a security feature where we track
-    // if we ever drew any images outside the domain, so we can disable toDataURL.
+    bool m_originClean;
 
-    mutable bool m_createdDrawingContext;
-    mutable void* m_data;
-    mutable GraphicsContext* m_drawingContext;
+    // m_createdImageBuffer means we tried to malloc the buffer.  We didn't necessarily get it.
+    mutable bool m_createdImageBuffer;
+    mutable OwnPtr<ImageBuffer> m_imageBuffer;
 };
 
 } //namespace