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