Implement the HTML5 canvas tainting rules to prevent potential data leakage
[WebKit-https.git] / WebCore / html / CanvasRenderingContext2D.h
index 202e2131b2d15db29805238aa0b1497168546277..acb75aa9fa454f7f25c5d2eda924a0c83abc5e33 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  *
  * 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. 
  */
 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#ifndef HTMLCanvas2DContext_h
-#define HTMLCanvas2DContext_h
+#ifndef CanvasRenderingContext2D_h
+#define CanvasRenderingContext2D_h
 
 
-#include "CompositeOperator.h"
-#include "FloatRect.h"
+#include "FloatSize.h"
+#include "GraphicsTypes.h"
+#include "Path.h"
 #include "PlatformString.h"
 #include "PlatformString.h"
-#include <kxmlcore/Vector.h>
+#include <wtf/Vector.h>
 
 
-#if __APPLE__
+#if PLATFORM(CG)
 #include <ApplicationServices/ApplicationServices.h>
 #endif
 
 #include <ApplicationServices/ApplicationServices.h>
 #endif
 
@@ -40,13 +41,16 @@ namespace WebCore {
     class CanvasGradient;
     class CanvasPattern;
     class CanvasStyle;
     class CanvasGradient;
     class CanvasPattern;
     class CanvasStyle;
+    class FloatRect;
     class GraphicsContext;
     class HTMLCanvasElement;
     class HTMLImageElement;
     class GraphicsContext;
     class HTMLCanvasElement;
     class HTMLImageElement;
+    class ImageData;
+    class KURL;
 
     typedef int ExceptionCode;
 
 
     typedef int ExceptionCode;
 
-    class CanvasRenderingContext2D : public Shared<CanvasRenderingContext2D> {
+    class CanvasRenderingContext2D : public RefCounted<CanvasRenderingContext2D> {
     public:
         CanvasRenderingContext2D(HTMLCanvasElement*);
 
     public:
         CanvasRenderingContext2D(HTMLCanvasElement*);
 
@@ -94,6 +98,7 @@ namespace WebCore {
         void scale(float sx, float sy);
         void rotate(float angleInRadians);
         void translate(float tx, float ty);
         void scale(float sx, float sy);
         void rotate(float angleInRadians);
         void translate(float tx, float ty);
+        void transform(float m11, float m12, float m21, float m22, float dx, float dy);
 
         void setStrokeColor(const String& color);
         void setStrokeColor(float grayLevel);
 
         void setStrokeColor(const String& color);
         void setStrokeColor(float grayLevel);
@@ -124,6 +129,8 @@ namespace WebCore {
         void stroke();
         void clip();
 
         void stroke();
         void clip();
 
+        bool isPointInPath(const float x, const float y);
+
         void clearRect(float x, float y, float width, float height, ExceptionCode&);
         void fillRect(float x, float y, float width, float height, ExceptionCode&);
         void strokeRect(float x, float y, float width, float height, ExceptionCode&);
         void clearRect(float x, float y, float width, float height, ExceptionCode&);
         void fillRect(float x, float y, float width, float height, ExceptionCode&);
         void strokeRect(float x, float y, float width, float height, ExceptionCode&);
@@ -141,12 +148,10 @@ namespace WebCore {
 
         void drawImage(HTMLImageElement*, float x, float y);
         void drawImage(HTMLImageElement*, float x, float y, float width, float height, ExceptionCode&);
 
         void drawImage(HTMLImageElement*, float x, float y);
         void drawImage(HTMLImageElement*, float x, float y, float width, float height, ExceptionCode&);
-        void drawImage(HTMLImageElement*, float sx, float sy, float sw, float sh,
-            float dx, float dy, float dw, float dh, ExceptionCode&);
+        void drawImage(HTMLImageElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
         void drawImage(HTMLCanvasElement*, float x, float y);
         void drawImage(HTMLCanvasElement*, float x, float y, float width, float height, ExceptionCode&);
         void drawImage(HTMLCanvasElement*, float x, float y);
         void drawImage(HTMLCanvasElement*, float x, float y, float width, float height, ExceptionCode&);
-        void drawImage(HTMLCanvasElement*, float sx, float sy, float sw, float sh,
-            float dx, float dy, float dw, float dh, ExceptionCode&);
+        void drawImage(HTMLCanvasElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
 
         void drawImageFromRect(HTMLImageElement*, float sx, float sy, float sw, float sh,
             float dx, float dy, float dw, float dh, const String& compositeOperation);
 
         void drawImageFromRect(HTMLImageElement*, float sx, float sy, float sw, float sh,
             float dx, float dy, float dw, float dh, const String& compositeOperation);
@@ -159,32 +164,35 @@ namespace WebCore {
         PassRefPtr<CanvasGradient> createRadialGradient(float x0, float y0, float r0, float x1, float y1, float r1);
         PassRefPtr<CanvasPattern> createPattern(HTMLImageElement*, const String& repetitionType, ExceptionCode&);
         PassRefPtr<CanvasPattern> createPattern(HTMLCanvasElement*, const String& repetitionType, ExceptionCode&);
         PassRefPtr<CanvasGradient> createRadialGradient(float x0, float y0, float r0, float x1, float y1, float r1);
         PassRefPtr<CanvasPattern> createPattern(HTMLImageElement*, const String& repetitionType, ExceptionCode&);
         PassRefPtr<CanvasPattern> createPattern(HTMLCanvasElement*, const String& repetitionType, ExceptionCode&);
-
+        
+        PassRefPtr<ImageData> createImageData(float width, float height) const;
+        PassRefPtr<ImageData> getImageData(float sx, float sy, float sw, float sh) const;
+        void putImageData(ImageData*, float dx, float dy, ExceptionCode&);
+        void putImageData(ImageData*, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight, ExceptionCode&);
+        
         void reset();
         void detachCanvas() { m_canvas = 0; }
 
     private:
         void reset();
         void detachCanvas() { m_canvas = 0; }
 
     private:
-        enum Cap { ButtCap, RoundCap, SquareCap };
-        enum Join { MiterJoin, RoundJoin, BevelJoin };
-
         struct State {
             State();
 
             RefPtr<CanvasStyle> m_strokeStyle;
             RefPtr<CanvasStyle> m_fillStyle;
         struct State {
             State();
 
             RefPtr<CanvasStyle> m_strokeStyle;
             RefPtr<CanvasStyle> m_fillStyle;
+            Path m_path;
             float m_lineWidth;
             float m_lineWidth;
-            Cap m_lineCap;
-            Join m_lineJoin;
+            LineCap m_lineCap;
+            LineJoin m_lineJoin;
             float m_miterLimit;
             FloatSize m_shadowOffset;
             float m_shadowBlur;
             String m_shadowColor;
             float m_globalAlpha;
             CompositeOperator m_globalComposite;
             float m_miterLimit;
             FloatSize m_shadowOffset;
             float m_shadowBlur;
             String m_shadowColor;
             float m_globalAlpha;
             CompositeOperator m_globalComposite;
-#if __APPLE__
-            bool m_platformContextStrokeStyleIsPattern;
+            bool m_appliedStrokePattern;
+            bool m_appliedFillPattern;
+#if PLATFORM(CG)
             CGAffineTransform m_strokeStylePatternTransform;
             CGAffineTransform m_strokeStylePatternTransform;
-            bool m_platformContextFillStyleIsPattern;
             CGAffineTransform m_fillStylePatternTransform;
 #endif
         };
             CGAffineTransform m_fillStylePatternTransform;
 #endif
         };
@@ -198,12 +206,14 @@ namespace WebCore {
 
         GraphicsContext* drawingContext() const;
 
 
         GraphicsContext* drawingContext() const;
 
-#if __APPLE__
         void applyStrokePattern();
         void applyFillPattern();
 
         void applyStrokePattern();
         void applyFillPattern();
 
-        CGContextRef platformContext() const;
-#endif
+        void clearPathForDashboardBackwardCompatibilityMode();
+
+        void checkOrigin(const KURL&);
+
+        void printSecurityExceptionMessage() const;
 
         HTMLCanvasElement* m_canvas;
         Vector<State, 1> m_stateStack;
 
         HTMLCanvasElement* m_canvas;
         Vector<State, 1> m_stateStack;