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