Auto merge of #15438 - asajeffrey:url-serializable-origin, r=jdm

Add ImmutableOrigin to allow for serializing origins

<!-- Please describe your changes on the following line: -->

This PR adds a serializable type `ImmutableOrigin` and a non-serializable type `MutableOrigin`. The immutable type represents an origin with `null` domain, and the mutable type represents an origin with a mutable domain. This separation is needed for implementing setting `document.domain`.

---
<!-- 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 fix #14892.
- [X] These changes do not require tests because it's a refactoring which will enable other features.

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/15438)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2017-02-22 09:46:27 -08:00 committed by GitHub
commit 78e8c31a4d
21 changed files with 270 additions and 152 deletions

View file

@ -34,7 +34,7 @@ use net_traits::ReferrerPolicy;
use net_traits::request::{Origin, RedirectMode, Referrer, Request, RequestMode};
use net_traits::response::{CacheState, Response, ResponseBody, ResponseType};
use servo_config::resource_files::resources_dir_path;
use servo_url::ServoUrl;
use servo_url::{ImmutableOrigin, ServoUrl};
use std::fs::File;
use std::io::Read;
use std::rc::Rc;
@ -43,7 +43,6 @@ use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::mpsc::{Sender, channel};
use time::{self, Duration};
use unicase::UniCase;
use url::Origin as UrlOrigin;
// TODO write a struct that impls Handler for storing test values
@ -223,7 +222,7 @@ fn test_cors_preflight_fetch() {
let target_url = url.clone().join("a.html").unwrap();
let origin = Origin::Origin(UrlOrigin::new_opaque());
let origin = Origin::Origin(ImmutableOrigin::new_opaque());
let mut request = Request::new(url.clone(), Some(origin), false, None);
*request.referrer.borrow_mut() = Referrer::ReferrerUrl(target_url);
*request.referrer_policy.get_mut() = Some(ReferrerPolicy::Origin);
@ -260,7 +259,7 @@ fn test_cors_preflight_cache_fetch() {
};
let (mut server, url) = make_server(handler);
let origin = Origin::Origin(UrlOrigin::new_opaque());
let origin = Origin::Origin(ImmutableOrigin::new_opaque());
let mut request = Request::new(url.clone(), Some(origin.clone()), false, None);
*request.referrer.borrow_mut() = Referrer::NoReferrer;
request.use_cors_preflight = true;
@ -309,7 +308,7 @@ fn test_cors_preflight_fetch_network_error() {
};
let (mut server, url) = make_server(handler);
let origin = Origin::Origin(UrlOrigin::new_opaque());
let origin = Origin::Origin(ImmutableOrigin::new_opaque());
let mut request = Request::new(url, Some(origin), false, None);
*request.method.borrow_mut() = Method::Extension("CHICKEN".to_owned());
*request.referrer.borrow_mut() = Referrer::NoReferrer;
@ -378,7 +377,7 @@ fn test_fetch_response_is_cors_filtered() {
let (mut server, url) = make_server(handler);
// an origin mis-match will stop it from defaulting to a basic filtered response
let origin = Origin::Origin(UrlOrigin::new_opaque());
let origin = Origin::Origin(ImmutableOrigin::new_opaque());
let mut request = Request::new(url, Some(origin), false, None);
*request.referrer.borrow_mut() = Referrer::NoReferrer;
request.mode = RequestMode::CorsMode;
@ -410,7 +409,7 @@ fn test_fetch_response_is_opaque_filtered() {
let (mut server, url) = make_server(handler);
// an origin mis-match will fall through to an Opaque filtered response
let origin = Origin::Origin(UrlOrigin::new_opaque());
let origin = Origin::Origin(ImmutableOrigin::new_opaque());
let request = Request::new(url, Some(origin), false, None);
*request.referrer.borrow_mut() = Referrer::NoReferrer;
let fetch_response = fetch(request, None);
@ -800,7 +799,7 @@ fn test_opaque_filtered_fetch_async_returns_complete_response() {
let (mut server, url) = make_server(handler);
// an origin mis-match will fall through to an Opaque filtered response
let origin = Origin::Origin(UrlOrigin::new_opaque());
let origin = Origin::Origin(ImmutableOrigin::new_opaque());
let request = Request::new(url, Some(origin), false, None);
*request.referrer.borrow_mut() = Referrer::NoReferrer;

View file

@ -2,46 +2,45 @@
* 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/. */
use script::origin::Origin;
use servo_url::ServoUrl;
use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl};
#[test]
fn same_origin() {
let a = Origin::new(&ServoUrl::parse("http://example.com/a.html").unwrap());
let b = Origin::new(&ServoUrl::parse("http://example.com/b.html").unwrap());
let a = MutableOrigin::new(ServoUrl::parse("http://example.com/a.html").unwrap().origin());
let b = MutableOrigin::new(ServoUrl::parse("http://example.com/b.html").unwrap().origin());
assert!(a.same_origin(&b));
assert_eq!(a.is_scheme_host_port_tuple(), true);
assert_eq!(a.is_tuple(), true);
}
#[test]
fn identical_origin() {
let a = Origin::new(&ServoUrl::parse("http://example.com/a.html").unwrap());
let a = MutableOrigin::new(ServoUrl::parse("http://example.com/a.html").unwrap().origin());
assert!(a.same_origin(&a));
}
#[test]
fn cross_origin() {
let a = Origin::new(&ServoUrl::parse("http://example.com/a.html").unwrap());
let b = Origin::new(&ServoUrl::parse("http://example.org/b.html").unwrap());
let a = MutableOrigin::new(ServoUrl::parse("http://example.com/a.html").unwrap().origin());
let b = MutableOrigin::new(ServoUrl::parse("http://example.org/b.html").unwrap().origin());
assert!(!a.same_origin(&b));
}
#[test]
fn alias_same_origin() {
let a = Origin::new(&ServoUrl::parse("http://example.com/a.html").unwrap());
let b = Origin::new(&ServoUrl::parse("http://example.com/b.html").unwrap());
let c = b.alias();
fn clone_same_origin() {
let a = MutableOrigin::new(ServoUrl::parse("http://example.com/a.html").unwrap().origin());
let b = MutableOrigin::new(ServoUrl::parse("http://example.com/b.html").unwrap().origin());
let c = b.clone();
assert!(a.same_origin(&c));
assert!(b.same_origin(&b));
assert!(c.same_origin(&b));
assert_eq!(c.is_scheme_host_port_tuple(), true);
assert_eq!(c.is_tuple(), true);
}
#[test]
fn alias_cross_origin() {
let a = Origin::new(&ServoUrl::parse("http://example.com/a.html").unwrap());
let b = Origin::new(&ServoUrl::parse("http://example.org/b.html").unwrap());
let c = b.alias();
fn clone_cross_origin() {
let a = MutableOrigin::new(ServoUrl::parse("http://example.com/a.html").unwrap().origin());
let b = MutableOrigin::new(ServoUrl::parse("http://example.org/b.html").unwrap().origin());
let c = b.clone();
assert!(!a.same_origin(&c));
assert!(b.same_origin(&c));
assert!(c.same_origin(&c));
@ -49,16 +48,16 @@ fn alias_cross_origin() {
#[test]
fn opaque() {
let a = Origin::opaque_identifier();
let b = Origin::opaque_identifier();
let a = MutableOrigin::new(ImmutableOrigin::new_opaque());
let b = MutableOrigin::new(ImmutableOrigin::new_opaque());
assert!(!a.same_origin(&b));
assert_eq!(a.is_scheme_host_port_tuple(), false);
assert_eq!(a.is_tuple(), false);
}
#[test]
fn opaque_clone() {
let a = Origin::opaque_identifier();
let b = a.alias();
let a = MutableOrigin::new(ImmutableOrigin::new_opaque());
let b = a.clone();
assert!(a.same_origin(&b));
assert_eq!(a.is_scheme_host_port_tuple(), false);
assert_eq!(a.is_tuple(), false);
}