1919import java .io .ObjectOutputStream ;
2020import java .io .Serializable ;
2121import java .io .StringReader ;
22- import java .util .ArrayDeque ;
2322import java .util .ArrayList ;
2423import java .util .HashMap ;
2524import java .util .Iterator ;
25+ import java .util .LinkedList ;
2626import java .util .List ;
2727import java .util .Map ;
2828
@@ -377,6 +377,7 @@ public static class CSSStyleSheetRuleIndex {
377377
378378 private MediaList mediaList_ = DEFAULT_MEDIA_LIST ;
379379 private final Map <String , List <SelectorEntry >> elementSelectors_ = new HashMap <>();
380+ private final Map <String , List <SelectorEntry >> classSelectors_ = new HashMap <>();
380381 private final List <SelectorEntry > otherSelectors_ = new ArrayList <>();
381382
382383 public void addElementSelector (final String name , final Selector s , final CSSStyleRuleImpl styleRule ) {
@@ -389,12 +390,29 @@ public void addElementSelector(final String name, final Selector s, final CSSSty
389390 entries .add (selectorEntry );
390391 }
391392
393+ public void addClassSelector (final String name , final Selector s , final CSSStyleRuleImpl styleRule ) {
394+ List <SelectorEntry > entries = classSelectors_ .get (name );
395+ if (entries == null ) {
396+ entries = new ArrayList <SelectorEntry >();
397+ classSelectors_ .put (name , entries );
398+ }
399+ final SelectorEntry selectorEntry = new SelectorEntry (s , styleRule );
400+ entries .add (selectorEntry );
401+ }
402+
392403 public void addOtherSelector (final Selector s , final CSSStyleRuleImpl styleRule ) {
393404 final SelectorEntry selectorEntry = new SelectorEntry (s , styleRule );
394405 otherSelectors_ .add (selectorEntry );
395406 }
396407
397408 public CSSStyleSheetRuleIndex addMedia (final MediaList mediaList ) {
409+ final String media = mediaList .getMediaText ();
410+ for (CSSStyleSheetRuleIndex cssStyleSheetRuleIndex : children_ ) {
411+ if (media .equals (cssStyleSheetRuleIndex .getMediaList ().getMediaText ())) {
412+ return cssStyleSheetRuleIndex ;
413+ }
414+ }
415+
398416 final CSSStyleSheetRuleIndex index = new CSSStyleSheetRuleIndex ();
399417 index .mediaList_ = mediaList ;
400418
@@ -410,21 +428,31 @@ public List<CSSStyleSheetRuleIndex> getChildren() {
410428 return children_ ;
411429 }
412430
413- public Iterator <SelectorEntry > getSelectorEntriesIteratorFor (final String elementName ) {
414- return new SelectorEntriesIterator (this , elementName );
431+ public Iterator <SelectorEntry > getSelectorEntriesIteratorFor (final String elementName , final String [] classes ) {
432+ return new SelectorEntriesIterator (this , elementName , classes );
415433 }
416434 }
417435
418436 static final class SelectorEntriesIterator implements Iterator <SelectorEntry > {
419- private ArrayDeque <Iterator <SelectorEntry >> iterators_ ;
437+ private LinkedList <Iterator <SelectorEntry >> iterators_ ;
420438
421- SelectorEntriesIterator (final CSSStyleSheetRuleIndex index , final String elementName ) {
422- iterators_ = new ArrayDeque <Iterator <SelectorEntry >>();
439+ SelectorEntriesIterator (final CSSStyleSheetRuleIndex index ,
440+ final String elementName , final String [] classes ) {
441+ iterators_ = new LinkedList <Iterator <SelectorEntry >>();
423442 List <SelectorEntry > sel = index .elementSelectors_ .get ("*" );
424443 if (sel != null && !sel .isEmpty ()) {
425444 iterators_ .add (sel .iterator ());
426445 }
427446
447+ if (classes != null ) {
448+ for (String clazz : classes ) {
449+ sel = index .classSelectors_ .get (clazz );
450+ if (sel != null && !sel .isEmpty ()) {
451+ iterators_ .add (sel .iterator ());
452+ }
453+
454+ }
455+ }
428456 sel = index .elementSelectors_ .get (elementName );
429457 if (sel != null && !sel .isEmpty ()) {
430458 iterators_ .add (sel .iterator ());
@@ -446,7 +474,7 @@ public SelectorEntry next() {
446474 return iter .next ();
447475 }
448476
449- iterators_ .pop ();
477+ iterators_ .removeFirst ();
450478 return next ();
451479 }
452480
0 commit comments