Add a simple method to emulate a platform UA (e.g. pretend a desktop build is an android UA).

This commit is contained in:
Glenn Watson 2015-08-17 13:50:30 +10:00
parent 3bb930661d
commit 6d9fccbae7
5 changed files with 44 additions and 21 deletions

View file

@ -128,7 +128,7 @@ pub fn start_sending_opt(start_chan: LoadConsumer, metadata: Metadata) -> Result
} }
/// Create a ResourceTask /// Create a ResourceTask
pub fn new_resource_task(user_agent: Option<String>, pub fn new_resource_task(user_agent: String,
devtools_chan: Option<Sender<DevtoolsControlMsg>>) -> ResourceTask { devtools_chan: Option<Sender<DevtoolsControlMsg>>) -> ResourceTask {
let hsts_preload = match preload_hsts_domains() { let hsts_preload = match preload_hsts_domains() {
Some(list) => list, Some(list) => list,
@ -184,7 +184,7 @@ impl ResourceChannelManager {
} }
pub struct ResourceManager { pub struct ResourceManager {
user_agent: Option<String>, user_agent: String,
cookie_storage: CookieStorage, cookie_storage: CookieStorage,
resource_task: IpcSender<ControlMsg>, resource_task: IpcSender<ControlMsg>,
mime_classifier: Arc<MIMEClassifier>, mime_classifier: Arc<MIMEClassifier>,
@ -193,7 +193,7 @@ pub struct ResourceManager {
} }
impl ResourceManager { impl ResourceManager {
pub fn new(user_agent: Option<String>, pub fn new(user_agent: String,
resource_task: IpcSender<ControlMsg>, resource_task: IpcSender<ControlMsg>,
hsts_list: HSTSList, hsts_list: HSTSList,
devtools_channel: Option<Sender<DevtoolsControlMsg>>) -> ResourceManager { devtools_channel: Option<Sender<DevtoolsControlMsg>>) -> ResourceManager {
@ -229,9 +229,7 @@ impl ResourceManager {
} }
fn load(&mut self, mut load_data: LoadData, consumer: LoadConsumer) { fn load(&mut self, mut load_data: LoadData, consumer: LoadConsumer) {
self.user_agent.as_ref().map(|ua| { load_data.preserved_headers.set(UserAgent(self.user_agent.clone()));
load_data.preserved_headers.set(UserAgent(ua.clone()));
});
fn from_factory(factory: fn(LoadData, LoadConsumer, Arc<MIMEClassifier>)) fn from_factory(factory: fn(LoadData, LoadConsumer, Arc<MIMEClassifier>))
-> Box<FnBox(LoadData, LoadConsumer, Arc<MIMEClassifier>) + Send> { -> Box<FnBox(LoadData, LoadConsumer, Arc<MIMEClassifier>) + Send> {

View file

@ -28,10 +28,7 @@ pub fn Platform() -> DOMString {
} }
pub fn UserAgent() -> DOMString { pub fn UserAgent() -> DOMString {
match opts::get().user_agent { opts::get().user_agent.clone()
Some(ref user_agent) => user_agent.clone(),
None => "".to_owned(),
}
} }
pub fn AppVersion() -> DOMString { pub fn AppVersion() -> DOMString {

View file

@ -135,7 +135,7 @@ pub struct Opts {
pub initial_window_size: TypedSize2D<ScreenPx, u32>, pub initial_window_size: TypedSize2D<ScreenPx, u32>,
/// An optional string allowing the user agent to be set for testing. /// An optional string allowing the user agent to be set for testing.
pub user_agent: Option<String>, pub user_agent: String,
/// Whether to run in multiprocess mode. /// Whether to run in multiprocess mode.
pub multiprocess: bool, pub multiprocess: bool,
@ -337,17 +337,36 @@ static FORCE_CPU_PAINTING: bool = true;
#[cfg(not(target_os="android"))] #[cfg(not(target_os="android"))]
static FORCE_CPU_PAINTING: bool = false; static FORCE_CPU_PAINTING: bool = false;
enum UserAgent {
Desktop,
Android,
Gonk,
}
fn default_user_agent_string(agent: UserAgent) -> String {
match agent {
UserAgent::Desktop => {
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Servo/1.0 Firefox/37.0"
}
UserAgent::Android => {
"Mozilla/5.0 (Android; Mobile; rv:37.0) Servo/1.0 Firefox/37.0"
}
UserAgent::Gonk => {
"Mozilla/5.0 (Mobile; rv:37.0) Servo/1.0 Firefox/37.0"
}
}.to_owned()
}
#[cfg(target_os="android")] #[cfg(target_os="android")]
const DEFAULT_USER_AGENT: &'static str = "Mozilla/5.0 (Android; Mobile; rv:37.0) Servo/1.0 Firefox/37.0"; const DEFAULT_USER_AGENT: UserAgent = UserAgent::Android;
// FIXME: This requires https://github.com/servo/servo/issues/7138 to provide the // FIXME: This requires https://github.com/servo/servo/issues/7138 to provide the
// correct string in Gonk builds (i.e., it will never be chosen today). // correct string in Gonk builds (i.e., it will never be chosen today).
#[cfg(target_os="gonk")] #[cfg(target_os="gonk")]
const DEFAULT_USER_AGENT: &'static str = "Mozilla/5.0 (Mobile; rv:37.0) Servo/1.0 Firefox/37.0"; const DEFAULT_USER_AGENT: UserAgent = UserAgent::Gonk;
#[cfg(not(any(target_os="android", target_os="gonk")))] #[cfg(not(any(target_os="android", target_os="gonk")))]
const DEFAULT_USER_AGENT: &'static str = const DEFAULT_USER_AGENT: UserAgent = UserAgent::Desktop;
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Servo/1.0 Firefox/37.0";
pub fn default_opts() -> Opts { pub fn default_opts() -> Opts {
Opts { Opts {
@ -381,7 +400,7 @@ pub fn default_opts() -> Opts {
devtools_port: None, devtools_port: None,
webdriver_port: None, webdriver_port: None,
initial_window_size: Size2D::typed(800, 600), initial_window_size: Size2D::typed(800, 600),
user_agent: None, user_agent: default_user_agent_string(DEFAULT_USER_AGENT),
multiprocess: false, multiprocess: false,
dump_flow_tree: false, dump_flow_tree: false,
dump_display_list: false, dump_display_list: false,
@ -424,7 +443,10 @@ pub fn from_cmdline_args(args: &[String]) {
opts.optflagopt("", "devtools", "Start remote devtools server on port", "6000"); opts.optflagopt("", "devtools", "Start remote devtools server on port", "6000");
opts.optflagopt("", "webdriver", "Start remote WebDriver server on port", "7000"); opts.optflagopt("", "webdriver", "Start remote WebDriver server on port", "7000");
opts.optopt("", "resolution", "Set window resolution.", "800x600"); opts.optopt("", "resolution", "Set window resolution.", "800x600");
opts.optopt("u", "user-agent", "Set custom user agent string", "NCSA Mosaic/1.0 (X11;SunOS 4.1.4 sun4m)"); opts.optopt("u",
"user-agent",
"Set custom user agent string (or android / gonk / desktop for platform default)",
"NCSA Mosaic/1.0 (X11;SunOS 4.1.4 sun4m)");
opts.optflag("M", "multiprocess", "Run in multiprocess mode"); opts.optflag("M", "multiprocess", "Run in multiprocess mode");
opts.optopt("Z", "debug", opts.optopt("Z", "debug",
"A comma-separated string of debug options. Pass help to show available options.", ""); "A comma-separated string of debug options. Pass help to show available options.", "");
@ -532,7 +554,13 @@ pub fn from_cmdline_args(args: &[String]) {
} }
}; };
let user_agent = opt_match.opt_str("u").or(Some(DEFAULT_USER_AGENT.to_string())); let user_agent = match opt_match.opt_str("u") {
Some(ref ua) if ua == "android" => default_user_agent_string(UserAgent::Android),
Some(ref ua) if ua == "gonk" => default_user_agent_string(UserAgent::Gonk),
Some(ref ua) if ua == "desktop" => default_user_agent_string(UserAgent::Desktop),
Some(ua) => ua,
None => default_user_agent_string(DEFAULT_USER_AGENT),
};
let user_stylesheets = opt_match.opt_strs("user-stylesheet").iter().map(|filename| { let user_stylesheets = opt_match.opt_strs("user-stylesheet").iter().map(|filename| {
let path = cwd.join(filename); let path = cwd.join(filename);

View file

@ -19,7 +19,7 @@ fn test_add_hsts_entry_to_resource_manager_adds_an_hsts_entry() {
}; };
let (tx, _) = ipc::channel().unwrap(); let (tx, _) = ipc::channel().unwrap();
let mut manager = ResourceManager::new(None, tx, list, None); let mut manager = ResourceManager::new("".to_owned(), tx, list, None);
let entry = HSTSEntry::new( let entry = HSTSEntry::new(
"mozilla.org".to_string(), IncludeSubdomains::NotIncluded, None "mozilla.org".to_string(), IncludeSubdomains::NotIncluded, None

View file

@ -14,13 +14,13 @@ use url::Url;
#[test] #[test]
fn test_exit() { fn test_exit() {
let resource_task = new_resource_task(None, None); let resource_task = new_resource_task("".to_owned(), None);
resource_task.send(ControlMsg::Exit).unwrap(); resource_task.send(ControlMsg::Exit).unwrap();
} }
#[test] #[test]
fn test_bad_scheme() { fn test_bad_scheme() {
let resource_task = new_resource_task(None, None); let resource_task = new_resource_task("".to_owned(), None);
let (start_chan, start) = ipc::channel().unwrap(); let (start_chan, start) = ipc::channel().unwrap();
let url = Url::parse("bogus://whatever").unwrap(); let url = Url::parse("bogus://whatever").unwrap();
resource_task.send(ControlMsg::Load(LoadData::new(url, None), LoadConsumer::Channel(start_chan))).unwrap(); resource_task.send(ControlMsg::Load(LoadData::new(url, None), LoadConsumer::Channel(start_chan))).unwrap();