1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.javascript.host.css;
16
17 import java.io.Serializable;
18 import java.util.function.Predicate;
19
20 import org.htmlunit.WebClient;
21 import org.htmlunit.corejs.javascript.Scriptable;
22 import org.htmlunit.html.DomNode;
23 import org.htmlunit.html.HtmlAttributeChangeEvent;
24 import org.htmlunit.html.HtmlElement;
25 import org.htmlunit.html.HtmlLink;
26 import org.htmlunit.html.HtmlStyle;
27 import org.htmlunit.javascript.HtmlUnitScriptable;
28 import org.htmlunit.javascript.JavaScriptEngine;
29 import org.htmlunit.javascript.configuration.JsxClass;
30 import org.htmlunit.javascript.configuration.JsxConstructor;
31 import org.htmlunit.javascript.configuration.JsxFunction;
32 import org.htmlunit.javascript.configuration.JsxGetter;
33 import org.htmlunit.javascript.host.dom.AbstractList.EffectOnCache;
34 import org.htmlunit.javascript.host.dom.Document;
35 import org.htmlunit.javascript.host.html.HTMLCollection;
36 import org.htmlunit.javascript.host.html.HTMLElement;
37 import org.htmlunit.javascript.host.html.HTMLLinkElement;
38 import org.htmlunit.javascript.host.html.HTMLStyleElement;
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 @JsxClass
57 public class StyleSheetList extends HtmlUnitScriptable {
58
59
60
61
62 private HTMLCollection nodes_;
63
64
65
66
67 public StyleSheetList() {
68 super();
69 }
70
71
72
73
74 @JsxConstructor
75 public void jsConstructor() {
76
77 }
78
79
80
81
82
83
84 public StyleSheetList(final Document document) {
85 super();
86 setParentScope(document);
87 setPrototype(getPrototype(getClass()));
88
89 final WebClient webClient = getWindow().getWebWindow().getWebClient();
90
91 if (webClient.getOptions().isCssEnabled()) {
92 nodes_ = new HTMLCollection(document.getDomNodeOrDie(), true);
93
94 nodes_.setEffectOnCacheFunction(
95 (java.util.function.Function<HtmlAttributeChangeEvent, EffectOnCache> & Serializable)
96 event -> {
97 final HtmlElement node = event.getHtmlElement();
98 if (node instanceof HtmlLink && "rel".equalsIgnoreCase(event.getName())) {
99 return EffectOnCache.RESET;
100 }
101 return EffectOnCache.NONE;
102 });
103
104 nodes_.setIsMatchingPredicate(
105 (Predicate<DomNode> & Serializable)
106 node -> {
107 if (node instanceof HtmlStyle) {
108 return true;
109 }
110 if (node instanceof HtmlLink) {
111 return ((HtmlLink) node).isActiveStyleSheetLink();
112 }
113 return false;
114 });
115 }
116 else {
117 nodes_ = HTMLCollection.emptyCollection(getWindow().getDomNodeOrDie());
118 }
119 }
120
121
122
123
124
125
126 @JsxGetter
127 public int getLength() {
128 return nodes_.getLength();
129 }
130
131
132
133
134
135
136
137 @JsxFunction
138 public Object item(final int index) {
139 final Object item = get(index, this);
140 if (JavaScriptEngine.UNDEFINED == item) {
141 return null;
142 }
143 return item;
144 }
145
146
147
148
149 @Override
150 public Object get(final int index, final Scriptable start) {
151 if (this == start) {
152 if (nodes_ == null || index < 0 || index >= nodes_.getLength()) {
153 return JavaScriptEngine.UNDEFINED;
154 }
155
156 final HTMLElement element = (HTMLElement) nodes_.item(Integer.valueOf(index));
157
158
159 if (element instanceof HTMLStyleElement) {
160 return ((HTMLStyleElement) element).getSheet();
161 }
162
163 return ((HTMLLinkElement) element).getSheet();
164 }
165 return super.get(index, start);
166 }
167
168
169
170
171 @Override
172 protected Object equivalentValues(final Object value) {
173 return value != null
174 && getClass() == value.getClass()
175 && getDomNodeOrNull() == ((StyleSheetList) value).getDomNodeOrNull();
176 }
177 }