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.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 ffNone() {
97          return new FF("none");
98      }
99  
100     static BrowserConfiguration ffNormal() {
101         return new FF("normal");
102     }
103 
104     static BrowserConfiguration ff(final String defaultValue) {
105         return new FF(defaultValue);
106     }
107 
108     static BrowserConfiguration ffNotIterable(final String defaultValue) {
109         return new FFNotIterable(defaultValue);
110     }
111 
112     static BrowserConfiguration ffLatest(final String defaultValue) {
113         return new FFLatest(defaultValue);
114     }
115 
116     static BrowserConfiguration ffEsr(final String defaultValue) {
117         return new FFESR(defaultValue);
118     }
119 
120     static class ChromeAndEdgeNotIterable extends BrowserConfiguration {
121         ChromeAndEdgeNotIterable(final String defaultValue) {
122             super(defaultValue);
123         }
124 
125         @Override
126         public boolean matches(final BrowserVersion browserVersion) {
127             return browserVersion.isChrome() || browserVersion.isEdge();
128         }
129 
130         @Override
131         public boolean isIterable() {
132             return false;
133         }
134     }
135 
136     private static class Chrome extends BrowserConfiguration {
137         Chrome(final String defaultValue) {
138             super(defaultValue);
139         }
140 
141         @Override
142         public boolean matches(final BrowserVersion browserVersion) {
143             return browserVersion.isChrome();
144         }
145     }
146 
147     private static class Edge extends BrowserConfiguration {
148         Edge(final String defaultValue) {
149             super(defaultValue);
150         }
151 
152         @Override
153         public boolean matches(final BrowserVersion browserVersion) {
154             return browserVersion.isEdge();
155         }
156     }
157 
158     private static class ChromeAndEdge extends BrowserConfiguration {
159         ChromeAndEdge(final String defaultValue) {
160             super(defaultValue);
161         }
162 
163         @Override
164         public boolean matches(final BrowserVersion browserVersion) {
165             return browserVersion.isChrome() || browserVersion.isEdge();
166         }
167     }
168 
169     private static class ChromeAndEdgeAndFirefox extends BrowserConfiguration {
170         ChromeAndEdgeAndFirefox(final String defaultValue) {
171             super(defaultValue);
172         }
173 
174         @Override
175         public boolean matches(final BrowserVersion browserVersion) {
176             return browserVersion.isChrome()
177                     || browserVersion.isEdge()
178                     || browserVersion.isFirefox();
179         }
180     }
181 
182     private static class FF extends BrowserConfiguration {
183         FF(final String defaultValue) {
184             super(defaultValue);
185         }
186 
187         @Override
188         public boolean matches(final BrowserVersion browserVersion) {
189             return browserVersion.isFirefox();
190         }
191     }
192 
193     private static class FFNotIterable extends BrowserConfiguration {
194         FFNotIterable(final String defaultValue) {
195             super(defaultValue);
196         }
197 
198         @Override
199         public boolean matches(final BrowserVersion browserVersion) {
200             return browserVersion.isFirefox();
201         }
202 
203         @Override
204         public boolean isIterable() {
205             return false;
206         }
207     }
208 
209     private static class FFESR extends BrowserConfiguration {
210         FFESR(final String defaultValue) {
211             super(defaultValue);
212         }
213 
214         @Override
215         public boolean matches(final BrowserVersion browserVersion) {
216             return browserVersion.isFirefox()
217                     && browserVersion.getBrowserVersionNumeric()
218                         == BrowserVersion.FIREFOX_ESR.getBrowserVersionNumeric();
219         }
220     }
221 
222     private static class FFLatest extends BrowserConfiguration {
223         FFLatest(final String defaultValue) {
224             super(defaultValue);
225         }
226 
227         @Override
228         public boolean matches(final BrowserVersion browserVersion) {
229             return browserVersion.isFirefox()
230                     && browserVersion.getBrowserVersionNumeric()
231                         > BrowserVersion.FIREFOX_ESR.getBrowserVersionNumeric();
232         }
233     }
234 }