Auto merge of #10696 - rebstar6:referrerPolicy, r=jdm

Referer header

PR1 for https://github.com/servo/servo/issues/10311

This puts the code and data structures in place to set the Referer header based on the Referrer Policy for a given document. Note that document:: get_referrer_policy() always returns the 'No Referrer' option, so for now, this should have no impact on production code, and that policy requires that the Referer header is not added.

Later PRs will determine the policy and edit that get_referrer_policy() accordingly.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/10696)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-04-25 13:52:01 -07:00
commit 34900814fc
19 changed files with 369 additions and 68 deletions

View file

@ -24,7 +24,7 @@ fn assert_parse(url: &'static str,
let (start_chan, start_port) = ipc::channel().unwrap();
let classifier = Arc::new(MIMEClassifier::new());
load(LoadData::new(LoadContext::Browsing, Url::parse(url).unwrap(), None),
load(LoadData::new(LoadContext::Browsing, Url::parse(url).unwrap(), None, None, None),
Channel(start_chan),
classifier, CancellationListener::new(None));

View file

@ -10,13 +10,13 @@ use flate2::Compression;
use flate2::write::{GzEncoder, DeflateEncoder};
use hyper::header::{Accept, AcceptEncoding, ContentEncoding, ContentLength, Cookie as CookieHeader};
use hyper::header::{Authorization, Basic};
use hyper::header::{Encoding, Headers, Host, Location, Quality, QualityItem, qitem, SetCookie};
use hyper::header::{Encoding, Headers, Host, Location, Quality, QualityItem, qitem, Referer, SetCookie};
use hyper::header::{StrictTransportSecurity, UserAgent};
use hyper::http::RawStatus;
use hyper::method::Method;
use hyper::mime::{Mime, SubLevel, TopLevel};
use hyper::status::StatusCode;
use msg::constellation_msg::PipelineId;
use msg::constellation_msg::{PipelineId, ReferrerPolicy};
use net::cookie::Cookie;
use net::cookie_storage::CookieStorage;
use net::hsts::HstsEntry;
@ -328,7 +328,7 @@ fn test_check_default_headers_loaded_in_every_request() {
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.data = None;
load_data.method = Method::Get;
@ -372,7 +372,7 @@ fn test_load_when_request_is_not_get_or_head_and_there_is_no_body_content_length
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.data = None;
load_data.method = Method::Post;
@ -410,7 +410,7 @@ fn test_request_and_response_data_with_network_messages() {
let (devtools_chan, devtools_port) = mpsc::channel::<DevtoolsControlMsg>();
// This will probably have to be changed as it uses fake_root_pipeline_id which is marked for removal.
let pipeline_id = PipelineId::fake_root_pipeline_id();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), Some(pipeline_id));
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), Some(pipeline_id), None, None);
let mut request_headers = Headers::new();
request_headers.set(Host { hostname: "bar.foo".to_owned(), port: None });
load_data.headers = request_headers.clone();
@ -483,7 +483,7 @@ fn test_request_and_response_message_from_devtool_without_pipeline_id() {
let url = Url::parse("https://mozilla.com").unwrap();
let (devtools_chan, devtools_port) = mpsc::channel::<DevtoolsControlMsg>();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let _ = load(&load_data, &ui_provider, &http_state, Some(devtools_chan), &Factory,
DEFAULT_USER_AGENT.to_owned(), &CancellationListener::new(None));
@ -512,7 +512,8 @@ fn test_load_when_redirecting_from_a_post_should_rewrite_next_request_as_get() {
}
let url = Url::parse("http://mozilla.com").unwrap();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.method = Method::Post;
let http_state = HttpState::new();
@ -541,7 +542,7 @@ fn test_load_should_decode_the_response_as_deflate_when_response_headers_have_co
}
let url = Url::parse("http://mozilla.com").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -575,7 +576,8 @@ fn test_load_should_decode_the_response_as_gzip_when_response_headers_have_conte
}
let url = Url::parse("http://mozilla.com").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -617,7 +619,8 @@ fn test_load_doesnt_send_request_body_on_any_redirect() {
}
let url = Url::parse("http://mozilla.com").unwrap();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.data = Some(<[_]>::to_vec("Body on POST!".as_bytes()));
let http_state = HttpState::new();
@ -648,7 +651,7 @@ fn test_load_doesnt_add_host_to_sts_list_when_url_is_http_even_if_sts_headers_ar
let url = Url::parse("http://mozilla.com").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -680,7 +683,7 @@ fn test_load_adds_host_to_sts_list_when_url_is_https_and_sts_headers_are_present
let url = Url::parse("https://mozilla.com").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -717,7 +720,7 @@ fn test_load_sets_cookies_in_the_resource_manager_when_it_get_set_cookie_header_
assert_cookie_for_domain(http_state.cookie_jar.clone(), "http://mozilla.com", "");
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let _ = load(&load_data,
&ui_provider, &http_state,
@ -733,7 +736,7 @@ fn test_load_sets_cookies_in_the_resource_manager_when_it_get_set_cookie_header_
fn test_load_sets_requests_cookies_header_for_url_by_getting_cookies_from_the_resource_manager() {
let url = Url::parse("http://mozilla.com").unwrap();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes()));
let http_state = HttpState::new();
@ -789,7 +792,7 @@ fn test_load_sends_secure_cookie_if_http_changed_to_https_due_to_entry_in_hsts_s
cookie_jar.push(cookie, CookieSource::HTTP);
}
let mut load_data = LoadData::new(LoadContext::Browsing, url, None);
let mut load_data = LoadData::new(LoadContext::Browsing, url, None, None, None);
load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes()));
let mut headers = Headers::new();
@ -821,7 +824,7 @@ fn test_load_sends_cookie_if_nonhttp() {
cookie_jar.push(cookie, CookieSource::HTTP);
}
let mut load_data = LoadData::new(LoadContext::Browsing, url, None);
let mut load_data = LoadData::new(LoadContext::Browsing, url, None, None, None);
load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes()));
let mut headers = Headers::new();
@ -855,7 +858,7 @@ fn test_cookie_set_with_httponly_should_not_be_available_using_getcookiesforurl(
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let _ = load(&load_data,
&ui_provider, &http_state,
None,
@ -885,7 +888,7 @@ fn test_when_cookie_received_marked_secure_is_ignored_for_http() {
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
let load_data = LoadData::new(LoadContext::Browsing, Url::parse("http://mozilla.com").unwrap(), None);
let load_data = LoadData::new(LoadContext::Browsing, Url::parse("http://mozilla.com").unwrap(), None, None, None);
let _ = load(&load_data,
&ui_provider, &http_state,
None,
@ -916,7 +919,7 @@ fn test_when_cookie_set_marked_httpsonly_secure_isnt_sent_on_http_request() {
cookie_jar.push(cookie, CookieSource::HTTP);
}
let mut load_data = LoadData::new(LoadContext::Browsing, url, None);
let mut load_data = LoadData::new(LoadContext::Browsing, url, None, None, None);
load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes()));
assert_cookie_for_domain(http_state.cookie_jar.clone(), "https://mozilla.com", "mozillaIs=theBest");
@ -934,7 +937,8 @@ fn test_load_sets_content_length_to_length_of_request_body() {
let content = "This is a request body";
let url = Url::parse("http://mozilla.com").unwrap();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.data = Some(<[_]>::to_vec(content.as_bytes()));
let mut content_len_headers = Headers::new();
@ -959,7 +963,8 @@ fn test_load_uses_explicit_accept_from_headers_in_load_data() {
accept_headers.set(Accept(vec![text_html.clone()]));
let url = Url::parse("http://mozilla.com").unwrap();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes()));
load_data.headers.set(Accept(vec![text_html.clone()]));
@ -987,7 +992,8 @@ fn test_load_sets_default_accept_to_html_xhtml_xml_and_then_anything_else() {
]));
let url = Url::parse("http://mozilla.com").unwrap();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes()));
let http_state = HttpState::new();
@ -1009,7 +1015,7 @@ fn test_load_uses_explicit_accept_encoding_from_load_data_headers() {
accept_encoding_headers.set(AcceptEncoding(vec![qitem(Encoding::Chunked)]));
let url = Url::parse("http://mozilla.com").unwrap();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes()));
load_data.headers.set(AcceptEncoding(vec![qitem(Encoding::Chunked)]));
@ -1034,7 +1040,7 @@ fn test_load_sets_default_accept_encoding_to_gzip_and_deflate() {
qitem(Encoding::EncodingExt("br".to_owned()))]));
let url = Url::parse("http://mozilla.com").unwrap();
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let mut load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes()));
let http_state = HttpState::new();
@ -1069,7 +1075,7 @@ fn test_load_errors_when_there_a_redirect_loop() {
}
let url = Url::parse("http://mozilla.com").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -1099,7 +1105,7 @@ fn test_load_errors_when_there_is_too_many_redirects() {
}
let url = Url::parse("http://mozilla.com").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -1146,8 +1152,7 @@ fn test_load_follows_a_redirect() {
}
let url = Url::parse("http://mozilla.com").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -1174,7 +1179,7 @@ impl HttpRequestFactory for DontConnectFactory {
#[test]
fn test_load_errors_when_scheme_is_not_http_or_https() {
let url = Url::parse("ftp://not-supported").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -1193,7 +1198,7 @@ fn test_load_errors_when_scheme_is_not_http_or_https() {
#[test]
fn test_load_errors_when_viewing_source_and_inner_url_scheme_is_not_http_or_https() {
let url = Url::parse("view-source:ftp://not-supported").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -1236,7 +1241,7 @@ fn test_load_errors_when_cancelled() {
cancel_sender.send(()).unwrap();
let url = Url::parse("https://mozilla.com").unwrap();
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -1285,7 +1290,7 @@ fn test_redirect_from_x_to_y_provides_y_cookies_from_y() {
}
}
let load_data = LoadData::new(LoadContext::Browsing, url_x.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url_x.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -1351,7 +1356,7 @@ fn test_redirect_from_x_to_x_provides_x_with_cookie_from_first_response() {
}
}
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None);
let load_data = LoadData::new(LoadContext::Browsing, url.clone(), None, None, None);
let http_state = HttpState::new();
let ui_provider = TestProvider::new();
@ -1384,7 +1389,7 @@ fn test_if_auth_creds_not_in_url_but_in_cache_it_sets_it() {
http_state.auth_cache.write().unwrap().entries.insert(url.clone(), auth_entry);
let mut load_data = LoadData::new(LoadContext::Browsing, url, None);
let mut load_data = LoadData::new(LoadContext::Browsing, url, None, None, None);
load_data.credentials_flag = true;
let mut auth_header = Headers::new();
@ -1423,7 +1428,7 @@ fn test_auth_ui_sets_header_on_401() {
)
);
let load_data = LoadData::new(LoadContext::Browsing, url, None);
let load_data = LoadData::new(LoadContext::Browsing, url, None, None, None);
match load(
&load_data, &ui_provider, &http_state,
@ -1437,3 +1442,188 @@ fn test_auth_ui_sets_header_on_401() {
}
}
}
fn assert_referer_header_matches(request_url: &str,
referrer_url: &str,
referrer_policy: Option<ReferrerPolicy>,
expected_referrer: &str) {
let ref_url = Url::parse(referrer_url).unwrap();
let url = Url::parse(request_url).unwrap();
let ui_provider = TestProvider::new();
let load_data = LoadData::new(LoadContext::Browsing,
url.clone(),
None,
referrer_policy,
Some(ref_url));
let mut referer_headers = Headers::new();
referer_headers.set(Referer(expected_referrer.to_owned()));
let http_state = HttpState::new();
let _ = load(&load_data.clone(), &ui_provider, &http_state, None,
&AssertMustIncludeHeadersRequestFactory {
expected_headers: referer_headers,
body: <[_]>::to_vec(&[])
}, DEFAULT_USER_AGENT.to_owned(),
&CancellationListener::new(None));
}
fn assert_referer_header_not_included(request_url: &str, referrer_url: &str, referrer_policy: Option<ReferrerPolicy>) {
let ref_url = Url::parse(referrer_url).unwrap();
let url = Url::parse(request_url).unwrap();
let ui_provider = TestProvider::new();
let load_data = LoadData::new(LoadContext::Browsing,
url.clone(),
None,
referrer_policy,
Some(ref_url));
let http_state = HttpState::new();
let _ = load(
&load_data.clone(), &ui_provider, &http_state, None,
&AssertMustNotIncludeHeadersRequestFactory {
headers_not_expected: vec!["Referer".to_owned()],
body: <[_]>::to_vec(&[])
}, DEFAULT_USER_AGENT.to_owned(), &CancellationListener::new(None));
}
#[test]
fn test_referer_set_to_origin_with_originonly_policy() {
let request_url = "http://mozilla.com";
let referrer_url = "http://username:password@someurl.com/some/path#fragment";
let referrer_policy = Some(ReferrerPolicy::OriginOnly);
let expected_referrer = "http://someurl.com/";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_referer_set_to_stripped_url_with_unsafeurl_policy() {
let request_url = "http://mozilla.com";
let referrer_url = "http://username:password@someurl.com/some/path#fragment";
let referrer_policy = Some(ReferrerPolicy::UnsafeUrl);
let expected_referrer = "http://someurl.com/some/path";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_referer_with_originwhencrossorigin_policy_cross_orig() {
let request_url = "http://mozilla.com";
let referrer_url = "http://username:password@someurl.com/some/path#fragment";
let referrer_policy = Some(ReferrerPolicy::OriginWhenCrossOrigin);
let expected_referrer = "http://someurl.com/";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_referer_with_originwhencrossorigin_policy_same_orig() {
let request_url = "http://mozilla.com";
let referrer_url = "http://username:password@mozilla.com/some/path#fragment";
let referrer_policy = Some(ReferrerPolicy::OriginWhenCrossOrigin);
let expected_referrer = "http://mozilla.com/some/path";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_http_to_https_considered_cross_origin_for_referer_header_logic() {
let request_url = "https://mozilla.com";
let referrer_url = "http://mozilla.com/some/path";
let referrer_policy = Some(ReferrerPolicy::OriginWhenCrossOrigin);
let expected_referrer = "http://mozilla.com/";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_referer_set_to_ref_url_with_noreferrerwhendowngrade_policy_https_to_https() {
let request_url = "https://mozilla.com";
let referrer_url = "https://username:password@mozilla.com/some/path#fragment";
let referrer_policy = Some(ReferrerPolicy::NoRefWhenDowngrade);
let expected_referrer = "https://mozilla.com/some/path";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_no_referer_set_with_noreferrerwhendowngrade_policy_https_to_http() {
let request_url = "http://mozilla.com";
let referrer_url = "https://username:password@mozilla.com/some/path#fragment";
let referrer_policy = Some(ReferrerPolicy::NoRefWhenDowngrade);
assert_referer_header_not_included(request_url, referrer_url, referrer_policy)
}
#[test]
fn test_referer_set_to_ref_url_with_noreferrerwhendowngrade_policy_http_to_https() {
let request_url = "https://mozilla.com";
let referrer_url = "http://username:password@mozilla.com/some/path#fragment";
let referrer_policy = Some(ReferrerPolicy::NoRefWhenDowngrade);
let expected_referrer = "http://mozilla.com/some/path";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_referer_set_to_ref_url_with_noreferrerwhendowngrade_policy_http_to_http() {
let request_url = "http://mozilla.com";
let referrer_url = "http://username:password@mozilla.com/some/path#fragment";
let referrer_policy = Some(ReferrerPolicy::NoRefWhenDowngrade);
let expected_referrer = "http://mozilla.com/some/path";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_no_referrer_policy_follows_noreferrerwhendowngrade_https_to_https() {
let request_url = "https://mozilla.com";
let referrer_url = "https://username:password@mozilla.com/some/path#fragment";
let referrer_policy = None;
let expected_referrer = "https://mozilla.com/some/path";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_no_referrer_policy_follows_noreferrerwhendowngrade_https_to_http() {
let request_url = "http://mozilla.com";
let referrer_url = "https://username:password@mozilla.com/some/path#fragment";
let referrer_policy = None;
assert_referer_header_not_included(request_url, referrer_url, referrer_policy);
}
#[test]
fn test_no_referrer_policy_follows_noreferrerwhendowngrade_http_to_https() {
let request_url = "https://mozilla.com";
let referrer_url = "http://username:password@mozilla.com/some/path#fragment";
let referrer_policy = None;
let expected_referrer = "http://mozilla.com/some/path";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_no_referrer_policy_follows_noreferrerwhendowngrade_http_to_http() {
let request_url = "http://mozilla.com";
let referrer_url = "http://username:password@mozilla.com/some/path#fragment";
let referrer_policy = None;
let expected_referrer = "http://mozilla.com/some/path";
assert_referer_header_matches(request_url, referrer_url, referrer_policy, expected_referrer);
}
#[test]
fn test_no_referer_set_with_noreferrer_policy() {
let request_url = "http://mozilla.com";
let referrer_url = "http://someurl.com";
let referrer_policy = Some(ReferrerPolicy::NoReferrer);
assert_referer_header_not_included(request_url, referrer_url, referrer_policy)
}

View file

@ -27,8 +27,9 @@ fn test_bad_scheme() {
let resource_thread = new_resource_thread("".to_owned(), None);
let (start_chan, start) = ipc::channel().unwrap();
let url = Url::parse("bogus://whatever").unwrap();
resource_thread.send(ControlMsg::Load(LoadData::new(LoadContext::Browsing, url, None),
LoadConsumer::Channel(start_chan), None)).unwrap();
resource_thread.send(ControlMsg::Load(LoadData::new(LoadContext::Browsing, url, None, None, None),
LoadConsumer::Channel(start_chan), None)).unwrap();
let response = start.recv().unwrap();
match response.progress_port.recv().unwrap() {
ProgressMsg::Done(result) => { assert!(result.is_err()) }
@ -205,7 +206,7 @@ fn test_cancelled_listener() {
let (sync_sender, sync_receiver) = ipc::channel().unwrap();
let url = Url::parse(&format!("http://127.0.0.1:{}", port)).unwrap();
resource_thread.send(ControlMsg::Load(LoadData::new(LoadContext::Browsing, url, None),
resource_thread.send(ControlMsg::Load(LoadData::new(LoadContext::Browsing, url, None, None, None),
LoadConsumer::Channel(sender),
Some(id_sender))).unwrap();
// get the `ResourceId` and send a cancel message, which should stop the loading loop