aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Watson <gw@intuitionlibrary.com>2015-08-17 13:50:30 +1000
committerGlenn Watson <gw@intuitionlibrary.com>2015-08-18 14:42:28 +1000
commit6d9fccbae7951a292395ff956750fb8ec32639be (patch)
treea5a47bdf6b0e0b7993032791366d496882d2322b
parent3bb930661d06c864e17374bfd1f0b0f4d06d7253 (diff)
downloadservo-6d9fccbae7951a292395ff956750fb8ec32639be.tar.gz
servo-6d9fccbae7951a292395ff956750fb8ec32639be.zip
Add a simple method to emulate a platform UA (e.g. pretend a desktop build is an android UA).
-rw-r--r--components/net/resource_task.rs10
-rw-r--r--components/script/dom/navigatorinfo.rs5
-rw-r--r--components/util/opts.rs44
-rw-r--r--tests/unit/net/hsts.rs2
-rw-r--r--tests/unit/net/resource_task.rs4
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();