Skip to content

Commit f33d2d9

Browse files
committed
Implement basics of link preloading
These changes allow a minimal set of checks for font-src CSP checks to pass. Part of servo#4577 Part of servo#35035 Signed-off-by: Tim van der Lippe <[email protected]>
1 parent c1789ab commit f33d2d9

File tree

45 files changed

+545
-1266
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+545
-1266
lines changed

components/script/dom/element.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::str::FromStr;
1313
use std::{fmt, mem};
1414

1515
use content_security_policy as csp;
16-
use cssparser::match_ignore_ascii_case;
16+
use cssparser::{Parser as CssParser, ParserInput as CssParserInput, match_ignore_ascii_case};
1717
use devtools_traits::AttrInfo;
1818
use dom_struct::dom_struct;
1919
use embedder_traits::InputMethodType;
@@ -36,6 +36,8 @@ use style::applicable_declarations::ApplicableDeclarationBlock;
3636
use style::attr::{AttrValue, LengthOrPercentageOrAuto};
3737
use style::context::QuirksMode;
3838
use style::invalidation::element::restyle_hints::RestyleHint;
39+
use style::media_queries::MediaList;
40+
use style::parser::ParserContext as CssParserContext;
3941
use style::properties::longhands::{
4042
self, background_image, border_spacing, font_family, font_size,
4143
};
@@ -50,13 +52,14 @@ use style::selector_parser::{
5052
};
5153
use style::shared_lock::{Locked, SharedRwLock};
5254
use style::stylesheets::layer_rule::LayerOrder;
53-
use style::stylesheets::{CssRuleType, UrlExtraData};
55+
use style::stylesheets::{CssRuleType, Origin as CssOrigin, UrlExtraData};
5456
use style::values::computed::Overflow;
5557
use style::values::generics::NonNegative;
5658
use style::values::generics::position::PreferredRatio;
5759
use style::values::generics::ratio::Ratio;
5860
use style::values::{AtomIdent, AtomString, CSSFloat, computed, specified};
5961
use style::{ArcSlice, CaseSensitivityExt, dom_apis, thread_state};
62+
use style_traits::ParsingMode as CssParsingMode;
6063
use stylo_atoms::Atom;
6164
use stylo_dom::ElementState;
6265
use xml5ever::serialize::TraversalScope::{
@@ -781,6 +784,33 @@ impl Element {
781784
.registered_intersection_observers
782785
.retain(|reg_obs| *reg_obs.observer != *observer)
783786
}
787+
788+
/// <https://html.spec.whatwg.org/multipage/#matches-the-environment>
789+
pub(crate) fn matches_environment(&self, media_query: &str) -> bool {
790+
let document = self.owner_document();
791+
let quirks_mode = document.quirks_mode();
792+
let document_url_data = UrlExtraData(document.url().get_arc());
793+
// FIXME(emilio): This should do the same that we do for other media
794+
// lists regarding the rule type and such, though it doesn't really
795+
// matter right now...
796+
//
797+
// Also, ParsingMode::all() is wrong, and should be DEFAULT.
798+
let context = CssParserContext::new(
799+
CssOrigin::Author,
800+
&document_url_data,
801+
Some(CssRuleType::Style),
802+
CssParsingMode::all(),
803+
quirks_mode,
804+
/* namespaces = */ Default::default(),
805+
None,
806+
None,
807+
);
808+
let mut parser_input = CssParserInput::new(media_query);
809+
let mut parser = CssParser::new(&mut parser_input);
810+
let media_list = MediaList::parse(&context, &mut parser);
811+
let result = media_list.evaluate(document.window().layout().device(), quirks_mode);
812+
result
813+
}
784814
}
785815

786816
/// <https://dom.spec.whatwg.org/#valid-shadow-host-name>

components/script/dom/htmlimageelement.rs

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,8 @@ use servo_url::ServoUrl;
3434
use servo_url::origin::MutableOrigin;
3535
use style::attr::{AttrValue, LengthOrPercentageOrAuto, parse_integer, parse_length};
3636
use style::context::QuirksMode;
37-
use style::media_queries::MediaList;
3837
use style::parser::ParserContext;
39-
use style::stylesheets::{CssRuleType, Origin, UrlExtraData};
38+
use style::stylesheets::{CssRuleType, Origin};
4039
use style::values::specified::AbsoluteLength;
4140
use style::values::specified::length::{Length, NoCalcLength};
4241
use style::values::specified::source_size_list::SourceSizeList;
@@ -675,7 +674,7 @@ impl HTMLImageElement {
675674

676675
// Step 4.6
677676
if let Some(x) = element.get_attribute(&ns!(), &local_name!("media")) {
678-
if !self.matches_environment(x.value().to_string()) {
677+
if !elem.matches_environment(&x.value()) {
679678
continue;
680679
}
681680
}
@@ -719,33 +718,6 @@ impl HTMLImageElement {
719718
result
720719
}
721720

722-
/// <https://html.spec.whatwg.org/multipage/#matches-the-environment>
723-
fn matches_environment(&self, media_query: String) -> bool {
724-
let document = self.owner_document();
725-
let quirks_mode = document.quirks_mode();
726-
let document_url_data = UrlExtraData(document.url().get_arc());
727-
// FIXME(emilio): This should do the same that we do for other media
728-
// lists regarding the rule type and such, though it doesn't really
729-
// matter right now...
730-
//
731-
// Also, ParsingMode::all() is wrong, and should be DEFAULT.
732-
let context = ParserContext::new(
733-
Origin::Author,
734-
&document_url_data,
735-
Some(CssRuleType::Style),
736-
ParsingMode::all(),
737-
quirks_mode,
738-
/* namespaces = */ Default::default(),
739-
None,
740-
None,
741-
);
742-
let mut parserInput = ParserInput::new(&media_query);
743-
let mut parser = Parser::new(&mut parserInput);
744-
let media_list = MediaList::parse(&context, &mut parser);
745-
let result = media_list.evaluate(document.window().layout().device(), quirks_mode);
746-
result
747-
}
748-
749721
/// <https://html.spec.whatwg.org/multipage/#normalise-the-source-densities>
750722
fn normalise_source_densities(&self, source_set: &mut SourceSet, width: Option<Length>) {
751723
// Step 1

0 commit comments

Comments
 (0)