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