Auto merge of #19955 - emilio:number-pseudos-chrome, r=jwatt

style: Make input[type=number] pseudo-elements accessible to chrome.

Bug: 1433389
Reviewed-by: jwatt
MozReview-Commit-ID: 2ycajPYd3CV

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/19955)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-02-05 09:50:35 -05:00 committed by GitHub
commit 3a3a7cdc22
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 509 additions and 840 deletions

View file

@ -614,89 +614,89 @@ impl PseudoElement {
PseudoElement::MozColorSwatch => PseudoElement::MozColorSwatch =>
structs::SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozColorSwatch, structs::SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozColorSwatch,
PseudoElement::MozText => PseudoElement::MozText =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::OofPlaceholder => PseudoElement::OofPlaceholder =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::FirstLetterContinuation => PseudoElement::FirstLetterContinuation =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::MozBlockInsideInlineWrapper => PseudoElement::MozBlockInsideInlineWrapper =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::MozMathMLAnonymousBlock => PseudoElement::MozMathMLAnonymousBlock =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::MozXULAnonymousBlock => PseudoElement::MozXULAnonymousBlock =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::HorizontalFramesetBorder => PseudoElement::HorizontalFramesetBorder =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::VerticalFramesetBorder => PseudoElement::VerticalFramesetBorder =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::MozLineFrame => PseudoElement::MozLineFrame =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::ButtonContent => PseudoElement::ButtonContent =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::CellContent => PseudoElement::CellContent =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::DropDownList => PseudoElement::DropDownList =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::FieldsetContent => PseudoElement::FieldsetContent =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::FramesetBlank => PseudoElement::FramesetBlank =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::MozDisplayComboboxControlFrame => PseudoElement::MozDisplayComboboxControlFrame =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::HtmlCanvasContent => PseudoElement::HtmlCanvasContent =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::InlineTable => PseudoElement::InlineTable =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::Table => PseudoElement::Table =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::TableCell => PseudoElement::TableCell =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::TableColGroup => PseudoElement::TableColGroup =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::TableCol => PseudoElement::TableCol =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::TableWrapper => PseudoElement::TableWrapper =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::TableRowGroup => PseudoElement::TableRowGroup =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::TableRow => PseudoElement::TableRow =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::Canvas => PseudoElement::Canvas =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::PageBreak => PseudoElement::PageBreak =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::Page => PseudoElement::Page =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::PageContent => PseudoElement::PageContent =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::PageSequence => PseudoElement::PageSequence =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::ScrolledContent => PseudoElement::ScrolledContent =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::ScrolledCanvas => PseudoElement::ScrolledCanvas =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::ScrolledPageSequence => PseudoElement::ScrolledPageSequence =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::ColumnContent => PseudoElement::ColumnContent =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::Viewport => PseudoElement::Viewport =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::ViewportScroll => PseudoElement::ViewportScroll =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::AnonymousFlexItem => PseudoElement::AnonymousFlexItem =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::AnonymousGridItem => PseudoElement::AnonymousGridItem =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::Ruby => PseudoElement::Ruby =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::RubyBase => PseudoElement::RubyBase =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::RubyBaseContainer => PseudoElement::RubyBaseContainer =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::RubyText => PseudoElement::RubyText =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::RubyTextContainer => PseudoElement::RubyTextContainer =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::MozTreeColumn(..) => PseudoElement::MozTreeColumn(..) =>
0, 0,
PseudoElement::MozTreeRow(..) => PseudoElement::MozTreeRow(..) =>
@ -720,13 +720,13 @@ impl PseudoElement {
PseudoElement::MozTreeDropFeedback(..) => PseudoElement::MozTreeDropFeedback(..) =>
0, 0,
PseudoElement::MozSVGMarkerAnonChild => PseudoElement::MozSVGMarkerAnonChild =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::MozSVGOuterSVGAnonChild => PseudoElement::MozSVGOuterSVGAnonChild =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::MozSVGForeignContent => PseudoElement::MozSVGForeignContent =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
PseudoElement::MozSVGText => PseudoElement::MozSVGText =>
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
} }
} }
@ -1360,367 +1360,232 @@ impl PseudoElement {
/// ///
/// Returns `None` if the pseudo-element is not recognised. /// Returns `None` if the pseudo-element is not recognised.
#[inline] #[inline]
pub fn from_slice(s: &str, in_ua_stylesheet: bool) -> Option<Self> { pub fn from_slice(name: &str) -> Option<Self> {
#[allow(unused_imports)] use std::ascii::AsciiExt;
// We don't need to support tree pseudos because functional // We don't need to support tree pseudos because functional
// pseudo-elements needs arguments, and thus should be created // pseudo-elements needs arguments, and thus should be created
// via other methods. // via other methods.
if in_ua_stylesheet || PseudoElement::After.exposed_in_non_ua_sheets() { match_ignore_ascii_case! { name,
if s.eq_ignore_ascii_case("after") { "after" => {
return Some(PseudoElement::After); return Some(PseudoElement::After)
}
} }
if in_ua_stylesheet || PseudoElement::Before.exposed_in_non_ua_sheets() { "before" => {
if s.eq_ignore_ascii_case("before") { return Some(PseudoElement::Before)
return Some(PseudoElement::Before);
}
} }
if in_ua_stylesheet || PseudoElement::Backdrop.exposed_in_non_ua_sheets() { "backdrop" => {
if s.eq_ignore_ascii_case("backdrop") { return Some(PseudoElement::Backdrop)
return Some(PseudoElement::Backdrop);
}
} }
if in_ua_stylesheet || PseudoElement::Cue.exposed_in_non_ua_sheets() { "cue" => {
if s.eq_ignore_ascii_case("cue") { return Some(PseudoElement::Cue)
return Some(PseudoElement::Cue);
}
} }
if in_ua_stylesheet || PseudoElement::FirstLetter.exposed_in_non_ua_sheets() { "first-letter" => {
if s.eq_ignore_ascii_case("first-letter") { return Some(PseudoElement::FirstLetter)
return Some(PseudoElement::FirstLetter);
}
} }
if in_ua_stylesheet || PseudoElement::FirstLine.exposed_in_non_ua_sheets() { "first-line" => {
if s.eq_ignore_ascii_case("first-line") { return Some(PseudoElement::FirstLine)
return Some(PseudoElement::FirstLine);
}
} }
if in_ua_stylesheet || PseudoElement::MozSelection.exposed_in_non_ua_sheets() { "-moz-selection" => {
if s.eq_ignore_ascii_case("-moz-selection") { return Some(PseudoElement::MozSelection)
return Some(PseudoElement::MozSelection);
}
} }
if in_ua_stylesheet || PseudoElement::MozFocusInner.exposed_in_non_ua_sheets() { "-moz-focus-inner" => {
if s.eq_ignore_ascii_case("-moz-focus-inner") { return Some(PseudoElement::MozFocusInner)
return Some(PseudoElement::MozFocusInner);
}
} }
if in_ua_stylesheet || PseudoElement::MozFocusOuter.exposed_in_non_ua_sheets() { "-moz-focus-outer" => {
if s.eq_ignore_ascii_case("-moz-focus-outer") { return Some(PseudoElement::MozFocusOuter)
return Some(PseudoElement::MozFocusOuter);
}
} }
if in_ua_stylesheet || PseudoElement::MozListBullet.exposed_in_non_ua_sheets() { "-moz-list-bullet" => {
if s.eq_ignore_ascii_case("-moz-list-bullet") { return Some(PseudoElement::MozListBullet)
return Some(PseudoElement::MozListBullet);
}
} }
if in_ua_stylesheet || PseudoElement::MozListNumber.exposed_in_non_ua_sheets() { "-moz-list-number" => {
if s.eq_ignore_ascii_case("-moz-list-number") { return Some(PseudoElement::MozListNumber)
return Some(PseudoElement::MozListNumber);
}
} }
if in_ua_stylesheet || PseudoElement::MozMathAnonymous.exposed_in_non_ua_sheets() { "-moz-math-anonymous" => {
if s.eq_ignore_ascii_case("-moz-math-anonymous") { return Some(PseudoElement::MozMathAnonymous)
return Some(PseudoElement::MozMathAnonymous);
}
} }
if in_ua_stylesheet || PseudoElement::MozNumberWrapper.exposed_in_non_ua_sheets() { "-moz-number-wrapper" => {
if s.eq_ignore_ascii_case("-moz-number-wrapper") { return Some(PseudoElement::MozNumberWrapper)
return Some(PseudoElement::MozNumberWrapper);
}
} }
if in_ua_stylesheet || PseudoElement::MozNumberText.exposed_in_non_ua_sheets() { "-moz-number-text" => {
if s.eq_ignore_ascii_case("-moz-number-text") { return Some(PseudoElement::MozNumberText)
return Some(PseudoElement::MozNumberText);
}
} }
if in_ua_stylesheet || PseudoElement::MozNumberSpinBox.exposed_in_non_ua_sheets() { "-moz-number-spin-box" => {
if s.eq_ignore_ascii_case("-moz-number-spin-box") { return Some(PseudoElement::MozNumberSpinBox)
return Some(PseudoElement::MozNumberSpinBox);
}
} }
if in_ua_stylesheet || PseudoElement::MozNumberSpinUp.exposed_in_non_ua_sheets() { "-moz-number-spin-up" => {
if s.eq_ignore_ascii_case("-moz-number-spin-up") { return Some(PseudoElement::MozNumberSpinUp)
return Some(PseudoElement::MozNumberSpinUp);
}
} }
if in_ua_stylesheet || PseudoElement::MozNumberSpinDown.exposed_in_non_ua_sheets() { "-moz-number-spin-down" => {
if s.eq_ignore_ascii_case("-moz-number-spin-down") { return Some(PseudoElement::MozNumberSpinDown)
return Some(PseudoElement::MozNumberSpinDown);
}
} }
if in_ua_stylesheet || PseudoElement::MozProgressBar.exposed_in_non_ua_sheets() { "-moz-progress-bar" => {
if s.eq_ignore_ascii_case("-moz-progress-bar") { return Some(PseudoElement::MozProgressBar)
return Some(PseudoElement::MozProgressBar);
}
} }
if in_ua_stylesheet || PseudoElement::MozRangeTrack.exposed_in_non_ua_sheets() { "-moz-range-track" => {
if s.eq_ignore_ascii_case("-moz-range-track") { return Some(PseudoElement::MozRangeTrack)
return Some(PseudoElement::MozRangeTrack);
}
} }
if in_ua_stylesheet || PseudoElement::MozRangeProgress.exposed_in_non_ua_sheets() { "-moz-range-progress" => {
if s.eq_ignore_ascii_case("-moz-range-progress") { return Some(PseudoElement::MozRangeProgress)
return Some(PseudoElement::MozRangeProgress);
}
} }
if in_ua_stylesheet || PseudoElement::MozRangeThumb.exposed_in_non_ua_sheets() { "-moz-range-thumb" => {
if s.eq_ignore_ascii_case("-moz-range-thumb") { return Some(PseudoElement::MozRangeThumb)
return Some(PseudoElement::MozRangeThumb);
}
} }
if in_ua_stylesheet || PseudoElement::MozMeterBar.exposed_in_non_ua_sheets() { "-moz-meter-bar" => {
if s.eq_ignore_ascii_case("-moz-meter-bar") { return Some(PseudoElement::MozMeterBar)
return Some(PseudoElement::MozMeterBar);
}
} }
if in_ua_stylesheet || PseudoElement::MozPlaceholder.exposed_in_non_ua_sheets() { "-moz-placeholder" => {
if s.eq_ignore_ascii_case("-moz-placeholder") { return Some(PseudoElement::MozPlaceholder)
return Some(PseudoElement::MozPlaceholder);
}
} }
if in_ua_stylesheet || PseudoElement::Placeholder.exposed_in_non_ua_sheets() { "placeholder" => {
if s.eq_ignore_ascii_case("placeholder") { return Some(PseudoElement::Placeholder)
return Some(PseudoElement::Placeholder);
}
} }
if in_ua_stylesheet || PseudoElement::MozColorSwatch.exposed_in_non_ua_sheets() { "-moz-color-swatch" => {
if s.eq_ignore_ascii_case("-moz-color-swatch") { return Some(PseudoElement::MozColorSwatch)
return Some(PseudoElement::MozColorSwatch);
}
} }
if in_ua_stylesheet || PseudoElement::MozText.exposed_in_non_ua_sheets() { "-moz-text" => {
if s.eq_ignore_ascii_case("-moz-text") { return Some(PseudoElement::MozText)
return Some(PseudoElement::MozText);
}
} }
if in_ua_stylesheet || PseudoElement::OofPlaceholder.exposed_in_non_ua_sheets() { "-moz-oof-placeholder" => {
if s.eq_ignore_ascii_case("-moz-oof-placeholder") { return Some(PseudoElement::OofPlaceholder)
return Some(PseudoElement::OofPlaceholder);
}
} }
if in_ua_stylesheet || PseudoElement::FirstLetterContinuation.exposed_in_non_ua_sheets() { "-moz-first-letter-continuation" => {
if s.eq_ignore_ascii_case("-moz-first-letter-continuation") { return Some(PseudoElement::FirstLetterContinuation)
return Some(PseudoElement::FirstLetterContinuation);
}
} }
if in_ua_stylesheet || PseudoElement::MozBlockInsideInlineWrapper.exposed_in_non_ua_sheets() { "-moz-block-inside-inline-wrapper" => {
if s.eq_ignore_ascii_case("-moz-block-inside-inline-wrapper") { return Some(PseudoElement::MozBlockInsideInlineWrapper)
return Some(PseudoElement::MozBlockInsideInlineWrapper);
}
} }
if in_ua_stylesheet || PseudoElement::MozMathMLAnonymousBlock.exposed_in_non_ua_sheets() { "-moz-mathml-anonymous-block" => {
if s.eq_ignore_ascii_case("-moz-mathml-anonymous-block") { return Some(PseudoElement::MozMathMLAnonymousBlock)
return Some(PseudoElement::MozMathMLAnonymousBlock);
}
} }
if in_ua_stylesheet || PseudoElement::MozXULAnonymousBlock.exposed_in_non_ua_sheets() { "-moz-xul-anonymous-block" => {
if s.eq_ignore_ascii_case("-moz-xul-anonymous-block") { return Some(PseudoElement::MozXULAnonymousBlock)
return Some(PseudoElement::MozXULAnonymousBlock);
}
} }
if in_ua_stylesheet || PseudoElement::HorizontalFramesetBorder.exposed_in_non_ua_sheets() { "-moz-hframeset-border" => {
if s.eq_ignore_ascii_case("-moz-hframeset-border") { return Some(PseudoElement::HorizontalFramesetBorder)
return Some(PseudoElement::HorizontalFramesetBorder);
}
} }
if in_ua_stylesheet || PseudoElement::VerticalFramesetBorder.exposed_in_non_ua_sheets() { "-moz-vframeset-border" => {
if s.eq_ignore_ascii_case("-moz-vframeset-border") { return Some(PseudoElement::VerticalFramesetBorder)
return Some(PseudoElement::VerticalFramesetBorder);
}
} }
if in_ua_stylesheet || PseudoElement::MozLineFrame.exposed_in_non_ua_sheets() { "-moz-line-frame" => {
if s.eq_ignore_ascii_case("-moz-line-frame") { return Some(PseudoElement::MozLineFrame)
return Some(PseudoElement::MozLineFrame);
}
} }
if in_ua_stylesheet || PseudoElement::ButtonContent.exposed_in_non_ua_sheets() { "-moz-button-content" => {
if s.eq_ignore_ascii_case("-moz-button-content") { return Some(PseudoElement::ButtonContent)
return Some(PseudoElement::ButtonContent);
}
} }
if in_ua_stylesheet || PseudoElement::CellContent.exposed_in_non_ua_sheets() { "-moz-cell-content" => {
if s.eq_ignore_ascii_case("-moz-cell-content") { return Some(PseudoElement::CellContent)
return Some(PseudoElement::CellContent);
}
} }
if in_ua_stylesheet || PseudoElement::DropDownList.exposed_in_non_ua_sheets() { "-moz-dropdown-list" => {
if s.eq_ignore_ascii_case("-moz-dropdown-list") { return Some(PseudoElement::DropDownList)
return Some(PseudoElement::DropDownList);
}
} }
if in_ua_stylesheet || PseudoElement::FieldsetContent.exposed_in_non_ua_sheets() { "-moz-fieldset-content" => {
if s.eq_ignore_ascii_case("-moz-fieldset-content") { return Some(PseudoElement::FieldsetContent)
return Some(PseudoElement::FieldsetContent);
}
} }
if in_ua_stylesheet || PseudoElement::FramesetBlank.exposed_in_non_ua_sheets() { "-moz-frameset-blank" => {
if s.eq_ignore_ascii_case("-moz-frameset-blank") { return Some(PseudoElement::FramesetBlank)
return Some(PseudoElement::FramesetBlank);
}
} }
if in_ua_stylesheet || PseudoElement::MozDisplayComboboxControlFrame.exposed_in_non_ua_sheets() { "-moz-display-comboboxcontrol-frame" => {
if s.eq_ignore_ascii_case("-moz-display-comboboxcontrol-frame") { return Some(PseudoElement::MozDisplayComboboxControlFrame)
return Some(PseudoElement::MozDisplayComboboxControlFrame);
}
} }
if in_ua_stylesheet || PseudoElement::HtmlCanvasContent.exposed_in_non_ua_sheets() { "-moz-html-canvas-content" => {
if s.eq_ignore_ascii_case("-moz-html-canvas-content") { return Some(PseudoElement::HtmlCanvasContent)
return Some(PseudoElement::HtmlCanvasContent);
}
} }
if in_ua_stylesheet || PseudoElement::InlineTable.exposed_in_non_ua_sheets() { "-moz-inline-table" => {
if s.eq_ignore_ascii_case("-moz-inline-table") { return Some(PseudoElement::InlineTable)
return Some(PseudoElement::InlineTable);
}
} }
if in_ua_stylesheet || PseudoElement::Table.exposed_in_non_ua_sheets() { "-moz-table" => {
if s.eq_ignore_ascii_case("-moz-table") { return Some(PseudoElement::Table)
return Some(PseudoElement::Table);
}
} }
if in_ua_stylesheet || PseudoElement::TableCell.exposed_in_non_ua_sheets() { "-moz-table-cell" => {
if s.eq_ignore_ascii_case("-moz-table-cell") { return Some(PseudoElement::TableCell)
return Some(PseudoElement::TableCell);
}
} }
if in_ua_stylesheet || PseudoElement::TableColGroup.exposed_in_non_ua_sheets() { "-moz-table-column-group" => {
if s.eq_ignore_ascii_case("-moz-table-column-group") { return Some(PseudoElement::TableColGroup)
return Some(PseudoElement::TableColGroup);
}
} }
if in_ua_stylesheet || PseudoElement::TableCol.exposed_in_non_ua_sheets() { "-moz-table-column" => {
if s.eq_ignore_ascii_case("-moz-table-column") { return Some(PseudoElement::TableCol)
return Some(PseudoElement::TableCol);
}
} }
if in_ua_stylesheet || PseudoElement::TableWrapper.exposed_in_non_ua_sheets() { "-moz-table-wrapper" => {
if s.eq_ignore_ascii_case("-moz-table-wrapper") { return Some(PseudoElement::TableWrapper)
return Some(PseudoElement::TableWrapper);
}
} }
if in_ua_stylesheet || PseudoElement::TableRowGroup.exposed_in_non_ua_sheets() { "-moz-table-row-group" => {
if s.eq_ignore_ascii_case("-moz-table-row-group") { return Some(PseudoElement::TableRowGroup)
return Some(PseudoElement::TableRowGroup);
}
} }
if in_ua_stylesheet || PseudoElement::TableRow.exposed_in_non_ua_sheets() { "-moz-table-row" => {
if s.eq_ignore_ascii_case("-moz-table-row") { return Some(PseudoElement::TableRow)
return Some(PseudoElement::TableRow);
}
} }
if in_ua_stylesheet || PseudoElement::Canvas.exposed_in_non_ua_sheets() { "-moz-canvas" => {
if s.eq_ignore_ascii_case("-moz-canvas") { return Some(PseudoElement::Canvas)
return Some(PseudoElement::Canvas);
}
} }
if in_ua_stylesheet || PseudoElement::PageBreak.exposed_in_non_ua_sheets() { "-moz-pagebreak" => {
if s.eq_ignore_ascii_case("-moz-pagebreak") { return Some(PseudoElement::PageBreak)
return Some(PseudoElement::PageBreak);
}
} }
if in_ua_stylesheet || PseudoElement::Page.exposed_in_non_ua_sheets() { "-moz-page" => {
if s.eq_ignore_ascii_case("-moz-page") { return Some(PseudoElement::Page)
return Some(PseudoElement::Page);
}
} }
if in_ua_stylesheet || PseudoElement::PageContent.exposed_in_non_ua_sheets() { "-moz-pagecontent" => {
if s.eq_ignore_ascii_case("-moz-pagecontent") { return Some(PseudoElement::PageContent)
return Some(PseudoElement::PageContent);
}
} }
if in_ua_stylesheet || PseudoElement::PageSequence.exposed_in_non_ua_sheets() { "-moz-page-sequence" => {
if s.eq_ignore_ascii_case("-moz-page-sequence") { return Some(PseudoElement::PageSequence)
return Some(PseudoElement::PageSequence);
}
} }
if in_ua_stylesheet || PseudoElement::ScrolledContent.exposed_in_non_ua_sheets() { "-moz-scrolled-content" => {
if s.eq_ignore_ascii_case("-moz-scrolled-content") { return Some(PseudoElement::ScrolledContent)
return Some(PseudoElement::ScrolledContent);
}
} }
if in_ua_stylesheet || PseudoElement::ScrolledCanvas.exposed_in_non_ua_sheets() { "-moz-scrolled-canvas" => {
if s.eq_ignore_ascii_case("-moz-scrolled-canvas") { return Some(PseudoElement::ScrolledCanvas)
return Some(PseudoElement::ScrolledCanvas);
}
} }
if in_ua_stylesheet || PseudoElement::ScrolledPageSequence.exposed_in_non_ua_sheets() { "-moz-scrolled-page-sequence" => {
if s.eq_ignore_ascii_case("-moz-scrolled-page-sequence") { return Some(PseudoElement::ScrolledPageSequence)
return Some(PseudoElement::ScrolledPageSequence);
}
} }
if in_ua_stylesheet || PseudoElement::ColumnContent.exposed_in_non_ua_sheets() { "-moz-column-content" => {
if s.eq_ignore_ascii_case("-moz-column-content") { return Some(PseudoElement::ColumnContent)
return Some(PseudoElement::ColumnContent);
}
} }
if in_ua_stylesheet || PseudoElement::Viewport.exposed_in_non_ua_sheets() { "-moz-viewport" => {
if s.eq_ignore_ascii_case("-moz-viewport") { return Some(PseudoElement::Viewport)
return Some(PseudoElement::Viewport);
}
} }
if in_ua_stylesheet || PseudoElement::ViewportScroll.exposed_in_non_ua_sheets() { "-moz-viewport-scroll" => {
if s.eq_ignore_ascii_case("-moz-viewport-scroll") { return Some(PseudoElement::ViewportScroll)
return Some(PseudoElement::ViewportScroll);
}
} }
if in_ua_stylesheet || PseudoElement::AnonymousFlexItem.exposed_in_non_ua_sheets() { "-moz-anonymous-flex-item" => {
if s.eq_ignore_ascii_case("-moz-anonymous-flex-item") { return Some(PseudoElement::AnonymousFlexItem)
return Some(PseudoElement::AnonymousFlexItem);
}
} }
if in_ua_stylesheet || PseudoElement::AnonymousGridItem.exposed_in_non_ua_sheets() { "-moz-anonymous-grid-item" => {
if s.eq_ignore_ascii_case("-moz-anonymous-grid-item") { return Some(PseudoElement::AnonymousGridItem)
return Some(PseudoElement::AnonymousGridItem);
}
} }
if in_ua_stylesheet || PseudoElement::Ruby.exposed_in_non_ua_sheets() { "-moz-ruby" => {
if s.eq_ignore_ascii_case("-moz-ruby") { return Some(PseudoElement::Ruby)
return Some(PseudoElement::Ruby);
}
} }
if in_ua_stylesheet || PseudoElement::RubyBase.exposed_in_non_ua_sheets() { "-moz-ruby-base" => {
if s.eq_ignore_ascii_case("-moz-ruby-base") { return Some(PseudoElement::RubyBase)
return Some(PseudoElement::RubyBase);
}
} }
if in_ua_stylesheet || PseudoElement::RubyBaseContainer.exposed_in_non_ua_sheets() { "-moz-ruby-base-container" => {
if s.eq_ignore_ascii_case("-moz-ruby-base-container") { return Some(PseudoElement::RubyBaseContainer)
return Some(PseudoElement::RubyBaseContainer);
}
} }
if in_ua_stylesheet || PseudoElement::RubyText.exposed_in_non_ua_sheets() { "-moz-ruby-text" => {
if s.eq_ignore_ascii_case("-moz-ruby-text") { return Some(PseudoElement::RubyText)
return Some(PseudoElement::RubyText);
}
} }
if in_ua_stylesheet || PseudoElement::RubyTextContainer.exposed_in_non_ua_sheets() { "-moz-ruby-text-container" => {
if s.eq_ignore_ascii_case("-moz-ruby-text-container") { return Some(PseudoElement::RubyTextContainer)
return Some(PseudoElement::RubyTextContainer);
}
} }
if in_ua_stylesheet || PseudoElement::MozSVGMarkerAnonChild.exposed_in_non_ua_sheets() { "-moz-svg-marker-anon-child" => {
if s.eq_ignore_ascii_case("-moz-svg-marker-anon-child") { return Some(PseudoElement::MozSVGMarkerAnonChild)
return Some(PseudoElement::MozSVGMarkerAnonChild);
}
} }
if in_ua_stylesheet || PseudoElement::MozSVGOuterSVGAnonChild.exposed_in_non_ua_sheets() { "-moz-svg-outer-svg-anon-child" => {
if s.eq_ignore_ascii_case("-moz-svg-outer-svg-anon-child") { return Some(PseudoElement::MozSVGOuterSVGAnonChild)
return Some(PseudoElement::MozSVGOuterSVGAnonChild);
}
} }
if in_ua_stylesheet || PseudoElement::MozSVGForeignContent.exposed_in_non_ua_sheets() { "-moz-svg-foreign-content" => {
if s.eq_ignore_ascii_case("-moz-svg-foreign-content") { return Some(PseudoElement::MozSVGForeignContent)
return Some(PseudoElement::MozSVGForeignContent); }
} "-moz-svg-text" => {
return Some(PseudoElement::MozSVGText)
} }
if in_ua_stylesheet || PseudoElement::MozSVGText.exposed_in_non_ua_sheets() { _ => {
if s.eq_ignore_ascii_case("-moz-svg-text") { // FIXME: -moz-tree check should probably be
return Some(PseudoElement::MozSVGText); // ascii-case-insensitive.
if name.starts_with("-moz-tree-") {
return PseudoElement::tree_pseudo_element(name, Box::new([]))
} }
} }
}
None None
} }

File diff suppressed because it is too large Load diff

View file

@ -124,16 +124,26 @@ impl PseudoElement {
!self.is_eager() && !self.is_precomputed() !self.is_eager() && !self.is_precomputed()
} }
/// Whether this pseudo-element is web-exposed.
pub fn exposed_in_non_ua_sheets(&self) -> bool {
(self.flags() & structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY) == 0
}
/// Whether this pseudo-element supports user action selectors. /// Whether this pseudo-element supports user action selectors.
pub fn supports_user_action_state(&self) -> bool { pub fn supports_user_action_state(&self) -> bool {
(self.flags() & structs::CSS_PSEUDO_ELEMENT_SUPPORTS_USER_ACTION_STATE) != 0 (self.flags() & structs::CSS_PSEUDO_ELEMENT_SUPPORTS_USER_ACTION_STATE) != 0
} }
/// Whether this pseudo-element is enabled for all content.
pub fn enabled_in_content(&self) -> bool {
(self.flags() & structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS_AND_CHROME) == 0
}
/// Whether this pseudo is enabled explicitly in UA sheets.
pub fn enabled_in_ua_sheets(&self) -> bool {
(self.flags() & structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS) != 0
}
/// Whether this pseudo is enabled explicitly in chrome sheets.
pub fn enabled_in_chrome(&self) -> bool {
(self.flags() & structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_CHROME) != 0
}
/// Whether this pseudo-element skips flex/grid container display-based /// Whether this pseudo-element skips flex/grid container display-based
/// fixup. /// fixup.
#[inline] #[inline]

View file

@ -114,7 +114,7 @@ impl PseudoElement {
% if pseudo.is_tree_pseudo_element(): % if pseudo.is_tree_pseudo_element():
0, 0,
% elif pseudo.is_anon_box(): % elif pseudo.is_anon_box():
structs::CSS_PSEUDO_ELEMENT_UA_SHEET_ONLY, structs::CSS_PSEUDO_ELEMENT_ENABLED_IN_UA_SHEETS,
% else: % else:
structs::SERVO_CSS_PSEUDO_ELEMENT_FLAGS_${pseudo.original_ident}, structs::SERVO_CSS_PSEUDO_ELEMENT_FLAGS_${pseudo.original_ident},
% endif % endif
@ -224,19 +224,24 @@ impl PseudoElement {
/// ///
/// Returns `None` if the pseudo-element is not recognised. /// Returns `None` if the pseudo-element is not recognised.
#[inline] #[inline]
pub fn from_slice(s: &str, in_ua_stylesheet: bool) -> Option<Self> { pub fn from_slice(name: &str) -> Option<Self> {
#[allow(unused_imports)] use std::ascii::AsciiExt;
// We don't need to support tree pseudos because functional // We don't need to support tree pseudos because functional
// pseudo-elements needs arguments, and thus should be created // pseudo-elements needs arguments, and thus should be created
// via other methods. // via other methods.
% for pseudo in SIMPLE_PSEUDOS: match_ignore_ascii_case! { name,
if in_ua_stylesheet || ${pseudo_element_variant(pseudo)}.exposed_in_non_ua_sheets() { % for pseudo in SIMPLE_PSEUDOS:
if s.eq_ignore_ascii_case("${pseudo.value[1:]}") { "${pseudo.value[1:]}" => {
return Some(${pseudo_element_variant(pseudo)}); return Some(${pseudo_element_variant(pseudo)})
}
% endfor
_ => {
// FIXME: -moz-tree check should probably be
// ascii-case-insensitive.
if name.starts_with("-moz-tree-") {
return PseudoElement::tree_pseudo_element(name, Box::new([]))
} }
} }
% endfor }
None None
} }

View file

@ -159,10 +159,10 @@ impl NonTSPseudoClass {
/// Returns whether the pseudo-class is enabled in content sheets. /// Returns whether the pseudo-class is enabled in content sheets.
fn is_enabled_in_content(&self) -> bool { fn is_enabled_in_content(&self) -> bool {
use gecko_bindings::structs::mozilla; use gecko_bindings::structs::mozilla;
match self { match *self {
// For pseudo-classes with pref, the availability in content // For pseudo-classes with pref, the availability in content
// depends on the pref. // depends on the pref.
&NonTSPseudoClass::Fullscreen => NonTSPseudoClass::Fullscreen =>
unsafe { mozilla::StylePrefs_sUnprefixedFullscreenApiEnabled }, unsafe { mozilla::StylePrefs_sUnprefixedFullscreenApiEnabled },
// Otherwise, a pseudo-class is enabled in content when it // Otherwise, a pseudo-class is enabled in content when it
// doesn't have any enabled flag. // doesn't have any enabled flag.
@ -322,6 +322,25 @@ impl<'a> SelectorParser<'a> {
return false; return false;
} }
fn is_pseudo_element_enabled(
&self,
pseudo_element: &PseudoElement,
) -> bool {
if pseudo_element.enabled_in_content() {
return true;
}
if self.in_user_agent_stylesheet() && pseudo_element.enabled_in_ua_sheets() {
return true;
}
if self.chrome_rules_enabled() && pseudo_element.enabled_in_chrome() {
return true;
}
return false;
}
} }
impl<'a, 'i> ::selectors::Parser<'i> for SelectorParser<'a> { impl<'a, 'i> ::selectors::Parser<'i> for SelectorParser<'a> {
@ -418,17 +437,15 @@ impl<'a, 'i> ::selectors::Parser<'i> for SelectorParser<'a> {
location: SourceLocation, location: SourceLocation,
name: CowRcStr<'i>, name: CowRcStr<'i>,
) -> Result<PseudoElement, ParseError<'i>> { ) -> Result<PseudoElement, ParseError<'i>> {
PseudoElement::from_slice(&name, self.in_user_agent_stylesheet()) if let Some(pseudo) = PseudoElement::from_slice(&name) {
.or_else(|| { if self.is_pseudo_element_enabled(&pseudo) {
// FIXME: -moz-tree check should probably be return Ok(pseudo);
// ascii-case-insensitive. }
if name.starts_with("-moz-tree-") { }
PseudoElement::tree_pseudo_element(&name, Box::new([]))
} else { Err(location.new_custom_error(
None SelectorParseErrorKind::UnsupportedPseudoClassOrElement(name)
} ))
})
.ok_or(location.new_custom_error(SelectorParseErrorKind::UnsupportedPseudoClassOrElement(name.clone())))
} }
fn parse_functional_pseudo_element<'t>( fn parse_functional_pseudo_element<'t>(
@ -456,7 +473,9 @@ impl<'a, 'i> ::selectors::Parser<'i> for SelectorParser<'a> {
return Ok(pseudo); return Ok(pseudo);
} }
} }
Err(parser.new_custom_error(SelectorParseErrorKind::UnsupportedPseudoClassOrElement(name.clone()))) Err(parser.new_custom_error(
SelectorParseErrorKind::UnsupportedPseudoClassOrElement(name)
))
} }
fn default_namespace(&self) -> Option<Namespace> { fn default_namespace(&self) -> Option<Namespace> {