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.protocol.data;
16  
17  import org.htmlunit.WebDriverTestCase;
18  import org.htmlunit.junit.BrowserRunner;
19  import org.htmlunit.junit.annotation.Alerts;
20  import org.junit.Test;
21  import org.junit.runner.RunWith;
22  import org.openqa.selenium.WebDriver;
23  
24  /**
25   * Tests for {@link DataUrlDecoder}.
26   *
27   * @author Marc Guillemot
28   * @author Ahmed Ashour
29   * @author Ronald Brill
30   */
31  @RunWith(BrowserRunner.class)
32  public class DataURLDecoderTest extends WebDriverTestCase {
33  
34      /**
35       * @throws Exception if something goes wrong
36       */
37      @Test
38      @Alerts({"one", "two", "three", "four", "five's"})
39      public void dataProtocol() throws Exception {
40          final String html = DOCTYPE_HTML
41              + "<html><head>\n"
42              + "<script>\n"
43              + "var d1, d2, d3, d4, d5;\n"
44              + "</script>\n"
45              + "<script src=\"data:text/javascript,d1%20%3D%20'one'%3B\"></script>\n"
46              + "<script src=\"data:text/javascript;base64,ZDIgPSAndHdvJzs%3D\"></script>\n"
47              + "<script src=\""
48              + "data:text/javascript;base64,%5a%44%4d%67%50%53%41%6e%64%47%68%79%5a%57%55%6e%4f%77%3D%3D\"></script>\n"
49              + "<script src=\"data:text/javascript;base64,%20ZD%20Qg%0D%0APS%20An%20Zm91cic%0D%0A%207%20\"></script>\n"
50              + "<script src=\"data:text/javascript,d5%20%3D%20'five%5Cu0027s'%3B\"></script>\n"
51              + "<script>\n"
52              + LOG_TITLE_FUNCTION
53              + "function test() {\n"
54              + "  log(d1);\n"
55              + "  log(d2);\n"
56              + "  log(d3);\n"
57              + "  log(d4);\n"
58              + "  log(d5);\n"
59              + "}\n"
60              + "</script></head><body onload='test()'></body></html>";
61  
62          loadPageVerifyTitle2(html);
63      }
64  
65      /**
66       * @throws Exception if something goes wrong
67       */
68      @Test
69      @Alerts(CHROME = "data:image/png;base64,"
70                  + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAHBJREFUOE+tkkkOACAIA+3/H40hEYOI"
71                  + "iAtXYKBNQURUHgq3AACFbx8DeJFLHu8AaWTUaNUDILLDHnA/WAH026GETrU6m2Es7xgwLUQmDua0Qe14+gM9eA0QiDU25UGU"
72                  + "hS9BcpNode8SOQXpC2B31etXnvKZ0TEDfq8AAAAASUVORK5CYII=",
73              EDGE = "data:image/png;base64,"
74                  + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAHBJREFUOE+tkkkOACAIA+3/H40hEYOI"
75                  + "iAtXYKBNQURUHgq3AACFbx8DeJFLHu8AaWTUaNUDILLDHnA/WAH026GETrU6m2Es7xgwLUQmDua0Qe14+gM9eA0QiDU25UGU"
76                  + "hS9BcpNode8SOQXpC2B31etXnvKZ0TEDfq8AAAAASUVORK5CYII=",
77              FF = "data:image/png;base64,"
78                  + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAcElEQVQ4T62SSQ4AIAgD7f8frZKIQUTEhSsw0KbItdJD4RYA"
79                  + "INHtYwAtUvHjHcCNiBqpegB4dugD5gcrgHzbldCpWmczjOQdA6YFz8TBnDYoHQ9/IAevAQzRxoY88LLwJUhmErXuXSKnIH0B"
80                  + "7K5a/QKe8pnRes1vRwAAAABJRU5ErkJggg==",
81              FF_ESR = "data:image/png;base64,"
82                  + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAcElEQVQ4T62SSQ4AIAgD7f8frZKIQUTEhSsw0KbItdJD4RYA"
83                  + "INHtYwAtUvHjHcCNiBqpegB4dugD5gcrgHzbldCpWmczjOQdA6YFz8TBnDYoHQ9/IAevAQzRxoY88LLwJUhmErXuXSKnIH0B"
84                  + "7K5a/QKe8pnRes1vRwAAAABJRU5ErkJggg==")
85      public void base64WithPlus() throws Exception {
86          final String html = DOCTYPE_HTML
87              + "<html><head>\n"
88              + "<script>\n"
89              + LOG_TEXTAREA_FUNCTION
90              + "function test() {\n"
91              + "  var canvas = document.getElementById('canvas');\n"
92              + "  var img = document.getElementById('image');\n"
93              + "  canvas.width = img.width;\n"
94              + "  canvas.height = img.height;\n"
95              + "  var ctx = canvas.getContext('2d');\n"
96              + "  ctx.drawImage(img, 0, 0);\n"
97              + "  log(canvas.toDataURL());\n"
98              + "}\n"
99              + "</script></head><body onload='test()'>\n"
100             + "  <img id='image' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEU"
101             + "AAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAA"
102             + "AElFTkSuQmCC'>\n"
103             + "  <canvas id='canvas'></canvas>\n"
104             + LOG_TEXTAREA
105             + "</body></html>";
106 
107         loadPageVerifyTextArea2(html);
108     }
109 
110     /**
111      * @throws Exception if something goes wrong
112      */
113     @Test
114     @Alerts("HtmlUnit")
115     public void withPlus() throws Exception {
116         final String dataUrl = "data:text/html;charset=utf-8,"
117             + "<html><head></head>\n"
118             + "<body>\n"
119             + "<script>\n"
120             + "  var result = 'Html';\n"
121             + "  result += 'Unit§';\n"
122             + "  window.document.title = result;\n"
123             + "</script>\n"
124             + "</body></html>";
125 
126         final WebDriver driver = getWebDriver();
127         driver.get(dataUrl);
128         verifyTitle2(driver, getExpectedAlerts());
129     }
130 }