View Javadoc
1   /*
2    * Copyright (c) 2002-2025 Gargoyle Software Inc.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * https://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  package org.htmlunit.javascript.host.canvas;
16  
17  import java.io.InputStream;
18  import java.util.Collections;
19  
20  import org.apache.commons.io.IOUtils;
21  import org.htmlunit.WebDriverTestCase;
22  import org.htmlunit.junit.annotation.Alerts;
23  import org.htmlunit.junit.annotation.HtmlUnitNYI;
24  import org.htmlunit.util.MimeType;
25  import org.junit.jupiter.api.Test;
26  import org.junit.jupiter.api.condition.DisabledOnOs;
27  import org.junit.jupiter.api.condition.OS;
28  
29  /**
30   * Unit tests for {@link CanvasRenderingContext2D}.
31   *
32   * @author Ahmed Ashour
33   * @author Marc Guillemot
34   * @author Frank Danek
35   * @author Ronald Brill
36   */
37  public class CanvasRenderingContext2DTest extends WebDriverTestCase {
38  
39      /**
40       * @throws Exception if an error occurs
41       */
42      @Test
43      @Alerts("done")
44      public void test() throws Exception {
45          final String html =
46              "<html><head><script>\n"
47              + LOG_TEXTAREA_FUNCTION
48              + "function test() {\n"
49              + "  var canvas = document.getElementById('myCanvas');\n"
50              + "  try {\n"
51              + "    var ctx = canvas.getContext('2d');\n"
52              + "    ctx.fillStyle = 'rgb(200,0,0)';\n"
53              + "    ctx.fillRect(10, 10, 55, 50);\n"
54              + "    ctx.fillStyle = 'rgba(0, 0, 200, 0.5)';\n"
55              + "    ctx.fillRect(30, 30, 55, 50);\n"
56              + "    ctx.drawImage(canvas, 1, 2);\n"
57              + "    ctx.drawImage(canvas, 1, 2, 3, 4);\n"
58              + "    ctx.drawImage(canvas, 1, 1, 1, 1, 1, 1, 1, 1);\n"
59              + "    ctx.translate(10, 10);\n"
60              + "    ctx.scale(10, 10);\n"
61              + "    ctx.fillRect(30, 30, 55, 50);\n"
62              + "    ctx.beginPath();\n"
63              + "    ctx.moveTo(0, 10);\n"
64              + "    ctx.lineTo(10, 10);\n"
65              + "    ctx.quadraticCurveTo(0, 10, 15, 10);\n"
66              + "    ctx.closePath();\n"
67              + "    ctx.rotate(1.234);\n"
68              + "    log('done');\n"
69              + "  } catch(e) { logEx(e); }\n"
70              + "}\n"
71              + "</script>\n"
72              + "</head>\n"
73              + "<body onload='test()'>\n"
74              + "  <canvas id='myCanvas'></canvas></body>\n"
75              + LOG_TEXTAREA
76              + "</html>";
77          loadPageVerifyTextArea2(html);
78      }
79  
80      /**
81       * @throws Exception if an error occurs
82       */
83      @Test
84      @Alerts({"addHitRegion", "drawCustomFocusRing", "drawSystemFocusRing", "removeHitRegion",
85               "scrollPathIntoView", "36 methods"})
86      public void methods() throws Exception {
87          final String[] methods = {"addHitRegion", "arc", "arcTo", "beginPath", "bezierCurveTo", "clearRect", "clip",
88              "closePath", "createImageData", "createLinearGradient", "createPattern", "createRadialGradient",
89              "drawImage", "drawCustomFocusRing", "drawSystemFocusRing", "ellipse", "fill", "fillRect", "fillText",
90              "getImageData", "getLineDash", "isPointInPath", "lineTo", "measureText", "moveTo", "putImageData",
91              "quadraticCurveTo", "rect", "removeHitRegion", "restore", "rotate", "save", "scale", "scrollPathIntoView",
92              "setLineDash", "setTransform", "stroke", "strokeRect", "strokeText", "transform", "translate" };
93          final String html = DOCTYPE_HTML
94              + "<html><body>\n"
95              + "<canvas id='myCanvas'></canvas>\n"
96              + LOG_TEXTAREA
97              + "<script>\n"
98              + LOG_TEXTAREA_FUNCTION
99              + "  var canvas = document.getElementById('myCanvas');\n"
100             + "  var nbMethods = 0;\n"
101             + "  var methods = ['" + String.join("', '", methods) + "'];\n"
102             + "  try {\n"
103             + "    var ctx = canvas.getContext('2d');\n"
104             + "    for (var i = 0; i < methods.length; i++) {\n"
105             + "      if (typeof ctx[methods[i]] == 'function')\n"
106             + "        nbMethods++;\n"
107             + "      else\n"
108             + "        log(methods[i]);\n"
109             + "    }\n"
110             + "    log(nbMethods + ' methods');\n"
111             + "  } catch(e) { logEx(e); }\n"
112             + "</script></body></html>";
113 
114         loadPageVerifyTextArea2(html);
115     }
116 
117     private void drawImage(final String png, final String canvasSetup, final String drawJS) throws Exception {
118         try (InputStream is = getClass().getResourceAsStream(png)) {
119             final byte[] directBytes = IOUtils.toByteArray(is);
120             getMockWebConnection().setResponse(URL_SECOND, directBytes, 200, "ok",
121                     MimeType.IMAGE_PNG, Collections.emptyList());
122             getMockWebConnection().setDefaultResponse("Test");
123         }
124 
125         final String html = DOCTYPE_HTML
126             + "<html><head>\n"
127             + "<script>\n"
128             + LOG_TEXTAREA_FUNCTION
129             + "  function test() {\n"
130             + "    var img = document.getElementById('myImage');\n"
131             + "    var canvas = document.createElement('canvas');\n"
132             + canvasSetup
133             + "    if (canvas.getContext) {\n"
134             + "      var context = canvas.getContext('2d');\n"
135             + drawJS
136             + "      log(canvas.toDataURL());\n"
137             + "    }\n"
138             + "  }\n"
139             + "</script>\n"
140             + "</head><body onload='test()'>\n"
141             + "  <img id='myImage' src='" + URL_SECOND + "'>\n"
142             + LOG_TEXTAREA
143             + "</body></html>";
144 
145         loadPageVerifyTextArea2(html);
146     }
147 
148     /**
149      * @throws Exception if the test fails
150      */
151     @Test
152     @Alerts(DEFAULT = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAutJREFUO"
153                     + "E99k19sU1Ucxz/3du1du94tLcE1IjIUHlASRcEOtnVccWyIJWRmuhD02cBQlMTnvfsiIUQy9uIDCf+hWYFN3Q0mBAIJSCQy"
154                     + "yIgORMtGHe1u71273T/m3qYN2wPn5OSc3znn90nO+X2/AsDF8XGp5vGT/QFJahBFEVEE0T14vtkwndfuf9Sp/Pj8tuAGF0Z"
155                     + "GExveXferaVoIgoAggOD28qI8Ow6iKHD1xs3Dya4P+ioQD3AilVbaNzar86aF6AEqo5xcGQG/D8uyuHzlxnfdyc5v3VwPcC"
156                     + "Y1rLRu2qDOmyaiIHoJmYJJtlS+EpFgZURC1wsYuo7P53P+fPRwfdeWLbeqgLaW91T3CaYNV/8tUQzIyLVBHBxkDMyiwVuxE"
157                     + "HUBHwIOw+qVZG/39nQVkHABls21v3UyVpBwnUy0XiImWQTMWXIFg4fPSux8cwn+mhpSl0YXAVrj6jNjjsHbOfyhMCuW1LNU"
158                     + "riXeKDKllZjRNCayM7yzPMrrS8OkLv6yENDeGlfHJgucvJcnFAoRDtaxIiLR0RQk7LO5l8lx7PcpNq+M0vVGI+cv/LwQsLk"
159                     + "trv6R0bj56D86VkcY+Qf+0mws2+bjVUG0gs7315/wdUsT29bGOJdeDEg0q5pR4sDQGH3rGjhyd47peQHHceh6VWIiq3F7qs"
160                     + "jgJ2/zWmMDZxcA0sOK0tKszhaLnLo+jjpR4Lenc95ngYNgWZ46e9ZEOLB1LXK9TOrST8meHdUqpBWlvU21TItsNsvZOxlOj"
161                     + "+WYnjWxbYew5KN7TZTP17/CspdjSAGJ80MjyZ5KGY+dSCkfdiqqKxvbtjEMg+kZjQdPdWwHVr0kE4vKyLJMwO9HFH0cP51K"
162                     + "7u7tLuvg0A9H3/9s16ejrgkqUva07jgIokDZYGJVpa4nDh4+suObL/cOeYB4IrF63xd7ByORSF3Vad5J2ZMLnClAbiY/u7/"
163                     + "vqz2Tk4/veNf6+/tr8vm8f7GDXxTrum4ODAzM/w8TKTogggbXQgAAAABJRU5ErkJggg==",
164             FF = "data:image/png;base64,"
165                     + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC6UlEQVQ4T12TXUgUURTH//s57rqj7Yq5VKaWgpbRl7p+rl+"
166                     + "ZWihi6VP1qqREJvTsey9FBIIS9CBEZbVpqJkTihgKpSSlsYWa2ppu6u7sjrs6M9ud2davGc69d+7c8+Occ/9HAfLY7XZqZm"
167                     + "Hpdhili1QqyQYZpGn/43Kz38sv5D/Zva+QPt72DVrTz58a5HkBCoWCGEBGeU2m4BwIEK4CI2PjjyrKihpDEBnQ2d1bmJORx"
168                     + "mwRgFIGhCzoHDKtRgVBEDA0PHavqqL0ruS7Dci1pBMATwBK2cHh4eH0B48YKSCBDF6vB5zXC7VaHfg5t5hWVmz9vA3Iy8xg"
169                     + "pBR4ERj57YdPS4MO0yFAXhoceB+H02Y9wrUqggygf2i4oqbycvc2wCoBBBEf571wCDoYwmmYIiiYKQFafgPrHg5za35UnYy"
170                     + "CRq1Gd//ADsBGapCdZWHWuE20T6xDozcgLioC0XQYLDFKLLN+uFkWs043zsWacDzagO537/dGkE8AU388eDbtgl6vh0EXjj"
171                     + "iSd0k8iUYlYtqxjo4vyyhIMKHsRAy6+j4QQOlOCgXZFuarg8WnX39RkmRE3yIww4oQRBFXEnVgPV7cH11CU048ylPNeNPbv"
172                     + "zeCgpxMhuX8aO6aQuPZSLR+28TqFikXuf+yoxQJn8XEsg/ttWdwLCYStt5dEUg1yCOADZ8Pz0ftYGY9GF/ZlItFFAQFuXtJ"
173                     + "oTUpRjRfTAUdQcPWw+xNoTA3ixHINTqdTrycdODF1DpWN3iIYgAGSoXqFBNupB3B4UNmUFoKr3v6dlLo6LQVXiouZCTZiCR"
174                     + "njuOw6mbxY8UL4o/EgzTMJqILmoZWoyHRqPD0la3iWk11sIgP2x4XXa+9OiA1QUjKstZJ/gqif6XUXJL9V6nUEw9a2yrvNN"
175                     + "R3yQCr1ZpUV9/QfsBkDN/uNPlPsCf3d6bb7d5obrp1c2FhYVI+1tLSona5XJqgcyxiY3c37N71/Py8vJGcnMzX1dVt/QNcN"
176                     + "Toga4nOWgAAAABJRU5ErkJggg==",
177             FF_ESR = "data:image/png;base64,"
178                     + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC6UlEQVQ4T12TXUgUURTH//s57rqj7Yq5VKaWgpbRl7p+rl+"
179                     + "ZWihi6VP1qqREJvTsey9FBIIS9CBEZbVpqJkTihgKpSSlsYWa2ppu6u7sjrs6M9ud2davGc69d+7c8+Occ/9HAfLY7XZqZm"
180                     + "Hpdhili1QqyQYZpGn/43Kz38sv5D/Zva+QPt72DVrTz58a5HkBCoWCGEBGeU2m4BwIEK4CI2PjjyrKihpDEBnQ2d1bmJORx"
181                     + "mwRgFIGhCzoHDKtRgVBEDA0PHavqqL0ruS7Dci1pBMATwBK2cHh4eH0B48YKSCBDF6vB5zXC7VaHfg5t5hWVmz9vA3Iy8xg"
182                     + "pBR4ERj57YdPS4MO0yFAXhoceB+H02Y9wrUqggygf2i4oqbycvc2wCoBBBEf571wCDoYwmmYIiiYKQFafgPrHg5za35UnYy"
183                     + "CRq1Gd//ADsBGapCdZWHWuE20T6xDozcgLioC0XQYLDFKLLN+uFkWs043zsWacDzagO537/dGkE8AU388eDbtgl6vh0EXjj"
184                     + "iSd0k8iUYlYtqxjo4vyyhIMKHsRAy6+j4QQOlOCgXZFuarg8WnX39RkmRE3yIww4oQRBFXEnVgPV7cH11CU048ylPNeNPbv"
185                     + "zeCgpxMhuX8aO6aQuPZSLR+28TqFikXuf+yoxQJn8XEsg/ttWdwLCYStt5dEUg1yCOADZ8Pz0ftYGY9GF/ZlItFFAQFuXtJ"
186                     + "oTUpRjRfTAUdQcPWw+xNoTA3ixHINTqdTrycdODF1DpWN3iIYgAGSoXqFBNupB3B4UNmUFoKr3v6dlLo6LQVXiouZCTZiCR"
187                     + "njuOw6mbxY8UL4o/EgzTMJqILmoZWoyHRqPD0la3iWk11sIgP2x4XXa+9OiA1QUjKstZJ/gqif6XUXJL9V6nUEw9a2yrvNN"
188                     + "R3yQCr1ZpUV9/QfsBkDN/uNPlPsCf3d6bb7d5obrp1c2FhYVI+1tLSona5XJqgcyxiY3c37N71/Py8vJGcnMzX1dVt/QNcN"
189                     + "Toga4nOWgAAAABJRU5ErkJggg==")
190     public void drawImage() throws Exception {
191         drawImage("html.png",
192                 "canvas.width = img.width; canvas.height = img.height;\n",
193                 "context.drawImage(img, 0, 0, canvas.width, canvas.height);\n");
194     }
195 
196     /**
197      * @throws Exception if the test fails
198      */
199     @Test
200     @Alerts({"rendering...", "...done"})
201     public void drawImage_noImage() throws Exception {
202         final String html = DOCTYPE_HTML
203             + "<html><body>\n"
204             + "<img id='myImage'>\n"
205             + "<canvas id='myCanvas'></canvas>\n"
206             + LOG_TEXTAREA
207             + "<script>\n"
208             + LOG_TEXTAREA_FUNCTION
209             + "try {\n"
210             + "  var img = document.getElementById('myImage');\n"
211             + "  var canvas = document.getElementById('myCanvas');\n"
212             + "  var context = canvas.getContext('2d');\n"
213             + "  log('rendering...');\n"
214             + "  context.drawImage(img, 0, 0, 10, 10);\n"
215             + "  log('...done');\n"
216             + "} catch(e) { logEx(e); }\n"
217             + "</script></body></html>";
218 
219         loadPageVerifyTextArea2(html);
220     }
221 
222     /**
223      * @throws Exception if the test fails
224      */
225     @Test
226     @Alerts({"rendering...", "...done"})
227     public void drawImage_invalidImage() throws Exception {
228         try (InputStream is = getClass().getResourceAsStream("invalid.png")) {
229             final byte[] directBytes = IOUtils.toByteArray(is);
230             getMockWebConnection().setResponse(URL_SECOND, directBytes, 200, "ok",
231                     MimeType.IMAGE_PNG, Collections.emptyList());
232             getMockWebConnection().setDefaultResponse("Test");
233         }
234 
235         final String html = DOCTYPE_HTML
236             + "<html><body>\n"
237             + "<img id='myImage'>\n"
238             + "<canvas id='myCanvas'></canvas>\n"
239             + LOG_TEXTAREA
240             + "<script>\n"
241             + LOG_TEXTAREA_FUNCTION
242             + "try {\n"
243             + "  var img = document.getElementById('myImage');\n"
244             + "  var canvas = document.getElementById('myCanvas');\n"
245             + "  var context = canvas.getContext('2d');\n"
246             + "  log('rendering...');\n"
247             + "  context.drawImage(img, 0, 0, 10, 10);\n"
248             + "  log('...done');\n"
249             + "} catch(e) { logEx(e); }\n"
250             + "</script></body></html>";
251 
252         loadPageVerifyTextArea2(html);
253     }
254 
255     /**
256      * @throws Exception if the test fails
257      */
258     @Test
259     @Alerts(DEFAULT = "data:image/png;base64,"
260                 + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdj+M/A8B8ABQAB/6Zcm10A"
261                 + "AAAASUVORK5CYII=",
262             FF = "data:image/png;base64,"
263                 + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z8DwHwAFAAH/F1FwBgAAAABJRU5ErkJggg==",
264             FF_ESR = "data:image/png;base64,"
265                 + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z8DwHwAFAAH/F1FwBgAAAABJRU5ErkJggg==")
266     // The output depends on the deflation algorithm
267     // check the output of: $pngcheck -v file.png
268     // chrome gives: zlib: deflated, 256-byte window, fast compression
269     // java gives:   zlib: deflated, 32K window, maximum compression
270     // https://bugs.openjdk.java.net/browse/JDK-8056093
271     public void drawImage_1x1_32bits() throws Exception {
272         drawImage("1x1red_32_bit_depth.png",
273                 "canvas.width = img.width; canvas.height = img.height;\n",
274                 "context.drawImage(img, 0, 0, canvas.width, canvas.height);\n");
275     }
276 
277     /**
278      * @throws Exception if the test fails
279      */
280     @Test
281     @Alerts(DEFAULT = "data:image/png;base64,"
282                 + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdj+M/A8B8ABQAB/6Zcm10A"
283                 + "AAAASUVORK5CYII=",
284             FF = "data:image/png;base64,"
285                 + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z8DwHwAFAAH/F1FwBgAAAABJRU5ErkJggg==",
286             FF_ESR = "data:image/png;base64,"
287                 + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z8DwHwAFAAH/F1FwBgAAAABJRU5ErkJggg==")
288     public void drawImage_1x1_24bits() throws Exception {
289         drawImage("1x1red_24_bit_depth.png",
290                 "canvas.width = img.width; canvas.height = img.height;\n",
291                 "context.drawImage(img, 0, 0, canvas.width, canvas.height);\n");
292     }
293 
294     /**
295      * @throws Exception if the test fails
296      */
297     @Test
298     @Alerts(DEFAULT = "data:image/png;base64,"
299                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAABdJREFUGFdj/M/A8J+RgYGRAQrgDOI"
300                 + "FAIPmAgWeg1g2AAAAAElFTkSuQmCC",
301             FF = "data:image/png;base64,"
302                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAF0lEQVQIW2P8z8Dwn5GBAYggAM4gXgAAg+YCBUgKw5EAAAAA"
303                 + "SUVORK5CYII=",
304             FF_ESR = "data:image/png;base64,"
305                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAF0lEQVQIW2P8z8Dwn5GBAYggAM4gXgAAg+YCBUgKw5EAAAAA"
306                 + "SUVORK5CYII=")
307     public void drawImage3Arguments() throws Exception {
308         drawImage("1x1red_32_bit_depth.png",
309                 "canvas.width = 4; canvas.height = 4;\n",
310                 "context.drawImage(img, 0, 0);\n");
311     }
312 
313     /**
314      * @throws Exception if the test fails
315      */
316     @Test
317     @Alerts(DEFAULT = "data:image/png;base64,"
318                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAABpJREFUGFdjZEADjFgF/jMw/GdkYABL"
319                 + "YqgAADfmAgXboMAzAAAAAElFTkSuQmCC",
320             FF = "data:image/png;base64,"
321                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAGUlEQVQIW2NkQAOMWAX+MzD8B8qAJTFUAAA35gIFxQ+VugAA"
322                 + "AABJRU5ErkJggg==",
323             FF_ESR = "data:image/png;base64,"
324                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAGUlEQVQIW2NkQAOMWAX+MzD8B8qAJTFUAAA35gIFxQ+VugAA"
325                 + "AABJRU5ErkJggg==")
326     public void drawImage3ArgumentsPlacement() throws Exception {
327         drawImage("1x1red_32_bit_depth.png",
328                 "canvas.width = 4; canvas.height = 4;\n",
329                 "context.drawImage(img, 1, 2);\n");
330     }
331 
332 
333     /**
334      * @throws Exception if the test fails
335      */
336     @Test
337     @Alerts(DEFAULT = "data:image/png;base64,"
338                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAC1JREFUGFc1yNENACAQwlAYxUllU0ep4aL9"
339                 + "ap6RMEv4yJKdhJ2oDXQABtqHt76KMBEFpp4gUgAAAABJRU5ErkJggg==",
340             FF = "data:image/png;base64,"
341                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAL0lEQVQIWzXI0REAEBAD0Y1OVCqd6kQ4w/vaWQXS0lmaCCTb"
342                 + "GTbljoocd5Q/XmoDijQRBTzmAeYAAAAASUVORK5CYII=",
343             FF_ESR = "data:image/png;base64,"
344                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAL0lEQVQIWzXI0REAEBAD0Y1OVCqd6kQ4w/vaWQXS0lmaCCTb"
345                 + "GTbljoocd5Q/XmoDijQRBTzmAeYAAAAASUVORK5CYII=")
346     public void drawImage3ArgumentsPlacementNegative() throws Exception {
347         drawImage("4x6.png",
348                 "canvas.width = 4; canvas.height = 4;\n",
349                 "context.drawImage(img, -1, -2);\n");
350     }
351 
352     /**
353      * @throws Exception if the test fails
354      */
355     @Test
356     @Alerts(DEFAULT = "data:image/png;base64,"
357                 + "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAFCAYAAABvsz2cAAAAAXNSR0IArs4c6QAAACpJREFUGFctyLERACAMxDD/KDTMGbbk0jC"
358                 + "KKUClwlQ7RJANwaE5b1YV4buKVA5Xbm45TAAAAABJRU5ErkJggg==",
359             FF = "data:image/png;base64,"
360                 + "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAFCAYAAABvsz2cAAAAK0lEQVQIWy3IsRUAEBQEwd1SJOr8uvQkOnECJhzpSZYYCBM0"
361                 + "Lcf9ZlQh3wWKWA5Xk6MBwQAAAABJRU5ErkJggg==",
362             FF_ESR = "data:image/png;base64,"
363                 + "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAFCAYAAABvsz2cAAAAK0lEQVQIWy3IsRUAEBQEwd1SJOr8uvQkOnECJhzpSZYYCBM0"
364                 + "Lcf9ZlQh3wWKWA5Xk6MBwQAAAABJRU5ErkJggg==")
365     public void drawImage3ArgumentsImageTooLarge() throws Exception {
366         drawImage("4x6.png",
367                 "canvas.width = 2; canvas.height = 5;\n",
368                 "context.drawImage(img, 0, 0);\n");
369     }
370 
371     /**
372      * @throws Exception if the test fails
373      */
374     @Test
375     @Alerts(DEFAULT = "data:image/png;base64,"
376                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAABdJREFUGFdj/M/A8J+RgYGRAQrgDOI"
377                 + "FAIPmAgWeg1g2AAAAAElFTkSuQmCC",
378             FF = "data:image/png;base64,"
379                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAF0lEQVQIW2P8z8Dwn5GBAYggAM4gXgAAg+YCBUgKw5EAAAAA"
380                 + "SUVORK5CYII=",
381             FF_ESR = "data:image/png;base64,"
382                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAF0lEQVQIW2P8z8Dwn5GBAYggAM4gXgAAg+YCBUgKw5EAAAAA"
383                 + "SUVORK5CYII=")
384     public void drawImage5Arguments() throws Exception {
385         drawImage("1x1red_32_bit_depth.png",
386                 "canvas.width = 4; canvas.height = 4;\n",
387                 "context.drawImage(img, 0, 0, img.width, img.height);\n");
388     }
389 
390     /**
391      * @throws Exception if the test fails
392      */
393     @Test
394     @Alerts(DEFAULT = "data:image/png;base64,"
395                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAABpJREFUGFdjZEADjFgF/jMw/GdkYABL"
396                 + "YqgAADfmAgXboMAzAAAAAElFTkSuQmCC",
397             FF = "data:image/png;base64,"
398                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAGUlEQVQIW2NkQAOMWAX+MzD8B8qAJTFUAAA35gIFxQ+VugAA"
399                 + "AABJRU5ErkJggg==",
400             FF_ESR = "data:image/png;base64,"
401                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAGUlEQVQIW2NkQAOMWAX+MzD8B8qAJTFUAAA35gIFxQ+VugAA"
402                 + "AABJRU5ErkJggg==")
403     public void drawImage5ArgumentsPlacement() throws Exception {
404         drawImage("1x1red_32_bit_depth.png",
405                 "canvas.width = 4; canvas.height = 4;\n",
406                 "context.drawImage(img, 1, 2, img.width, img.height);\n");
407     }
408 
409     /**
410      * @throws Exception if the test fails
411      */
412     @Test
413     @Alerts(DEFAULT = "data:image/png;base64,"
414                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAACVJREFUGFdj/H+D4T+jBgMjAxQw/mdg+M/I"
415                 + "gFfg////jIyMcC0AnzULBWgjtygAAAAASUVORK5CYII=",
416             FF = "data:image/png;base64,"
417                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAJElEQVQIW2P8f4PhP6MGAyMDFDD+ZwAKMOAV+P//PyMQwLQAAJ81"
418                 + "CwUd8tccAAAAAElFTkSuQmCC",
419             FF_ESR = "data:image/png;base64,"
420                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAJElEQVQIW2P8f4PhP6MGAyMDFDD+ZwAKMOAV+P//PyMQwLQAAJ81"
421                 + "CwUd8tccAAAAAElFTkSuQmCC")
422     public void drawImage5ArgumentsPlacementNegative() throws Exception {
423         drawImage("4x6.png",
424                 "canvas.width = 4; canvas.height = 4;\n",
425                 "context.drawImage(img, -3, -1, img.width, img.height);\n");
426     }
427 
428     /**
429      * @throws Exception if the test fails
430      */
431     @Test
432     @Alerts(DEFAULT = "data:image/png;base64,"
433                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAABZJREFUGFdj/M/A8J8BCTAic0BswgIAg"
434                 + "2sCAzQ3b+cAAAAASUVORK5CYII=",
435             FF = "data:image/png;base64,"
436                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAFklEQVQIW2P8z8AARAjAiMwBsQkLAACDawID+0h1rgAAAABJ"
437                 + "RU5ErkJggg==",
438             FF_ESR = "data:image/png;base64,"
439                 + "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAFklEQVQIW2P8z8AARAjAiMwBsQkLAACDawID+0h1rgAAAABJ"
440                 + "RU5ErkJggg==")
441     public void drawImageStretch() throws Exception {
442         drawImage("1x1red_32_bit_depth.png",
443                 "canvas.width = 4; canvas.height = 4;\n",
444                 "context.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, img.height);\n");
445     }
446 
447     /**
448      * @throws Exception if the test fails
449      */
450     @Test
451     @Alerts(DEFAULT = "data:image/png;base64,"
452                 + "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAFCAYAAABvsz2cAAAAAXNSR0IArs4c6QAAACpJREFUGFctyLERACAMxDD/KDTMGbbk0jC"
453                 + "KKUClwlQ7RJANwaE5b1YV4buKVA5Xbm45TAAAAABJRU5ErkJggg==",
454             FF = "data:image/png;base64,"
455                 + "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAFCAYAAABvsz2cAAAAK0lEQVQIWy3IsRUAEBQEwd1SJOr8uvQkOnECJhzpSZYYCBM0Lcf"
456                 + "9ZlQh3wWKWA5Xk6MBwQAAAABJRU5ErkJggg==",
457             FF_ESR = "data:image/png;base64,"
458                 + "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAFCAYAAABvsz2cAAAAK0lEQVQIWy3IsRUAEBQEwd1SJOr8uvQkOnECJhzpSZYYCBM0Lcf"
459                 + "9ZlQh3wWKWA5Xk6MBwQAAAABJRU5ErkJggg==")
460     public void drawImage5ArgumentsImageTooLarge() throws Exception {
461         drawImage("4x6.png",
462                 "canvas.width = 2; canvas.height = 5;\n",
463                 "context.drawImage(img, 0, 0, 4, 6);\n");
464     }
465 
466     /**
467      * @throws Exception if the test fails
468      */
469     @Test
470     @Alerts(DEFAULT = "data:image/png;base64,"
471                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAJFJREFUKFONkMENAjEMBNclIBoIH0QF"
472                 + "9z0XRA+Re6CgpZM0gO538DM4CaeDV1aRrI0mazuCQUnlzu66Evlh1dox1xpen4QAUkGPMwG49vhbr+EnQC4dhJ9c+UK2pSXm"
473                 + "Q0u0BXH/k1hSwl21AjOJVMo2/Qbu93H3oGPI9urTQUL/S39BkmpmINnYwd+JOcc0DL4B84cwC7JlTrYAAAAASUVORK5CYII=",
474             FF = "data:image/png;base64,"
475                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAmElEQVQYV42PzQ3CMAyF7Q2QukC4ICbotR6IHTA7MJC9SRZA"
476                 + "4kS5GdsKUWlVCSuS814+/wThz8DkTmbTS4AfnJKHll3TrOAQJmhxRr9cWvt7y6Hdx3MD0Y42yQxXfiZx40Pm0KTv3461FBCi"
477                 + "BEgESq19+z56+R/zdWPN4L8+Riyh3LeBIkLMDKoa9hZcF/auew9rfzN6r/AD8z8wC6n68A8AAAAASUVORK5CYII=",
478             FF_ESR = "data:image/png;base64,"
479                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAkUlEQVQYV62PwQ0CMQwE7RIQDYQPooL7nguih8g9UJDpJA2c"
480                 + "+AE/s3ai04GExAMrkbPWeLVh+rE4uaO73I3qoil1X7OHlocRIE7Q40x4nIf9ZfTQmPNpgOwHn+1JVW/dse66I7Rg/ubYSqGr"
481                 + "SAKzGZXW1vQruP2PI26Y4fYtFEdtocw7QDMTVSX0zn6C3/T/wRfzizALwpK/7gAAAABJRU5ErkJggg==")
482     public void drawImage5ArgumentsStretchX() throws Exception {
483         drawImage("4x6.png",
484                 "canvas.width = 10; canvas.height = 10;\n",
485                 "context.drawImage(img, 1, 1, 8, 6);\n");
486     }
487 
488     /**
489      * @throws Exception if the test fails
490      */
491     @Test
492     @Alerts(DEFAULT = "data:image/png;base64,"
493                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAFFJREFUKFNjZCASMILUNQg3/K+PbGBoXN7"
494                 + "AAKIZpzCAxZEBRGGDwH/7AwYMBx0uMNQ3fACpwq4QpvP/////GxsbGRoaGvArxOdcDJ24FA8FhQDPFBULZWbihAAAAABJRU5Erk"
495                 + "Jggg==",
496             FF = "data:image/png;base64,"
497                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAUElEQVQYV2NkIBIwgtTVC9f/b4hsZGhYXs8AohmnMIDFkQFY"
498                 + "oKFe4L/9QQOGg/YXGOobP4BUYVcI0/kfCBoaGhgaGxvxK8TnXAyduBQPBYUAzvAVCzcdbJgAAAAASUVORK5CYII=",
499             FF_ESR = "data:image/png;base64,"
500                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAATklEQVQYV2NkIBIwgtQ1CDf8r49sYGhc3sAAohmnMIDFkQFE"
501                 + "YYPAf/sDBgwHHS4w1Dd8AKnCrhCm8z8QNDY2AjU24FeIz7kYOnEpHgoKAc8UFQug8KnwAAAAAElFTkSuQmCC")
502     public void drawImage5ArgumentsShrinkY() throws Exception {
503         drawImage("4x6.png",
504                 "canvas.width = 10; canvas.height = 10;\n",
505                 "context.drawImage(img, 1, 1, 4, 3);\n");
506     }
507 
508     /**
509      * @throws Exception if the test fails
510      */
511     @Test
512     @Alerts(DEFAULT = "data:image/png;base64,"
513                 + "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAFCAYAAABvsz2cAAAAAXNSR0IArs4c6QAAADhJREFUGFcBLQDS/wEAJv//QPbAAAFAHL/"
514                 + "/MAfQAAG/CUD/ECfwAAG/QAj/EBj+AAFAvxn/MN76AI+DEbp3TIWcAAAAAElFTkSuQmCC",
515             FF = "data:image/png;base64,"
516                 + "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAFCAYAAABvsz2cAAAANUlEQVQIW2NkUPv/3/7bAQZGe5n9/w3YLjAw7ue0/y+g9gHI"
517                 + "sOf4LyD5j4HRYb/Ef4O7vxgAjuARs3OGyksAAAAASUVORK5CYII=",
518             FF_ESR = "data:image/png;base64,"
519                 + "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAFCAYAAABvsz2cAAAANElEQVQIW2NkUPv/3+HbAQZGB5n9/w3YLzAw7ud0+C+g/gHI"
520                 + "cOD4LyDxDyi1X/K/wb1fDACPgxG6JQ+97QAAAABJRU5ErkJggg==")
521     public void drawImage5ArgumentsStretchImageTooLarge() throws Exception {
522         drawImage("4x6.png",
523                 "canvas.width = 2; canvas.height = 5;\n",
524                 "context.drawImage(img, 0, 0, 8, 12);\n");
525     }
526 
527     /**
528      * @throws Exception if the test fails
529      */
530     @Test
531     @Alerts(DEFAULT = "data:image/png;base64,"
532                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAFpJREFUKFO10EEKgDAMRNE/R+mm9JbGW4ob"
533                 + "jzJiUFetdGM2A+GRwIjJ0aTjD1ht70LVZNL/IoPZgAZXqg0gLrYO5ELm18U1giUiCxjCpx7bTih1m3iXF7xNF57OsB8LLeYw9AAA"
534                 + "AABJRU5ErkJggg==",
535             FF = "data:image/png;base64,"
536                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAX0lEQVQYV7WQQQqAMBADE3/SS+kvrb8UL/7EmIp62kovBkJg"
537                 + "GXbDEoPiIIc/wCxpI5iFKxFfoQBhddNiO1k6IJV0cMekhJafG5daMdtNXfB5j5u6hUEretk7bODNhOAJzrgfCzJhsNQAAAAA"
538                 + "SUVORK5CYII=",
539             FF_ESR = "data:image/png;base64,"
540                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAX0lEQVQYV7WQQQqAMBADE3/SS+kvrb8UL/7EmIp62kovBkJg"
541                 + "GXbDEoPiIIc/wCxpI5iFKxFfoQBhddNiO1k6IJV0cMekhJafG5daMdtNXfB5j5u6hUEretk7bODNhOAJzrgfCzJhsNQAAAAA"
542                 + "SUVORK5CYII=")
543     public void drawImage5ArgumentsNegativeWidth() throws Exception {
544         drawImage("4x6.png",
545                 "canvas.width = 10; canvas.height = 10;\n",
546                 "context.drawImage(img, 4, 4, -4, 6);\n");
547     }
548 
549 
550     /**
551      * @throws Exception if the test fails
552      */
553     @Test
554     @Alerts(DEFAULT = "data:image/png;base64,"
555                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAFlJREFUKFPFzkEKgDAMRNE/R+mm9JbGW4ob"
556                 + "jzJiUChixZ0hZDaPJOJe1fYqVE0mR5+jtwazAA2OVBtAXGxtyIXMt41zBFNEHhrC6w3bTig9/9jD3qT+Uj/CHbu+Hws0CMhTAAAA"
557                 + "AElFTkSuQmCC",
558             FF = "data:image/png;base64,"
559                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAX0lEQVQYV8WOQQqAMBADE3/SS+kvrb8UL/7EmJYKRap4M+w2"
560                 + "sAxNiLuipI1gFKqjTHt6VoCw+pK8dqYHkAo6uGNSQPHXH5ecMXtb5Dj6quGmbuFoa9ixB3um0l/0I3gCu8YfCw1yrNcAAAAA"
561                 + "SUVORK5CYII=",
562             FF_ESR = "data:image/png;base64,"
563                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAX0lEQVQYV8WOQQqAMBADE3/SS+kvrb8UL/7EmJYKRap4M+w2"
564                 + "sAxNiLuipI1gFKqjTHt6VoCw+pK8dqYHkAo6uGNSQPHXH5ecMXtb5Dj6quGmbuFoa9ixB3um0l/0I3gCu8YfCw1yrNcAAAAA"
565                 + "SUVORK5CYII=")
566     public void drawImage5ArgumentsNegativeHeight() throws Exception {
567         drawImage("4x6.png",
568                 "canvas.width = 10; canvas.height = 10;\n",
569                 "context.drawImage(img, 4, 6, 4, -6);\n");
570     }
571 
572     /**
573      * @throws Exception if the test fails
574      */
575     @Test
576     @Alerts(DEFAULT = "data:image/png;base64,"
577                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAFxJREFUKFOl0EEKgDAMRNE/R+mm9JbGW4ob"
578                 + "jzJiRSjUSsFsZvMIk4jJ0aSjh9n2LpRNTW7TQYPZgAJXqgwgTrYO5ETNr41rBEtErT+Ez3G2XaH03rGFrfnxnsFjT80oHwvhRbeC"
579                 + "AAAAAElFTkSuQmCC",
580             FF = "data:image/png;base64,"
581                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAY0lEQVQYV6WQXQqAMAyDE2+yl+EtnbcUX7yJMf7BYJsMLJQ89KNJ"
582                 + "S3QWOzmUYJS0EozCpbiZAhQgLJ6MbivHBkgF7dwwKODUz41zSpjcj2Xd+j3OSZ3C1q5qxhzMmR/vaTz2AM0wHwuiBt/PAAAAAElF"
583                 + "TkSuQmCC",
584             FF_ESR = "data:image/png;base64,"
585                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAY0lEQVQYV6WQXQqAMAyDE2+yl+EtnbcUX7yJMf7BYJsMLJQ89KNJ"
586                 + "S3QWOzmUYJS0EozCpbiZAhQgLJ6MbivHBkgF7dwwKODUz41zSpjcj2Xd+j3OSZ3C1q5qxhzMmR/vaTz2AM0wHwuiBt/PAAAAAElF"
587                 + "TkSuQmCC")
588     public void drawImage9Arguments() throws Exception {
589         drawImage("4x6.png",
590                 "canvas.width = 10; canvas.height = 10;\n",
591                 "context.drawImage(img, 0, 0, img.width, img.height, 4, 2, img.width, img.height);\n");
592     }
593 
594     /**
595      * @throws Exception if the test fails
596      */
597     @Test
598     @Alerts(DEFAULT = "data:image/png;base64,"
599                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAIpJREFUKFNjPBXA/p+BgYFhWgQfiGJY"
600                 + "EPGaEcxAA4zrA0zACh8ovGAQ+PCBIXHBF+wKFyQkXGHl4OC2v3ZNVPrtW27Gq1dxKIyP1zaNiDBVkZDIYmNlNWXU0cGuEGTt"
601                 + "////HYBU/YMHDxwUFRUJKzxw4ICDo6MjboXYfInha2IUgdRgtQZrOBJrIgAUwCcL+6R7MwAAAABJRU5ErkJggg==",
602             FF = "data:image/png;base64,"
603                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAgklEQVQYV2P8z8Dw/4A9B0NjgwDDQQdOhv+M9xkZsADG/Q4O"
604                 + "/z/wf2F4oPCC4aPAF4aGxg/YFTY0NNxXevKEw+HiRQHZV684GB8+xK6wqalJ39/AwERNQiKDg5XVhNHQELtCkHP+//9vD6Qa"
605                 + "gNiBEQiwupEkhdhMQBfDag1Oq6lqIgCfzScLcG6H/gAAAABJRU5ErkJggg==",
606             FF_ESR = "data:image/png;base64,"
607                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAiUlEQVQYV2M8FcD+nwEIpkXwgSiGBRGvGcEMNMC4IcAErPCB"
608                 + "wgsGgQ8fGBIWfMGucEFCwhVWDg5u+2vXRKXfvuVmvHoVh8L4eG3TiAhTFQmJLDZWVlNGHR3sCkHW/v//3wFI1T948MBBUVGR"
609                 + "sMIDBw44ODo64laIzZcYviZGEUgNVmuwhiOxJgIAFNAnC2GN/IoAAAAASUVORK5CYII=")
610     public void drawImage9ArgumentsCrop() throws Exception {
611         drawImage("4x6.png",
612                 "canvas.width = 10; canvas.height = 10;\n",
613                 "context.drawImage(img, 1, 2, 2, 4, 0, 0, img.width, img.height);\n");
614     }
615 
616     /**
617      * @throws Exception if the test fails
618      */
619     @Test
620     @Alerts(DEFAULT = "data:image/png;base64,"
621                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAFxJREFUKFNjZCASMBKpjmHoKlT7/z/h0wK"
622                 + "G+reNDIq/H4D9gdUz2WJT/ptLnWTwUtrGILLuLW6F+x04/kuo/mVQMPzDwJn1H7dC0Vdy/0PW/GQomPCNQf3WZ7BCAChZHAtgVD"
623                 + "PiAAAAAElFTkSuQmCC",
624             FF = "data:image/png;base64,"
625                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAWUlEQVQYV2NkIBIwEqmOYegqVPufFvdhgcnCV4kgT6SBPIzV"
626                 + "M3Fi81bbih8NSVGZy8C4HqIGq8L99uyrJVT/hWjY/WZgjMOjkOG/4uqEBZ9D5ie+AakCGwYAh4cWC3rmpLIAAAAASUVORK5C"
627                 + "YII=",
628             FF_ESR = "data:image/png;base64,"
629                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAX0lEQVQYV2NkIBIwEqmOYegqVP+fn/hhoVbduwYGxd8P0kEe"
630                 + "xuqZbPGpq8wlT4R6KW1jEFn3FqwGq8IDjpyrxFX+hCoY/mHgzPqPW6H4K7lVQWt+hhZM+MagfuszWCEAHxEcC87YTb4AAAAA"
631                 + "SUVORK5CYII=")
632     public void drawImage9ArgumentsCropNegativStart() throws Exception {
633         drawImage("4x6.png",
634                 "canvas.width = 10; canvas.height = 10;\n",
635                 "context.drawImage(img, -1, -2, 3, 5, 4, 4, img.width, img.height);\n");
636     }
637 
638     /**
639      * @throws Exception if the test fails
640      */
641     @Test
642     @Alerts(DEFAULT = "data:image/png;base64,"
643                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAABdJREFUKFNjZCASMBKpjmFUId6QIjp4"
644                 + "AAppAAuXjCs4AAAAAElFTkSuQmCC",
645             FF = "data:image/png;base64,"
646                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAF0lEQVQYV2NkIBIwEqmOYVQh3pAiOngACmkAC8i6MuwAAAAA"
647                 + "SUVORK5CYII=",
648             FF_ESR = "data:image/png;base64,"
649                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAF0lEQVQYV2NkIBIwEqmOYVQh3pAiOngACmkAC8i6MuwAAAAA"
650                 + "SUVORK5CYII=")
651     public void drawImage9ArgumentsCropNegativWidth() throws Exception {
652         drawImage("4x6.png",
653                 "canvas.width = 10; canvas.height = 10;\n",
654                 "context.drawImage(img, 0, 0, -3, 5, 4, 4, img.width, img.height);\n");
655     }
656 
657     /**
658      * @throws Exception if the test fails
659      */
660     @Test
661     @Alerts(DEFAULT = "data:image/png;base64,"
662                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAEhJREFUKFNjnK+Z8J+BgYEh8foCRhCNCzDO"
663                 + "r+aBKGz9gl/hAQeH/fYMDA6MBw7gVwgybf78+f8TExMJK8TnNpgcXlOQDRgKCgFraBALDri0wwAAAABJRU5ErkJggg==",
664             FF = "data:image/png;base64,"
665                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAR0lEQVQYV2Ocrxn/nwEIEq8vZATRuADj/CoeiMK2L/gV7ndw"
666                 + "2O/w/78D48GD+BWCTJs/f/7/xMREwgrxuQ0mh9cUZAOGgkIA7moSC5sf8xAAAAAASUVORK5CYII=",
667             FF_ESR = "data:image/png;base64,"
668                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAASElEQVQYV2Ocr5nwnwEIEq8vYATRuADjgmoesMKE1i/4FR5w"
669                 + "cNhvz8DgwHjgAH6FINPmz5//PzExkbBCfG6DyeE1BdmAoaAQAGtwEAvm0nZdAAAAAElFTkSuQmCC")
670     public void drawImage9ArgumentsStretch() throws Exception {
671         drawImage("4x6.png",
672                 "canvas.width = 10; canvas.height = 10;\n",
673                 "context.drawImage(img, 0, 0, img.width, img.height, 0, 0, 2, 4);\n");
674     }
675 
676     /**
677      * @throws Exception if the test fails
678      */
679     @Test
680     @Alerts(DEFAULT = "data:image/png;base64,"
681                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAHBJREFUKFOd0LENglAUBdDzSmLNCO5g"
682                 + "4QTG1jWo7JjCFehchgSdQxcg5BsSKPQHQ3j1efcmN6y8WOlkMLGfnovgMQd9wcQJFUo0wW0JvrDDgGdwyGDiiPuU1qPDOXiP"
683                 + "+Le6xgUtrjPK4L8Fts+zlPoB1NMSC7MwsngAAAAASUVORK5CYII=",
684             FF = "data:image/png;base64,"
685                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAaklEQVQYV2NkIBIwEqmOAUPhfwYGVahmTqDkJZhBKAqBiryA"
686                 + "EnlALArEi4CSE3EpfAuU4Abiv0B8GajQAkMh0DQboOBKqGm/gfRFIPYBKn4HUoxudTVQLBSIzwFxCUwRhkJ8IUB+8OAyFQDU"
687                 + "0xILsSkm0QAAAABJRU5ErkJggg==",
688             FF_ESR = "data:image/png;base64,"
689                 + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAaklEQVQYV2NkIBIwEqmOAUPhfwYGVahmTqDkJZhBKAqBiryA"
690                 + "EnlALArEi4CSE3EpfAuU4Abiv0B8GajQAkMh0DQboOBKqGm/gfRFIPYBKn4HUoxudTVQLBSIzwFxCUwRhkJ8IUB+8OAyFQDU"
691                 + "0xILsSkm0QAAAABJRU5ErkJggg==")
692     public void drawImageDataUrlPng() throws Exception {
693         final String html = DOCTYPE_HTML
694             + "<html><head>\n"
695             + "<script>\n"
696             + LOG_TEXTAREA_FUNCTION
697             + "  function test() {\n"
698             + "    var img = document.getElementById('myImage');\n"
699             + "    var canvas = document.createElement('canvas');\n"
700             + "    canvas.width = img.width;\n"
701             + "    canvas.height = img.height;\n"
702             + "    if (canvas.getContext) {\n"
703             + "      var context = canvas.getContext('2d');\n"
704             + "      context.drawImage(img, 0, 0, canvas.width, canvas.height);\n"
705             + "      log(canvas.toDataURL());\n"
706             + "    }\n"
707             + "  }\n"
708             + "</script>\n"
709             + "</head><body onload='test()'>\n"
710             + "  <img id='myImage' src='data:image/png;base64,"
711                         + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP"
712                         + "C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA"
713                         + "AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J"
714                         + "REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq"
715                         + "ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0"
716                         + "vr4MkhoXe0rZigAAAABJRU5ErkJggg==' alt='red dot' />\n"
717             + LOG_TEXTAREA
718             + "</body></html>";
719 
720         loadPageVerifyTextArea2(html);
721     }
722 
723     /**
724      * @throws Exception if the test fails
725      */
726     @Test
727     @Alerts(DEFAULT = "data:image/png;base64,"
728                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAL1JREFUOE9jZEAFjgwMDOZQoZMMDAz7"
729                 + "0eQJchmhKnhFGBi2CDAw6AcwMHCDxDYwMHz9wMBw8Q0Dgw8DA8NngiZBFYANFGFgOJjAwGDVzcDAgqyxlIHhzwIGhmNvGBjs"
730                 + "STHQUYWBYf1tBgZ+bJpUGRg+3mFgCCTW+yAXVpQwMDSjuw5mOMiVPQwMtQwMDB3EuJImBlLdy1SPFFDQUDfZIAU21RI2MRFI"
731                 + "lBpYTiFKMTGKRg0kJpTwqxkNQ8rDEABatjIVyjXhJwAAAABJRU5ErkJggg==",
732             FF = "data:image/png;base64,"
733                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABF0lEQVQ4T+2SvUoDQRSFv5SC5UIUK30ACUFIbyws4wMsBkO6"
734                 + "RJ9AiBhUsEqvstoKVgELwdRa5cc6pTbGLqTUM+saNsvGHUljkYFlmDn3fnvPvZNicmV13AiunrW3I3riMfUTkYYT0dwlcMzd"
735                 + "G7x3wNN+mEgJBfjAZTjdhsoVLIaTd2HYhPMPOLKFGmB2C24fYC0uKQ/9R9iR1rWBGmB5DxqXsBCXUIKRKq9KU0jy8oGy1vCm"
736                 + "AKWNbmBfcRfJODDAjCzfyfJqXMKmLLegIK1nC2QF6urVwXVkKK6Gcg9nA+k2MBMzfjaa9PE6FLU7n9/PZvAim69Qs4VNAIMk"
737                 + "McnpM8wnW5vhH44r/EsVv8XOgbN3ct7Df9jDL+YBMhUCa42EAAAAAElFTkSuQmCC",
738             FF_ESR = "data:image/png;base64,"
739                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA4klEQVQ4T+2STQ4BQRCFPyT+V27AESQyC5cwQqzY2zuGvT0b"
740                 + "QnAJCyGO4AhiIRgJUU1P4mdkesJSbzpV/frlvaoX4vlYUuZ1ayX3/OXdtwxpRCIDvR2UauCoZh9iSZhuoS7lwZdJA26EQjbM"
741                 + "QXkB4cePBbisYbKBShBCKwozByJen2JwPkHR1L5S2BRP7S6Iw/fTgH0PUkEUmhC2hLBjQqoU/tyyWsooC/bSeyljWUrVRJ3C"
742                 + "uLGJ69jYKjbqYSCxSd83rGJzDEro4n8WbFMBvjjXsi/QFPAnNJ3UZ9x/ht/P8AqUpzEVnisiKgAAAABJRU5ErkJggg==")
743     public void drawImageDataUrlSvg() throws Exception {
744         final String html = DOCTYPE_HTML
745             + "<html><head>\n"
746             + "<script>\n"
747             + LOG_TEXTAREA_FUNCTION
748             + "  function test() {\n"
749             + "    var img = document.getElementById('myImage');\n"
750             + "    var canvas = document.createElement('canvas');\n"
751             + "    canvas.width = 20;\n"
752             + "    canvas.height = 20;\n"
753             + "    if (canvas.getContext) {\n"
754             + "      var context = canvas.getContext('2d');\n"
755             + "      context.drawImage(img, 0, 0, img.width, img.height);\n"
756             + "      log(canvas.toDataURL());\n"
757             + "    }\n"
758             + "  }\n"
759             + "</script>\n"
760             + "</head><body onload='test()'>\n"
761             + "  <img id='myImage' src='data:image/svg+xml,"
762                     + "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\" "
763                             + "overflow=\"hidden\" width=\"10\" height=\"10\">"
764                     + "  <circle cx=\"5\" cy=\"5\" r=\"4\" stroke=\"black\" stroke-width=\"1\" fill=\"red\" />"
765                     + "</svg>' />\n"
766             + LOG_TEXTAREA
767             + "</body></html>";
768 
769         loadPageVerifyTextArea2(html);
770     }
771 
772     /**
773      * @throws Exception if an error occurs
774      */
775     @Test
776     @Alerts({"TypeError", "0", "true", "true"})
777     public void measureText() throws Exception {
778         final String html = DOCTYPE_HTML
779             + "<html>\n"
780             + "  <head>\n"
781             + "    <script>\n"
782             + LOG_TEXTAREA_FUNCTION
783             + "      function test() {\n"
784             + "        var canvas = document.getElementById('myCanvas');\n"
785             + "        if (canvas.getContext){\n"
786             + "          ctx = canvas.getContext('2d');\n"
787             + "          try {\n"
788             + "            log(ctx.measureText());\n"
789             + "          } catch(e) { logEx(e); }\n"
790 
791             + "          var metrics = ctx.measureText('');\n"
792             + "          log(metrics.width);\n"
793 
794             + "          metrics = ctx.measureText('a');\n"
795             + "          log(metrics.width > 5);\n"
796 
797             + "          metrics = ctx.measureText('abc');\n"
798             + "          log(metrics.width > 10);\n"
799             + "        }\n"
800             + "      }\n"
801             + "    </script>\n"
802             + "  </head>\n"
803             + "  <body onload='test()'>\n"
804             + "    <canvas id='myCanvas'></canvas>\n"
805             + LOG_TEXTAREA
806             + "  </body>\n"
807             + "</html>";
808 
809         loadPageVerifyTextArea2(html);
810     }
811 
812     private void draw(final String canvasSetup, final String drawJS) throws Exception {
813         final String html = DOCTYPE_HTML
814             + "<html><head>\n"
815             + "<script>\n"
816             + LOG_TEXTAREA_FUNCTION
817             + "  function test() {\n"
818             + "    var canvas = document.getElementById('myCanvas');\n"
819             + "    if (canvas.getContext) {\n"
820             + "      var context = canvas.getContext('2d');\n"
821             + drawJS
822             + "      log(canvas.toDataURL());\n"
823             + "    }\n"
824             + "  }\n"
825             + "</script>\n"
826             + "</head><body onload='test()'>\n"
827             + canvasSetup
828             + LOG_TEXTAREA
829             + "</body></html>";
830 
831         loadPageVerifyTextArea2(html);
832     }
833 
834     /**
835      * @throws Exception if an error occurs
836      */
837     @Test
838     @Alerts(DEFAULT = "data:image/png;base64,"
839                 + "iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAAAXNSR0IArs4c6QAAAVlJREFUWEftlK1OA0EUhb9a3qCGBIvA"
840                 + "gKgqQdQBCsFPQusJCkENlh9N6+tIsOAJaLA8AIYH4AXYQ+4mw4Syu8lta+4mm+zO7D1z5rtntsXvax0YAKfJ8Lk93wCHwBPw"
841                 + "mdXlr23gGjgBroAJ8GYfae4OOJiik9ZuAF+qbTUwOgZ0D2dsNLV0W26yiVEJiNKzGT4Ceqa6D4yAZWAXeK1J9Ni6tGY6ae0j"
842                 + "cA98AJ2/jL4ASxlpUUyJqiVnhaHtwviWmewAGt8z6nVaL6OrQL9o785/tU2I5ka1gHJbLqDFyoxfNiD6XtQ9VNXOw6gOVElN"
843                 + "jUo3poM6E6PKzQpwAeh01iEqc6rbtDj9ZM4OZJVRdVFR6uZEK/46i5sOo97sg2gQ9SbgrRcZDaLeBLz1IqNB1JuAt15kNIh6"
844                 + "E/DWi4wGUW8C3nqR0SDqTcBbLzIaRL0JeOtFRoOoNwFvvW9NqWN35u+ZcQAAAABJRU5ErkJggg==",
845             FF = "data:image/png;base64,"
846                 + "iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAABUklEQVRYR+2UPw4BQRTG7TU0Cu5Aq+EGFBqJhgsoFAolB6Bx"
847                 + "AEdAodC4BImGY/B9yRt51vqz8YTE2+RlZ2Znvvnm995slLl+KugOECU1PJR2F+8Zoh5bk9TNY3CNyCI2iD5ioSae0I7u6Oi1"
848                 + "bczZcW188jOjjzbQ+75jVOtcDpnGaA4KNcRRqJelT+EqYi47dPBevkiUGaJuUdZSZytrmdmxjBeSjIYN9clG6DD1gShTwnQy"
849                 + "tbrNjLQQvRRG96JNHR4+cW0aonGjFGW9BnOhTRINZZTUpghdowc5JL+tEBOl8zWjvIxMb7iEJNdE8MJ+zChJ8CG1V4lyPi9F"
850                 + "qEP2QyafGeV33oubGhUfv/e69y/7Oadu1DolTtSJWhOw1vMadaLWBKz1vEadqDUBaz2vUSdqTcBaz2vUiVoTsNbzGnWi1gSs"
851                 + "9bxGnag1AWs9r9G/JXoGyiFdcUG+TPcAAAAASUVORK5CYII=",
852             FF_ESR = "data:image/png;base64,"
853                 + "iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAABOUlEQVRYR+2UMW7CUBBE4R5UhGMALTlCSEWFBAeAJiUVB0iu"
854                 + "QMEJUgYppzAUXARmpHW0WHYSKyORYiyt/jf2DvPfjtzt3F5D3L6gHtPPq9hvsb6ilpWeptsnPBjH+z/p1mnk/k63hdHPmkN8"
855                 + "5/mvRrP2sI3ROTofUG+oj6C1CLUR1kPsp1h3qN8aPePdGWoS/WusnF7uL+qMln+YT8TmTJQiG9QgBMs9R/wc425rlHHro96T"
856                 + "7ld02hCtGs35K83lLGajNMB8V7NPmrxKLe6LexqlgQuK0TmFORriyHtqo3sIHlE5o/wC5HE3EaU3PsuxqstiE9F+dfRx2P+3"
857                 + "2Kh6JiZqomoCaj1n1ETVBNR6zqiJqgmo9ZxRE1UTUOs5oyaqJqDWc0ZNVE1AreeMmqiagFrPGTVRNQG13hX4a00ZAyWoGQAA"
858                 + "AABJRU5ErkJggg==")
859     public void fillText() throws Exception {
860         draw("<canvas id='myCanvas' width='42' height='42'>\n",
861                 "context.fillText('HtmlUnit', 3, 7);\n");
862     }
863 
864     /**
865      * @throws Exception if an error occurs
866      */
867     @Test
868     @Alerts("[object CanvasGradient]")
869     public void createLinearGradient() throws Exception {
870         final String html = DOCTYPE_HTML
871             + "<html><head><script>\n"
872             + LOG_TEXTAREA_FUNCTION
873             + "function test() {\n"
874             + "  var canvas = document.getElementById('myCanvas');\n"
875             + "  var ctx = canvas.getContext('2d');\n"
876             + "  var gradient = ctx.createLinearGradient(0, 0, 200, 0);\n"
877             + "  log(gradient);\n"
878             + "}\n"
879             + "</script>\n"
880             + "</head>\n"
881             + "<body onload='test()'>\n"
882             + "  <canvas id='myCanvas'></canvas>\n"
883             + LOG_TEXTAREA
884             + "</body>\n"
885             + "</html>";
886 
887         loadPageVerifyTextArea2(html);
888     }
889 
890     /**
891      * @throws Exception if an error occurs
892      */
893     @Test
894     @Alerts("[object CanvasGradient]")
895     public void createRadialGradient() throws Exception {
896         final String html = DOCTYPE_HTML
897             + "<html><head><script>\n"
898             + LOG_TEXTAREA_FUNCTION
899             + "function test() {\n"
900             + "  var canvas = document.getElementById('myCanvas');\n"
901             + "  var ctx = canvas.getContext('2d');\n"
902             + "  var gradient = ctx.createRadialGradient(100, 100, 100, 100, 100, 0);\n"
903             + "  log(gradient);\n"
904             + "}\n"
905             + "</script>\n"
906             + "</head>\n"
907             + "<body onload='test()'>\n"
908             + "  <canvas id='myCanvas'></canvas>\n"
909             + LOG_TEXTAREA
910             + "</body>\n"
911             + "</html>";
912 
913         loadPageVerifyTextArea2(html);
914     }
915 
916     /**
917      * @throws Exception if an error occurs
918      */
919     @Test
920     @Alerts(DEFAULT = {"1", "0.5", "0", "0.699999988079071", "0"},
921             CHROME = {"1", "0.5", "0", "0.7", "0"},
922             EDGE = {"1", "0.5", "0", "0.7", "0"})
923     @HtmlUnitNYI(CHROME = {"1", "0.5", "0", "0.699999988079071", "0"},
924             EDGE = {"1", "0.5", "0", "0.699999988079071", "0"})
925     public void globalAlpha() throws Exception {
926         final String html = DOCTYPE_HTML
927             + "<html><head><script>\n"
928             + LOG_TEXTAREA_FUNCTION
929             + "function test() {\n"
930             + "  var canvas = document.getElementById('myCanvas');\n"
931             + "  try {\n"
932             + "    var ctx = canvas.getContext('2d');\n"
933             + "    log(ctx.globalAlpha);\n"
934             + "    ctx.globalAlpha = 0.5;\n"
935             + "    log(ctx.globalAlpha);\n"
936             + "    ctx.globalAlpha = 0;\n"
937             + "    log(ctx.globalAlpha);\n"
938             + "    ctx.globalAlpha = 0.7;\n"
939             + "    log(ctx.globalAlpha);\n"
940             + "    ctx.globalAlpha = null;\n"
941             + "    log(ctx.globalAlpha);\n"
942             + "  } catch(e) { logEx(e); }\n"
943             + "}\n"
944             + "</script>\n"
945             + "</head>\n"
946             + "<body onload='test()'>\n"
947             + "  <canvas id='myCanvas'></canvas>\n"
948             + LOG_TEXTAREA
949             + "</body>\n"
950             + "</html>";
951 
952         loadPageVerifyTextArea2(html);
953     }
954 
955     /**
956      * @throws Exception if an error occurs
957      */
958     @Test
959     @Alerts({"0.5", "0.5", "0.5", "0.5"})
960     public void globalAlphaInvalid() throws Exception {
961         final String html = DOCTYPE_HTML
962             + "<html><head><script>\n"
963             + LOG_TEXTAREA_FUNCTION
964             + "function test() {\n"
965             + "  var canvas = document.getElementById('myCanvas');\n"
966             + "  try {\n"
967             + "    var ctx = canvas.getContext('2d');\n"
968             + "    ctx.globalAlpha = 0.5;\n"
969             + "    log(ctx.globalAlpha);\n"
970             + "    ctx.globalAlpha = -1;\n"
971             + "    log(ctx.globalAlpha);\n"
972             + "    ctx.globalAlpha = 'test';\n"
973             + "    log(ctx.globalAlpha);\n"
974             + "    ctx.globalAlpha = undefined;\n"
975             + "    log(ctx.globalAlpha);\n"
976             + "  } catch(e) { logEx(e); }\n"
977             + "}\n"
978             + "</script>\n"
979             + "</head>\n"
980             + "<body onload='test()'>\n"
981             + "  <canvas id='myCanvas'></canvas>\n"
982             + LOG_TEXTAREA
983             + "</body>\n"
984             + "</html>";
985 
986         loadPageVerifyTextArea2(html);
987     }
988 
989     /**
990      * @throws Exception if the test fails
991      */
992     @Test
993     @Alerts(DEFAULT = "data:image/png;base64,"
994                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAADxJREFUOE9jZKAyYISa10AlcxtoZmA9"
995                 + "AwMDyHByXQrTB3ch1Q2E20BmWGK4kGYGkulAuDbaxTKlLoPrBwDnlwwLU3fVIAAAAABJRU5ErkJggg==",
996             FF = "data:image/png;base64,"
997                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAS0lEQVQoU2NkoDJghJrnAKRBmBJwAKj5AMzABqiBIEFygD1Q"
998                 + "00EgbkA2EGQQyGByQD1QE8iskW4gKGDJjRRQCkGJFKonG3JiFqseAAjhEgvKgKaUAAAAAElFTkSuQmCC",
999             FF_ESR = "data:image/png;base64,"
1000                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAP0lEQVQoU2NkoDJghJrnAKRBmBJwAKj5AMzABiDHHogPkmki"
1001                 + "TG8DsoEgs0AGkwNg+ka6gVSNFKonG3JiFqseAAklEgtbZz3HAAAAAElFTkSuQmCC")
1002     public void strokeRect() throws Exception {
1003         draw("<canvas id='myCanvas' width='20', height='10' style='border: 1px solid red;'></canvas>\n",
1004                 "context.strokeRect(2, 2, 16, 6);\n");
1005     }
1006 
1007     /**
1008      * @throws Exception if the test fails
1009      */
1010     @Test
1011     @Alerts(DEFAULT = "data:image/png;base64,"
1012                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAChJREFUOE9jZKAyYKSyeQzIBv6n0HCw"
1013                 + "WaMGUhSKtA9DipwH00z1dAgAPKcGC8XskzoAAAAASUVORK5CYII=",
1014             FF = "data:image/png;base64,"
1015                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAKElEQVQoU2NkoDJgpLJ5DMgG/qfQcLBZowZSFIq0D0OKnAfT"
1016                 + "TPV0CAA8pwYL+jNAvAAAAABJRU5ErkJggg==",
1017             FF_ESR = "data:image/png;base64,"
1018                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAKElEQVQoU2NkoDJgpLJ5DMgG/qfQcLBZowZSFIq0D0OKnAfT"
1019                 + "TPV0CAA8pwYL+jNAvAAAAABJRU5ErkJggg==")
1020     public void fillRect() throws Exception {
1021         draw("<canvas id='myCanvas' width='20', height='10' style='border: 1px solid red;'></canvas>\n",
1022                 "context.fillRect(2, 2, 16, 6);\n");
1023     }
1024 
1025     /**
1026      * @throws Exception if the test fails
1027      */
1028     @Test
1029     @Alerts(DEFAULT = "data:image/png;base64,"
1030                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAACxJREFUOE9jZICA/1CaUoqRcdTA0TAk"
1031                 + "OQRGkw3JQYahYTQMR8OQjBCgfrIBABkEFBUHz6OrAAAAAElFTkSuQmCC",
1032             FF = "data:image/png;base64,"
1033                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAALElEQVQ4T2NkgID/UJpSipFx1MDRMCQ5BEaTDclBhqFhNAxH"
1034                 + "w5CMEKB+sgEAGQQUFQfPo6sAAAAASUVORK5CYII=",
1035             FF_ESR = "data:image/png;base64,"
1036                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAALElEQVQ4T2NkgID/UJpSipFx1MDRMCQ5BEaTDclBhqFhNAxH"
1037                 + "w5CMEKB+sgEAGQQUFQfPo6sAAAAASUVORK5CYII=")
1038     public void fillRectWidthHeight() throws Exception {
1039         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1040                 "context.fillRect(1, 0, 18, 20);\n");
1041     }
1042 
1043     /**
1044      * @throws Exception if the test fails
1045      */
1046     @Test
1047     @Alerts(DEFAULT = "data:image/png;base64,"
1048                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAADdJREFUOE9jZKAyYKSyeQzIBv6n0HCw"
1049                 + "WaMGUhSKtA9DipwH00zTdDjqQvJCYDRSyAs3ZF2DPwwBbfkGFYXESWwAAAAASUVORK5CYII=",
1050             FF = "data:image/png;base64,"
1051                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAN0lEQVQ4T2NkoDJgpLJ5DMgG/qfQcLBZowZSFIq0D0OKnAfT"
1052                 + "TNN0OOpC8kJgNFLICzdkXYM/DAFt+QYVhcRJbAAAAABJRU5ErkJggg==",
1053             FF_ESR = "data:image/png;base64,"
1054                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAN0lEQVQ4T2NkoDJgpLJ5DMgG/qfQcLBZowZSFIq0D0OKnAfT"
1055                 + "TNN0OOpC8kJgNFLICzdkXYM/DAFt+QYVhcRJbAAAAABJRU5ErkJggg==")
1056     public void fillRectRotate() throws Exception {
1057         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1058                 "context.fillRect(2, 2, 16, 6); context.rotate(.5);\n");
1059     }
1060 
1061     /**
1062      * @throws Exception if the test fails
1063      */
1064     @Test
1065     @Alerts(DEFAULT = "data:image/png;base64,"
1066                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAANRJREFUOE/d1CEPgUEYwPH/q/kCvoRA"
1067                 + "kRQbCkUQTJFtNp2MpmmCTZIQRJIkapIoaT4A4bnt3c3dvffuCrfddtvz3O+e5267iMAjCuzxm2ATOKS9Cr3lEnAB9sBU1l62"
1068                 + "Dm6BVkxYCnxPqsbBhqXVmcAvFxwHz0DZsuEp6NyGKrAHrFynS/wGTID1t3wFZoCRzGxC+ARU9Vz9UXKCDhOgNeDoAlU8L3DX"
1069                 + "AG+Ajq1lU0EVgetaQgG4pgHVnjYwBorAAhiYKvD9HPofdAc8QoHOt/Kt8A/AN1+PHBVxaGY3AAAAAElFTkSuQmCC",
1070             FF = "data:image/png;base64,"
1071                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA60lEQVQ4T2NkoDJgpLJ5DEPTQCFgMLwjNyjQvawANOgyEC8B"
1072                 + "4mYgfkaqwegGrgAaEA415DuQ7gfiDiD+TKzByAZaATUdxaLxFVCsCYhnAvEfQgYjGwgyDGQoLnATKFEJxOvxGQozMICQQiRD"
1073                 + "QBaX4/ANPB2KAhXUAHE2EDMT8hZUvhWqB0U5eqSoAWW7gdiPCEM9gWp2oKvDlVOsgQo7gRhEYwM7gYIe2CQIZb1AoKZ2IFZH"
1074                 + "06wL5F8hx0CQHhYgTgfiOiAWA+KVQByBK0gIuRBZHy+QA4rdOUD8gBoGEhFPDEO0+CLKa7gUAQCpFx4VDtwfyAAAAABJRU5E"
1075                 + "rkJggg==",
1076             FF_ESR = "data:image/png;base64,"
1077                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA0ElEQVQ4T2NkoDJgpLJ5DEPTQFVgMNwmNyjQvWwKNOgUEG8E"
1078                 + "4lYgPk2qwegGrgcaEIBkyBwguw2I7xNrMLKBXkBNW3FobIca/IWQwcgGHgEqtsaj4S3U0D58hsIMBHkT5F1iwE1o+C7GphjZ"
1079                 + "hdVABSDMSYypQDULgDgRXS16pIgBFVQBcT4RhroA1ewlZCBMXgvq2igcBq8EikcQ8jI2eXuowa5okvpA/iVyDITpCYEGhSGQ"
1080                 + "ngrEObiChNTCIQ1o0HIg/kwtAwnGFakuHAYGAgBd6xwVKif+GwAAAABJRU5ErkJggg==")
1081     public void rotateFillRect() throws Exception {
1082         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1083                 "context.rotate(.5); context.fillRect(6, 2, 12, 6);\n");
1084     }
1085 
1086     /**
1087      * @throws Exception if the test fails
1088      */
1089     @Test
1090     @Alerts(DEFAULT = "data:image/png;base64,"
1091                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAADdJREFUOE9jZKAyYKSyeQzIBv6n0HCw"
1092                 + "WaMGUhSKtA9DipwH00zTdDjqQvJCYDRSyAs3ZF2DPwwBbfkGFYXESWwAAAAASUVORK5CYII=",
1093             FF = "data:image/png;base64,"
1094                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAN0lEQVQ4T2NkoDJgpLJ5DMgG/qfQcLBZowZSFIq0D0OKnAfT"
1095                 + "TNN0OOpC8kJgNFLICzdkXYM/DAFt+QYVhcRJbAAAAABJRU5ErkJggg==",
1096             FF_ESR = "data:image/png;base64,"
1097                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAN0lEQVQ4T2NkoDJgpLJ5DMgG/qfQcLBZowZSFIq0D0OKnAfT"
1098                 + "TNN0OOpC8kJgNFLICzdkXYM/DAFt+QYVhcRJbAAAAABJRU5ErkJggg==")
1099     public void fillRectTranslate() throws Exception {
1100         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1101                 "context.fillRect(2, 2, 16, 6); context.translate(3, 4);\n");
1102     }
1103 
1104     /**
1105      * @throws Exception if the test fails
1106      */
1107     @Test
1108     @Alerts(DEFAULT = "data:image/png;base64,"
1109                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAADFJREFUOE9jZKAyYKSyeQyjBlIeorjC"
1110                 + "8D+5Ro8aCA+5wR+G5EbyaNYjO+QQGkdg8QUAebwGD4ULeHoAAAAASUVORK5CYII=",
1111             FF = "data:image/png;base64,"
1112                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAMUlEQVQ4T2NkoDJgpLJ5DKMGUh6iuMLwP7lGjxoID7nBH4bk"
1113                 + "RvJo1iM75BAaR2DxBQB5vAYPhQt4egAAAABJRU5ErkJggg==",
1114             FF_ESR = "data:image/png;base64,"
1115                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAMUlEQVQ4T2NkoDJgpLJ5DKMGUh6iuMLwP7lGjxoID7nBH4bk"
1116                 + "RvJo1iM75BAaR2DxBQB5vAYPhQt4egAAAABJRU5ErkJggg==")
1117     public void translateFillRect() throws Exception {
1118         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1119                 "context.translate(3, 4); context.fillRect(2, 2, 16, 6);\n");
1120     }
1121 
1122     /**
1123      * @throws Exception if the test fails
1124      */
1125     @Test
1126     @Alerts(DEFAULT = "data:image/png;base64,"
1127                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAMxJREFUOE/t1LEJAjEUxvH/gYKVjStY"
1128                 + "WYlOYOMGCnYOYeEKYu8INo4gOICgnaWCYCEIghvIgzx4hODlTBrBQLjj8vJ7+VJcQeZRZPb4g+k3+lt3OAIOwCUluI18AjrA"
1129                 + "w8FH95Qm19gmCjaB14dNd4Nro1uoXsEBsIs9hasT0KbYSzoFZ8CyImjLz0BbPii4BiYJ4AYYW3AF9IA+UPsCngMLC6ohJxZU"
1130                 + "cXmXWTaGwDYEhjbWvQbSrOsVtoBnLBhq0vCSTG3EsjiV1rP/HN50hx8VahodiQAAAABJRU5ErkJggg==",
1131             FF = "data:image/png;base64,"
1132                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyUlEQVQ4T2NkoDJgpLJ5DKMGUh6iQysMlYEefgbE3ynxOLKX"
1133                 + "bwANUgHim0B8HglfALLfEWsJzEBOoIYvQMyEQ+MjNEtAFj7GphZmoD1Q8gCxroCqe41kyTkgexVIHGZgBZDdTqKByMpBwaSB"
1134                 + "bOAKICecAgNXAvVGIBtYBeT4AbEBELOTYXApUE8PsoEwM1iADD0gNkXC2kA2MwFLPIHyO7AZiE0fKAUYo1kCSl4w8A/IkATi"
1135                 + "V8QaiM0SfqCgGdQSWSCdCVM0+PMyAOlZHxXNWGcZAAAAAElFTkSuQmCC",
1136             FF_ESR = "data:image/png;base64,"
1137                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAxElEQVQ4T2NkoDJgpLJ5DKMGUh6iQysMtYAe/gHE9yjxOLKX"
1138                 + "rwINAhn6GojPAfFZJPyQWEtgBvIBNXzEo+kF1HBki55gUw8z0BEouY9YV0DVgQxEtuAAkP8VZmAJkNNNooHIyu8COSogAZiB"
1139                 + "y4DsSAoMXA3UG4ZsYDOQ4wrExkDMQobBFUA9ncgGwswAuRhkqBGUBrFBmBBwAyrYjc1AbBpZ0SwAWWaAplAYyH9HrIHYLOFA"
1140                 + "8okCkF2M7EVC3iFJnuqFAwBzIx8VNVMmtgAAAABJRU5ErkJggg==")
1141     public void rotateTranslateFillRect() throws Exception {
1142         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1143                 "context.rotate(0.2); context.translate(0, 4); context.fillRect(4, 4, 16, 6);\n");
1144     }
1145 
1146     /**
1147      * @throws Exception if the test fails
1148      */
1149     @Test
1150     @Alerts(DEFAULT = "data:image/png;base64,"
1151                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAALZJREFUOE/tkjEKAjEQRd8ewXoLK23s"
1152                 + "1kZ7j+IRbG3st/M6tlYq2CxYCl7CTgZ2liEMMm5WsDCQIiR5b+YnBQOPYmAef2B+ol/LcAzc8+uje+U1sAfOwMXM66cSbbkE"
1153                 + "Hs7lZwu3orcSm+ERWAYqUol0oqJOYoFbYBcAekdqYCMbFjgHTj2BDTBLgbK+AdOeUAE23j8cAVUyIxJpuY5+bJVILCqbJJ0c"
1154                 + "gFUU6KXgSRY5QDfq3we+AOdFHSeUoHcMAAAAAElFTkSuQmCC",
1155             FF = "data:image/png;base64,"
1156                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAxUlEQVQ4T2NkoDJgpLJ5DKMGUh6iNAtDaaDb3gHxd0rdCHNh"
1157                 + "AtCgOUB8DYjPIOGLQPZPUiyBGSgF1PQEiNGD4A9Q7AqaJZeB/F+4LEE24ARQkTkRrgEZdgnNEpClf0F6kQ2sAPLbiTAQm5JO"
1158                 + "oCBIP4qBGkD+dTINvAnUB9KPEWZ7gGL2QMxChsFaIAdhS4fsQAl9IDZBwiDFzAQsqQTKdxCbsDmBio3RLFFD8+FBIN+BWAOx"
1159                 + "OY4XzRI9IN+CEgOxhsDgNxAAub8hIw8WPeEAAAAASUVORK5CYII=",
1160             FF_ESR = "data:image/png;base64,"
1161                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAoUlEQVQ4T2NkoDJgpLJ5DKMGUh6iNAtDAaDbPlDuPgZ4LCcA"
1162                 + "DZsPxBuA+AEQXwTiC1BMkj0wL4Nc+B6HTpIsQQ7D+0ADFYh0Dk5LkA1sABpWT6SB6MoWAAUSQYLIBuLzNiF7QBEqiG4giL8f"
1163                 + "iB0I6cYhrwiKUFzpMAAoaQDE+lCamLAtBKqdQErCJmTJAaCBjqQYiM2n6JYYUmoghiWD30AAk4cbJe1EwXcAAAAASUVORK5C"
1164                 + "YII=")
1165     public void transformTranslateFillRect() throws Exception {
1166         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1167                 "context.setTransform(1, .2, .3, 1, 0, 0); context.translate(-5, 4); context.fillRect(4, 4, 16, 6);\n");
1168     }
1169 
1170     /**
1171      * @throws Exception if the test fails
1172      */
1173     @Test
1174     @Alerts(DEFAULT = "data:image/png;base64,"
1175                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAC1JREFUOE9jZKAyYKSyeQxwA88wMPyn"
1176                 + "xHATBohZowaSH4q0D0Py3Yaqk+rpEAAqPQwLveqeQwAAAABJRU5ErkJggg==",
1177             FF = "data:image/png;base64,"
1178                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAALUlEQVQoU2NkoDJgpLJ5DHADzzAw/KfEcBMGiFmjBpIfirQP"
1179                 + "Q/LdhqqT6ukQACo9DAtpppU3AAAAAElFTkSuQmCC",
1180             FF_ESR = "data:image/png;base64,"
1181                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAALUlEQVQoU2NkoDJgpLJ5DHADzzAw/KfEcBMGiFmjBpIfirQP"
1182                 + "Q/LdhqqT6ukQACo9DAtpppU3AAAAAElFTkSuQmCC")
1183     public void fillStyleNullFillRect() throws Exception {
1184         draw("<canvas id='myCanvas' width='20', height='10' style='border: 1px solid red;'></canvas>\n",
1185                 "context.fillStyle = '#cc0000'; context.fillStyle = null; context.fillRect(2, 2, 16, 6);\n");
1186     }
1187 
1188     /**
1189      * @throws Exception if the test fails
1190      */
1191     @Test
1192     @Alerts(DEFAULT = "data:image/png;base64,"
1193                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAC1JREFUOE9jZKAyYKSyeQxwA88wMPyn"
1194                 + "xHATBohZowaSH4q0D0Py3Yaqk+rpEAAqPQwLveqeQwAAAABJRU5ErkJggg==",
1195             FF = "data:image/png;base64,"
1196                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAALUlEQVQoU2NkoDJgpLJ5DHADzzAw/KfEcBMGiFmjBpIfirQP"
1197                 + "Q/LdhqqT6ukQACo9DAtpppU3AAAAAElFTkSuQmCC",
1198             FF_ESR = "data:image/png;base64,"
1199                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAALUlEQVQoU2NkoDJgpLJ5DHADzzAw/KfEcBMGiFmjBpIfirQP"
1200                 + "Q/LdhqqT6ukQACo9DAtpppU3AAAAAElFTkSuQmCC")
1201     public void fillStyleUndefinedFillRect() throws Exception {
1202         draw("<canvas id='myCanvas' width='20', height='10' style='border: 1px solid red;'></canvas>\n",
1203                 "context.fillStyle = '#cc0000'; context.fillStyle = undefined; context.fillRect(2, 2, 16, 6);\n");
1204     }
1205 
1206     /**
1207      * @throws Exception if the test fails
1208      */
1209     @Test
1210     @Alerts(DEFAULT = "data:image/png;base64,"
1211                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAC1JREFUOE9jZKAyYKSyeQxwA88wMPyn"
1212                 + "xHATBohZowaSH4q0D0Py3Yaqk+rpEAAqPQwLveqeQwAAAABJRU5ErkJggg==",
1213             FF = "data:image/png;base64,"
1214                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAALUlEQVQoU2NkoDJgpLJ5DHADzzAw/KfEcBMGiFmjBpIfirQP"
1215                 + "Q/LdhqqT6ukQACo9DAtpppU3AAAAAElFTkSuQmCC",
1216             FF_ESR = "data:image/png;base64,"
1217                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAALUlEQVQoU2NkoDJgpLJ5DHADzzAw/KfEcBMGiFmjBpIfirQP"
1218                 + "Q/LdhqqT6ukQACo9DAtpppU3AAAAAElFTkSuQmCC")
1219     public void fillStyleUnknownFillRect() throws Exception {
1220         draw("<canvas id='myCanvas' width='20', height='10' style='border: 1px solid red;'></canvas>\n",
1221                 "context.fillStyle = '#cc0000'; context.fillStyle = 'pipi'; context.fillRect(2, 2, 16, 6);\n");
1222     }
1223 
1224     /**
1225      * @throws Exception if the test fails
1226      */
1227     @Test
1228     @Alerts(DEFAULT = "data:image/png;base64,"
1229                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAC1JREFUOE9jZKAyYKSyeQzIBv6n0HCw"
1230                 + "WXQxEFcwEPIBTheOIAMpjGSIdqqnQwA/UgoLxnfNlgAAAABJRU5ErkJggg==",
1231             FF = "data:image/png;base64,"
1232                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAALUlEQVQoU2NkoDJgpLJ5DMgG/qfQcLBZdDEQVzAQ8gFOF44g"
1233                 + "AymMZIh2qqdDAD9SCgsSO8biAAAAAElFTkSuQmCC",
1234             FF_ESR = "data:image/png;base64,"
1235                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAALUlEQVQoU2NkoDJgpLJ5DMgG/qfQcLBZdDEQVzAQ8gFOF44g"
1236                 + "AymMZIh2qqdDAD9SCgsSO8biAAAAAElFTkSuQmCC")
1237     public void clearRect() throws Exception {
1238         draw("<canvas id='myCanvas' width='20', height='10' style='border: 1px solid red;'></canvas>\n",
1239                 "context.fillRect(2, 2, 16, 6); context.clearRect(4, 4, 6, 6);\n");
1240     }
1241 
1242     /**
1243      * @throws Exception if the test fails
1244      */
1245     @Test
1246     @Alerts(DEFAULT = "data:image/png;base64,"
1247                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAF1JREFUOE9j/O/C8J+BioBx1ECKQ3Mk"
1248                 + "hyHjHgZGWABSkpTgYYhsILaYIdYSog0k1hKUWCbkSnxpCuaDIWYgupdICQKsXiYm3+GzBGQoVbIezBKqGYjsM6q4kKYGAgB9"
1249                 + "kkg955Wz+gAAAABJRU5ErkJggg==",
1250             FF = "data:image/png;base64,"
1251                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABBklEQVQ4T2P878Lwn4GKgHHUQIpDc+iE4VOgX4WAmJNSP0O8"
1252                 + "zMiwgEGAIYXhPYMW0EATMGYE4v8M+kA2OymWwMLwGcNuBhlGRtRE/r+BgYXhKIMO3BKIZbpAVWy4LEFEChODBeMuhpOEXPM/"
1253                 + "FGjYBwY9FEv+gy1lBulFjuUOxj0MlYQMxCb/35WhHOjqDlQDGRluMO5m0CTLQA8GdYY/DDfQXQh0L4MLgzXDQcYGoDSJABi5"
1254                 + "14BaNLEl7J9Agy8CvXAGqACCBRmuMa5m+IvPDqCB7UD5CmJzyneg4rNgw5mgeDvDLeRUAQxHe6AjDhBrIDbHfUax5B/DJaDP"
1255                 + "TlBiINYQGPwGAgAm8mgw6jTe3wAAAABJRU5ErkJggg==",
1256             FF_ESR = "data:image/png;base64,"
1257                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAxUlEQVQ4T2P878Lwn4GKgHHUQIpDc+iE4QegXwUo9i/QAIiX"
1258                 + "/zMsYNzLkPjfmSGAgZFBAcjXB9IGQHkQJgnAwvAD4x4GQWw6SbUEESksDIqMOxgeEOMcfJYgx3ID0JWNxBiIrua/K0MCMJjm"
1259                 + "g8SRDcTpbUKW/HcARigLw3t0A0F8R6ArDxAyAEdY3wdFKK6EvQGo6QLQGxcZWBkuEBO2wNTSD9RTQEpOwWsJ0EAHoIH7STEQ"
1260                 + "m09RLGH4w3CeUgMxLBn8BgIAZv1hLbrWWZAAAAAASUVORK5CYII=")
1261     public void transformTranslateClearRect() throws Exception {
1262         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1263                 "context.fillStyle = '#ff4400'; context.fillRect(0, 0, 20, 20); "
1264                 + "context.setTransform(1, .2, .3, 1, 0, 0); "
1265                 + "context.translate(-5, 4); context.clearRect(4, 4, 16, 6);\n");
1266     }
1267 
1268     /**
1269      * @throws Exception if the test fails
1270      */
1271     @Test
1272     @Alerts(DEFAULT = "data:image/png;base64,"
1273                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAHVJREFUOE9jZKAyYEQyL5GBgWEXAwPD"
1274                 + "U0rsgBmozMDA0MLAwODGwMBwF2owyPBDpBqO7EKYXjuowSDDQRaBDIZhgq7HZiCyo6SRDHdnYGC4Q8j1hAxE9zHM9SDDlaCG"
1275                 + "10CDCayWVAOxuX4+siAlBmKNr8FvIAB+fhILDX78/QAAAABJRU5ErkJggg==",
1276             FF = "data:image/png;base64,"
1277                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAY0lEQVQoU2NkoDJgRDIvGsjeDsTvKLED2cAlQIM8gfgO1OBt"
1278                 + "QPoUqYYjGwjTawY12AtIq0ANB7mcKNdjMxDZUUJQw0EuJ8r1hAxE9zE218cgKyLVQGyuX0otA7HGFyUupI+BAC5XEQsxJDCz"
1279                 + "AAAAAElFTkSuQmCC",
1280             FF_ESR = "data:image/png;base64,"
1281                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAcElEQVQoU2NkoDJgRDLPF8g+B8RPKbEDZqAI0JDJQOwKxPeA"
1282                 + "eBcUHyLVcGQXwvTaARluUKyMZDjIEoKux2YgsqOkkQwHWXKXkOsJGYjuY2TXKwEldwNxLhC/gSkk1UB01xsBBTYjC1JiINb4"
1283                 + "GvwGAgB9VhILFc2B9QAAAABJRU5ErkJggg==")
1284     public void moveToLineToStroke() throws Exception {
1285         draw("<canvas id='myCanvas' width='20', height='10' style='border: 1px solid red;'></canvas>\n",
1286                 "context.moveTo(2, 2); context.lineTo(16, 6); context.stroke();\n");
1287     }
1288 
1289     /**
1290      * @throws Exception if the test fails
1291      */
1292     @Test
1293     @Alerts(DEFAULT = "data:image/png;base64,"
1294                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAOlJREFUOE+t0z1KRDEQAOBvS+32AHoI"
1295                 + "EbzAoh7ARhAR3N6txUL8W7CzshEbwcbOxhU9idVaWNsoFoL6Igm8Qpbn20kzIWG+TEKmI3h0gj0F3M9wia3PKeAlvrHdWsqJ"
1296                 + "dfAL/SjwAJ84jAKP8IHjKDBB7ziJAq8wg7UocAG3WMcrXnL8t1//2DtYRhdzeMMI9zk2wid1Sqp6FStYwg2uq/ndJLlp681i"
1297                 + "CwM8Vbc4w8NfcFOwnpu6KX2z9ObD6qBxfbMNWPJPsYk9XJTFacBkLOI8P8MunqcFS2GpITYwHwUmuIfHSPC32nDwBzgGJBXR"
1298                 + "dXO7AAAAAElFTkSuQmCC",
1299             FF = "data:image/png;base64,"
1300                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA4klEQVQ4T63TzwoBURSA8RmvwMpOUqxslaews7HyAv4nNhgp"
1301                 + "SizY2nsCeQh7axt7C4UF39G9NVLTNHNufRlTfnMa97qO8nKVPceCI+A3jeM+wIIToBd5WmAT6ElbLVAme9BUC2yZCTdaYAco"
1302                 + "QQstsA6Uo74WmAea05qudKF7FNy/sTMAXUpSmlJ0pIP5DOUHnRSZukwlqtDSbKtbkBz26MnUVZrRjnokB+FvhQX9P2zwpW0m"
1303                 + "lnf+s6KAFlhxUTTv/WRvxgHFyNLe/GlDuREXtIMNuKhRQQsUWHbFWRP8TqsOfgB13yEV/GLnewAAAABJRU5ErkJggg==",
1304             FF_ESR = "data:image/png;base64,"
1305                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA3ElEQVQ4T2NkoDJgpLJ5DDADG4AG/wfiRkotgBkIMujfoDfw"
1306                 + "L9CFTdT0MlUNrAa6jBOIa6jlwkygQXpADKIpArBYVgeacgqIs4D4HBA/BOJv5JiMnLBTgQZ4A7EGEMsD8XUgPgDFm4g1HF9O"
1307                 + "sQIaYg/EDkBsDMSLgHgmEN/EZzixWU8VaEgcEBcA8XIg7of6AMNsYg2EaeQHMgqBuBKIu4G4DohBOQwOSDUQplEOyABlV1CQ"
1308                 + "VADxKpgEuQbC9LtBvX8U6vKvlBoIMpgJiCcAMSiFKFPDQJSIGfwGAgAmkSMVCV26awAAAABJRU5ErkJggg==")
1309     public void moveToBezierCurveToStroke() throws Exception {
1310         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1311                 "context.moveTo(2, 2); context.bezierCurveTo(2, 17, 1, 4, 19, 17); context.stroke();\n");
1312     }
1313 
1314     /**
1315      * @throws Exception if the test fails
1316      */
1317     @Test
1318     @Alerts(DEFAULT = "data:image/png;base64,"
1319                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAOhJREFUOE/N1LErxVEUB/DP+xNke4OS"
1320                 + "LAZlNkmxSIoy2ZRks5n0bDIoI6NNBmWQUW+RgZXF8AazySi/I7+6vXp63juDW3e59f3cM5xzGpJPo/B28YrnnzvQVyV4jElM"
1321                 + "YQT3uMMtnvrVS7DMjGIW81jCO85xio/f8F5gd2YOm1jEIY56of2CdX4a+1WlTezgsRv+K1jnt3CCdVyV6KBgGAu4xgpuanQY"
1322                 + "MIxlnGEGb/EwLBjGAcaxkQWG08EaHjIqDHAPY9jOAieqIWhHO2WBUeULVjPBy2oPXGSCsVw6mWALn5ng97D8f/ALi58fh0da"
1323                 + "GhQAAAAASUVORK5CYII=",
1324             FF = "data:image/png;base64,"
1325                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA10lEQVQ4T83TMQ4BQRSAYRuFjqj2ANxAIdFzAEqN6BWipyHU"
1326                 + "FBuF3hVcgEohGr0rqEThf5sZmWLEMq+wyZ/MbjLfTDKzUU75iRyvz3hPl5A1XHAD1KDYwILb7lkXcUE7p2xgwW1bxks6foJ9"
1327                 + "oG9OjY9rOtOAbu/grKCd32OwohktfOi3oDXmDOrUoocL/wqK0aSpgV9mCCjImPI0sWIoKI5crREd5EUDLOJcqaQFijOkgpy8"
1328                 + "xg4FbFOXOlpgBWxHVS1Qdil/T6wJpqetCSaAJ00wvdv/Dz4ByKocwaSTblsAAAAASUVORK5CYII=",
1329             FF_ESR = "data:image/png;base64,"
1330                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA4klEQVQ4T2NkoDJghJrHBKSzgPgaFL8g1x5kA6cCDdGC4r9A"
1331                 + "+gQQ74DiB8RaADMQXb00UMAeiD2A2B2InwDxFCCeT8hgXAai6/MCCmQDsQbU4H5cBhNrIEy/FZBRA8T/gTgHiO+jG0yqgTD9"
1332                 + "VUBGGRCHA/FOZEPJNRBkhj8QLwZiFyA+BTOUEgNBZiQCcQMQGwPxG5AApQaCzJgAdV0BtQwUgUaOJZC+Qg0XghxWB8R8QFxC"
1333                 + "LQPNgYbNAWJdahkIciUoNzlR08DtQAMnUdPAhUAD91HTQFDiXk1NA8HJcfAbCABA6CBYte9o5AAAAABJRU5ErkJggg==")
1334     public void moveToQuadraticCurveToStroke() throws Exception {
1335         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1336                 "context.moveTo(2, 2); context.quadraticCurveTo(19, 4, 19, 17); context.stroke();\n");
1337     }
1338 
1339     /**
1340      * @throws Exception if the test fails
1341      */
1342     @Test
1343     @Alerts(DEFAULT = "data:image/png;base64,"
1344                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAADRJREFUOE9jZKAyYKSyeQyjBlIeokMr"
1345                 + "DP9T6GGwb5G9PAINpDAIIdqHVrIZ9TJ5IUD1WAYAYokEFfnLcNAAAAAASUVORK5CYII=",
1346             FF = "data:image/png;base64,"
1347                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAANElEQVQ4T2NkoDJgpLJ5DKMGUh6iQysM/1PoYbBvkb08Ag2k"
1348                 + "MAgh2odWshn1MnkhQPVYBgBiiQQV+ctw0AAAAABJRU5ErkJggg==",
1349             FF_ESR = "data:image/png;base64,"
1350                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAANElEQVQ4T2NkoDJgpLJ5DKMGUh6iQysM/1PoYbBvkb08Ag2k"
1351                 + "MAgh2odWshn1MnkhQPVYBgBiiQQV+ctw0AAAAABJRU5ErkJggg==")
1352     public void lineWidthMoveToLineToStroke() throws Exception {
1353         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1354                 "context.lineWidth = 4; context.moveTo(2, 10); context.lineTo(18, 10); context.stroke();\n");
1355     }
1356 
1357     /**
1358      * @throws Exception if the test fails
1359      */
1360     @Test
1361     @Alerts(DEFAULT = "data:image/png;base64,"
1362                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAL9JREFUOE/tkr0NwkAMhb+0SNRQsAM/"
1363                 + "PWILaGGMlClAbAEFDYzBAEAmgBK2QJZO4ohs4qCjw80V9/T5PdsZiStLzOPnwBYwAU7A4xv3msML0AeuAXwOr6uJBlwBueHu"
1364                 + "FsGXmkYDjoGjI+4AKKs6ayl3oFMDlRRrL3ADzGuAkkIW+FaWwymwd8TuVq/BAraBHTACeh/AC2Ab/3sOW4DDAJcGcZMDMGsK"
1365                 + "1AzGTYoUQHMKnsiO3bwkf2Cjcani5DN8AnFEGRVy9qdcAAAAAElFTkSuQmCC",
1366             FF = "data:image/png;base64,"
1367                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA0klEQVQ4T2NkoDJgpLJ5DDQ3kA3o4iggPgvE14D4L6k+wObC"
1368                 + "E0BDzIH4OxBfgBoOsuAMEF8nZAk2AxuAmupxuOwH1JKjQLoUiP+jq8NmoAVQ0XEivGoJVAPyDQrAZiBI7AkQSxEwtBEoD/IN"
1369                 + "QQNBCmYAcToBA08C5UG+IcrAAKCq9QQMBIWfDBA/Q1aHKx3yABX1ALEpEOsCMSsOw1OB4nOIMRBZDShtggw1RsIgPkh8IxCD"
1370                 + "fAMH5OYUkGF6QKwOxEupYSDO4CXXhaMGUh7L9AtDAEzqHRUeyJjbAAAAAElFTkSuQmCC",
1371             FF_ESR = "data:image/png;base64,"
1372                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAApUlEQVQ4T2NkoDJgpLJ5DHQx0AHo6gPkuhybC+8DDVMA4gdA"
1373                 + "fAGIL0ItIMoSbAb2Aw0owOFCZEsasKnBZqABUOF5IrysCPUFilJckQLzNj5zC4GSE9AV4DIQn7dhZoDC15BYAwOACteT421c"
1374                 + "LhSAGghKQiR5m5iEDUpCoIgCYXsgRrZkA5AfiGwjMQZicyHMEhCNEjHkGogzGEYNJCLlEVAy+MMQAEwqFxVGqYQqAAAAAElF"
1375                 + "TkSuQmCC")
1376     public void setTransformFillRect() throws Exception {
1377         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1378                 "context.setTransform(1, .2, .3, 1, 0, 0); context.fillRect(3, 3, 10, 7);\n");
1379     }
1380 
1381     /**
1382      * @throws Exception if the test fails
1383      */
1384     @Test
1385     @Alerts(DEFAULT = "data:image/png;base64,"
1386                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAL9JREFUOE/tkr0NwkAMhb+0SNRQsAM/"
1387                 + "PWILaGGMlClAbAEFDYzBAEAmgBK2QJZO4ohs4qCjw80V9/T5PdsZiStLzOPnwBYwAU7A4xv3msML0AeuAXwOr6uJBlwBueHu"
1388                 + "FsGXmkYDjoGjI+4AKKs6ayl3oFMDlRRrL3ADzGuAkkIW+FaWwymwd8TuVq/BAraBHTACeh/AC2Ab/3sOW4DDAJcGcZMDMGsK"
1389                 + "1AzGTYoUQHMKnsiO3bwkf2Cjcani5DN8AnFEGRVy9qdcAAAAAElFTkSuQmCC",
1390             FF = "data:image/png;base64,"
1391                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA0klEQVQ4T2NkoDJgpLJ5DDQ3kA3o4iggPgvE14D4L6k+wObC"
1392                 + "E0BDzIH4OxBfgBoOsuAMEF8nZAk2AxuAmupxuOwH1JKjQLoUiP+jq8NmoAVQ0XEivGoJVAPyDQrAZiBI7AkQSxEwtBEoD/IN"
1393                 + "QQNBCmYAcToBA08C5UG+IcrAAKCq9QQMBIWfDBA/Q1aHKx3yABX1ALEpEOsCMSsOw1OB4nOIMRBZDShtggw1RsIgPkh8IxCD"
1394                 + "fAMH5OYUkGF6QKwOxEupYSDO4CXXhaMGUh7L9AtDAEzqHRUeyJjbAAAAAElFTkSuQmCC",
1395             FF_ESR = "data:image/png;base64,"
1396                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAApUlEQVQ4T2NkoDJgpLJ5DHQx0AHo6gPkuhybC+8DDVMA4gdA"
1397                 + "fAGIL0ItIMoSbAb2Aw0owOFCZEsasKnBZqABUOF5IrysCPUFilJckQLzNj5zC4GSE9AV4DIQn7dhZoDC15BYAwOACteT421c"
1398                 + "LhSAGghKQiR5m5iEDUpCoIgCYXsgRrZkA5AfiGwjMQZicyHMEhCNEjHkGogzGEYNJCLlEVAy+MMQAEwqFxVGqYQqAAAAAElF"
1399                 + "TkSuQmCC")
1400     public void transformFillRect() throws Exception {
1401         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1402                 "context.transform(1, .2, .3, 1, 0, 0); context.fillRect(3, 3, 10, 7);\n");
1403     }
1404 
1405     /**
1406      * @throws Exception if the test fails
1407      */
1408     @Test
1409     @Alerts(DEFAULT = "data:image/png;base64,"
1410                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAEFJREFUOE9jZKAyYKSyeQyjBlIeoiM4"
1411                 + "DBUYGBiSSAjBOlxqkcOwiQQD5zEwMDzApn4ERwoJwYdf6WgYUh6UVA9DAJn9AxWRWUx3AAAAAElFTkSuQmCC",
1412             FF = "data:image/png;base64,"
1413                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAR0lEQVQ4T2NkoDJgpLJ5DKMGUh6iIzgMBYChV0BkCH4AqpuA"
1414                 + "Sy1yGIIMBBlMDAAZCDIYA4zgSCEm3IhSMxqGRAUTXkVUD0MA33oEFT5oGBkAAAAASUVORK5CYII=",
1415             FF_ESR = "data:image/png;base64,"
1416                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAPUlEQVQ4T2NkoDJgpLJ5DKMGUh6iIzwMG0gIQZxqkcMQpIif"
1417                 + "SEMbgeo+YFM7wiOFyODDr2w0DCkPRqqHIQCa5QMVIJiVTAAAAABJRU5ErkJggg==")
1418     public void moveToLineToTransformStroke() throws Exception {
1419         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1420                 "context.moveTo(2, 10); context.lineTo(13, 10);"
1421                 + "context.transform(1, .2, .3, 1, 0, 0); context.stroke();\n");
1422     }
1423 
1424     /**
1425      * @throws Exception if the test fails
1426      */
1427     @Test
1428     @Alerts(DEFAULT = "data:image/png;base64,"
1429                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAGZJREFUOE9jZKAyYKSyeQyjBlIeoqNh"
1430                 + "CA5DFgYGhj/khiauMHzAwMBwm4GB4QISvkqMJfgiRZuBgcEADSNbAGJjWEJqLKNbosrAwKCA7HJSDcTma5Qwp4aBKJaMGkhM"
1431                 + "SsOvhuphCABLbg0VZ88YdgAAAABJRU5ErkJggg==",
1432             FF = "data:image/png;base64,"
1433                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAb0lEQVQ4T2NkoDJgpLJ5DKMGUh6io2FImzBkAxp7DYhvAPFF"
1434                 + "IL4EpW8B6X+ErMQVKfxAjYZArAfE+lBaCUjfQ7IAZNF5IP6IbAkpscwE1KiGZAHIIg0g1gLiXzBDSTGQkG/B8qMGEhVMeBUN"
1435                 + "/jAEAMq8DhXVLTYNAAAAAElFTkSuQmCC",
1436             FF_ESR = "data:image/png;base64,"
1437                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAZ0lEQVQ4T2NkoDJgpLJ5DKMGUh6io2EIDkMBIP5AbmjiCsP3"
1438                 + "QAMPAPEDID4IxBegbIL24IsUB6BuBSDWB2IDIAbxNxCyhNRYRrcEZJEgsrNJNRCbl1HCnBoGolgyaiDBZEZQAdXDEABMtg0V"
1439                 + "HTQi5gAAAABJRU5ErkJggg==")
1440     public void transformMoveToLineToStroke() throws Exception {
1441         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1442                 "context.transform(1, .2, .3, 1, 0, 0); context.moveTo(2, 10);"
1443                 + "context.lineTo(13, 10); context.stroke();\n");
1444     }
1445 
1446     /**
1447      * @throws Exception if the test fails
1448      */
1449     @Test
1450     @Alerts(DEFAULT = "data:image/png;base64,"
1451                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAADNJREFUOE9jZKAyYKSyeQyjBlIeoiM8"
1452                 + "DBsoDEGwfuQwpLqBFDoQon2Ex/JoGJIXAlRPNgCWIAIVwMrcFwAAAABJRU5ErkJggg==",
1453             FF = "data:image/png;base64,"
1454                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAM0lEQVQ4T2NkoDJgpLJ5DKMGUh6iIzwMGygMQbB+5DCkuoEU"
1455                 + "OhCifYTH8mgYkhcCVE82AJYgAhXAytwXAAAAAElFTkSuQmCC",
1456             FF_ESR = "data:image/png;base64,"
1457                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAM0lEQVQ4T2NkoDJgpLJ5DKMGUh6iIzwMGygMQbB+5DCkuoEU"
1458                 + "OhCifYTH8mgYkhcCVE82AJYgAhXAytwXAAAAAElFTkSuQmCC")
1459     public void moveToLineToRotateStroke() throws Exception {
1460         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1461                 "context.moveTo(2, 10); context.lineTo(18, 10); context.rotate(90); context.stroke();\n");
1462     }
1463 
1464     /**
1465      * @throws Exception if the test fails
1466      */
1467     @Test
1468     @Alerts(DEFAULT = "data:image/png;base64,"
1469                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAALBJREFUOE/t0rEJAkEUhOH/cjGwAhEs"
1470                 + "wSYMLMEmNBCNNbcJ0RosQrAEMRYzOTCQB/Nkg3PZXQ0M7sU7H8OwFdADbvzoKmAP3IENcPnWNbADLIGF0DXwKIUN9OsDK2Ai"
1471                 + "eFuChqDnR2o8FLzLgZtAz48FPwGb4ZgCx0DPTzXFWY1PMTgF9PxMjQ+Cr01wDmj5rtB58CPqEM4FPTsQbLta4/eVgh9nbMGU"
1472                 + "rxt/0274hxu+AE0JGRUWB25NAAAAAElFTkSuQmCC",
1473             FF = "data:image/png;base64,"
1474                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAvklEQVQ4T2NkoDJgBJo3FYg/AXE3EL+j1HyQgZxAXATEaVDD"
1475                 + "JwPp7+QaDDIQBkSBjAYg9gHiFiCeD8R/SDUY2UCYXjUgowuINYG4GojXAvF/Yg3GZiBMrzWQMQOIfwBxARAfJcZQfAaC9DMB"
1476                 + "cRw0CM4B6SogvoLPYEIGwvTCIq4UKLARiOuB+AE2g4k1EKYXFnEJQIHZQNwKxK+RDSbVQPSIWwAU2EANA3EGI7kuHDUQEQKj"
1477                 + "YUhM9sevhuphCAApYRoVT9kKewAAAABJRU5ErkJggg==",
1478             FF_ESR = "data:image/png;base64,"
1479                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAqklEQVQ4T2NkYGAQB+KXQEwVwAg0ZR4Q/wLiNiB+RKmpIAO5"
1480                 + "gbgaiCuAuBVq8HdyDQYZCAMKQEYVEPtDDZ1IjqHIBsL0m0INVoUavIwUg7EZCNPvCQ2KP9Cg2E2MwfgMhOmPg7r4MtTF5/EZ"
1481                 + "TIyBMP3FUINXQg1+gs1gUgwE6eeDGloCNbQJSIOCBA5INRCmUQlq8HogvZUaBuIMRnJdOGog5bE8GoY0DEMATKUZFZcLTogA"
1482                 + "AAAASUVORK5CYII=")
1483     public void rotateMoveToLineToStroke() throws Exception {
1484         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1485                 "context.rotate(.5); context.moveTo(1, 1); context.lineTo(18, 1); context.stroke();\n");
1486     }
1487 
1488     /**
1489      * @throws Exception if the test fails
1490      */
1491     @Test
1492     @Alerts(DEFAULT = "data:image/png;base64,"
1493                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAADdJREFUOE9jZKAyYKSyeQzIBv6n0HCw"
1494                 + "WaMGUhSKtA9DipwH00zTdDjqQvJCYDRSyAs3ZF2DPwwBbfkGFYXESWwAAAAASUVORK5CYII=",
1495             FF = "data:image/png;base64,"
1496                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAN0lEQVQ4T2NkoDJgpLJ5DMgG/qfQcLBZowZSFIq0D0OKnAfT"
1497                 + "TNN0OOpC8kJgNFLICzdkXYM/DAFt+QYVhcRJbAAAAABJRU5ErkJggg==",
1498             FF_ESR = "data:image/png;base64,"
1499                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAN0lEQVQ4T2NkoDJgpLJ5DMgG/qfQcLBZowZSFIq0D0OKnAfT"
1500                 + "TNN0OOpC8kJgNFLICzdkXYM/DAFt+QYVhcRJbAAAAABJRU5ErkJggg==")
1501     public void rectFill() throws Exception {
1502         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1503                 "context.rect(2, 2, 16, 6); context.fill();\n");
1504     }
1505 
1506     /**
1507      * @throws Exception if the test fails
1508      */
1509     @Test
1510     @Alerts(DEFAULT = "data:image/png;base64,"
1511                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAPxJREFUOE/F08EqRVEUAND1PkL5AEli"
1512                 + "qgxRb2Cg5AswMREDmZqLwctE6T2lZCDlB0wYGBmIJF9ARr6Au3WVbq577uvGGZ7a6+x99t4tDZ9Ww54/Adf4fGgRT7jAGV5T"
1513                 + "qilmGNg0dnJsEksYze/2q9AiuI4bXBUCx9HFIzbxXAYXwVu08VISsIcxTKWCpzjGeVVpqeAKZjHXFDiAa8zjrh/0pzmMLKOz"
1514                 + "E02B4RzhDat10bJNGcRJNpOX2KqD/rZ6QzjAfZ1Mq3Y5Mt3GCJZTGlUFflUbjdrAA3r5JAznjdv9/iWpYMTESC1kazmDwA6z"
1515                 + "/31Hp18wqTd1Mvwf8AMXuSUVr2KpOAAAAABJRU5ErkJggg==",
1516             FF = "data:image/png;base64,"
1517                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABAklEQVQ4T72UvQ4BQRRGbaOT6L2AQqHTeAK0HkAnkSgoJOIn"
1518                 + "QYSEREGn0mppRCVRKMVPPIBapVBIOLeQyMTuzLKxySlm987ZOzvzreXz+LI89vn+IozSdQWCcIYpzE1XonYosi404AoyToMf"
1519                 + "qrDRiVWhdDOAtTIxzLgEe+g7SVXhkuIibG0m5bgfgrKdVBWOKVzBxKGLFM9mpsIEhdJFUvetTIVSt4A8nL6RfjqHMURZyHgl"
1520                 + "FI9szA1GbqVOSWkju0PNjVQXvQ4yScvQVKoTiqcAEejBUSc2EYpDNqoOD5A07SAAcWi9v8RU+Joj51SyLWm5QBMOvwh1K/7P"
1521                 + "/1DbhVPBEzD3JBVTQqvpAAAAAElFTkSuQmCC",
1522             FF_ESR = "data:image/png;base64,"
1523                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABAElEQVQ4T72UPQuBURSAfazMTAblP4jBKCOF1eAPIJvB7iMx"
1524                 + "KYMyIbKJzeRH2GxmVvKcQrlxP0pOPcP7vvc8nXPvPa/X8+Pw/tjn+YswQ9VlCMABdjC37UStUGSSXIMjxKAIfujCzCRWhQsS"
1525                 + "tjBUEnM8N2EDdZ1UFUpCD9YfkoK8G4MPst+kqnDw2Le+pooQ3062wjwLK5Aw7ZWtUNbtoQ2yn87x6R4WsDQgCWdX47eLLRVG"
1526                 + "QU7XKXSTssIUhriLUSeUSZnADUq27dvMcgtZGpqwNFVrIxSHHFQVrjAFmfEIdEA6eYWt8Jkg9zQFMuMXGMHbVLkKTR3/539o"
1527                 + "rEK34A43YyQVd6W5xwAAAABJRU5ErkJggg==")
1528     public void ellipseStroke() throws Exception {
1529         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1530                 "if (!context.ellipse) { log('context.ellipse not supported'); return; }\n"
1531                  + "context.ellipse(10, 10, 8, 4, Math.PI / 4, 0, 1.5 * Math.PI); context.stroke();\n");
1532     }
1533 
1534     /**
1535      * @throws Exception if the test fails
1536      */
1537     @Test
1538     @Alerts(DEFAULT = "data:image/png;base64,"
1539                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAOlJREFUOE/NlL0OAVEQRs+UCrVai8Qb"
1540                 + "aK0HUCslOk+iU6hovQC1JyBCq9cqlMPdrGTt/dtNNmLqmXPnm/nmCjWH1MzjN0BVEqAJXEW4VFFhdajKHhjmICdgIcKmDPgL"
1541                 + "mHW28xSah2Yi3ELgInAMbAMFTyAR4eDLKQJ7wDki7S5CqxTQJKlyBPoR6EgknbUVrqVMgHUEuBJhWgqYdWkWY6zjC69sp7FV"
1542                 + "aUPqv0YA6pTtvRRVBpDOyQd1yg6eXgTqlB295Uz+0jNTS3YU+JmhKmb784KlLNmlgTlw931NHeDh8mJlYOyD+H/gC77COxVH"
1543                 + "Ilo+AAAAAElFTkSuQmCC",
1544             FF = "data:image/png;base64,"
1545                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABKklEQVQ4T2NkoDJgpLJ5DPQx8P9/BmGgyxWB+CojI8N3UnyB"
1546                 + "4kKgQcxAzVuA2ANqyF8gvRqIW4AGXyXGYHQD7YGaDmDR+B8oNheIS4AGf8RnMLqBPkDFm/FouAlyPdDQB7jUoBsICrd7BLz2"
1547                 + "CCivADQU5GoMgBHLwHA8C1RlRMBQe6CBh4g10BGocB8BA6cADcwlykCQIqAr1wCpYDyGvgTKSWLzNtaEDTRQEKgB5HVQmOIC"
1548                 + "dkADD6NL4swpQENVgIqPALE4DhMnAQ3MJ9pAqNflgfReIFbGYugLoJgUurcJ5mWgS4WAGruBOAmLobZAA0G+gAOCBsJUAg3W"
1549                 + "BbKrgDgMiJmg4k1AA+vJMhDJYC4gWwuIuUFhDDQQlN9JdyGuqCYpUog1hKYuBAD36EAVpWqveAAAAABJRU5ErkJggg==",
1550             FF_ESR = "data:image/png;base64,"
1551                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA7ElEQVQ4T73UgQ2CMBQE0HYD3aAjOIIjwAayiU5g3MANYAPd"
1552                 + "QDfQDXQDvEtKUuH3/5IQmhBMgMddafVu4eEX9tw6YN+7gOTBe3ef22CSENgZyAHHJmJEL8C7EvwPjMkeCZYaHdDaQsfgDg8Q"
1553                 + "zI0nLjSAeRbHGGTNj5HiC3BbBPIm1GZCJtVGnZtT6aNYtfmiK8BGeqO4DpHyhpv3SsRs7RzIuSSqVRdrZ3dKXEIvJaVYW916"
1554                 + "QJmwxREEWKxt7mWgrE9UmtNJbRMckgGu8JvbMk17wtc+pumLwQQmyKl4SztmNmgs+JX+D60U2vUf7SQ5FX401SMAAAAASUVO"
1555                 + "RK5CYII=")
1556     public void ellipseFill() throws Exception {
1557         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1558                 "if (!context.ellipse) { log('context.ellipse not supported'); return; }\n"
1559                 + "context.fillStyle = 'yellow';"
1560                 + "context.ellipse(10, 10, 8, 4, Math.PI / 4, 0, 1.5 * Math.PI); context.fill();\n");
1561     }
1562 
1563     /**
1564      * @throws Exception if the test fails
1565      */
1566     @Test
1567     @Alerts(DEFAULT = "data:image/png;base64,"
1568                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAKhJREFUOE/t1CEOAjEUhOFvBRKB5wJY"
1569                 + "DBqB5QIcAwFHAMEZUGgSLAKNwXIBPAKJgSZLQmB308LKrWsy/TMzr22m5pXVzNMACxtt4R7bdVWHbWywxboO4A5nzGJhQVfm"
1570                 + "cIgV+imwKuAcnVR3/wCXuGLxmeDXyCdMcYgFBl3ZUIK7HsZF/cZcmy72+eERLpg8Hd5SgS99mPgg3xyLYr6Dm88h9V1862vv"
1571                 + "8AEQFhYVPMxY1gAAAABJRU5ErkJggg==",
1572             FF = "data:image/png;base64,"
1573                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAArElEQVQ4T2NkoDJgpLJ5DKMGYg1RcaDoS2LDmlAYJgINegPE"
1574                 + "m6lhYDfQkG9AXE+sYSB1uFxoAJRrB2JPUgzDZ2AeUFIZiPOpZWAa0CBjIE7HYeBsoPhJIJ6DLo/Py0VAxXE4DFwKFO8A4svE"
1575                 + "GghSVwb1NrorQa66DsS92CwjlGxAhupBYxuklguIz+EyDF+kIFsOMtAciP9Dww3Dm8iKCbmQ1EgeLW1IDjFMDQCsfxYVL43f"
1576                 + "UAAAAABJRU5ErkJggg==",
1577             FF_ESR = "data:image/png;base64,"
1578                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAt0lEQVQ4T2NkoDJgpLJ5DKMGUh6i+MKQE2j8TCDeD8TzibUK"
1579                 + "n4GLgYaoA7EZsYaB1OEy0AQotxCItUkxDJ+BZUBJGSDOo5aBGUCDDIE4HYeBoLC9BMRT0eVxedkGqHARECvhMPAqUBxk6WFi"
1580                 + "DQSp2wDEL6AakfVNAXKEgDgKm2WEst5aqNe3A2lTIBYE4pNAnAjEv8kxEKQHlGxAsc4DxLuB+DyOYAALE3IhPr1Y5UYNJDnI"
1581                 + "MDQAAHzHFBVJ6doGAAAAAElFTkSuQmCC")
1582     public void arcStroke() throws Exception {
1583         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1584                 "context.arc(10, 10, 4, 0, 4.3); context.stroke();\n");
1585     }
1586 
1587     /**
1588      * @throws Exception if the test fails
1589      */
1590     @Test
1591     @Alerts(DEFAULT = "data:image/png;base64,"
1592                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAALRJREFUOE/l0qEKwlAYxfGfT2AWbCbB"
1593                 + "brEYrAarj2EwqkX0ZQSzwWKxmC02wShis+g2loaDbcwgu3DL5Z4/5zvnq2Ee3CLnjVpSGD6EwKLQJG9eUeAsCHdRpJUvmqpm"
1594                 + "+D972Ec3bu6IfYHmo5aX6KCJXQwZ4IoxnjnAEfCMLaYJ4RptDPMCb2ikiE6Bw0mO8SOHB/RSgKHLO1YZXf4GWPrIpZcSrs0I"
1595                 + "dVzirFp4YINXxvyibx97bTIVviNnOwAAAABJRU5ErkJggg==",
1596             FF = "data:image/png;base64,"
1597                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAwklEQVQ4T2NkYGA4AMVAimJgzwg0ogGKKTYNaED9qIEUB+No"
1598                 + "GFIchDROh0ZAB5pAHXkKSF8gw8HwWP4F1KwOxD+ghnAC6StA3EWioWAD9wLxTSDOQtM8E8i/S6KhYANBXjPA4ZIlUAMvEelS"
1599                 + "sIFnkMIOXd90qPxcahk4G2jQSSCeQ4qBF4GK9XFoWAoU7wDiy6QYuBuo+B4Qp6NpArnqOhD3EmkYSBk4DPcD8W8gFgdiUPJh"
1600                 + "AmJWIH4GxMdJMAyk1AEAvZs0gSroYl8AAAAASUVORK5CYII=",
1601             FF_ESR = "data:image/png;base64,"
1602                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAsUlEQVQ4T2NkYGDYD8QHgZgawJ4RaEoDFFPDwIZRAykOxtEw"
1603                 + "pDgIGWgbhuZABxpBHXkOSJ8kw8FgF7YAsQwQhwHxUqgh0UB6FRBnAvF3EgwGG3geiH8DsRmaxlNA/jUgTiDVQJBhrDg0fQOK"
1604                 + "O5LgfbALzwKxMQ4D5wDFU0h1ISgCYJGBrnc2UAAkP51IQ8EupLqXqR4poOKfD4h1gPgSEINcrQvEV4B4CxD/JdK7IGX2AF1J"
1605                 + "M5M1IFdKAAAAAElFTkSuQmCC")
1606     public void arcCircleStroke() throws Exception {
1607         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1608                 "context.arc(4, 16, 4, 0, 2 * Math.PI); context.stroke(); context.strokeRect(0, 0, 20, 20);\n");
1609     }
1610 
1611     /**
1612      * @throws Exception if the test fails
1613      */
1614     @Test
1615     @Alerts(DEFAULT = "data:image/png;base64,"
1616                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAHVJREFUOE9jZKAyYKSyeQyjBmINUVsG"
1617                 + "BgZrqMxJBgaG/fjCnZgwzGVgYJCBGuLKwMDwhIGBIZqBgeEzNoOJMRBdXycDA4MmAwODH7UMBJlzDujCYmzeJ8eFIANBrnzP"
1618                 + "wMDQge5Kcg3EGS+jBlJeVIyG4SAMQwCdIwoVbWPYDQAAAABJRU5ErkJggg==",
1619             FF = "data:image/png;base64,"
1620                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAa0lEQVQ4T2NkoDJgpLJ5DKMGYg1RWaCoBxCDgucUEF/AF+7E"
1621                 + "hGEt0ACQof+BmBOIrwBxFy5DiTEQXe9MoMBdXIaSYyDIgiVQAy+h20augbOABp0G4tnUMhBnvJDrwlEDESEwGoaUF7dUD0MA"
1622                 + "jksLFQkR+1oAAAAASUVORK5CYII=",
1623             FF_ESR = "data:image/png;base64,"
1624                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAcElEQVQ4T2NkoDJgpLJ5DKMGYg1RSaCoExBLAfE6IL6LL9yJ"
1625                 + "CcNKoAH6QPwBiIOB+AAQh+IylBgD0fUuBwp8BeIUbIaSYyDInEdA7ALEt9ANJdfAxUCDDgLxHGoZiDNeyHXhqIGIEBgNQ8qL"
1626                 + "W6qHIQCR/wsV2AyBPAAAAABJRU5ErkJggg==")
1627     public void arcAnticlockwiseStroke() throws Exception {
1628         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1629                 "context.arc(10, 10, 4, 0, 4.3, true); context.stroke();\n");
1630     }
1631 
1632     /**
1633      * @throws Exception if the test fails
1634      */
1635     @Test
1636     @Alerts(DEFAULT = "data:image/png;base64,"
1637                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAKBJREFUOE/t1KENAkEQheHvCkDgaQCL"
1638                 + "QSOwNEAZCCjhEJRBA1gEGoOlATyCBmCTO8Fl7xIuE9SNncy/772dTCG4imCeAZhNdIF51bni0pV7V4YjHDHBuYIs8cAarxy4"
1639                 + "C3jCHdvG4B5TrH4BJpsHzFrs3T4KNzn7bQp3GGfU1fyk8omy+eDfgOGWk5PQT0nA8LWp8w5b7F6HaLg2vWL7GnoDgugeFeNK"
1640                 + "vNUAAAAASUVORK5CYII=",
1641             FF = "data:image/png;base64,"
1642                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA0klEQVQ4T2NkoDJgpLJ5DKMGYg1RI6CoCVTmFJC+gC/cCYVh"
1643                 + "FVCzOhD/gBrCCaSvAHEXLkPxGQgyTAaIs9A0zwTy7+IyFJeBIG/mA3E8DpcsgRp4CV0el4GpQIWGWFwH0z8LyDgNxLNJMdAU"
1644                 + "qDgNhwtBBp0E4jnEGmgAVFgExHE4DFwKFO8A4svEGghSVwbEykCcjqYJ5KrrQNyLzTJCyQZkqB4QfwZiFiDmAuJzuAwDWUDI"
1645                 + "QJAakIFmUNeAwg3Dm8guJcZAHMGIXXjUQJKCC6tiABZOHBWsf4c4AAAAAElFTkSuQmCC",
1646             FF_ESR = "data:image/png;base64,"
1647                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAsUlEQVQ4T2NkoDJgpLJ5DKMGYg1Rc6CoEVTmHJA+iS/c8YUh"
1648                 + "J1DjdCAOA+KlUEOigfQqIM4E4u/YDMZn4AKgBi0gNkPTeArIvwbECaQYCPLmfiDmwuG9b0BxR2zex+VCkJdA4ZaKw8DZQHFQ"
1649                 + "eIKCBAXgM9AYqDIFh4FzcMnhMpDqXgY5jKqRAjKQA4hnADEs2YB8EwXEoGSTAcQ/SIllZLVUS9g44gO/8GhpQ1awoWgCAGzL"
1650                 + "HRVrJ2zIAAAAAElFTkSuQmCC")
1651     public void arcCircleAnticlockwiseStroke() throws Exception {
1652         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1653                 "context.arc(10, 10, 4, 0, 2 * Math.PI, true); context.stroke();\n");
1654     }
1655 
1656     /**
1657      * @throws Exception if the test fails
1658      */
1659     @Test
1660     @Alerts(DEFAULT = "data:image/png;base64,"
1661                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAIZJREFUOE/tlDEOQEAQRd+KhuuotVou"
1662                 + "JCIuRKtVuw6NICuREEaxJtHYdjNv/r6ZrEH5GGUeP/C90WeHORE+OTPJ1sqjZaKiopday0AL8+gwBKfihZGZWILKwJKahfQ2"
1663                 + "iaGhILu7k4EFwyXdTrApS8KPgepPVh+KFaS6No47/n8OjuIOZeoOVy24KBWsq37aAAAAAElFTkSuQmCC",
1664             FF = "data:image/png;base64,"
1665                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAn0lEQVQ4T2NkoDJgpLJ5DKMGUh6i+MOwgUECaMVsILaAWnWc"
1666                 + "gZUhnaGa4Tkuq3Eb2MogyfCb4RRQowya5idAvj5DA8M7bIbiNrCBYQlQQzQOlywEGphAqoEvgBrEcRj4EmggKDgwAD4XUt1A"
1667                 + "qntZCuifk1gjhZ1Bj6GS4T1pXgaphsT0TCDLEqr5BJBOBYYfKDiwgtG8TOu8TIb5VI8UAIOoHhWKBN6HAAAAAElFTkSuQmCC",
1668             FF_ESR = "data:image/png;base64,"
1669                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAfElEQVQ4T2NkoDJgpLJ5DKMGUh6i+MOwmkGegZVhItAaU6hV"
1670                 + "pxl+M+QztDI8xGU1bgMhht0AauRA0/wDaKgGLkNxG9jAsAFokD8Ol2xkaGAIwCaHz8CnQA1SOAx8BjRQesANpLKXqR4poACi"
1671                 + "arIhM42PFg5kBhySNqqHIQDrciAVd504BAAAAABJRU5ErkJggg==")
1672     public void arcFillPath() throws Exception {
1673         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1674                 "context.fillStyle = 'green'; context.beginPath();"
1675                 + "context.arc(10, 10, 4, 0, 2 * Math.PI); context.fill();\n");
1676     }
1677 
1678     /**
1679      * @throws Exception if the test fails
1680      */
1681     @Test
1682     @Alerts(DEFAULT = "data:image/png;base64,"
1683                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAPRJREFUOE+91DtOw0AQgOHPFlyEAs4A"
1684                 + "JQ2cghouES2IO8R1KjpKHgVFCnIAKigizkCFRETAASe2ceKHLLbdmX//nZndSM8r6plnPfDCvk8nOMTO78FTPIiNDEyqZKqB"
1685                 + "wRCnNfaJ4Kwc8xcY3OKoYSnuBMf52CKwmVn5rILpCvhTs8eGZsWw2EFW0xWwm10GXlrmgc/Y7WTIi2Avzc0DP7DVETgTbPcF"
1686                 + "vOJ7zIJxGdjmyu9IzCQupXnL1bYpr+aGImkT3ja/lE1jE5mYLyCjuhrXDfb1AnTuvg6U7Vc9vRtMxRIDT01B64FtCaX4f/wP"
1687                 + "O5r2bvgFsto7Fc6TIKEAAAAASUVORK5CYII=",
1688             FF = "data:image/png;base64,"
1689                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABPElEQVQ4T83UzyuEQRzH8feiuHJyUy4S5e6u3PwBDpy4iBM5"
1690                 + "iKndC1qJ1hEnB3EnRykXKfIjtVt7cuWg/OYz5Wlnxz7MPm3y1Pcw02deM8/MNClq/KVq7BEPZmjjlUFN2K/qUtnsqeqEBnLM"
1691                 + "UKy0mO+gURxWVCOq+pg/eFb/Ai1kGOfJzZSD2wIu2VVgIHArDoX2uWg5aDQrTAZiUSyHYSxqlMA0HbxxXSVm4++qTqE3tlEC"
1692                 + "DctqTyQA7ZBFgVM+eK6O7oTgmcAeH3xUR2NC8E5gsw9+JMDsmB3VksBjH8yroz0QfVBuXTc2619w91A2FBr+BbzVMa5qY9aY"
1693                 + "5r5S1gV7FTiKAa8EzdPKFqO8/DSpf7E3FR5yBuwLyjLHQeBWeI+DoUkD91QF6gTNchEKRbk/fL6qXdpX/v+v8BPqrD0V/Gmy"
1694                 + "MAAAAABJRU5ErkJggg==",
1695             FF_ESR = "data:image/png;base64,"
1696                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABBklEQVQ4T82UjRGCMAyFwwa6AW7gCDqBjuAIMoFhAmUC3UCd"
1697                 + "QDaQDXQDGcEXpJgWKj/neebu3QGJX1/T1IC+HMGXeeQHMk2x2BJaQCGUQ3cog2Li4r0WdSDTCFUraAPJsy8Eym6yCXgsnXXp"
1698                 + "RgrkXBfaQKY1ktsuJFVjOX0DXz27tGzTt9YETqW/6lCGuTML7ACMXKC4m/Xcrimveqm3fEM2HAjM4XDsOhwKTAGKAJT5tHp4"
1699                 + "xbscTJeQoT5BiQGZH+ktMz7KMH8KASXQwZyqW6yBciseHpps61yCGq9c3aF84WKoZbhNCCiGMt/d9Ts0GaY9HkOoanRLG6z0"
1700                 + "D/+++thStf/v8AmQKzYVpXVGrAAAAABJRU5ErkJggg==")
1701     public void arcFillPathAngle() throws Exception {
1702         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1703                 "context.fillStyle = 'green'; context.beginPath();"
1704                 + "context.arc(10, 10, 8, 2.3, 2 * Math.PI); context.fill();\n");
1705     }
1706 
1707     /**
1708      * @throws Exception if the test fails
1709      */
1710     @Test
1711     @Alerts(DEFAULT = "data:image/png;base64,"
1712                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAALhJREFUOE/Fk7ENAjEMRd/NQsEOLMAC"
1713                 + "tFQ3AQwCE1DRsgALsMMV7AKW7lAUYn8XEaSKlO/n7+RnoPMaOvP4CfAKPJPOV2/tvtTWDnfAGbgkgSNwAG6LvjXyAziVIgdu"
1714                 + "zY/AJnJoZ01hA9ps7D2Kcuk29YDKpdswio1XFDaLgF5heB0q2HWxugr5U2qAeiwJtLQsENt/5a6Okxq5zKXtZeAzQANNs5O1"
1715                 + "+pJZ4HYG3XsBFedznnX4P+ALwKAjFWklBKcAAAAASUVORK5CYII=",
1716             FF = "data:image/png;base64,"
1717                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAApElEQVQ4T+WT0Q2AIAxEwYncQDcxTmLcRCfRCVxJ2w8Iadoe"
1718                 + "JsQfSfrV412BI4bGKzbmhU+Ay8up11IvJxyouVNtldCJdDPVmfTakQ9qsmsWGXA2Z93oTcg9VahAVWPrUdCUpqkFRFOahl5s"
1719                 + "rE2umQe0NrrXgYItN6OrgD9FAtBjQSCnJUFuLXcyTujIZS4T0A18DZChF1VH1aMvWQtEnNz/IfABG4IjFfQNX+kAAAAASUVO"
1720                 + "RK5CYII=",
1721             FF_ESR = "data:image/png;base64,"
1722                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAr0lEQVQ4T2NkoDJgpLJ5DDQ3sIFMF8P1obswBGhgPxDPJdLg"
1723                 + "ZKC6QiBeA1OPzcvHgJJ9yIpwGA6yvAiIrZDlsRmIVSEWQ7FajCtSCLkSp6W4DCTkSpwW4ks2uDThtQyfgbg04g0OQgkbXTOh"
1724                 + "oCCYU9ANIBRZBA0EpRaYISA2RrpDT06EvAxSD3MliE0wwRNjIMigm1CXqBPKksQaCHIlCMDzLC6DiTWQkMPg8oPfQAB2pSIV"
1725                 + "qh5VTAAAAABJRU5ErkJggg==")
1726     public void closePath() throws Exception {
1727         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1728                 "context.moveTo(4,4); context.lineTo(10,16);"
1729                 + "context.lineTo(16,4); context.closePath(); context.stroke();\n");
1730     }
1731 
1732     /**
1733      * @throws Exception if the test fails
1734      */
1735     @Test
1736     @Alerts(DEFAULT = "data:image/png;base64,"
1737                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAChJREFUOE9jZKAyYKSyeQyjBlIeoqNh"
1738                 + "OBqGZITAaLIhI9DQtIzAMAQASMYAFTvklLAAAAAASUVORK5CYII=",
1739             FF = "data:image/png;base64,"
1740                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAKElEQVQ4T2NkoDJgpLJ5DKMGUh6io2E4GoZkhMBosiEj0NC0"
1741                 + "jMAwBABIxgAVO+SUsAAAAABJRU5ErkJggg==",
1742             FF_ESR = "data:image/png;base64,"
1743                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAKElEQVQ4T2NkoDJgpLJ5DKMGUh6io2E4GoZkhMBosiEj0NC0"
1744                 + "jMAwBABIxgAVO+SUsAAAAABJRU5ErkJggg==")
1745     public void closePathNoSubpath() throws Exception {
1746         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1747                 "context.closePath();context.stroke();\n");
1748     }
1749 
1750     /**
1751      * @throws Exception if the test fails
1752      */
1753     @Test
1754     @Alerts(DEFAULT = "data:image/png;base64,"
1755                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAChJREFUOE9jZKAyYKSyeQyjBlIeoqNh"
1756                 + "OBqGZITAaLIhI9DQtIzAMAQASMYAFTvklLAAAAAASUVORK5CYII=",
1757             FF = "data:image/png;base64,"
1758                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAKElEQVQ4T2NkoDJgpLJ5DKMGUh6io2E4GoZkhMBosiEj0NC0"
1759                 + "jMAwBABIxgAVO+SUsAAAAABJRU5ErkJggg==",
1760             FF_ESR = "data:image/png;base64,"
1761                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAKElEQVQ4T2NkoDJgpLJ5DKMGUh6io2E4GoZkhMBosiEj0NC0"
1762                 + "jMAwBABIxgAVO+SUsAAAAABJRU5ErkJggg==")
1763     public void closePathPointOnly() throws Exception {
1764         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1765                 "context.moveTo(4,4); context.closePath(); context.stroke();\n");
1766     }
1767 
1768     /**
1769      * @throws Exception if the test fails
1770      */
1771     @Test
1772     @Alerts(DEFAULT = "data:image/png;base64,"
1773                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAChJREFUOE9jZKAyYKSyeQyjBlIeoqNh"
1774                 + "OBqGZITAaLIhI9DQtIzAMAQASMYAFTvklLAAAAAASUVORK5CYII=",
1775             FF = "data:image/png;base64,"
1776                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAKElEQVQ4T2NkoDJgpLJ5DKMGUh6io2E4GoZkhMBosiEj0NC0"
1777                 + "jMAwBABIxgAVO+SUsAAAAABJRU5ErkJggg==",
1778             FF_ESR = "data:image/png;base64,"
1779                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAKElEQVQ4T2NkoDJgpLJ5DKMGUh6io2E4GoZkhMBosiEj0NC0"
1780                 + "jMAwBABIxgAVO+SUsAAAAABJRU5ErkJggg==")
1781     public void closePathTwice() throws Exception {
1782         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1783                 "context.closePath(); context.closePath(); context.stroke();\n");
1784     }
1785 
1786     /**
1787      * @throws Exception if the test fails
1788      */
1789     @Test
1790     @Alerts(DEFAULT = "data:image/png;base64,"
1791                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAK9JREFUOE/tk7ERgkAQRR+1ENiDDdgA"
1792                 + "qREVYCFSgZGpDdiAPRDYCy5z66zLyeGsIRcx/89/t3yWij+fyvAOwN3xrXYFns6vX9rRagpsgBOwd4EHcE5aD1yc3wIdcFPd"
1793                 + "TqhhNf0lJX9iWuCvAH/BDCiCfcVSBTn/Y0IB6pTyLN29u0kdlfwZUHJDCu++bNSibzvUvKyKHL9Cq/wcMLTqGzBUX3axw8Tt"
1794                 + "o4QrzP7LIeoI3pwhFeJpA+wAAAAASUVORK5CYII=",
1795             FF = "data:image/png;base64,"
1796                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAiklEQVQ4T2NkoDJgJMG8ehxqG5HFYQbaAwVBEg5omvZDxf8D"
1797                 + "6YVAvABNPh7ITwTiAzBxZBfCNMMk0S0hJA82E9lAUg1AtwDDQJAAshcJBQE2eRQXggyEuRIUZiAN8LCBhhEheQwDQfrOATET"
1798                 + "EBvgiFW88qQkGxzmowqPGkhUMOFVNBqGo2FIRggAACy9IRWISF6KAAAAAElFTkSuQmCC",
1799             FF_ESR = "data:image/png;base64,"
1800                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAm0lEQVQ4T2NkoDJgJNK8BgLq4PIwA/mAGnYAsRWaxmNAvgcQ"
1801                 + "uwFxPxDPRZNPBvILgXgNTBzZhSDNfUiSIUB2EZIlhOTBZiIbSKoB6BZgGAgSgCkCsZFdB/MRIXkUF4I0wVwJYiN7H2YgIXkM"
1802                 + "A0Eab0J1q6NFAIyLVx5bsgG5AgTgMYdmMF55YtMhDsdiCo8aSHRQ4VQ4GoYjIQwBM+0eFQy1UnkAAAAASUVORK5CYII=")
1803     public void closePathClosesOnlyLastSubpath() throws Exception {
1804         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1805                 "context.moveTo(2,2); context.lineTo(5,8); context.lineTo(8,2);"
1806                 + "context.moveTo(10,2); context.lineTo(13,8); context.lineTo(16,2); context.closePath();"
1807                 + "context.stroke();\n");
1808     }
1809 
1810     /**
1811      * @throws Exception if the test fails
1812      */
1813     @Test
1814     @Alerts(DEFAULT = "data:image/png;base64,"
1815                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAGZJREFUOE9jZNjH/J8BGTj9ZUThE+Kg"
1816                 + "6WekuoH7GFBd6MRAmgvR9TNS3UB4EFEallCDEBFAbQMp9TrMp3AXUt1AQsmNWHnSEjERpo4aSEQgEVAyEsIQozykNNiobSBG"
1817                 + "eUixA9EKaAA0fyYV+TYpjQAAAABJRU5ErkJggg==",
1818             FF = "data:image/png;base64,"
1819                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAZklEQVQ4T2Nk2Mf8nwEZOP1lROET4qDpZ6S6gfsYUF3oxECa"
1820                 + "C9H1M1LdQHgQURqWUIMQEUBtAyn1OsyncBdS3UBCyY1YedISMRGmjhpIRCARUDISwhCjPKQ02KhtIEZ5SLED0QpoADR/JhX5"
1821                 + "NimNAAAAAElFTkSuQmCC",
1822             FF_ESR = "data:image/png;base64,"
1823                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAZklEQVQ4T2Nk2Mf8nwEZOP1lROET4qDpZ6S6gfsYUF3oxECa"
1824                 + "C9H1M1LdQHgQURqWUIMQEUBtAyn1OsyncBdS3UBCyY1YedISMRGmjhpIRCARUDISwhCjPKQ02KhtIEZ5SLED0QpoADR/JhX5"
1825                 + "NimNAAAAAElFTkSuQmCC")
1826     public void putImageDataInside() throws Exception {
1827         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1828                 "if (typeof ImageData != 'function') { log('no ctor'); return; }\n"
1829                 + "      var arr = new Uint8ClampedArray(64);\n"
1830                 + "      for (var i = 0; i < 32; i += 4) {\n"
1831                 + "        arr[i + 0] = 0; arr[i + 1] = 190; arr[i + 2] = 3; arr[i + 3] = 255;\n"
1832                 + "      }\n"
1833                 + "      for (var i = 32; i < 64; i += 4) {\n"
1834                 + "        arr[i + 0] = 190; arr[i + 1] = 0; arr[i + 2] = 3; arr[i + 3] = 255;\n"
1835                 + "      }\n"
1836 
1837                 + "      var imageData = new ImageData(arr, 4, 4);\n"
1838                 + "      context.putImageData(imageData, 0, 0);\n"
1839                 + "      context.putImageData(imageData, 2, 4);\n"
1840                 + "      context.putImageData(imageData, 16, 0);\n"
1841                 + "      context.putImageData(imageData, 16, 16);\n");
1842     }
1843 
1844     /**
1845      * @throws Exception if the test fails
1846      */
1847     @Test
1848     @Alerts(DEFAULT = "data:image/png;base64,"
1849                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAGtJREFUOE9jZNjH/J+BgYFhnxOIRAAn"
1850                 + "hr+MqCLE8RipbuA+BogLyXURursZqW4g3AZoWML5TuSGIcwEahsI8zrMfHLDFJ40qG4gcamMsCqyEi8+Y0cNJBzohFSMhiGh"
1851                 + "ECIsT70whBYuVDcQAEALHZVK+V18AAAAAElFTkSuQmCC",
1852             FF = "data:image/png;base64,"
1853                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAaUlEQVQ4T2Nk2Mf8nwEI9jmBSARwYvjLiCpCHI+R6gbuY4C4"
1854                 + "kFwXobubkeoGwm2AhiWc70RuGMJMoLaBMK/DzCc3TOFJg+oGEpfKCKsiK/HiM3bUQMKBTkjFaBgSCiHC8tQLQ2jhQnUDAUAL"
1855                 + "HZUFr6Y/AAAAAElFTkSuQmCC",
1856             FF_ESR = "data:image/png;base64,"
1857                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAaUlEQVQ4T2Nk2Mf8nwEI9jmBSARwYvjLiCpCHI+R6gbuY4C4"
1858                 + "kFwXobubkeoGwm2AhiWc70RuGMJMoLaBMK/DzCc3TOFJg+oGEpfKCKsiK/HiM3bUQMKBTkjFaBgSCiHC8tQLQ2jhQnUDAUAL"
1859                 + "HZUFr6Y/AAAAAElFTkSuQmCC")
1860     public void putImageDataOutside() throws Exception {
1861         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1862                 "if (typeof ImageData != 'function') { log('no ctor'); return; }\n"
1863                 + "      var arr = new Uint8ClampedArray(64);\n"
1864                 + "      for (var i = 0; i < 32; i += 4) {\n"
1865                 + "        arr[i + 0] = 0; arr[i + 1] = 190; arr[i + 2] = 3; arr[i + 3] = 255;\n"
1866                 + "      }\n"
1867                 + "      for (var i = 32; i < 64; i += 4) {\n"
1868                 + "        arr[i + 0] = 190; arr[i + 1] = 0; arr[i + 2] = 3; arr[i + 3] = 255;\n"
1869                 + "      }\n"
1870 
1871                 + "      var imageData = new ImageData(arr, 4, 4);\n"
1872                 + "      context.putImageData(imageData, -2, 0);\n"
1873                 + "      context.putImageData(imageData, 2, -2);\n"
1874                 + "      context.putImageData(imageData, 2, 4);\n"
1875                 + "      context.putImageData(imageData, 18, 18);\n");
1876     }
1877 
1878     /**
1879      * @throws Exception if the test fails
1880      */
1881     @Test
1882     @Alerts(DEFAULT = "data:image/png;base64,"
1883                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAF1JREFUOE/tkskJACAMBBPszMLTmSjR"
1884                 + "jxBhPfap38AwDqtCfkrlWaodaJJqlvIMd84zZP4hHehwquES6Np+uG0aDOnAMCMbxpL3VoAb0oGHy8eGH4gK/IaoEL7TGzaf"
1885                 + "lBRV53guuAAAAABJRU5ErkJggg==",
1886             FF = "data:image/png;base64,"
1887                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAXklEQVQ4T+2SQQoAIAgEjX7Ww/tZVHoKCrZyj3pUGNZhk5An"
1888                 + "UXk1dwNWyb1Ic8OV44asH9KBCqcmPAI1th5+nW4J6cCtRrMKtit3LcAO6cDH5uOEAUQGwiEyhO90hwOflBRVULNh6QAAAABJ"
1889                 + "RU5ErkJggg==",
1890             FF_ESR = "data:image/png;base64,"
1891                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAXklEQVQ4T+2SQQoAIAgEjX7Ww/tZVHoKCrZyj3pUGNZhk5An"
1892                 + "UXk1dwNWyb1Ic8OV44asH9KBCqcmPAI1th5+nW4J6cCtRrMKtit3LcAO6cDH5uOEAUQGwiEyhO90hwOflBRVULNh6QAAAABJ"
1893                 + "RU5ErkJggg==")
1894     public void putImageDataDirty() throws Exception {
1895         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1896                 "if (typeof ImageData != 'function') { log('no ctor'); return; }\n"
1897                 + "      var arr = new Uint8ClampedArray(64);\n"
1898                 + "      for (var i = 0; i < 32; i += 4) {\n"
1899                 + "        arr[i + 0] = 0; arr[i + 1] = 190; arr[i + 2] = 3; arr[i + 3] = 255;\n"
1900                 + "      }\n"
1901                 + "      for (var i = 32; i < 64; i += 4) {\n"
1902                 + "        arr[i + 0] = 190; arr[i + 1] = 0; arr[i + 2] = 3; arr[i + 3] = 255;\n"
1903                 + "      }\n"
1904 
1905                 + "      var imageData = new ImageData(arr, 4, 4);\n"
1906                 + "      context.putImageData(imageData, 0, 0, 1, 2, 1, 1);\n"
1907                 + "      context.putImageData(imageData, 4, 4, 0, 2, 2, 2);\n"
1908                 + "      context.putImageData(imageData, 8, 8, 0, 0, 2, 2);\n"
1909                 + "      context.putImageData(imageData, 18, 0, 1, 1, 2, 3);\n");
1910     }
1911 
1912     /**
1913      * @throws Exception if the test fails
1914      */
1915     @Test
1916     @Alerts(DEFAULT = "data:image/png;base64,"
1917                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAYxJREFUOE+t1L9LV2EUx/HXl2gI+gPS"
1918                 + "piBqMsFRoiGiEIKWIFAicNEahMIpUKPNxcYMoogIGhwFrSkQFUchiqBJlPYSDYf0OXCvPN2uelOf7d7nPO/z63NOyzGfVsa7"
1919                 + "gQ8Vfvw7iemmfkvgbTxCd+XhV5xFF743geYRLmACU+jEIG4ioOcQTpcPgubAePAUq+jACXzCF/ShHfN4hpm9wDnwCR7jOeZq"
1920                 + "ShD/VnAVLxIw7P85JTAurxew+4VVmX756DwW8QAPU70/1kED2INXuIBf+FYQLtYEEDV9jWuYTRH3V9MPYHh6g3cFIKQSpyqh"
1921                 + "kj+MW5jEvSKzXd8B/JFq0pZFs31QJ7P7jUJqu90P4FvcPSRwE0N4Wb4PYDQk79j/RBi279F7XMDfGM8DOmrKawXsr5SP0pR1"
1922                 + "XM5Hsk42TWu4lTS8hCu5KuqE3RQYQ3CnTtjhoBy9EPXPBjoMWCyJsaptdTkMpAk4sw/wD0J7ARvZbzmUdzHXo7iUNk/U6FT6"
1923                 + "DkhEdDrtxM9FNnuurx0UblcV1Fz/YwAAAABJRU5ErkJggg==",
1924             FF = "data:image/png;base64,"
1925                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABgUlEQVQ4T62UuS9FQRSH3/MfWEIs0SoUtkhEQ6NBgiglKqIQ"
1926                 + "nUQiYkskiKVQo6MRa9Q0hALR6RSWWGLXUOD7vcxNzrt5uO/lnuTLZOae+e6ZO3cmGgk5oiH7Ip6wBvEI1PpesEe/CLKCvthW"
1927                 + "uOOku7Tp0APtoH4J1MHzf2IrVJXjcAZN8AYHcAFVUAHLMAiXv4mtsJKkbZiFfVet/QRbjJ1CMYzCSSKpJ5RsGCad6Nu1Wq6N"
1928                 + "a1fpPO0AHPulEha6qlrdQyWlQWmCCnIZO4I8WIduuLJ5Ei7CKmhJQaKRpC5YgAbo8AsfGcgwg1pu0PggMRtevQmqcAL6UhQ+"
1929                 + "MK8T1sISyjME2vVYqMIp6E2xQi25H2bCqvAWkTZowwqf6OioeZHMpnwyKRPerVDbvwn6rxTJCJfIbzPFxL5hAcxBS5LCc/Kr"
1930                 + "4cYvVL8MxqA+YIUv5Oky0dmOC3s5lPNEN4lumr9CR03H9DBRkv/GzidpGprhHnQKvuAOcmAF9IvFLdOKfwCGhFAVxZXYrgAA"
1931                 + "AABJRU5ErkJggg==",
1932             FF_ESR = "data:image/png;base64,"
1933                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABiElEQVQ4T62UTStHQRSH/RdkIRtLRUlslFIWLKQsWIjEJ/Cy"
1934                 + "sUCSslI2skFZUN6+ALKwULL0XvKykFLiM1DewvOrMxrj3v4X99TT3Jk585uZe86ZTE7Klsmi18X8E2wl3dcJFrJgG+qDhVf0"
1935                 + "i6EGbpKI+ifcZ8E0rEEujEAfnEEZ1MJrNlFfUNcbgzvogEc4hFvrF9FuwLD5RGr7gr14LNgJN2kHgl+wR/8B6kx0KUrRCUps"
1936                 + "Biah1Rzd9d26cj4OYArGYQiWQ1EJlsIlNNuCa3OqjDiBNluFfhOror33/SS4DucwYRP6lzIFJ8oUrHbYgWroDAXfGciHF5v4"
1937                 + "iBGKG1ZGvLlJnfAUlGfOfiOopG+EI19wkY7y7S+C2rwNvipJJ/yPoBJ9EObTurLysgmOfcHUgxKmTdKgKCAn0OCH3yX2BYMt"
1938                 + "oEpIKviMbwX8SGxt0AOzoGpRzWYz5Z0eibnQ0X8cJKr61dsYZ7qmbDRKTBPhi13C2AoocopgngmoigpgF7rh2zX93T8BvvJW"
1939                 + "FWV1b98AAAAASUVORK5CYII=")
1940     public void clip() throws Exception {
1941         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1942                 "if (typeof ImageData != 'function') { log('no ctor'); return; }\n"
1943                 + "context.moveTo(2,2); context.lineTo(5,8); context.lineTo(8,2);"
1944                 + "context.arc(8, 12, 8, 0, 2 * Math.PI); context.stroke();"
1945                 + "context.clip(); context.fillRect(4, 9, 19, 14);\n");
1946     }
1947 
1948     /**
1949      * @throws Exception if the test fails
1950      */
1951     @Test
1952     @Alerts(DEFAULT = "data:image/png;base64,"
1953                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAKZJREFUOE9jZKAyYKSyeQw4DfwvNMWS"
1954                 + "gel/HOOb3ExSLMVtoMjk/yCDGN/kkuSLUQMRwf9/+Ifhf5HJvxkYGFhgnoYlF5jXCaTFP4xvclnByQym8L/I5JsMDAxqZBp4"
1955                 + "i/FNrjq6gdMZGBgyyDRwBixHIVwIyWrHyDLwH6MV47uc4yguBHH+i0yGu5KEMIS7DsNA5IAfAumQ2sUXKWUgslqSyjpiLAEA"
1956                 + "O2tdFYccvt8AAAAASUVORK5CYII=",
1957             FF = "data:image/png;base64,"
1958                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyUlEQVQ4T2NkoDJgpLJ5DDgN/C84UY6BiTGS8W1eJymW4jZQ"
1959                 + "ZPJ/kEGMb3JJ8sWogYjg/z/8w/C/8OQPwFTJD/M0LLnAvI43Lf5n+Mj4NlcAnMxgCoEaLwDZ+mQZyPD/LOObPBNUA4UndTAw"
1960                 + "MpaTZeD//53AHFWBaiDfRFUGVsZrQENZkHMIQS////+H4TezJuOn7DsoBoI4/4UmzQDm33SSDPz3fybju7wMuM9wBfYQSIfg"
1961                 + "4ospApgcuqhSfJFiCLJakso6YiwBAMSpYxVbkG1GAAAAAElFTkSuQmCC",
1962             FF_ESR = "data:image/png;base64,"
1963                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAArUlEQVQ4T2NkoDJgpLJ5DDgN/C84UYeBmTmI8U1OEymW4jZQ"
1964                 + "ZPJ/kEGMb3JJ8sWogYjg/z/8wxDoxadAD0vBPA1LLjCvE0iLz4DqpcHJDKbwv8ikTUCuL3kG/t/M+CbPD83AKXUMDP8byTOQ"
1965                 + "sR6WoxAuBGc1pstkGfj3ny7j+/wrKC4Ecf6LTCkCkr3IWY5wGDIWA13XB3cIrsAeAumQ2sUXKWUgslqSyjpiLAEAdMteFUCj"
1966                 + "kQkAAAAASUVORK5CYII=")
1967     public void clipWindingEvenOdd() throws Exception {
1968         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
1969                 "if (typeof ImageData != 'function') { log('no ctor'); return; }\n"
1970                 + "context.rect(6, 2, 2, 16); context.rect(2, 10, 16, 5); context.clip('evenodd');"
1971                 + "context.beginPath(); context.arc(10, 10, 8, 0, 2 * Math.PI);"
1972                 + "context.fillStyle = 'deeppink';context.fill();\n");
1973     }
1974 
1975     /**
1976      * @throws Exception if the test fails
1977      */
1978     @Test
1979     @Alerts(DEFAULT = "data:image/png;base64,"
1980                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAOpJREFUOE/t1KFOA0EQxvHfiiIIqAYB"
1981                 + "ElECJAheAEMdBIFCUF4A0YSkbYLBkdaSoHF9AzyiEoHlBUg9CnP0kr2wOZJyuSBvzJfszvwz++3sBtzhaKF5vEStLSFW5tA8"
1982                 + "Cm2A1R1IPBx0GK+ii1xHhHGKyjiNPh/G9WFgkuaUgVs4wTqmuCB8FAUR2MfZYn8Ht+gFPoucMvDtp6vsAU+E1xJwN+8qYxP3"
1983                 + "uF4GrNLhn8A42JdtblbY26bVYjhl8p76M6Czz8YVswPWHjk+53nOV3rkBNid05tVv9PfmUs8rIdtnl7z29SYnH8fm2/FgECV"
1984                 + "q9xRJAAAAABJRU5ErkJggg==",
1985             FF = "data:image/png;base64,"
1986                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA40lEQVQ4T2NkYGBoAGJ7IGYE4gNATBEAGQIC9VADQYZTBEa2"
1987                 + "gZNNGRhyvgIDMAwaiJnAeJqBHKD/GRiygPwEIAaqBYMeYJiVIqtBCkOwgUZAQ6QgCv4D9TPC5CEiUAOBgmZAtgpQ6DCQLYnP"
1988                 + "QKALGcOhBp4A0tFA/l2YBqiBjkBDQqEWPCdkIDEuJGggKA0CE3aVNANDOhcDg5wMxEVTtwCD4Ayyd6YBw86cgUHRmIFhFUj8"
1989                 + "EwNDCR8wHNG93IAwMPAXUM8aZAWkstEjBSkMSTUKon5k5xSw90ERRBEYDUPKwxAA2I49lItsoRgAAAAASUVORK5CYII=",
1990             FF_ESR = "data:image/png;base64,"
1991                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA20lEQVQ4T2NkYGBoAGJ7IAaBg1CabIoRqhNkKAjA6FEDiQ8B"
1992                 + "pDCcbcHAkPIBqDUcqr2QgYFxArJR/xkYCoD8ECC2hor3Ag0oQVaDbqAW0BA5iIL/QP2MMHmICNRAoKANkG0EFNoAZEPVQ3Rh"
1993                 + "cSFjBNTAI0A6D6jkHMwFUAMtgJrAaoD8R4QMJMaFBA0EpT1gwm6SYWCIZmdgUJKFuGjOTgaG1BPI4TObgcFCn4FBxoyBYQ1I"
1994                 + "/D0DQ6EgA0M/ehgiGejxk4HBDKyYXIAnDMkzcjTrjZY2ZKQcqicbAN2xPZWYt5iSAAAAAElFTkSuQmCC")
1995     @HtmlUnitNYI(FF_ESR = "data:image/png;base64,"
1996                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAcElEQVR42mNgYGD4T2UMBygcaoCRaeB/EJ4NxO+AOBCPopVA"
1997                 + "/AWIA4gxEKjovw8QX8ajyAeIg4D4FzEGsgExOxB/waOIGcYmxkAPIPYG4nO4FGFj4zNwGRC/BGJ3cg1ESuX/qZ1T/v8fzSmj"
1998                 + "Bg4HAwGGsHedCdecqgAAAABJRU5ErkJggg==",
1999             FF = "data:image/png;base64,"
2000                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAcElEQVR42mNgYGD4T2UMBygcaoCRaeB/EJ4NxO+AOBCPopVA"
2001                 + "/AWIA4gxEKjovw8QX8ajyAeIg4D4FzEGsgExOxB/waOIGcYmxkAPIPYG4nO4FGFj4zNwGRC/BGJ3cg1ESuX/qZ1T/v8fzSmj"
2002                 + "Bg4HAwGGsHedCdecqgAAAABJRU5ErkJggg==")
2003     @DisabledOnOs(OS.LINUX)
2004     public void fillTextAndTransform() throws Exception {
2005         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
2006                 "if (typeof ImageData != 'function') { log('no ctor'); return; }\n"
2007                 + "context.moveTo(0, 0);\n"
2008                 + "      context.lineTo(20, 0);\n"
2009                 + "      context.moveTo(2, 0);\n"
2010                 + "      context.lineTo(2, 20);\n"
2011                 + "      context.moveTo(0, 10);\n"
2012                 + "      context.lineTo(20, 10);\n"
2013                 + "      context.stroke();\n"
2014 
2015                 + "      context.fillStyle = 'blue';\n"
2016                 + "      context.fillText('p', 2, 10);\n"
2017 
2018                 + "      context.fillStyle = 'red';\n"
2019                 + "      context.setTransform(1.0, 0.0, -0.0, 1.0, 11.0, 10.0);\n"
2020                 + "      context.fillText('n', 0, 0);\n");
2021     }
2022 
2023     /**
2024      * @throws Exception if the test fails
2025      */
2026     @Test
2027     @Alerts(DEFAULT = "data:image/png;base64,"
2028                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAJBJREFUOE+t1FsOgCAMRNFhc7pmXZ0p"
2029                 + "CQSkj6GhP4YQL+erBYenHO5hDD4AruQDL4Bb/h2DEpNoZiQm0Sko54yy67RgRtl1WnBXOems4I5y0llBVrnovCCjXHReMFKq"
2030                 + "uijoKVVdFLSUpo4JakpTxwT/SlfHBkelq2ODTSnfulG8YfdhW2t1o5wIRp1+zwrp4Ac9kx4V/3bxXQAAAABJRU5ErkJggg==",
2031             FF = "data:image/png;base64,"
2032                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAj0lEQVQ4T63USw6AIAxFUViZunJxZ7YDCJ9+Hg2dGDG9nJE5"
2033                 + "HZ58uJf6YKH4Fbzgo72bd/sgH7zB4EN7DBqC/B5RNp0UjCibTgruKgedFtxRDjotiCoXnRVElIvOCnpKUecFLaWo84KaUtUh"
2034                 + "QUmp6pDgrDR1aLBXmjo0WJX85Lg56P+whsqpoNdp31EhHPwBPdMeFdd8Eu8AAAAASUVORK5CYII=",
2035             FF_ESR = "data:image/png;base64,"
2036                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAmUlEQVQ4T63U0Q2AIAxFUdjAUVzBzd3AVRzBPhMJSFseDU1M"
2037                 + "NITr4YecFk9e3Et18JL4HvzBKfsO7K2DiCEaGcQQbYL4jiiLTgtGlEWnBWeVjc4KzigbnRVklZ3OCzLKTucFR0pVNwp6SlU3"
2038                 + "ClpKU8cENaWpY4J/patjg7XS1bHBT3nLy3ujeMPeh1Bu8uDIS4KjTllnhXTwAVWiHxW3nihqAAAAAElFTkSuQmCC")
2039     public void pathFill() throws Exception {
2040         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
2041                 "context.moveTo(2, 2);\n"
2042                 + "      context.lineTo(10, 18);\n"
2043                 + "      context.lineTo(18, 2);\n"
2044                 + "      context.closePath();\n"
2045                 + "      context.fill();\n");
2046     }
2047 
2048     /**
2049      * @throws Exception if the test fails
2050      */
2051     @Test
2052     @Alerts(DEFAULT = "data:image/png;base64,"
2053                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAQxJREFUOE+11M8qRVEUx/HPfRMTychE"
2054                 + "KEJKGchUUqKYmLolioFS8gIGDIgkMwNlYsRAeQhFEV6CXffUdjp/9qlrT3at9eu79vq3W7p8Wl3miYFPGE4McI6lIm0M3MFe"
2055                 + "AvATQ3itAw7iOQG4jqMyXb6GDxirgN5itipoHriJg4RX5iVnWA7GPDA0JTSnyQm1nMRLETDY7jHVgLiGk0xfNIfb2E8EXmIx"
2056                 + "1hYBR/GYAHzHCN7qgHHad781nSmB/0m1KuXg28UGJnCI6Rz0GvN1gx37x9GHY6x27sz/jQF8NAHG2p5sJDrGFZymbkqZ7gZz"
2057                 + "uMJCk00p07axhX58dQMYNqgXF3Xj9K8fbF3wJP8PpH0mFcFq5PIAAAAASUVORK5CYII=",
2058             FF = "data:image/png;base64,"
2059                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA3ElEQVQ4T62UYQrCMAyFu8MIQ397Epm30CvofRyeQ/C3CB7C"
2060                 + "M/gCnaRZ0r3CAmWwZl+Tt5d2aeXoVuYlDXwBviUPuCHv6OVq4BUJFwL4Rc4GS56z0ECpTqpcCqlMKnTDavjJp0f5d2wcaida"
2061                 + "INu2Zf41tUC2bQ0sNPVss9S2ra7Q1AO2tD3T1AOybbv2iSbljb56rCfWPvirA96Pdi8CisHP2UIPx0qhfSKgtL3LBraa0pMS"
2062                 + "+dVq2jQpEXSyUvOkREBp+5S1dC+F6UP2PtSa1ka5uA+riewmWyHLSz+ljSYVkapvPQAAAABJRU5ErkJggg==",
2063             FF_ESR = "data:image/png;base64,"
2064                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAzElEQVQ4T7WU0Q2DQAxDYQNGKJt0BTZgBDpJO0pH6AaMwAgw"
2065                 + "AonUQyHEnE8CJMQH1ruz5aSuLn7qi3mVBU4Cf5AHfEXXRVoLfItgIICLaFp59Xt4LLCRvzMBfInmg3Q+w5xtaDUd4IGsbX/B"
2066                 + "7SAPZG1b4C7TqDY52/52u0wjYIntQ6YRkLUd1gdNSrL9E39PUJGwPgiotvt/gcdggqhJsRdR2wrUAvtM6UlB5feZFk0KgqZM"
2067                 + "iycFAW2m4VJAo3dmO2V6uj9uXbDE5spLVqfJJhVVgK1QAAAAAElFTkSuQmCC")
2068     public void pathFillTransform() throws Exception {
2069         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
2070                 "      context.moveTo(2, 2);\n"
2071                 + "      context.lineTo(6, 14);\n"
2072                 + "      context.lineTo(14, 2);\n"
2073                 + "      context.closePath();\n"
2074 
2075                 + "      context.setTransform(1.0, 0.0, 0.0, 1.0, 4.0, 4.0);\n"
2076                 + "      context.moveTo(2, 2);\n"
2077                 + "      context.lineTo(6, 14);\n"
2078                 + "      context.lineTo(14, 2);\n"
2079                 + "      context.closePath();\n"
2080 
2081                 + "      context.fill();\n");
2082     }
2083 
2084     /**
2085      * @throws Exception if the test fails
2086      */
2087     @Test
2088     @Alerts(DEFAULT = "data:image/png;base64,"
2089                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAOZJREFUOE+tlNENwjAMRC/zVBVD8MkM"
2090                 + "LMASMExX4AuGYA+GCLrIjYzrYlc0P0hteL13cVuw8yo786CBLwCH5AMmAGdvrwbeAFwTwDeAAQB/F0sDmY4po8VkTOgu22Gk"
2091                 + "vao60y2wa0dkE28q0qkFdu1sodLlUKRTb2xauGyhPO2iOvWAW7S76lqHvJ7VbuMzq/4C8l7TPgL3J3BamZAv1QhI7QsTVODh"
2092                 + "vEEL1QhI7ZEDXAF74K5qBOyWVXUqF13VNJAbq3TKxPMAZ189d59ot07tqdo/pL6Hoj3qAf4rYfT50fdTCbcAP2uOMhXdBSkP"
2093                 + "AAAAAElFTkSuQmCC",
2094             FF = "data:image/png;base64,"
2095                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA7UlEQVQ4T62U0Q3CMAxE3WEq+OSTGZiADsEMMA5doCPACDAF"
2096                 + "K8DZaqLUtYlBqVRVSk7PubPTjho/XWMelcAn4JtggRG6o6UtgRcIzgHgC5oeL39XTwncYvcRAA7QXD2dzrBm27WaCmhgtl0j"
2097                 + "qxOOAEmmGphtRwOds+wBkkytsZHDRQOFdgAkZ2oBf7GdrXoZ8nrUtoxPsvoNyHtie0803YkOzogsrNaAbPvEJ3gT3RjudVUX"
2098                 + "8+4y297xAAOoG25arZ0wFwZQN9y0GgayENA056uuRi0vdLNtyVR39V+gZFoOsNN586Z42tB68z/2B2u6MhWr0Q5cAAAAAElF"
2099                 + "TkSuQmCC",
2100             FF_ESR = "data:image/png;base64,"
2101                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA7UlEQVQ4T62UwQ3CMAxF3Q24caXzcGIDRqCT0FF6YY6OwJUb"
2102                 + "bADfVhOlrk0MSqWqUvL1nP/ttKPGT9eYRyXwDvghWGCC7mRpS+AVgksA+IKmx8vfzVMCd9h9BoADNKOn0xnWbLtWUwENzLZr"
2103                 + "ZHXCCSDJVAOz7WigS5Y9QJKpNTZyuGig0A6A5Ewt4C+2s1UvQ16P2pbxSVa/AXlPbO+Jbg+iozMiK6s1INs+8wneRDPDva7q"
2104                 + "Yt5dZtsMHAHUDTet1k6YCwOoG25aDQNZCGia801Xo5ZXusW2ZKq7+i9QMi0H2Om8eVM8bWi9+R/7A246MhXPMagrAAAAAElF"
2105                 + "TkSuQmCC")
2106     public void pathFillTransform2() throws Exception {
2107         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
2108                 "      context.beginPath();\n"
2109                 + "      context.moveTo(2, 2);\n"
2110                 + "      context.lineTo(6, 14);\n"
2111                 + "      context.lineTo(14, 2);\n"
2112                 + "      context.closePath();\n"
2113                 + "      context.fill();\n"
2114 
2115                 + "      context.setTransform(1.0, 0.0, 0.0, 1.0, 4.0, 4.0);\n"
2116                 + "      context.fillStyle = 'red';"
2117                 + "      context.beginPath();\n"
2118                 + "      context.moveTo(2, 2);\n"
2119                 + "      context.lineTo(6, 14);\n"
2120                 + "      context.lineTo(14, 2);\n"
2121                 + "      context.closePath();\n"
2122                 + "      context.fill();\n");
2123     }
2124 
2125     /**
2126      * @throws Exception if the test fails
2127      */
2128     @Test
2129     @Alerts(DEFAULT = "data:image/png;base64,"
2130                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAHVJREFUOE/Vk8EOwFAEBNef+3M9lDY0"
2131                 + "mhIOfccnmYwFYfjRMA9/BDLExcC1Lp4tbwGF/bgI30xTwzmgignOLClECtDrZqTFceCdoPipdw0XgX7aFoX9xumXT28NSGFP"
2132                 + "oRfVNhwDXonGE9VC2XAPaORg2jdMgAdeyiQRQvsTZgAAAABJRU5ErkJggg==",
2133             FF = "data:image/png;base64,"
2134                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAeklEQVQ4T9WTUQ7AQAREubmbqzS0pdHsCh/dT5K3YwaE5ofN"
2135                 + "PPgjkICdDbQ3xXvkKSCTj0t+XvI7VdgHVGFi5OklBkul8qk0bbYDbwfZp15VOAj0aZsVVo3pL63CEzkGxLCnoBdVVtgGvMaP"
2136                 + "J6qNbYVzQCMHpXWFCfAAXsokEVEKzTkAAAAASUVORK5CYII=",
2137             FF_ESR = "data:image/png;base64,"
2138                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAeklEQVQ4T9WTUQ7AQAREubmbqzS0pdHsCh/dT5K3YwaE5ofN"
2139                 + "PPgjkICdDbQ3xXvkKSCTj0t+XvI7VdgHVGFi5OklBkul8qk0bbYDbwfZp15VOAj0aZsVVo3pL63CEzkGxLCnoBdVVtgGvMaP"
2140                 + "J6qNbYVzQCMHpXWFCfAAXsokEVEKzTkAAAAASUVORK5CYII=")
2141     public void saveRestore() throws Exception {
2142         draw("<canvas id='myCanvas' width='20', height='20' style='border: 1px solid red;'></canvas>\n",
2143                 "      context.fillStyle = 'green';\n"
2144                 + "      context.save();\n"
2145                 + "      context.fillRect(4, 4, 4, 4);\n"
2146 
2147                 + "      context.fillStyle = 'red';\n"
2148                 + "      context.fillRect(6, 6, 4, 4);\n"
2149                 + "      context.save();\n"
2150 
2151                 + "      context.fillStyle = 'blue';\n"
2152                 + "      context.fillRect(8, 8, 4, 4);\n"
2153 
2154                 + "      context.restore();\n"
2155                 + "      context.fillRect(12, 12, 4, 4);\n"
2156 
2157                 + "      context.restore();\n"
2158                 + "      context.fillRect(14, 14, 4, 4);\n"
2159 
2160                 + "      context.restore();\n"
2161                 + "      context.fillRect(16, 16, 4, 4);\n");
2162     }
2163 
2164     /**
2165      * @throws Exception if the test fails
2166      */
2167     @Test
2168     @Alerts(DEFAULT = "data:image/png;base64,"
2169                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAL1JREFUOE9jZEAFjgwMDOZQoZMMDAz7"
2170                 + "0eQJchmhKnhFGBi2CDAw6AcwMHCDxDYwMHz9wMBw8Q0Dgw8DA8NngiZBFYANFGFgOJjAwGDVzcDAgqyxlIHhzwIGhmNvGBjs"
2171                 + "STHQUYWBYf1tBgZ+bJpUGRg+3mFgCCTW+yAXVpQwMDSjuw5mOMiVPQwMtQwMDB3EuJImBlLdy1SPFFDQUDfZIAU21RI2MRFI"
2172                 + "lBpYTiFKMTGKRg0kJpTwqxkNQ8rDEABatjIVyjXhJwAAAABJRU5ErkJggg==",
2173             FF = "data:image/png;base64,"
2174                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABF0lEQVQ4T+2SvUoDQRSFv5SC5UIUK30ACUFIbyws4wMsBkO6"
2175                 + "RJ9AiBhUsEqvstoKVgELwdRa5cc6pTbGLqTUM+saNsvGHUljkYFlmDn3fnvPvZNicmV13AiunrW3I3riMfUTkYYT0dwlcMzd"
2176                 + "G7x3wNN+mEgJBfjAZTjdhsoVLIaTd2HYhPMPOLKFGmB2C24fYC0uKQ/9R9iR1rWBGmB5DxqXsBCXUIKRKq9KU0jy8oGy1vCm"
2177                 + "AKWNbmBfcRfJODDAjCzfyfJqXMKmLLegIK1nC2QF6urVwXVkKK6Gcg9nA+k2MBMzfjaa9PE6FLU7n9/PZvAim69Qs4VNAIMk"
2178                 + "McnpM8wnW5vhH44r/EsVv8XOgbN3ct7Df9jDL+YBMhUCa42EAAAAAElFTkSuQmCC",
2179             FF_ESR = "data:image/png;base64,"
2180                 + "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAA4klEQVQ4T+2STQ4BQRCFPyT+V27AESQyC5cwQqzY2zuGvT0b"
2181                 + "QnAJCyGO4AhiIRgJUU1P4mdkesJSbzpV/frlvaoX4vlYUuZ1ayX3/OXdtwxpRCIDvR2UauCoZh9iSZhuoS7lwZdJA26EQjbM"
2182                 + "QXkB4cePBbisYbKBShBCKwozByJen2JwPkHR1L5S2BRP7S6Iw/fTgH0PUkEUmhC2hLBjQqoU/tyyWsooC/bSeyljWUrVRJ3C"
2183                 + "uLGJ69jYKjbqYSCxSd83rGJzDEro4n8WbFMBvjjXsi/QFPAnNJ3UZ9x/ht/P8AqUpzEVnisiKgAAAABJRU5ErkJggg==")
2184     public void imageOnLoad() throws Exception {
2185         final String html = DOCTYPE_HTML
2186             + "<html><head>\n"
2187             + "<script>\n"
2188             + LOG_TEXTAREA_FUNCTION
2189             + "  function test() {\n"
2190             + "    var img = new Image();\n"
2191             + "    img.onload = function() {\n"
2192             + "      var canvas = document.createElement('canvas');\n"
2193             + "      canvas.width = 20;\n"
2194             + "      canvas.height = 20;\n"
2195             + "      var context = canvas.getContext('2d');\n"
2196             + "      context.drawImage(img, 0, 0);\n"
2197 
2198             + "      log(canvas.toDataURL());\n"
2199             + "    }\n"
2200 
2201             + "    img.src = 'data:image/svg+xml,"
2202                     + "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\" "
2203                             + "overflow=\"hidden\" width=\"10\" height=\"10\">"
2204                     + "  <circle cx=\"5\" cy=\"5\" r=\"4\" stroke=\"black\" stroke-width=\"1\" fill=\"red\" />"
2205                     + "</svg>';"
2206             + "  }\n"
2207             + "</script>\n"
2208             + "</head>\n"
2209             + "<body onload='test()'>\n"
2210             + LOG_TEXTAREA
2211             + "</body></html>";
2212 
2213         loadPageVerifyTextArea2(html);
2214     }
2215 }