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.css;
16  
17  import org.htmlunit.WebDriverTestCase;
18  import org.htmlunit.junit.annotation.Alerts;
19  import org.htmlunit.junit.annotation.HtmlUnitNYI;
20  import org.junit.jupiter.api.Test;
21  
22  /**
23   * Tests for {@link CSSMediaRule}.
24   *
25   * @author Ronald Brill
26   * @author Frank Danek
27   */
28  public class CSSMediaRuleTest extends WebDriverTestCase {
29  
30      /**
31       * @throws Exception if an error occurs
32       */
33      @Test
34      @Alerts("TypeError")
35      public void ctor() throws Exception {
36          final String html = DOCTYPE_HTML
37              + "<html><body>\n"
38              + LOG_TEXTAREA
39              + "<script>\n"
40              + LOG_TEXTAREA_FUNCTION
41              + "try {\n"
42              + "  var rule = new CSSMediaRule();\n"
43              + "  log(rule);\n"
44              + "} catch(e) { logEx(e); }\n"
45              + "</script></body></html>";
46  
47          loadPageVerifyTextArea2(html);
48      }
49  
50      /**
51       * @throws Exception if an error occurs
52       */
53      @Test
54      @Alerts({"[object CSSMediaRule]", "[object CSSMediaRule]"})
55      public void scriptableToString() throws Exception {
56          final String html = DOCTYPE_HTML
57              + "<html><body>\n"
58  
59              + "<style>\n"
60              + "  @media screen { p { background-color:#FFFFFF; }};\n"
61              + "</style>\n"
62  
63              + "<script>\n"
64              + LOG_TITLE_FUNCTION
65              + "  var styleSheet = document.styleSheets[0];\n"
66              + "  var rule = styleSheet.cssRules[0];\n"
67              + "  log(Object.prototype.toString.call(rule));\n"
68              + "  log(rule);\n"
69              + "</script>\n"
70  
71              + "</body></html>";
72  
73          loadPageVerifyTitle2(html);
74      }
75  
76      /**
77       * @throws Exception if an error occurs
78       */
79      @Test
80      @Alerts("@media screen {\n  p { background-color: rgb(255, 255, 255); }\n}")
81      public void cssText() throws Exception {
82          final String html = DOCTYPE_HTML
83              + "<html><body>\n"
84  
85              + LOG_TEXTAREA
86  
87              + "<style>\n"
88              + "  @media screen { p { background-color:#FFFFFF; }};\n"
89              + "</style>\n"
90  
91              + "<script>\n"
92              + LOG_TEXTAREA_FUNCTION
93              + "  var styleSheet = document.styleSheets[0];\n"
94              + "  var rule = styleSheet.cssRules[0];\n"
95              + "  log(rule.cssText);\n"
96              + "</script>\n"
97  
98              + "</body></html>";
99  
100         loadPageVerifyTextArea2(html);
101     }
102 
103     /**
104      * @throws Exception if an error occurs
105      */
106     @Test
107     @Alerts("@media screen {\n}")
108     public void cssTextEmpty() throws Exception {
109         final String html = DOCTYPE_HTML
110             + "<html><body>\n"
111 
112             + LOG_TEXTAREA
113 
114             + "<style>\n"
115             + "  @media screen {};\n"
116             + "</style>\n"
117 
118             + "<script>\n"
119             + LOG_TEXTAREA_FUNCTION
120             + "  var styleSheet = document.styleSheets[0];\n"
121             + "  var rule = styleSheet.cssRules[0];\n"
122             + "  log(rule.cssText);\n"
123             + "</script>\n"
124 
125             + "</body></html>";
126 
127         loadPageVerifyTextArea2(html);
128     }
129 
130     /**
131      * @throws Exception if an error occurs
132      */
133     @Test
134     @Alerts("@media screen {\n  p { }\n  div { }\n}")
135     public void cssTextMultipleRules() throws Exception {
136         final String html = DOCTYPE_HTML
137             + "<html><body>\n"
138 
139             + LOG_TEXTAREA
140 
141             + "<style>\n"
142             + "  @media screen { p {} div {}};\n"
143             + "</style>\n"
144 
145             + "<script>\n"
146             + LOG_TEXTAREA_FUNCTION
147             + "  var styleSheet = document.styleSheets[0];\n"
148             + "  var rule = styleSheet.cssRules[0];\n"
149             + "  log(rule.cssText);\n"
150             + "</script>\n"
151 
152             + "</body></html>";
153 
154         loadPageVerifyTextArea2(html);
155     }
156 
157     /**
158      * @throws Exception if an error occurs
159      */
160     @Test
161     @Alerts("@media print {\n  #navigation { display: none; }"
162             + "\n  @media (max-width: 12cm) {\n  .note { float: none; }\n}\n}")
163     @HtmlUnitNYI(CHROME = "@media print {\n  *#navigation { display: none; }"
164                     + "\n  @media (max-width: 12cm) {\n  *.note { float: none; }\n}\n}",
165             EDGE = "@media print {\n  *#navigation { display: none; }"
166                     + "\n  @media (max-width: 12cm) {\n  *.note { float: none; }\n}\n}",
167             FF = "@media print {\n  *#navigation { display: none; }"
168                     + "\n  @media (max-width: 12cm) {\n  *.note { float: none; }\n}\n}",
169             FF_ESR = "@media print {\n  *#navigation { display: none; }"
170                     + "\n  @media (max-width: 12cm) {\n  *.note { float: none; }\n}\n}")
171     public void cssTextNested() throws Exception {
172         final String html = DOCTYPE_HTML
173             + "<html><body>\n"
174 
175             + LOG_TEXTAREA
176 
177             + "<style>\n"
178             + "  @media print { #navigation { display: none }"
179                     + "@media (max-width: 12cm) { .note { float: none } } }"
180             + "</style>\n"
181 
182             + "<script>\n"
183             + LOG_TEXTAREA_FUNCTION
184             + "  var styleSheet = document.styleSheets[0];\n"
185             + "  var rule = styleSheet.cssRules[0];\n"
186             + "  log(rule.cssText);\n"
187             + "</script>\n"
188 
189             + "</body></html>";
190 
191         loadPageVerifyTextArea2(html);
192     }
193 
194     /**
195      * @throws Exception if an error occurs
196      */
197     @Test
198     @Alerts("@media screen {\n  p { background-color: rgb(255, 255, 255); }\n}")
199     public void cssTextSet() throws Exception {
200         final String html = DOCTYPE_HTML
201             + "<html><body>\n"
202 
203             + LOG_TEXTAREA
204 
205             + "<style>\n"
206             + "  @media screen { p { background-color:#FFFFFF; }};\n"
207             + "</style>\n"
208 
209             + "<script>\n"
210             + LOG_TEXTAREA_FUNCTION
211             + "  var styleSheet = document.styleSheets[0];\n"
212             + "  var rule = styleSheet.cssRules[0];\n"
213             + "  try {"
214             + "    rule.cssText = '@media screen { span { color: rgb(0, 0, 0); }}';\n"
215             + "    log(rule.cssText);\n"
216             + "  } catch(e) {\n"
217             + "    logEx(e);\n"
218             + "  }\n"
219             + "</script>\n"
220 
221             + "</body></html>";
222 
223         loadPageVerifyTextArea2(html);
224     }
225 
226     /**
227      * @throws Exception if an error occurs
228      */
229     @Test
230     @Alerts("null")
231     public void parentRule() throws Exception {
232         final String html = DOCTYPE_HTML
233             + "<html><body>\n"
234 
235             + "<style>\n"
236             + "  @media screen { p { background-color:#FFFFFF; }};\n"
237             + "</style>\n"
238 
239             + "<script>\n"
240             + LOG_TITLE_FUNCTION
241             + "  var styleSheet = document.styleSheets[0];\n"
242             + "  var rule = styleSheet.cssRules[0];\n"
243             + "  log(rule.parentRule);\n"
244             + "</script>\n"
245 
246             + "</body></html>";
247 
248         loadPageVerifyTitle2(html);
249     }
250 
251     /**
252      * @throws Exception if an error occurs
253      */
254     @Test
255     @Alerts({"[object CSSMediaRule]", "[object CSSMediaRule]"})
256     public void parentRuleNested() throws Exception {
257         final String html = DOCTYPE_HTML
258             + "<html><body>\n"
259 
260             + "<style>\n"
261             + "  @media print { #navigation { display: none; } "
262                     + "@media (max-width: 12cm) { .note { float: none; } } }"
263             + "</style>\n"
264 
265             + "<script>\n"
266             + LOG_TITLE_FUNCTION
267             + "  var styleSheet = document.styleSheets[0];\n"
268             + "  var ruleOuter = styleSheet.cssRules[0];\n"
269             + "  var ruleInner = ruleOuter.cssRules[1];\n"
270             + "  log(ruleInner);\n"
271             + "  log(ruleInner.parentRule);\n"
272             + "</script>\n"
273 
274             + "</body></html>";
275 
276         loadPageVerifyTitle2(html);
277     }
278 
279     /**
280      * @throws Exception if an error occurs
281      */
282     @Test
283     @Alerts("null")
284     public void parentRuleSet() throws Exception {
285         final String html = DOCTYPE_HTML
286             + "<html><body>\n"
287 
288             + "<style>\n"
289             + "  @media screen { p { background-color:#FFFFFF; }};\n"
290             + "</style>\n"
291 
292             + "<script>\n"
293             + LOG_TITLE_FUNCTION
294             + "  var styleSheet = document.styleSheets[0];\n"
295             + "  var rule = styleSheet.cssRules[0];\n"
296             + "  try {"
297             + "    rule.parentRule = rule;\n"
298             + "    log(rule.parentRule);\n"
299             + "  } catch(e) {\n"
300             + "    logEx(e);\n"
301             + "  }\n"
302             + "</script>\n"
303 
304             + "</body></html>";
305 
306         loadPageVerifyTitle2(html);
307     }
308 
309     /**
310      * @throws Exception if an error occurs
311      */
312     @Test
313     @Alerts("[object CSSStyleSheet]")
314     public void parentStyleSheet() throws Exception {
315         final String html = DOCTYPE_HTML
316             + "<html><body>\n"
317 
318             + "<style>\n"
319             + "  @media screen { p { background-color:#FFFFFF; }};\n"
320             + "</style>\n"
321 
322             + "<script>\n"
323             + LOG_TITLE_FUNCTION
324             + "  var styleSheet = document.styleSheets[0];\n"
325             + "  var rule = styleSheet.cssRules[0];\n"
326             + "  log(rule.parentStyleSheet);\n"
327             + "</script>\n"
328 
329             + "</body></html>";
330 
331         loadPageVerifyTitle2(html);
332     }
333 
334     /**
335      * @throws Exception if an error occurs
336      */
337     @Test
338     @Alerts("[object CSSStyleSheet]")
339     public void parentStyleSheetSet() throws Exception {
340         final String html = DOCTYPE_HTML
341             + "<html><body>\n"
342 
343             + "<style>\n"
344             + "  @media screen { p { background-color:#FFFFFF; }};\n"
345             + "</style>\n"
346 
347             + "<script>\n"
348             + LOG_TITLE_FUNCTION
349             + "  var styleSheet = document.styleSheets[0];\n"
350             + "  var rule = styleSheet.cssRules[0];\n"
351             + "  try {"
352             + "    rule.parentStyleSheet = null;\n"
353             + "    log(rule.parentStyleSheet);\n"
354             + "  } catch(e) {\n"
355             + "    logEx(e);\n"
356             + "  }\n"
357             + "</script>\n"
358 
359             + "</body></html>";
360 
361         loadPageVerifyTitle2(html);
362     }
363 
364     /**
365      * @throws Exception if an error occurs
366      */
367     @Test
368     @Alerts({"[object MediaList]", "all", "1", "all", "all", "all"})
369     public void mediaAll() throws Exception {
370         final String html = DOCTYPE_HTML
371             + "<html><body>\n"
372 
373             + "<style>\n"
374             + "  @media all { p { background-color:#FFFFFF; }};\n"
375             + "</style>\n"
376 
377             + "<script>\n"
378             + LOG_TITLE_FUNCTION
379             + "  var styleSheet = document.styleSheets[0];\n"
380             + "  var rule = styleSheet.cssRules[0];\n"
381             + "  var mediaList = rule.media;\n"
382             + "  log(Object.prototype.toString.call(mediaList));\n"
383             + "  log(mediaList);\n"
384             + "  log(mediaList.length);\n"
385             + "  for (var i = 0; i < mediaList.length; i++) {\n"
386             + "    log(mediaList.item(i));\n"
387             + "  }\n"
388             + "  log(mediaList.mediaText);\n"
389             + "  log(rule.conditionText);\n"
390             + "</script>\n"
391 
392             + "</body></html>";
393 
394         loadPageVerifyTitle2(html);
395     }
396 
397     /**
398      * @throws Exception if an error occurs
399      */
400     @Test
401     @Alerts({"[object MediaList]", "screen", "1", "screen", "screen", "screen"})
402     public void media() throws Exception {
403         final String html = DOCTYPE_HTML
404             + "<html><body>\n"
405 
406             + "<style>\n"
407             + "  @media screen { p { background-color:#FFFFFF; }};\n"
408             + "</style>\n"
409 
410             + "<script>\n"
411             + LOG_TITLE_FUNCTION
412             + "  var styleSheet = document.styleSheets[0];\n"
413             + "  var rule = styleSheet.cssRules[0];\n"
414             + "  var mediaList = rule.media;\n"
415             + "  log(Object.prototype.toString.call(mediaList));\n"
416             + "  log(mediaList);\n"
417             + "  log(mediaList.length);\n"
418             + "  for (var i = 0; i < mediaList.length; i++) {\n"
419             + "    log(mediaList.item(i));\n"
420             + "  }\n"
421             + "  log(mediaList.mediaText);\n"
422             + "  log(rule.conditionText);\n"
423             + "</script>\n"
424 
425             + "</body></html>";
426 
427         loadPageVerifyTitle2(html);
428     }
429 
430     /**
431      * @throws Exception if an error occurs
432      */
433     @Test
434     @Alerts({"2", "only screen and (color)", "print and (max-width: 12cm) and (min-width: 30em)",
435              "only screen and (color), print and (max-width: 12cm) and (min-width: 30em)",
436              "only screen and (color), print and (max-width: 12cm) and (min-width: 30em)"})
437     public void mediaQuery() throws Exception {
438         final String html = DOCTYPE_HTML
439             + "<html><body>\n"
440 
441             + "<style>\n"
442             + "  @media only screen and  (color ),print and ( max-width:12cm) and (min-width: 30em) { "
443                     + "p { background-color:#FFFFFF; }};\n"
444             + "</style>\n"
445 
446             + "<script>\n"
447             + LOG_TITLE_FUNCTION
448             + "  var styleSheet = document.styleSheets[0];\n"
449             + "  var rule = styleSheet.cssRules[0];\n"
450             + "  var mediaList = rule.media;\n"
451             + "  log(mediaList.length);\n"
452             + "  for (var i = 0; i < mediaList.length; i++) {\n"
453             + "    log(mediaList.item(i));\n"
454             + "  }\n"
455             + "  log(mediaList.mediaText);\n"
456             + "  log(rule.conditionText);\n"
457             + "</script>\n"
458 
459             + "</body></html>";
460 
461         loadPageVerifyTitle2(html);
462     }
463 
464     /**
465      * @throws Exception if an error occurs
466      */
467     @Test
468     @Alerts({"[object CSSRuleList]", "[object CSSRuleList]", "1", "[object CSSStyleRule]",
469              "p { background-color: rgb(255, 255, 255); }", "[object CSSMediaRule]"})
470     public void cssRules() throws Exception {
471         final String html = DOCTYPE_HTML
472             + "<html><body>\n"
473 
474             + "<style>\n"
475             + "  @media screen { p { background-color:#FFFFFF; }};\n"
476             + "</style>\n"
477 
478             + "<script>\n"
479             + LOG_TITLE_FUNCTION
480             + "  var styleSheet = document.styleSheets[0];\n"
481             + "  var rule = styleSheet.cssRules[0];\n"
482             + "  var rules = rule.cssRules;\n"
483             + "  log(Object.prototype.toString.call(rules));\n"
484             + "  log(rules);\n"
485             + "  log(rules.length);\n"
486             + "  for (var i = 0; i < rules.length; i++) {\n"
487             + "    log(rules.item(i));\n"
488             + "    log(rules.item(i).cssText);\n"
489             + "    log(rules.item(i).parentRule);\n"
490             + "  }\n"
491             + "</script>\n"
492 
493             + "</body></html>";
494 
495         loadPageVerifyTitle2(html);
496     }
497 
498     /**
499      * @throws Exception if an error occurs
500      */
501     @Test
502     @Alerts({"[object CSSRuleList]", "[object CSSRuleList]", "1", "[object CSSStyleRule]",
503              "p { background-color: rgb(255, 255, 255); }", "[object CSSMediaRule]"})
504     public void cssRulesMediaNotMatching() throws Exception {
505         final String html = DOCTYPE_HTML
506             + "<html><body>\n"
507 
508             + "<style>\n"
509             + "  @media print { p { background-color:#FFFFFF; }};\n"
510             + "</style>\n"
511 
512             + "<script>\n"
513             + LOG_TITLE_FUNCTION
514             + "  var styleSheet = document.styleSheets[0];\n"
515             + "  var rule = styleSheet.cssRules[0];\n"
516             + "  var rules = rule.cssRules;\n"
517             + "  log(Object.prototype.toString.call(rules));\n"
518             + "  log(rules);\n"
519             + "  log(rules.length);\n"
520             + "  for (var i = 0; i < rules.length; i++) {\n"
521             + "    log(rules.item(i));\n"
522             + "    log(rules.item(i).cssText);\n"
523             + "    log(rules.item(i).parentRule);\n"
524             + "  }\n"
525             + "</script>\n"
526 
527             + "</body></html>";
528 
529         loadPageVerifyTitle2(html);
530     }
531 
532     /**
533      * @throws Exception if an error occurs
534      */
535     @Test
536     @Alerts({"1", "0", "2", "span { color: rgb(0, 0, 0); }", "[object CSSMediaRule]",
537              "p { background-color: rgb(255, 255, 255); }", "[object CSSMediaRule]"})
538     public void insertRule() throws Exception {
539         final String html = DOCTYPE_HTML
540             + "<html><body>\n"
541 
542             + "<style>\n"
543             + "  @media screen { p { background-color:#FFFFFF; }};\n"
544             + "</style>\n"
545 
546             + "<script>\n"
547             + LOG_TITLE_FUNCTION
548             + "  var styleSheet = document.styleSheets[0];\n"
549             + "  var rule = styleSheet.cssRules[0];\n"
550             + "  var rules = rule.cssRules;\n"
551             + "  log(rules.length);\n"
552             + "  try {\n"
553             + "    log(rule.insertRule('span { color:#000000; }'));\n"
554             + "    log(rules.length);\n"
555             + "    for (var i = 0; i < rules.length; i++) {\n"
556             + "      log(rules.item(i).cssText);\n"
557             + "      log(rules.item(i).parentRule);\n"
558             + "    }\n"
559             + "  } catch(e) {\n"
560             + "    logEx(e);\n"
561             + "  }\n"
562             + "</script>\n"
563 
564             + "</body></html>";
565 
566         loadPageVerifyTitle2(html);
567     }
568 
569     /**
570      * @throws Exception if an error occurs
571      */
572     @Test
573     @Alerts("SyntaxError/DOMException")
574     public void insertRuleNull() throws Exception {
575         final String html = DOCTYPE_HTML
576             + "<html><body>\n"
577 
578             + "<style>\n"
579             + "  @media screen { p { background-color:#FFFFFF; }};\n"
580             + "</style>\n"
581 
582             + "<script>\n"
583             + LOG_TITLE_FUNCTION
584             + "  var styleSheet = document.styleSheets[0];\n"
585             + "  var rule = styleSheet.cssRules[0];\n"
586             + "  var rules = rule.cssRules;\n"
587             + "  try {\n"
588             + "    rule.insertRule(null);\n"
589             + "  } catch(e) {\n"
590             + "    logEx(e);\n"
591             + "  }\n"
592             + "</script>\n"
593 
594             + "</body></html>";
595 
596         loadPageVerifyTitle2(html);
597     }
598 
599     /**
600      * @throws Exception if an error occurs
601      */
602     @Test
603     @Alerts("SyntaxError/DOMException")
604     public void insertRuleEmpty() throws Exception {
605         final String html = DOCTYPE_HTML
606             + "<html><body>\n"
607 
608             + "<style>\n"
609             + "  @media screen { p { background-color:#FFFFFF; }};\n"
610             + "</style>\n"
611 
612             + "<script>\n"
613             + LOG_TITLE_FUNCTION
614             + "  var styleSheet = document.styleSheets[0];\n"
615             + "  var rule = styleSheet.cssRules[0];\n"
616             + "  var rules = rule.cssRules;\n"
617             + "  try {\n"
618             + "    rule.insertRule('');\n"
619             + "  } catch(e) {\n"
620             + "    logEx(e);\n"
621             + "  }\n"
622             + "</script>\n"
623 
624             + "</body></html>";
625 
626         loadPageVerifyTitle2(html);
627     }
628 
629     /**
630      * @throws Exception if an error occurs
631      */
632     @Test
633     @Alerts("SyntaxError/DOMException")
634     public void insertRuleInvalid() throws Exception {
635         final String html = DOCTYPE_HTML
636             + "<html><body>\n"
637 
638             + "<style>\n"
639             + "  @media screen { p { background-color:#FFFFFF; }};\n"
640             + "</style>\n"
641 
642             + "<script>\n"
643             + LOG_TITLE_FUNCTION
644             + "  var styleSheet = document.styleSheets[0];\n"
645             + "  var rule = styleSheet.cssRules[0];\n"
646             + "  var rules = rule.cssRules;\n"
647             + "  try {\n"
648             + "    rule.insertRule('%ab');\n"
649             + "  } catch(e) {\n"
650             + "    logEx(e);\n"
651             + "  }\n"
652             + "</script>\n"
653 
654             + "</body></html>";
655 
656         loadPageVerifyTitle2(html);
657     }
658 
659     /**
660      * @throws Exception if an error occurs
661      */
662     @Test
663     @Alerts({"1", "1", "2", "p { background-color: rgb(255, 255, 255); }", "[object CSSMediaRule]",
664              "span { color: rgb(0, 0, 0); }", "[object CSSMediaRule]"})
665     public void insertRuleWithIndex() throws Exception {
666         final String html = DOCTYPE_HTML
667             + "<html><body>\n"
668 
669             + "<style>\n"
670             + "  @media screen { p { background-color:#FFFFFF; }};\n"
671             + "</style>\n"
672 
673             + "<script>\n"
674             + LOG_TITLE_FUNCTION
675             + "  var styleSheet = document.styleSheets[0];\n"
676             + "  var rule = styleSheet.cssRules[0];\n"
677             + "  var rules = rule.cssRules;\n"
678             + "  log(rules.length);\n"
679             + "  try {\n"
680             + "    log(rule.insertRule('span { color:#000000; }', 1));\n"
681             + "    log(rules.length);\n"
682             + "    for (var i = 0; i < rules.length; i++) {\n"
683             + "      log(rules.item(i).cssText);\n"
684             + "      log(rules.item(i).parentRule);\n"
685             + "    }\n"
686             + "  } catch(e) {\n"
687             + "    logEx(e);\n"
688             + "  }\n"
689             + "</script>\n"
690 
691             + "</body></html>";
692 
693         loadPageVerifyTitle2(html);
694     }
695 
696     /**
697      * @throws Exception if an error occurs
698      */
699     @Test
700     @Alerts("SyntaxError/DOMException")
701     public void insertRuleNullWithIndex() throws Exception {
702         final String html = DOCTYPE_HTML
703             + "<html><body>\n"
704 
705             + "<style>\n"
706             + "  @media screen { p { background-color:#FFFFFF; }};\n"
707             + "</style>\n"
708 
709             + "<script>\n"
710             + LOG_TITLE_FUNCTION
711             + "  var styleSheet = document.styleSheets[0];\n"
712             + "  var rule = styleSheet.cssRules[0];\n"
713             + "  var rules = rule.cssRules;\n"
714             + "  try {\n"
715             + "    rule.insertRule(null, 1);\n"
716             + "  } catch(e) {\n"
717             + "    logEx(e);\n"
718             + "  }\n"
719             + "</script>\n"
720 
721             + "</body></html>";
722 
723         loadPageVerifyTitle2(html);
724     }
725 
726     /**
727      * @throws Exception if an error occurs
728      */
729     @Test
730     @Alerts({"1", "SyntaxError/DOMException"})
731     public void insertRuleEmptyWithIndex() throws Exception {
732         final String html = DOCTYPE_HTML
733             + "<html><body>\n"
734 
735             + "<style>\n"
736             + "  @media screen { p { background-color:#FFFFFF; }};\n"
737             + "</style>\n"
738 
739             + "<script>\n"
740             + LOG_TITLE_FUNCTION
741             + "  var styleSheet = document.styleSheets[0];\n"
742             + "  var rule = styleSheet.cssRules[0];\n"
743             + "  var rules = rule.cssRules;\n"
744             + "  log(rules.length);\n"
745             + "  try {\n"
746             + "    log(rule.insertRule('', 1));\n"
747             + "    log(rules.length);\n"
748             + "    for (var i = 0; i < rules.length; i++) {\n"
749             + "      log(rules.item(i).cssText);\n"
750             + "      log(rules.item(i).parentRule);\n"
751             + "    }\n"
752             + "  } catch(e) {\n"
753             + "    logEx(e);\n"
754             + "  }\n"
755             + "</script>\n"
756 
757             + "</body></html>";
758 
759         loadPageVerifyTitle2(html);
760     }
761 
762     /**
763      * @throws Exception if an error occurs
764      */
765     @Test
766     @Alerts("SyntaxError/DOMException")
767     public void insertRuleInvalidWithIndex() throws Exception {
768         final String html = DOCTYPE_HTML
769             + "<html><body>\n"
770 
771             + "<style>\n"
772             + "  @media screen { p { background-color:#FFFFFF; }};\n"
773             + "</style>\n"
774 
775             + "<script>\n"
776             + LOG_TITLE_FUNCTION
777             + "  var styleSheet = document.styleSheets[0];\n"
778             + "  var rule = styleSheet.cssRules[0];\n"
779             + "  var rules = rule.cssRules;\n"
780             + "  try {\n"
781             + "    rule.insertRule('%ab', 1);\n"
782             + "  } catch(e) {\n"
783             + "    logEx(e);\n"
784             + "  }\n"
785             + "</script>\n"
786 
787             + "</body></html>";
788 
789         loadPageVerifyTitle2(html);
790     }
791 
792     /**
793      * @throws Exception if an error occurs
794      */
795     @Test
796     @Alerts({"1", "0", "2", "span { color: rgb(0, 0, 0); }", "[object CSSMediaRule]",
797              "p { background-color: rgb(255, 255, 255); }", "[object CSSMediaRule]"})
798     public void insertRuleWithIndexNull() throws Exception {
799         final String html = DOCTYPE_HTML
800             + "<html><body>\n"
801 
802             + "<style>\n"
803             + "  @media screen { p { background-color:#FFFFFF; }};\n"
804             + "</style>\n"
805 
806             + "<script>\n"
807             + LOG_TITLE_FUNCTION
808             + "  var styleSheet = document.styleSheets[0];\n"
809             + "  var rule = styleSheet.cssRules[0];\n"
810             + "  var rules = rule.cssRules;\n"
811             + "  log(rules.length);\n"
812             + "  try {\n"
813             + "    log(rule.insertRule('span { color:#000000; }', null));\n"
814             + "    log(rules.length);\n"
815             + "    for (var i = 0; i < rules.length; i++) {\n"
816             + "      log(rules.item(i).cssText);\n"
817             + "      log(rules.item(i).parentRule);\n"
818             + "    }\n"
819             + "  } catch(e) { logEx(e); }\n"
820             + "</script>\n"
821 
822             + "</body></html>";
823 
824         loadPageVerifyTitle2(html);
825     }
826 
827     /**
828      * @throws Exception if an error occurs
829      */
830     @Test
831     @Alerts({"1", "0", "2", "span { color: rgb(0, 0, 0); }", "[object CSSMediaRule]",
832              "p { background-color: rgb(255, 255, 255); }", "[object CSSMediaRule]"})
833     public void insertRuleWithIndexNaN() throws Exception {
834         final String html = DOCTYPE_HTML
835             + "<html><body>\n"
836 
837             + "<style>\n"
838             + "  @media screen { p { background-color:#FFFFFF; }};\n"
839             + "</style>\n"
840 
841             + "<script>\n"
842             + LOG_TITLE_FUNCTION
843             + "  var styleSheet = document.styleSheets[0];\n"
844             + "  var rule = styleSheet.cssRules[0];\n"
845             + "  var rules = rule.cssRules;\n"
846             + "  log(rules.length);\n"
847             + "  try {\n"
848             + "    log(rule.insertRule('span { color:#000000; }', 'abc'));\n"
849             + "    log(rules.length);\n"
850             + "    for (var i = 0; i < rules.length; i++) {\n"
851             + "      log(rules.item(i).cssText);\n"
852             + "      log(rules.item(i).parentRule);\n"
853             + "    }\n"
854             + "  } catch(e) { logEx(e); }\n"
855             + "</script>\n"
856 
857             + "</body></html>";
858 
859         loadPageVerifyTitle2(html);
860     }
861 
862     /**
863      * @throws Exception if an error occurs
864      */
865     @Test
866     @Alerts({"1", "IndexSizeError/DOMException"})
867     public void insertRuleWithIndexNegative() throws Exception {
868         final String html = DOCTYPE_HTML
869             + "<html><body>\n"
870 
871             + "<style>\n"
872             + "  @media screen { p { background-color:#FFFFFF; }};\n"
873             + "</style>\n"
874 
875             + "<script>\n"
876             + LOG_TITLE_FUNCTION
877             + "  var styleSheet = document.styleSheets[0];\n"
878             + "  var rule = styleSheet.cssRules[0];\n"
879             + "  var rules = rule.cssRules;\n"
880             + "  log(rules.length);\n"
881             + "  try {\n"
882             + "    rule.insertRule('span { color:#000000; }', 2);\n"
883             + "  } catch(e) {\n"
884             + "    logEx(e);\n"
885             + "  }\n"
886             + "</script>\n"
887 
888             + "</body></html>";
889 
890         loadPageVerifyTitle2(html);
891     }
892 
893     /**
894      * @throws Exception if an error occurs
895      */
896     @Test
897     @Alerts({"1", "IndexSizeError/DOMException"})
898     public void insertRuleWithIndexGreaterThanLength() throws Exception {
899         final String html = DOCTYPE_HTML
900             + "<html><body>\n"
901 
902             + "<style>\n"
903             + "  @media screen { p { background-color:#FFFFFF; }};\n"
904             + "</style>\n"
905 
906             + "<script>\n"
907             + LOG_TITLE_FUNCTION
908             + "  var styleSheet = document.styleSheets[0];\n"
909             + "  var rule = styleSheet.cssRules[0];\n"
910             + "  var rules = rule.cssRules;\n"
911             + "  log(rules.length);\n"
912             + "  try {\n"
913             + "    rule.insertRule('span { color:#000000; }', 2);\n"
914             + "  } catch(e) {\n"
915             + "    logEx(e);\n"
916             + "  }\n"
917             + "</script>\n"
918 
919             + "</body></html>";
920 
921         loadPageVerifyTitle2(html);
922     }
923 
924     /**
925      * @throws Exception if an error occurs
926      */
927     @Test
928     @Alerts({"2", "1", "p { background-color: rgb(255, 255, 255); }"})
929     public void deleteRule() throws Exception {
930         final String html = DOCTYPE_HTML
931             + "<html><body>\n"
932 
933             + "<style>\n"
934             + "  @media screen { p { background-color:#FFFFFF; } span { color: rgb(0, 0, 0); }};\n"
935             + "</style>\n"
936 
937             + "<script>\n"
938             + LOG_TITLE_FUNCTION
939             + "  var styleSheet = document.styleSheets[0];\n"
940             + "  var rule = styleSheet.cssRules[0];\n"
941             + "  var rules = rule.cssRules;\n"
942             + "  log(rules.length);\n"
943             + "  try {\n"
944             + "    rule.deleteRule(1);\n"
945             + "    log(rules.length);\n"
946             + "    for (var i = 0; i < rules.length; i++) {\n"
947             + "      log(rules.item(i).cssText);\n"
948             + "    }\n"
949             + "  } catch(e) {\n"
950             + "    logEx(e);\n"
951             + "  }\n"
952             + "</script>\n"
953 
954             + "</body></html>";
955 
956         loadPageVerifyTitle2(html);
957     }
958 
959     /**
960      * @throws Exception if an error occurs
961      */
962     @Test
963     @Alerts({"2", "1", "span { color: rgb(0, 0, 0); }"})
964     public void deleteRuleNull() throws Exception {
965         final String html = DOCTYPE_HTML
966             + "<html><body>\n"
967 
968             + "<style>\n"
969             + "  @media screen { p { background-color:#FFFFFF; } span { color: rgb(0, 0, 0); }};\n"
970             + "</style>\n"
971 
972             + "<script>\n"
973             + LOG_TITLE_FUNCTION
974             + "  var styleSheet = document.styleSheets[0];\n"
975             + "  var rule = styleSheet.cssRules[0];\n"
976             + "  var rules = rule.cssRules;\n"
977             + "  log(rules.length);\n"
978             + "  try {\n"
979             + "    rule.deleteRule(null);\n"
980             + "    log(rules.length);\n"
981             + "    for (var i = 0; i < rules.length; i++) {\n"
982             + "      log(rules.item(i).cssText);\n"
983             + "    }\n"
984             + "  } catch(e) {\n"
985             + "    logEx(e);\n"
986             + "  }\n"
987             + "</script>\n"
988 
989             + "</body></html>";
990 
991         loadPageVerifyTitle2(html);
992     }
993 
994     /**
995      * @throws Exception if an error occurs
996      */
997     @Test
998     @Alerts({"2", "1", "span { color: rgb(0, 0, 0); }"})
999     public void deleteRuleNaN() throws Exception {
1000         final String html = DOCTYPE_HTML
1001             + "<html><body>\n"
1002 
1003             + "<style>\n"
1004             + "  @media screen { p { background-color:#FFFFFF; } span { color: rgb(0, 0, 0); }};\n"
1005             + "</style>\n"
1006 
1007             + "<script>\n"
1008             + LOG_TITLE_FUNCTION
1009             + "  var styleSheet = document.styleSheets[0];\n"
1010             + "  var rule = styleSheet.cssRules[0];\n"
1011             + "  var rules = rule.cssRules;\n"
1012             + "  log(rules.length);\n"
1013             + "  try {\n"
1014             + "    rule.deleteRule('abc');\n"
1015             + "    log(rules.length);\n"
1016             + "    for (var i = 0; i < rules.length; i++) {\n"
1017             + "      log(rules.item(i).cssText);\n"
1018             + "    }\n"
1019             + "  } catch(e) {\n"
1020             + "    logEx(e);\n"
1021             + "  }\n"
1022             + "</script>\n"
1023 
1024             + "</body></html>";
1025 
1026         loadPageVerifyTitle2(html);
1027     }
1028 
1029     /**
1030      * @throws Exception if an error occurs
1031      */
1032     @Test
1033     @Alerts({"2", "IndexSizeError/DOMException"})
1034     public void deleteRuleNegative() throws Exception {
1035         final String html = DOCTYPE_HTML
1036             + "<html><body>\n"
1037 
1038             + "<style>\n"
1039             + "  @media screen { p { background-color:#FFFFFF; } span { color: rgb(0, 0, 0); }};\n"
1040             + "</style>\n"
1041 
1042             + "<script>\n"
1043             + LOG_TITLE_FUNCTION
1044             + "  var styleSheet = document.styleSheets[0];\n"
1045             + "  var rule = styleSheet.cssRules[0];\n"
1046             + "  var rules = rule.cssRules;\n"
1047             + "  log(rules.length);\n"
1048             + "  try {\n"
1049             + "    rule.deleteRule(-1);\n"
1050             + "  } catch(e) {\n"
1051             + "    logEx(e);\n"
1052             + "  }\n"
1053             + "</script>\n"
1054 
1055             + "</body></html>";
1056 
1057         loadPageVerifyTitle2(html);
1058     }
1059 
1060     /**
1061      * @throws Exception if an error occurs
1062      */
1063     @Test
1064     @Alerts({"2", "IndexSizeError/DOMException"})
1065     public void deleteRuleGreaterThanLength() throws Exception {
1066         final String html = DOCTYPE_HTML
1067             + "<html><body>\n"
1068 
1069             + "<style>\n"
1070             + "  @media screen { p { background-color:#FFFFFF; } span { color: rgb(0, 0, 0); }};\n"
1071             + "</style>\n"
1072 
1073             + "<script>\n"
1074             + LOG_TITLE_FUNCTION
1075             + "  var styleSheet = document.styleSheets[0];\n"
1076             + "  var rule = styleSheet.cssRules[0];\n"
1077             + "  var rules = rule.cssRules;\n"
1078             + "  log(rules.length);\n"
1079             + "  try {\n"
1080             + "    rule.deleteRule(2);\n"
1081             + "  } catch(e) {\n"
1082             + "    logEx(e);\n"
1083             + "  }\n"
1084             + "</script>\n"
1085 
1086             + "</body></html>";
1087 
1088         loadPageVerifyTitle2(html);
1089     }
1090 }