View Javadoc
1   /*
2    * Copyright (c) 2002-2026 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.css;
16  
17  import org.htmlunit.BrowserVersion;
18  
19  /**
20   * Allows specifying for which {@link BrowserVersion} a style attribute is defined.
21   * Quite experimental: it allows doing more than what we had previously but let's see if
22   * this is the right way.
23   *
24   * @author Marc Guillemot
25   * @author Frank Danek
26   * @author Ahmed Ashour
27   * @author Ronald Brill
28   */
29  abstract class BrowserConfiguration {
30  
31      private final String defaultValue_;
32  
33      BrowserConfiguration(final String defaultValue) {
34          defaultValue_ = defaultValue;
35      }
36  
37      String getDefaultValue() {
38          return defaultValue_;
39      }
40  
41      abstract boolean matches(BrowserVersion browserVersion);
42  
43      public boolean isIterable() {
44          return true;
45      }
46  
47      static BrowserConfiguration getMatchingConfiguration(
48              final BrowserVersion browserVersion,
49              final BrowserConfiguration[] browserConfigurations) {
50  
51          for (final BrowserConfiguration browserConfiguration : browserConfigurations) {
52              if (browserConfiguration.matches(browserVersion)) {
53                  return browserConfiguration;
54              }
55          }
56  
57          return null;
58      }
59  
60      static BrowserConfiguration chromeAndEdgeAuto() {
61          return new ChromeAndEdge("auto");
62      }
63  
64      static BrowserConfiguration chromeAndEdgeNone() {
65          return new ChromeAndEdge("none");
66      }
67  
68      static BrowserConfiguration chromeAndEdgeNormal() {
69          return new ChromeAndEdge("normal");
70      }
71  
72      static BrowserConfiguration chromeAndEdgeEmpty() {
73          return new ChromeAndEdge("");
74      }
75  
76      static BrowserConfiguration chromeAndEdge(final String defaultValue) {
77          return new ChromeAndEdge(defaultValue);
78      }
79  
80      static BrowserConfiguration chrome(final String defaultValue) {
81          return new Chrome(defaultValue);
82      }
83  
84      static BrowserConfiguration edge(final String defaultValue) {
85          return new Edge(defaultValue);
86      }
87  
88      static BrowserConfiguration chromeAndEdgeAndFirefox(final String defaultValue) {
89          return new ChromeAndEdgeAndFirefox(defaultValue);
90      }
91  
92      static BrowserConfiguration chromeAndEdgeNotIterable(final String defaultValue) {
93          return new ChromeAndEdgeNotIterable(defaultValue);
94      }
95  
96      static BrowserConfiguration ffAuto() {
97          return new FF("auto");
98      }
99  
100     static BrowserConfiguration ffNone() {
101         return new FF("none");
102     }
103 
104     static BrowserConfiguration ffNormal() {
105         return new FF("normal");
106     }
107 
108     static BrowserConfiguration ff(final String defaultValue) {
109         return new FF(defaultValue);
110     }
111 
112     static BrowserConfiguration ffNotIterable(final String defaultValue) {
113         return new FFNotIterable(defaultValue);
114     }
115 
116     static BrowserConfiguration ffLatest(final String defaultValue) {
117         return new FFLatest(defaultValue);
118     }
119 
120     static BrowserConfiguration ffEsr(final String defaultValue) {
121         return new FFESR(defaultValue);
122     }
123 
124     static class ChromeAndEdgeNotIterable extends BrowserConfiguration {
125         ChromeAndEdgeNotIterable(final String defaultValue) {
126             super(defaultValue);
127         }
128 
129         @Override
130         public boolean matches(final BrowserVersion browserVersion) {
131             return browserVersion.isChrome() || browserVersion.isEdge();
132         }
133 
134         @Override
135         public boolean isIterable() {
136             return false;
137         }
138     }
139 
140     private static class Chrome extends BrowserConfiguration {
141         Chrome(final String defaultValue) {
142             super(defaultValue);
143         }
144 
145         @Override
146         public boolean matches(final BrowserVersion browserVersion) {
147             return browserVersion.isChrome();
148         }
149     }
150 
151     private static class Edge extends BrowserConfiguration {
152         Edge(final String defaultValue) {
153             super(defaultValue);
154         }
155 
156         @Override
157         public boolean matches(final BrowserVersion browserVersion) {
158             return browserVersion.isEdge();
159         }
160     }
161 
162     private static class ChromeAndEdge extends BrowserConfiguration {
163         ChromeAndEdge(final String defaultValue) {
164             super(defaultValue);
165         }
166 
167         @Override
168         public boolean matches(final BrowserVersion browserVersion) {
169             return browserVersion.isChrome() || browserVersion.isEdge();
170         }
171     }
172 
173     private static class ChromeAndEdgeAndFirefox extends BrowserConfiguration {
174         ChromeAndEdgeAndFirefox(final String defaultValue) {
175             super(defaultValue);
176         }
177 
178         @Override
179         public boolean matches(final BrowserVersion browserVersion) {
180             return browserVersion.isChrome()
181                     || browserVersion.isEdge()
182                     || browserVersion.isFirefox();
183         }
184     }
185 
186     private static class FF extends BrowserConfiguration {
187         FF(final String defaultValue) {
188             super(defaultValue);
189         }
190 
191         @Override
192         public boolean matches(final BrowserVersion browserVersion) {
193             return browserVersion.isFirefox();
194         }
195     }
196 
197     private static class FFNotIterable extends BrowserConfiguration {
198         FFNotIterable(final String defaultValue) {
199             super(defaultValue);
200         }
201 
202         @Override
203         public boolean matches(final BrowserVersion browserVersion) {
204             return browserVersion.isFirefox();
205         }
206 
207         @Override
208         public boolean isIterable() {
209             return false;
210         }
211     }
212 
213     private static class FFESR extends BrowserConfiguration {
214         FFESR(final String defaultValue) {
215             super(defaultValue);
216         }
217 
218         @Override
219         public boolean matches(final BrowserVersion browserVersion) {
220             return browserVersion.isFirefox()
221                     && browserVersion.getBrowserVersionNumeric()
222                         == BrowserVersion.FIREFOX_ESR.getBrowserVersionNumeric();
223         }
224     }
225 
226     private static class FFLatest extends BrowserConfiguration {
227         FFLatest(final String defaultValue) {
228             super(defaultValue);
229         }
230 
231         @Override
232         public boolean matches(final BrowserVersion browserVersion) {
233             return browserVersion.isFirefox()
234                     && browserVersion.getBrowserVersionNumeric()
235                         > BrowserVersion.FIREFOX_ESR.getBrowserVersionNumeric();
236         }
237     }
238 }