diff options
-rw-r--r-- | components/net/resource_task.rs | 10 | ||||
-rw-r--r-- | components/script/dom/navigatorinfo.rs | 5 | ||||
-rw-r--r-- | components/util/opts.rs | 44 | ||||
-rw-r--r-- | tests/unit/net/hsts.rs | 2 | ||||
-rw-r--r-- | tests/unit/net/resource_task.rs | 4 |
5 files changed, 44 insertions, 21 deletions
diff --git a/components/net/resource_task.rs b/components/net/resource_task.rs index 7b87ec8830f..f3acee92996 100644 --- a/components/net/resource_task.rs +++ b/components/net/resource_task.rs @@ -128,7 +128,7 @@ pub fn start_sending_opt(start_chan: LoadConsumer, metadata: Metadata) -> Result } /// 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 { let hsts_preload = match preload_hsts_domains() { Some(list) => list, @@ -184,7 +184,7 @@ impl ResourceChannelManager { } pub struct ResourceManager { - user_agent: Option<String>, + user_agent: String, cookie_storage: CookieStorage, resource_task: IpcSender<ControlMsg>, mime_classifier: Arc<MIMEClassifier>, @@ -193,7 +193,7 @@ pub struct ResourceManager { } impl ResourceManager { - pub fn new(user_agent: Option<String>, + pub fn new(user_agent: String, resource_task: IpcSender<ControlMsg>, hsts_list: HSTSList, devtools_channel: Option<Sender<DevtoolsControlMsg>>) -> ResourceManager { @@ -229,9 +229,7 @@ impl ResourceManager { } fn load(&mut self, mut load_data: LoadData, consumer: LoadConsumer) { - self.user_agent.as_ref().map(|ua| { - load_data.preserved_headers.set(UserAgent(ua.clone())); - }); + load_data.preserved_headers.set(UserAgent(self.user_agent.clone())); fn from_factory(factory: fn(LoadData, LoadConsumer, Arc<MIMEClassifier>)) -> Box<FnBox(LoadData, LoadConsumer, Arc<MIMEClassifier>) + Send> { diff --git a/components/script/dom/navigatorinfo.rs b/components/script/dom/navigatorinfo.rs index d4aec6999ab..4982908969b 100644 --- a/components/script/dom/navigatorinfo.rs +++ b/components/script/dom/navigatorinfo.rs @@ -28,10 +28,7 @@ pub fn Platform() -> DOMString { } pub fn UserAgent() -> DOMString { - match opts::get().user_agent { - Some(ref user_agent) => user_agent.clone(), - None => "".to_owned(), - } + opts::get().user_agent.clone() } pub fn AppVersion() -> DOMString { diff --git a/components/util/opts.rs b/components/util/opts.rs index 6202396b79f..0e11006ab4e 100644 --- a/components/util/opts.rs +++ b/components/util/opts.rs @@ -135,7 +135,7 @@ pub struct Opts { pub initial_window_size: TypedSize2D<ScreenPx, u32>, /// 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. pub multiprocess: bool, @@ -337,17 +337,36 @@ static FORCE_CPU_PAINTING: bool = true; #[cfg(not(target_os="android"))] 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")] -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 // correct string in Gonk builds (i.e., it will never be chosen today). #[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")))] -const DEFAULT_USER_AGENT: &'static str = - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Servo/1.0 Firefox/37.0"; +const DEFAULT_USER_AGENT: UserAgent = UserAgent::Desktop; pub fn default_opts() -> Opts { Opts { @@ -381,7 +400,7 @@ pub fn default_opts() -> Opts { devtools_port: None, webdriver_port: None, initial_window_size: Size2D::typed(800, 600), - user_agent: None, + user_agent: default_user_agent_string(DEFAULT_USER_AGENT), multiprocess: false, dump_flow_tree: 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("", "webdriver", "Start remote WebDriver server on port", "7000"); 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.optopt("Z", "debug", "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 path = cwd.join(filename); diff --git a/tests/unit/net/hsts.rs b/tests/unit/net/hsts.rs index 7ac11d4dbc3..421d9a65730 100644 --- a/tests/unit/net/hsts.rs +++ b/tests/unit/net/hsts.rs @@ -19,7 +19,7 @@ fn test_add_hsts_entry_to_resource_manager_adds_an_hsts_entry() { }; 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( "mozilla.org".to_string(), IncludeSubdomains::NotIncluded, None diff --git a/tests/unit/net/resource_task.rs b/tests/unit/net/resource_task.rs index 1d766e8cb7a..8850f38cff9 100644 --- a/tests/unit/net/resource_task.rs +++ b/tests/unit/net/resource_task.rs @@ -14,13 +14,13 @@ use url::Url; #[test] 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(); } #[test] 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 url = Url::parse("bogus://whatever").unwrap(); resource_task.send(ControlMsg::Load(LoadData::new(url, None), LoadConsumer::Channel(start_chan))).unwrap(); |