Implement the HTML5 canvas tainting rules to prevent potential data leakage
[WebKit-https.git] / WebCore / html / CanvasRenderingContext2D.h
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef CanvasRenderingContext2D_h
27 #define CanvasRenderingContext2D_h
28
29 #include "FloatSize.h"
30 #include "GraphicsTypes.h"
31 #include "Path.h"
32 #include "PlatformString.h"
33 #include <wtf/Vector.h>
34
35 #if PLATFORM(CG)
36 #include <ApplicationServices/ApplicationServices.h>
37 #endif
38
39 namespace WebCore {
40
41     class CanvasGradient;
42     class CanvasPattern;
43     class CanvasStyle;
44     class FloatRect;
45     class GraphicsContext;
46     class HTMLCanvasElement;
47     class HTMLImageElement;
48     class ImageData;
49     class KURL;
50
51     typedef int ExceptionCode;
52
53     class CanvasRenderingContext2D : public RefCounted<CanvasRenderingContext2D> {
54     public:
55         CanvasRenderingContext2D(HTMLCanvasElement*);
56
57         HTMLCanvasElement* canvas() const { return m_canvas; }
58
59         CanvasStyle* strokeStyle() const;
60         void setStrokeStyle(PassRefPtr<CanvasStyle>);
61
62         CanvasStyle* fillStyle() const;
63         void setFillStyle(PassRefPtr<CanvasStyle>);
64
65         float lineWidth() const;
66         void setLineWidth(float);
67
68         String lineCap() const;
69         void setLineCap(const String&);
70
71         String lineJoin() const;
72         void setLineJoin(const String&);
73
74         float miterLimit() const;
75         void setMiterLimit(float);
76
77         float shadowOffsetX() const;
78         void setShadowOffsetX(float);
79
80         float shadowOffsetY() const;
81         void setShadowOffsetY(float);
82
83         float shadowBlur() const;
84         void setShadowBlur(float);
85
86         String shadowColor() const;
87         void setShadowColor(const String&);
88
89         float globalAlpha() const;
90         void setGlobalAlpha(float);
91
92         String globalCompositeOperation() const;
93         void setGlobalCompositeOperation(const String&);
94
95         void save();
96         void restore();
97
98         void scale(float sx, float sy);
99         void rotate(float angleInRadians);
100         void translate(float tx, float ty);
101         void transform(float m11, float m12, float m21, float m22, float dx, float dy);
102
103         void setStrokeColor(const String& color);
104         void setStrokeColor(float grayLevel);
105         void setStrokeColor(const String& color, float alpha);
106         void setStrokeColor(float grayLevel, float alpha);
107         void setStrokeColor(float r, float g, float b, float a);
108         void setStrokeColor(float c, float m, float y, float k, float a);
109
110         void setFillColor(const String& color);
111         void setFillColor(float grayLevel);
112         void setFillColor(const String& color, float alpha);
113         void setFillColor(float grayLevel, float alpha);
114         void setFillColor(float r, float g, float b, float a);
115         void setFillColor(float c, float m, float y, float k, float a);
116
117         void beginPath();
118         void closePath();
119
120         void moveTo(float x, float y);
121         void lineTo(float x, float y);
122         void quadraticCurveTo(float cpx, float cpy, float x, float y);
123         void bezierCurveTo(float cp1x, float cp1y, float cp2x, float cp2y, float x, float y);
124         void arcTo(float x0, float y0, float x1, float y1, float radius, ExceptionCode&);
125         void arc(float x, float y, float r, float sa, float ea, bool clockwise, ExceptionCode&);
126         void rect(float x, float y, float width, float height, ExceptionCode&);
127
128         void fill();
129         void stroke();
130         void clip();
131
132         bool isPointInPath(const float x, const float y);
133
134         void clearRect(float x, float y, float width, float height, ExceptionCode&);
135         void fillRect(float x, float y, float width, float height, ExceptionCode&);
136         void strokeRect(float x, float y, float width, float height, ExceptionCode&);
137         void strokeRect(float x, float y, float width, float height, float lineWidth, ExceptionCode&);
138
139         void setShadow(float width, float height, float blur);
140         void setShadow(float width, float height, float blur, const String& color);
141         void setShadow(float width, float height, float blur, float grayLevel);
142         void setShadow(float width, float height, float blur, const String& color, float alpha);
143         void setShadow(float width, float height, float blur, float grayLevel, float alpha);
144         void setShadow(float width, float height, float blur, float r, float g, float b, float a);
145         void setShadow(float width, float height, float blur, float c, float m, float y, float k, float a);
146
147         void clearShadow();
148
149         void drawImage(HTMLImageElement*, float x, float y);
150         void drawImage(HTMLImageElement*, float x, float y, float width, float height, ExceptionCode&);
151         void drawImage(HTMLImageElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
152         void drawImage(HTMLCanvasElement*, float x, float y);
153         void drawImage(HTMLCanvasElement*, float x, float y, float width, float height, ExceptionCode&);
154         void drawImage(HTMLCanvasElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
155
156         void drawImageFromRect(HTMLImageElement*, float sx, float sy, float sw, float sh,
157             float dx, float dy, float dw, float dh, const String& compositeOperation);
158
159         void setAlpha(float);
160
161         void setCompositeOperation(const String&);
162
163         PassRefPtr<CanvasGradient> createLinearGradient(float x0, float y0, float x1, float y1);
164         PassRefPtr<CanvasGradient> createRadialGradient(float x0, float y0, float r0, float x1, float y1, float r1);
165         PassRefPtr<CanvasPattern> createPattern(HTMLImageElement*, const String& repetitionType, ExceptionCode&);
166         PassRefPtr<CanvasPattern> createPattern(HTMLCanvasElement*, const String& repetitionType, ExceptionCode&);
167         
168         PassRefPtr<ImageData> createImageData(float width, float height) const;
169         PassRefPtr<ImageData> getImageData(float sx, float sy, float sw, float sh) const;
170         void putImageData(ImageData*, float dx, float dy, ExceptionCode&);
171         void putImageData(ImageData*, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight, ExceptionCode&);
172         
173         void reset();
174         void detachCanvas() { m_canvas = 0; }
175
176     private:
177         struct State {
178             State();
179
180             RefPtr<CanvasStyle> m_strokeStyle;
181             RefPtr<CanvasStyle> m_fillStyle;
182             Path m_path;
183             float m_lineWidth;
184             LineCap m_lineCap;
185             LineJoin m_lineJoin;
186             float m_miterLimit;
187             FloatSize m_shadowOffset;
188             float m_shadowBlur;
189             String m_shadowColor;
190             float m_globalAlpha;
191             CompositeOperator m_globalComposite;
192             bool m_appliedStrokePattern;
193             bool m_appliedFillPattern;
194 #if PLATFORM(CG)
195             CGAffineTransform m_strokeStylePatternTransform;
196             CGAffineTransform m_fillStylePatternTransform;
197 #endif
198         };
199
200         State& state() { return m_stateStack.last(); }
201         const State& state() const { return m_stateStack.last(); }
202
203         void applyShadow();
204
205         void willDraw(const FloatRect&);
206
207         GraphicsContext* drawingContext() const;
208
209         void applyStrokePattern();
210         void applyFillPattern();
211
212         void clearPathForDashboardBackwardCompatibilityMode();
213
214         void checkOrigin(const KURL&);
215
216         void printSecurityExceptionMessage() const;
217
218         HTMLCanvasElement* m_canvas;
219         Vector<State, 1> m_stateStack;
220     };
221
222 } // namespace WebCore
223
224 #endif