forked from mirrors/gecko-dev
		
	<!-- Please describe your changes on the following line: --> This PR removes the `util` crate. * Replaced the `spawn_named` and `clamp` functions by appropriate uses of `std:🧵:Builder::spawn`, `std::cmp::min` and `std::cmp::max`. * Moved `opts`, `prefs` and `resource_files` into a new `config` crate. * Moved `remutex` and `geometry` into their own crates. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes do not require tests because they are refactorings <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> Source-Repo: https://github.com/servo/servo Source-Revision: 4eb653817f87e5fb47de34356f558eb76ecbca9f --HG-- rename : servo/components/util/Cargo.toml => servo/components/config/Cargo.toml rename : servo/components/util/basedir.rs => servo/components/config/basedir.rs rename : servo/components/util/lib.rs => servo/components/config/lib.rs rename : servo/components/util/opts.rs => servo/components/config/opts.rs rename : servo/components/util/prefs.rs => servo/components/config/prefs.rs rename : servo/components/util/resource_files.rs => servo/components/config/resource_files.rs rename : servo/components/util/geometry.rs => servo/components/geometry/lib.rs rename : servo/components/util/remutex.rs => servo/components/remutex/lib.rs rename : servo/tests/unit/util/lib.rs => servo/tests/unit/servo_config/lib.rs rename : servo/tests/unit/util/opts.rs => servo/tests/unit/servo_config/opts.rs rename : servo/tests/unit/util/prefs.rs => servo/tests/unit/servo_config/prefs.rs rename : servo/tests/unit/util/remutex.rs => servo/tests/unit/servo_remutex/lib.rs
		
			
				
	
	
		
			55 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
/* 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/. */
 | 
						|
 | 
						|
//! Machinery to conditionally expose things.
 | 
						|
 | 
						|
use js::jsapi::{HandleObject, JSContext};
 | 
						|
use servo_config::prefs::PREFS;
 | 
						|
 | 
						|
/// A container with a condition.
 | 
						|
pub struct Guard<T: Clone + Copy> {
 | 
						|
    condition: Condition,
 | 
						|
    value: T,
 | 
						|
}
 | 
						|
 | 
						|
impl<T: Clone + Copy> Guard<T> {
 | 
						|
    /// Construct a new guarded value.
 | 
						|
    pub const fn new(condition: Condition, value: T) -> Self {
 | 
						|
        Guard {
 | 
						|
            condition: condition,
 | 
						|
            value: value,
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /// Expose the value if the condition is satisfied.
 | 
						|
    ///
 | 
						|
    /// The passed handle is the object on which the value may be exposed.
 | 
						|
    pub unsafe fn expose(&self, cx: *mut JSContext, obj: HandleObject) -> Option<T> {
 | 
						|
        if self.condition.is_satisfied(cx, obj) {
 | 
						|
            Some(self.value)
 | 
						|
        } else {
 | 
						|
            None
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/// A condition to expose things.
 | 
						|
pub enum Condition {
 | 
						|
    /// The condition is satisfied if the function returns true.
 | 
						|
    Func(unsafe fn(*mut JSContext, HandleObject) -> bool),
 | 
						|
    /// The condition is satisfied if the preference is set.
 | 
						|
    Pref(&'static str),
 | 
						|
    /// The condition is always satisfied.
 | 
						|
    Satisfied,
 | 
						|
}
 | 
						|
 | 
						|
impl Condition {
 | 
						|
    unsafe fn is_satisfied(&self, cx: *mut JSContext, obj: HandleObject) -> bool {
 | 
						|
        match *self {
 | 
						|
            Condition::Pref(name) => PREFS.get(name).as_boolean().unwrap_or(false),
 | 
						|
            Condition::Func(f) => f(cx, obj),
 | 
						|
            Condition::Satisfied => true,
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |