1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 use dom::bindings::codegen::Bindings::DissimilarOriginLocationBinding;
6 use dom::bindings::codegen::Bindings::DissimilarOriginLocationBinding::DissimilarOriginLocationMethods;
7 use dom::bindings::error::{Error, ErrorResult, Fallible};
8 use dom::bindings::reflector::Reflector;
9 use dom::bindings::reflector::reflect_dom_object;
10 use dom::bindings::root::{Dom, DomRoot};
11 use dom::bindings::str::DOMString;
12 use dom::bindings::str::USVString;
13 use dom::dissimilaroriginwindow::DissimilarOriginWindow;
14 use dom_struct::dom_struct;
15 use servo_url::MutableOrigin;
16 
17 /// Represents a dissimilar-origin `Location` that exists in another script thread.
18 ///
19 /// Since the `Location` is in a different script thread, we cannot access it
20 /// directly, but some of its accessors (for example setting `location.href`)
21 /// still need to function.
22 
23 #[dom_struct]
24 pub struct DissimilarOriginLocation {
25     /// The reflector. Once we have XOWs, this will have a cross-origin
26     /// wrapper placed around it.
27     reflector: Reflector,
28 
29     /// The window associated with this location.
30     window: Dom<DissimilarOriginWindow>,
31 }
32 
33 impl DissimilarOriginLocation {
34     #[allow(unrooted_must_root)]
new_inherited(window: &DissimilarOriginWindow) -> DissimilarOriginLocation35     fn new_inherited(window: &DissimilarOriginWindow) -> DissimilarOriginLocation {
36         DissimilarOriginLocation {
37             reflector: Reflector::new(),
38             window: Dom::from_ref(window),
39         }
40     }
41 
new(window: &DissimilarOriginWindow) -> DomRoot<DissimilarOriginLocation>42     pub fn new(window: &DissimilarOriginWindow) -> DomRoot<DissimilarOriginLocation> {
43         reflect_dom_object(Box::new(DissimilarOriginLocation::new_inherited(window)),
44                            window,
45                            DissimilarOriginLocationBinding::Wrap)
46     }
47 
48     #[allow(dead_code)]
origin(&self) -> &MutableOrigin49     pub fn origin(&self) -> &MutableOrigin {
50         self.window.origin()
51     }
52 }
53 
54 impl DissimilarOriginLocationMethods for DissimilarOriginLocation {
55     // https://html.spec.whatwg.org/multipage/#dom-location-href
GetHref(&self) -> Fallible<USVString>56     fn GetHref(&self) -> Fallible<USVString> {
57         Err(Error::Security)
58     }
59 
60     // https://html.spec.whatwg.org/multipage/#dom-location-href
SetHref(&self, _: USVString) -> ErrorResult61     fn SetHref(&self, _: USVString) -> ErrorResult {
62         // TODO: setting href on a cross-origin window should succeed?
63         Err(Error::Security)
64     }
65 
66     // https://html.spec.whatwg.org/multipage/#dom-location-assign
Assign(&self, _: USVString) -> Fallible<()>67     fn Assign(&self, _: USVString) -> Fallible<()> {
68         // TODO: setting href on a cross-origin window should succeed?
69         Err(Error::Security)
70     }
71 
72     // https://html.spec.whatwg.org/multipage/#dom-location-replace
Replace(&self, _: USVString) -> Fallible<()>73     fn Replace(&self, _: USVString) -> Fallible<()> {
74         // TODO: replacing href on a cross-origin window should succeed?
75         Err(Error::Security)
76     }
77 
78     // https://html.spec.whatwg.org/multipage/#dom-location-reload
Reload(&self) -> Fallible<()>79     fn Reload(&self) -> Fallible<()> {
80         Err(Error::Security)
81     }
82 
83     // https://html.spec.whatwg.org/multipage/#dom-location-href
Stringifier(&self) -> Fallible<DOMString>84     fn Stringifier(&self) -> Fallible<DOMString> {
85         Err(Error::Security)
86     }
87 }
88