--- a/servo/components/style/stylist.rs
+++ b/servo/components/style/stylist.rs
@@ -1065,44 +1065,42 @@ impl Stylist {
/// Returns the sheet origins that were actually affected.
///
/// This means that we may need to rebuild style data even if the
/// stylesheets haven't changed.
///
/// Also, the device that arrives here may need to take the viewport rules
/// into account.
///
- /// feature = "servo" because gecko only has one device, and manually tracks
- /// when the device is dirty.
- ///
- /// FIXME(emilio): The semantics of the device for Servo and Gecko are
- /// different enough we may want to unify them.
- #[cfg(feature = "servo")]
+ /// For Gecko, this is called when XBL bindings are used by different
+ /// documents.
pub fn set_device(
&mut self,
mut device: Device,
guard: &SharedRwLockReadGuard,
) -> OriginSet {
- let cascaded_rule = {
- let stylesheets = self.stylesheets.iter();
+ if viewport_rule::enabled() {
+ let cascaded_rule = {
+ let stylesheets = self.stylesheets.iter();
- ViewportRule {
- declarations: viewport_rule::Cascade::from_stylesheets(
- stylesheets.clone(),
- guard,
- &device
- ).finish(),
+ ViewportRule {
+ declarations: viewport_rule::Cascade::from_stylesheets(
+ stylesheets.clone(),
+ guard,
+ &device
+ ).finish(),
+ }
+ };
+
+ self.viewport_constraints =
+ ViewportConstraints::maybe_new(&device, &cascaded_rule, self.quirks_mode);
+
+ if let Some(ref constraints) = self.viewport_constraints {
+ device.account_for_viewport_rule(constraints);
}
- };
-
- self.viewport_constraints =
- ViewportConstraints::maybe_new(&device, &cascaded_rule, self.quirks_mode);
-
- if let Some(ref constraints) = self.viewport_constraints {
- device.account_for_viewport_rule(constraints);
}
self.device = device;
self.media_features_change_changed_style(guard)
}
/// Returns whether, given a media feature change, any previously-applicable
/// style has become non-applicable, or vice-versa for each origin.
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -97,17 +97,17 @@ use style::gecko_bindings::structs::nsID
use style::gecko_bindings::structs::nsStyleTransformMatrix::MatrixTransformOperator;
use style::gecko_bindings::structs::nsTArray;
use style::gecko_bindings::structs::nsresult;
use style::gecko_bindings::sugar::ownership::{FFIArcHelpers, HasFFI, HasArcFFI};
use style::gecko_bindings::sugar::ownership::{HasSimpleFFI, Strong};
use style::gecko_bindings::sugar::refptr::RefPtr;
use style::gecko_properties::style_structs;
use style::invalidation::element::restyle_hints;
-use style::media_queries::{MediaList, parse_media_query_list};
+use style::media_queries::{Device, MediaList, parse_media_query_list};
use style::parser::{ParserContext, self};
use style::properties::{CascadeFlags, ComputedValues, Importance};
use style::properties::{IS_FIELDSET_CONTENT, IS_LINK, IS_VISITED_LINK, LonghandIdSet};
use style::properties::{PropertyDeclaration, PropertyDeclarationBlock, PropertyId, ShorthandId};
use style::properties::{SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP, SourcePropertyDeclaration, StyleBuilder};
use style::properties::PROHIBIT_DISPLAY_CONTENTS;
use style::properties::animated_properties::{AnimatableLonghand, AnimationValue};
use style::properties::animated_properties::compare_property_priority;
@@ -944,16 +944,35 @@ pub extern "C" fn Servo_StyleSet_MediumF
// We'd like to return `OriginFlags` here, but bindgen bitfield enums don't
// work as return values with the Linux 32-bit ABI at the moment because
// they wrap the value in a struct, so for now just unwrap it.
OriginFlags::from(origins_in_which_rules_changed).0
}
#[no_mangle]
+pub extern "C" fn Servo_StyleSet_SetDevice(
+ raw_data: RawServoStyleSetBorrowed,
+ pres_context: RawGeckoPresContextOwned
+) -> u8 {
+ let global_style_data = &*GLOBAL_STYLE_DATA;
+ let guard = global_style_data.shared_lock.read();
+
+ let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
+ let device = Device::new(pres_context);
+ let origins_in_which_rules_changed =
+ data.stylist.set_device(device, &guard);
+
+ // We'd like to return `OriginFlags` here, but bindgen bitfield enums don't
+ // work as return values with the Linux 32-bit ABI at the moment because
+ // they wrap the value in a struct, so for now just unwrap it.
+ OriginFlags::from(origins_in_which_rules_changed).0
+}
+
+#[no_mangle]
pub extern "C" fn Servo_StyleSet_PrependStyleSheet(
raw_data: RawServoStyleSetBorrowed,
sheet: *const ServoStyleSheet,
) {
let global_style_data = &*GLOBAL_STYLE_DATA;
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
let data = &mut *data;
let guard = global_style_data.shared_lock.read();