aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/style/stylesheets.rs105
1 files changed, 59 insertions, 46 deletions
diff --git a/components/style/stylesheets.rs b/components/style/stylesheets.rs
index e89b1b06513..e3dcfaa6b4e 100644
--- a/components/style/stylesheets.rs
+++ b/components/style/stylesheets.rs
@@ -1123,56 +1123,69 @@ impl<'a, 'b, C> Iterator for RulesIterator<'a, 'b, C>
type Item = &'a CssRule;
fn next(&mut self) -> Option<Self::Item> {
- while let Some(mut nested_iter) = self.stack.pop() {
- let rule = match nested_iter.next() {
- Some(r) => r,
- None => continue,
- };
-
- let sub_iter = match *rule {
- CssRule::Import(ref import_rule) => {
- let import_rule = import_rule.read_with(self.guard);
-
- if C::process_import(self.guard, self.device, self.quirks_mode, import_rule) {
- Some(import_rule.stylesheet.rules.read_with(self.guard).0.iter())
- } else {
- None
+ let mut nested_iter_finished = false;
+ while !self.stack.is_empty() {
+ if nested_iter_finished {
+ self.stack.pop();
+ nested_iter_finished = false;
+ continue;
+ }
+
+ let rule;
+ let sub_iter;
+ {
+ let mut nested_iter = self.stack.last_mut().unwrap();
+ rule = match nested_iter.next() {
+ Some(r) => r,
+ None => {
+ nested_iter_finished = true;
+ continue
}
- }
- CssRule::Document(ref doc_rule) => {
- let doc_rule = doc_rule.read_with(self.guard);
- if C::process_document(self.guard, self.device, self.quirks_mode, doc_rule) {
- Some(doc_rule.rules.read_with(self.guard).0.iter())
- } else {
- None
+ };
+
+ sub_iter = match *rule {
+ CssRule::Import(ref import_rule) => {
+ let import_rule = import_rule.read_with(self.guard);
+
+ if C::process_import(self.guard, self.device, self.quirks_mode, import_rule) {
+ Some(import_rule.stylesheet.rules.read_with(self.guard).0.iter())
+ } else {
+ None
+ }
}
- }
- CssRule::Media(ref lock) => {
- let media_rule = lock.read_with(self.guard);
- if C::process_media(self.guard, self.device, self.quirks_mode, media_rule) {
- Some(media_rule.rules.read_with(self.guard).0.iter())
- } else {
- None
+ CssRule::Document(ref doc_rule) => {
+ let doc_rule = doc_rule.read_with(self.guard);
+ if C::process_document(self.guard, self.device, self.quirks_mode, doc_rule) {
+ Some(doc_rule.rules.read_with(self.guard).0.iter())
+ } else {
+ None
+ }
}
- }
- CssRule::Supports(ref lock) => {
- let supports_rule = lock.read_with(self.guard);
- if C::process_supports(self.guard, self.device, self.quirks_mode, supports_rule) {
- Some(supports_rule.rules.read_with(self.guard).0.iter())
- } else {
- None
+ CssRule::Media(ref lock) => {
+ let media_rule = lock.read_with(self.guard);
+ if C::process_media(self.guard, self.device, self.quirks_mode, media_rule) {
+ Some(media_rule.rules.read_with(self.guard).0.iter())
+ } else {
+ None
+ }
}
- }
- CssRule::Namespace(_) |
- CssRule::Style(_) |
- CssRule::FontFace(_) |
- CssRule::CounterStyle(_) |
- CssRule::Viewport(_) |
- CssRule::Keyframes(_) |
- CssRule::Page(_) => None,
- };
-
- self.stack.push(nested_iter);
+ CssRule::Supports(ref lock) => {
+ let supports_rule = lock.read_with(self.guard);
+ if C::process_supports(self.guard, self.device, self.quirks_mode, supports_rule) {
+ Some(supports_rule.rules.read_with(self.guard).0.iter())
+ } else {
+ None
+ }
+ }
+ CssRule::Namespace(_) |
+ CssRule::Style(_) |
+ CssRule::FontFace(_) |
+ CssRule::CounterStyle(_) |
+ CssRule::Viewport(_) |
+ CssRule::Keyframes(_) |
+ CssRule::Page(_) => None,
+ };
+ }
if let Some(sub_iter) = sub_iter {
self.stack.push(sub_iter);