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