mirror of
https://github.com/servo/servo.git
synced 2025-08-26 15:48:22 +01:00
Refactor style to be completely backend-independent
This commit refactors the style crate to be completely independent of the actual implementation and pseudo-elements supported. This also adds a gecko backend which introduces parsing for the anonymous box pseudo-elements[1], although there's still no way of querying them. https://mxr.mozilla.org/mozilla-central/source/layout/style/nsCSSAnonBoxList.h
This commit is contained in:
parent
a164176876
commit
dd503dfacb
41 changed files with 767 additions and 310 deletions
12
ports/cef/Cargo.lock
generated
12
ports/cef/Cargo.lock
generated
|
@ -934,7 +934,7 @@ dependencies = [
|
|||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"script 0.0.1",
|
||||
"script_traits 0.0.1",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1477,7 +1477,7 @@ dependencies = [
|
|||
"ref_slice 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"script_traits 0.0.1",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"string_cache 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1519,7 +1519,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "selectors"
|
||||
version = "0.4.2"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1763,7 +1763,7 @@ dependencies = [
|
|||
"num 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plugins 0.0.1",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1787,7 +1787,7 @@ dependencies = [
|
|||
"num 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plugins 0.0.1",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1945,7 +1945,7 @@ dependencies = [
|
|||
"plugins 0.0.1",
|
||||
"rand 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
14
ports/geckolib/Cargo.lock
generated
14
ports/geckolib/Cargo.lock
generated
|
@ -6,10 +6,14 @@ dependencies = [
|
|||
"bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num_cpus 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plugins 0.0.1",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"string_cache 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"style 0.0.1",
|
||||
|
@ -312,7 +316,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "selectors"
|
||||
version = "0.4.2"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -389,7 +393,7 @@ dependencies = [
|
|||
"num 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plugins 0.0.1",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -413,7 +417,7 @@ dependencies = [
|
|||
"num 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plugins 0.0.1",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -492,7 +496,7 @@ dependencies = [
|
|||
"plugins 0.0.1",
|
||||
"rand 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
|
@ -13,14 +13,20 @@ app_units = {version = "0.2.1", features = ["plugins"]}
|
|||
bitflags = "0.3"
|
||||
cssparser = {version = "0.5.3", features = ["heap_size", "serde-serialization"]}
|
||||
euclid = {version = "0.6.2", features = ["plugins"]}
|
||||
heapsize = "0.3.0"
|
||||
heapsize_plugin = "0.1.2"
|
||||
lazy_static = "0.1"
|
||||
libc = "0.2"
|
||||
log = "0.3"
|
||||
num_cpus = "0.2.2"
|
||||
selectors = {version = "0.4.2", features = ["heap_size"]}
|
||||
selectors = {version = "0.5", features = ["heap_size"]}
|
||||
smallvec = "0.1"
|
||||
string_cache = {version = "0.2.9", features = ["heap_size"]}
|
||||
url = {version = "0.5.5", features = ["heap_size"]}
|
||||
|
||||
[dependencies.plugins]
|
||||
path = "../../components/plugins"
|
||||
|
||||
[dependencies.util]
|
||||
path = "../../components/util"
|
||||
|
||||
|
|
|
@ -6,17 +6,15 @@ use bindings::ServoStyleSetData;
|
|||
use euclid::Size2D;
|
||||
use euclid::size::TypedSize2D;
|
||||
use num_cpus;
|
||||
use selector_impl::{Stylist, Stylesheet, SharedStyleContext};
|
||||
use std::cmp;
|
||||
use std::collections::HashMap;
|
||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
||||
use std::sync::{Arc, RwLock};
|
||||
use style::animation::Animation;
|
||||
use style::context::SharedStyleContext;
|
||||
use style::dom::OpaqueNode;
|
||||
use style::media_queries::{Device, MediaType};
|
||||
use style::parallel::WorkQueueData;
|
||||
use style::selector_matching::Stylist;
|
||||
use style::stylesheets::Stylesheet;
|
||||
use util::geometry::ViewportPx;
|
||||
use util::thread_state;
|
||||
use util::workqueue::WorkQueue;
|
||||
|
|
|
@ -9,15 +9,16 @@ use bindings::RawGeckoDocument;
|
|||
use bindings::{ServoArcStyleSheet, ServoNodeData, ServoStyleSetData, uint8_t, uint32_t};
|
||||
use data::PerDocumentStyleData;
|
||||
use euclid::Size2D;
|
||||
use selector_impl::{SharedStyleContext, Stylesheet};
|
||||
use std::mem::{forget, transmute};
|
||||
use std::slice;
|
||||
use std::str::from_utf8_unchecked;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use style::context::{ReflowGoal, SharedStyleContext, StylistWrapper};
|
||||
use style::context::{ReflowGoal, StylistWrapper};
|
||||
use style::dom::{TDocument, TNode};
|
||||
use style::error_reporting::StdoutErrorReporter;
|
||||
use style::parallel;
|
||||
use style::stylesheets::{Origin, Stylesheet};
|
||||
use style::stylesheets::Origin;
|
||||
use traversal::RecalcStyleOnly;
|
||||
use url::Url;
|
||||
use util::arc_ptr_eq;
|
||||
|
|
|
@ -5,13 +5,24 @@
|
|||
#![feature(as_unsafe_cell)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(ptr_as_ref)]
|
||||
#![feature(custom_derive)]
|
||||
#![feature(plugin)]
|
||||
|
||||
#![plugin(heapsize_plugin)]
|
||||
#![plugin(plugins)]
|
||||
|
||||
extern crate app_units;
|
||||
#[macro_use]
|
||||
extern crate bitflags;
|
||||
#[macro_use]
|
||||
extern crate cssparser;
|
||||
extern crate euclid;
|
||||
extern crate heapsize;
|
||||
#[macro_use]
|
||||
extern crate lazy_static;
|
||||
extern crate libc;
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
extern crate num_cpus;
|
||||
extern crate selectors;
|
||||
extern crate smallvec;
|
||||
|
@ -26,5 +37,6 @@ mod bindings;
|
|||
mod data;
|
||||
#[allow(non_snake_case)]
|
||||
pub mod glue;
|
||||
mod selector_impl;
|
||||
mod traversal;
|
||||
mod wrapper;
|
||||
|
|
307
ports/geckolib/selector_impl.rs
Normal file
307
ports/geckolib/selector_impl.rs
Normal file
|
@ -0,0 +1,307 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use selectors::parser::{ParserContext, SelectorImpl};
|
||||
use std::process;
|
||||
use style;
|
||||
use style::element_state::ElementState;
|
||||
use style::error_reporting::StdoutErrorReporter;
|
||||
use style::selector_impl::SelectorImplExt;
|
||||
use style::stylesheets::Origin;
|
||||
use url::Url;
|
||||
use util::resource_files::read_resource_file;
|
||||
|
||||
pub type Stylist = style::selector_matching::Stylist<GeckoSelectorImpl>;
|
||||
pub type Stylesheet = style::stylesheets::Stylesheet<GeckoSelectorImpl>;
|
||||
pub type SharedStyleContext = style::context::SharedStyleContext<GeckoSelectorImpl>;
|
||||
pub type PrivateStyleData = style::data::PrivateStyleData<GeckoSelectorImpl>;
|
||||
|
||||
pub struct GeckoSelectorImpl;
|
||||
|
||||
// TODO: Replace this with Gecko's stylesheets
|
||||
lazy_static! {
|
||||
static ref USER_OR_USER_AGENT_STYLESHEETS: Vec<Stylesheet> = {
|
||||
let mut stylesheets = vec!();
|
||||
// FIXME: presentational-hints.css should be at author origin with zero specificity.
|
||||
// (Does it make a difference?)
|
||||
for &filename in &["user-agent.css", "servo.css", "presentational-hints.css"] {
|
||||
match read_resource_file(&[filename]) {
|
||||
Ok(res) => {
|
||||
let ua_stylesheet = Stylesheet::from_bytes(
|
||||
&res,
|
||||
Url::parse(&format!("chrome:///{:?}", filename)).unwrap(),
|
||||
None,
|
||||
None,
|
||||
Origin::UserAgent,
|
||||
box StdoutErrorReporter);
|
||||
stylesheets.push(ua_stylesheet);
|
||||
}
|
||||
Err(..) => {
|
||||
error!("Failed to load UA stylesheet {}!", filename);
|
||||
process::exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stylesheets
|
||||
};
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref QUIRKS_MODE_STYLESHEET: Stylesheet = {
|
||||
match read_resource_file(&["quirks-mode.css"]) {
|
||||
Ok(res) => {
|
||||
Stylesheet::from_bytes(
|
||||
&res,
|
||||
url!("chrome:///quirks-mode.css"),
|
||||
None,
|
||||
None,
|
||||
Origin::UserAgent,
|
||||
box StdoutErrorReporter)
|
||||
},
|
||||
Err(..) => {
|
||||
error!("Stylist failed to load 'quirks-mode.css'!");
|
||||
process::exit(1);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, HeapSizeOf, Hash)]
|
||||
pub enum PseudoElement {
|
||||
Before,
|
||||
After,
|
||||
FirstLine,
|
||||
// TODO: Probably a few more are missing here
|
||||
|
||||
// https://mxr.mozilla.org/mozilla-central/source/layout/style/nsCSSAnonBoxList.h
|
||||
MozNonElement,
|
||||
MozAnonymousBlock,
|
||||
MozAnonymousPositionedBlock,
|
||||
MozMathMLAnonymousBlock,
|
||||
MozXULAnonymousBlock,
|
||||
|
||||
MozHorizontalFramesetBorder,
|
||||
MozVerticalFramesetBorder,
|
||||
MozLineFrame,
|
||||
MozButtonContent,
|
||||
MozButtonLabel,
|
||||
MozCellContent,
|
||||
MozDropdownList,
|
||||
MozFieldsetContent,
|
||||
MozFramesetBlank,
|
||||
MozDisplayComboboxControlFrame,
|
||||
|
||||
MozHTMLCanvasContent,
|
||||
MozInlineTable,
|
||||
MozTable,
|
||||
MozTableCell,
|
||||
MozTableColumnGroup,
|
||||
MozTableColumn,
|
||||
MozTableOuter,
|
||||
MozTableRowGroup,
|
||||
MozTableRow,
|
||||
|
||||
MozCanvas,
|
||||
MozPageBreak,
|
||||
MozPage,
|
||||
MozPageContent,
|
||||
MozPageSequence,
|
||||
MozScrolledContent,
|
||||
MozScrolledCanvas,
|
||||
MozScrolledPageSequence,
|
||||
MozColumnContent,
|
||||
MozViewport,
|
||||
MozViewportScroll,
|
||||
MozAnonymousFlexItem,
|
||||
MozAnonymousGridItem,
|
||||
|
||||
MozRuby,
|
||||
MozRubyBase,
|
||||
MozRubyBaseContainer,
|
||||
MozRubyText,
|
||||
MozRubyTextContainer,
|
||||
|
||||
MozTreeColumn,
|
||||
MozTreeRow,
|
||||
MozTreeSeparator,
|
||||
MozTreeCell,
|
||||
MozTreeIndentation,
|
||||
MozTreeLine,
|
||||
MozTreeTwisty,
|
||||
MozTreeImage,
|
||||
MozTreeCellText,
|
||||
MozTreeCheckbox,
|
||||
MozTreeProgressMeter,
|
||||
MozTreeDropFeedback,
|
||||
|
||||
MozSVGMarkerAnonChild,
|
||||
MozSVGOuterSVGAnonChild,
|
||||
MozSVGForeignContent,
|
||||
MozSVGText,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, HeapSizeOf, Hash)]
|
||||
pub enum NonTSPseudoClass {
|
||||
AnyLink,
|
||||
Link,
|
||||
Visited,
|
||||
Active,
|
||||
Focus,
|
||||
Hover,
|
||||
Enabled,
|
||||
Disabled,
|
||||
Checked,
|
||||
Indeterminate,
|
||||
}
|
||||
|
||||
impl NonTSPseudoClass {
|
||||
pub fn state_flag(&self) -> ElementState {
|
||||
use self::NonTSPseudoClass::*;
|
||||
use style::element_state::*;
|
||||
match *self {
|
||||
Active => IN_ACTIVE_STATE,
|
||||
Focus => IN_FOCUS_STATE,
|
||||
Hover => IN_HOVER_STATE,
|
||||
Enabled => IN_ENABLED_STATE,
|
||||
Disabled => IN_DISABLED_STATE,
|
||||
Checked => IN_CHECKED_STATE,
|
||||
Indeterminate => IN_INDETERMINATE_STATE,
|
||||
|
||||
AnyLink |
|
||||
Link |
|
||||
Visited => ElementState::empty(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl SelectorImpl for GeckoSelectorImpl {
|
||||
type PseudoElement = PseudoElement;
|
||||
type NonTSPseudoClass = NonTSPseudoClass;
|
||||
fn parse_non_ts_pseudo_class(_context: &ParserContext,
|
||||
name: &str) -> Result<NonTSPseudoClass, ()> {
|
||||
use self::NonTSPseudoClass::*;
|
||||
let pseudo_class = match_ignore_ascii_case! { name,
|
||||
"any-link" => AnyLink,
|
||||
"link" => Link,
|
||||
"visited" => Visited,
|
||||
"active" => Active,
|
||||
"focus" => Focus,
|
||||
"hover" => Hover,
|
||||
"enabled" => Enabled,
|
||||
"disabled" => Disabled,
|
||||
"checked" => Checked,
|
||||
"indeterminate" => Indeterminate,
|
||||
_ => return Err(())
|
||||
};
|
||||
|
||||
Ok(pseudo_class)
|
||||
}
|
||||
|
||||
fn parse_pseudo_element(_context: &ParserContext,
|
||||
name: &str) -> Result<PseudoElement, ()> {
|
||||
use self::PseudoElement::*;
|
||||
let pseudo_element = match_ignore_ascii_case! { name,
|
||||
"before" => Before,
|
||||
"after" => After,
|
||||
"first-line" => FirstLine,
|
||||
|
||||
"-moz-non-element" => MozNonElement,
|
||||
|
||||
"-moz-anonymous-block" => MozAnonymousBlock,
|
||||
"-moz-anonymous-positioned-block" => MozAnonymousPositionedBlock,
|
||||
"-moz-mathml-anonymous-block" => MozMathMLAnonymousBlock,
|
||||
"-moz-xul-anonymous-block" => MozXULAnonymousBlock,
|
||||
|
||||
"-moz-hframeset-border" => MozHorizontalFramesetBorder,
|
||||
"-moz-vframeset-border" => MozVerticalFramesetBorder,
|
||||
|
||||
"-moz-line-frame" => MozLineFrame,
|
||||
|
||||
"-moz-button-content" => MozButtonContent,
|
||||
"-moz-buttonlabel" => MozButtonLabel,
|
||||
"-moz-cell-content" => MozCellContent,
|
||||
"-moz-dropdown-list" => MozDropdownList,
|
||||
"-moz-fieldset-content" => MozFieldsetContent,
|
||||
"-moz-frameset-blank" => MozFramesetBlank,
|
||||
"-moz-display-comboboxcontrol-frame" => MozDisplayComboboxControlFrame,
|
||||
"-moz-html-canvas-content" => MozHTMLCanvasContent,
|
||||
|
||||
"-moz-inline-table" => MozInlineTable,
|
||||
"-moz-table" => MozTable,
|
||||
"-moz-table-cell" => MozTableCell,
|
||||
"-moz-table-column-group" => MozTableColumnGroup,
|
||||
"-moz-table-column" => MozTableColumn,
|
||||
"-moz-table-outer" => MozTableOuter,
|
||||
"-moz-table-row-group" => MozTableRowGroup,
|
||||
"-moz-table-row" => MozTableRow,
|
||||
|
||||
"-moz-canvas" => MozCanvas,
|
||||
"-moz-pagebreak" => MozPageBreak,
|
||||
"-moz-page" => MozPage,
|
||||
"-moz-pagecontent" => MozPageContent,
|
||||
"-moz-page-sequence" => MozPageSequence,
|
||||
"-moz-scrolled-content" => MozScrolledContent,
|
||||
"-moz-scrolled-canvas" => MozScrolledCanvas,
|
||||
"-moz-scrolled-page-sequence" => MozScrolledPageSequence,
|
||||
"-moz-column-content" => MozColumnContent,
|
||||
"-moz-viewport" => MozViewport,
|
||||
"-moz-viewport-scroll" => MozViewportScroll,
|
||||
"-moz-anonymous-flex-item" => MozAnonymousFlexItem,
|
||||
"-moz-anonymous-grid-item" => MozAnonymousGridItem,
|
||||
"-moz-ruby" => MozRuby,
|
||||
"-moz-ruby-base" => MozRubyBase,
|
||||
"-moz-ruby-base-container" => MozRubyBaseContainer,
|
||||
"-moz-ruby-text" => MozRubyText,
|
||||
"-moz-ruby-text-container" => MozRubyTextContainer,
|
||||
"-moz-tree-column" => MozTreeColumn,
|
||||
"-moz-tree-row" => MozTreeRow,
|
||||
"-moz-tree-separator" => MozTreeSeparator,
|
||||
"-moz-tree-cell" => MozTreeCell,
|
||||
"-moz-tree-indentation" => MozTreeIndentation,
|
||||
"-moz-tree-line" => MozTreeLine,
|
||||
"-moz-tree-twisty" => MozTreeTwisty,
|
||||
"-moz-tree-image" => MozTreeImage,
|
||||
"-moz-tree-cell-text" => MozTreeCellText,
|
||||
"-moz-tree-checkbox" => MozTreeCheckbox,
|
||||
"-moz-tree-progressmeter" => MozTreeProgressMeter,
|
||||
"-moz-tree-drop-feedback" => MozTreeDropFeedback,
|
||||
"-moz-svg-marker-anon-child" => MozSVGMarkerAnonChild,
|
||||
"-moz-svg-outer-svg-anon-child" => MozSVGOuterSVGAnonChild,
|
||||
"-moz-svg-foreign-content" => MozSVGForeignContent,
|
||||
"-moz-svg-text" => MozSVGText,
|
||||
|
||||
_ => return Err(())
|
||||
};
|
||||
|
||||
Ok(pseudo_element)
|
||||
}
|
||||
}
|
||||
|
||||
impl SelectorImplExt for GeckoSelectorImpl {
|
||||
#[inline]
|
||||
fn each_eagerly_cascaded_pseudo_element<F>(mut fun: F)
|
||||
where F: FnMut(PseudoElement) {
|
||||
fun(PseudoElement::Before);
|
||||
fun(PseudoElement::After);
|
||||
// TODO: probably a lot more are missing here
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn pseudo_class_state_flag(pc: &NonTSPseudoClass) -> ElementState {
|
||||
pc.state_flag()
|
||||
}
|
||||
|
||||
// FIXME: Don't use Servo's UA stylesheets, use Gecko's instead
|
||||
#[inline]
|
||||
fn get_user_or_user_agent_stylesheets() -> &'static [Stylesheet] {
|
||||
&*USER_OR_USER_AGENT_STYLESHEETS
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_quirks_mode_stylesheet() -> &'static Stylesheet {
|
||||
&*QUIRKS_MODE_STYLESHEET
|
||||
}
|
||||
}
|
|
@ -2,10 +2,11 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use selector_impl::{GeckoSelectorImpl, SharedStyleContext};
|
||||
use std::cell::RefCell;
|
||||
use std::mem;
|
||||
use std::rc::Rc;
|
||||
use style::context::{LocalStyleContext, SharedStyleContext, StyleContext};
|
||||
use style::context::{LocalStyleContext, StyleContext};
|
||||
use style::dom::{OpaqueNode, TNode};
|
||||
use style::matching::{ApplicableDeclarationsCache, StyleSharingCandidateCache};
|
||||
use style::traversal::{DomTraversalContext, recalc_style_at};
|
||||
|
@ -48,7 +49,7 @@ impl<'a> StandaloneStyleContext<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> StyleContext<'a> for StandaloneStyleContext<'a> {
|
||||
impl<'a> StyleContext<'a, GeckoSelectorImpl> for StandaloneStyleContext<'a> {
|
||||
fn shared_context(&self) -> &'a SharedStyleContext {
|
||||
&self.shared
|
||||
}
|
||||
|
@ -63,7 +64,8 @@ pub struct RecalcStyleOnly<'lc> {
|
|||
root: OpaqueNode,
|
||||
}
|
||||
|
||||
impl<'lc, 'ln, N: TNode<'ln>> DomTraversalContext<'ln, N> for RecalcStyleOnly<'lc> {
|
||||
impl<'lc, 'ln, N: TNode<'ln>> DomTraversalContext<'ln, N> for RecalcStyleOnly<'lc>
|
||||
where N::ConcreteElement: ::selectors::Element<Impl=GeckoSelectorImpl> {
|
||||
type SharedContext = SharedStyleContext;
|
||||
#[allow(unsafe_code)]
|
||||
fn new<'a>(shared: &'a Self::SharedContext, root: OpaqueNode) -> Self {
|
||||
|
|
|
@ -19,6 +19,8 @@ use bindings::{Gecko_LocalName, Gecko_Namespace, Gecko_NodeIsElement, Gecko_SetN
|
|||
use bindings::{RawGeckoDocument, RawGeckoElement, RawGeckoNode};
|
||||
use bindings::{ServoNodeData};
|
||||
use libc::uintptr_t;
|
||||
use selector_impl::{GeckoSelectorImpl, NonTSPseudoClass, PrivateStyleData};
|
||||
use selectors::Element;
|
||||
use selectors::matching::DeclarationBlock;
|
||||
use selectors::parser::{AttrSelector, NamespaceConstraint};
|
||||
use smallvec::VecLike;
|
||||
|
@ -29,7 +31,6 @@ use std::slice;
|
|||
use std::str::from_utf8_unchecked;
|
||||
use std::sync::Arc;
|
||||
use string_cache::{Atom, Namespace};
|
||||
use style::data::PrivateStyleData;
|
||||
use style::dom::{OpaqueNode, TDocument, TElement, TNode, TRestyleDamage, UnsafeNode};
|
||||
use style::element_state::ElementState;
|
||||
#[allow(unused_imports)] // Used in commented-out code.
|
||||
|
@ -38,7 +39,7 @@ use style::properties::{ComputedValues, PropertyDeclaration, PropertyDeclaration
|
|||
#[allow(unused_imports)] // Used in commented-out code.
|
||||
use style::properties::{parse_style_attribute};
|
||||
use style::restyle_hints::ElementSnapshot;
|
||||
use style::selector_impl::{NonTSPseudoClass, ServoSelectorImpl};
|
||||
use style::selector_impl::ElementExt;
|
||||
#[allow(unused_imports)] // Used in commented-out code.
|
||||
use url::Url;
|
||||
|
||||
|
@ -357,7 +358,7 @@ impl<'le> TElement<'le> for GeckoElement<'le> {
|
|||
}
|
||||
|
||||
impl<'le> ::selectors::Element for GeckoElement<'le> {
|
||||
type Impl = ServoSelectorImpl;
|
||||
type Impl = GeckoSelectorImpl;
|
||||
|
||||
fn parent_element(&self) -> Option<Self> {
|
||||
unsafe {
|
||||
|
@ -427,11 +428,6 @@ impl<'le> ::selectors::Element for GeckoElement<'le> {
|
|||
NonTSPseudoClass::Link => unsafe { Gecko_IsLink(self.element) != 0 },
|
||||
NonTSPseudoClass::AnyLink => unsafe { Gecko_IsUnvisitedLink(self.element) != 0 },
|
||||
NonTSPseudoClass::Visited => unsafe { Gecko_IsVisitedLink(self.element) != 0 },
|
||||
|
||||
NonTSPseudoClass::ServoNonZeroBorder => {
|
||||
unimplemented!()
|
||||
},
|
||||
|
||||
NonTSPseudoClass::Active |
|
||||
NonTSPseudoClass::Focus |
|
||||
NonTSPseudoClass::Hover |
|
||||
|
@ -489,6 +485,12 @@ impl<'le> ::selectors::Element for GeckoElement<'le> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'le> ElementExt for GeckoElement<'le> {
|
||||
fn is_link(&self) -> bool {
|
||||
self.match_non_ts_pseudo_class(NonTSPseudoClass::AnyLink)
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn reinterpret_string<'a>(ptr: *const ::libc::c_char, length: u32) -> Option<&'a str> {
|
||||
(ptr as *const u8).as_ref().map(|p| from_utf8_unchecked(slice::from_raw_parts(p, length as usize)))
|
||||
}
|
||||
|
|
12
ports/gonk/Cargo.lock
generated
12
ports/gonk/Cargo.lock
generated
|
@ -916,7 +916,7 @@ dependencies = [
|
|||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"script 0.0.1",
|
||||
"script_traits 0.0.1",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1459,7 +1459,7 @@ dependencies = [
|
|||
"ref_slice 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"script_traits 0.0.1",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"string_cache 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1501,7 +1501,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "selectors"
|
||||
version = "0.4.2"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1743,7 +1743,7 @@ dependencies = [
|
|||
"num 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plugins 0.0.1",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1767,7 +1767,7 @@ dependencies = [
|
|||
"num 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plugins 0.0.1",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1925,7 +1925,7 @@ dependencies = [
|
|||
"plugins 0.0.1",
|
||||
"rand 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue