mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Implement window.frameElement, change window.parent to make use of it.
This commit is contained in:
parent
5436922169
commit
1e0e98b63c
10 changed files with 88 additions and 74 deletions
|
@ -11,6 +11,7 @@ use dom::bindings::proxyhandler::{get_property_descriptor, fill_property_descrip
|
|||
use dom::bindings::utils::{Reflectable, WindowProxyHandler};
|
||||
use dom::bindings::utils::get_array_index_from_id;
|
||||
use dom::document::{Document, DocumentHelpers};
|
||||
use dom::element::Element;
|
||||
use dom::window::Window;
|
||||
use dom::window::WindowHelpers;
|
||||
|
||||
|
@ -33,16 +34,16 @@ pub struct BrowserContext {
|
|||
history: Vec<SessionHistoryEntry>,
|
||||
active_index: uint,
|
||||
window_proxy: *mut JSObject,
|
||||
parent: Option<JS<Window>>,
|
||||
frame_element: Option<JS<Element>>,
|
||||
}
|
||||
|
||||
impl BrowserContext {
|
||||
pub fn new(document: JSRef<Document>, parent: Option<JSRef<Window>>) -> BrowserContext {
|
||||
pub fn new(document: JSRef<Document>, frame_element: Option<JSRef<Element>>) -> BrowserContext {
|
||||
let mut context = BrowserContext {
|
||||
history: vec!(SessionHistoryEntry::new(document)),
|
||||
active_index: 0,
|
||||
window_proxy: ptr::null_mut(),
|
||||
parent: parent.map(|p| JS::from_rooted(p)),
|
||||
frame_element: frame_element.map(JS::from_rooted),
|
||||
};
|
||||
context.create_window_proxy();
|
||||
context
|
||||
|
@ -57,17 +58,15 @@ impl BrowserContext {
|
|||
doc.r().window()
|
||||
}
|
||||
|
||||
pub fn frame_element(&self) -> Option<Temporary<Element>> {
|
||||
self.frame_element.map(Temporary::new)
|
||||
}
|
||||
|
||||
pub fn window_proxy(&self) -> *mut JSObject {
|
||||
assert!(!self.window_proxy.is_null());
|
||||
self.window_proxy
|
||||
}
|
||||
|
||||
pub fn parent(&self) -> Option<Temporary<Window>> {
|
||||
self.parent.map(|p| {
|
||||
p.root().r().browser_context().as_ref().unwrap().active_window()
|
||||
})
|
||||
}
|
||||
|
||||
#[allow(unsafe_blocks)]
|
||||
fn create_window_proxy(&mut self) {
|
||||
let win = self.active_window().root();
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
// attribute any opener;
|
||||
//readonly attribute WindowProxy parent;
|
||||
readonly attribute Window parent;
|
||||
//readonly attribute Element? frameElement;
|
||||
readonly attribute Element? frameElement;
|
||||
//WindowProxy open(optional DOMString url = "about:blank", optional DOMString target = "_blank", optional DOMString features = "", optional boolean replace = false);
|
||||
//getter WindowProxy (unsigned long index);
|
||||
//getter object (DOMString name);
|
||||
|
|
|
@ -18,9 +18,11 @@ use dom::bindings::utils::Reflectable;
|
|||
use dom::browsercontext::BrowserContext;
|
||||
use dom::console::Console;
|
||||
use dom::document::Document;
|
||||
use dom::element::Element;
|
||||
use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId};
|
||||
use dom::location::Location;
|
||||
use dom::navigator::Navigator;
|
||||
use dom::node::window_from_node;
|
||||
use dom::performance::Performance;
|
||||
use dom::screen::Screen;
|
||||
use dom::storage::Storage;
|
||||
|
@ -68,7 +70,7 @@ pub struct Window {
|
|||
navigation_start_precise: f64,
|
||||
screen: MutNullableJS<Screen>,
|
||||
session_storage: MutNullableJS<Storage>,
|
||||
timers: TimerManager
|
||||
timers: TimerManager,
|
||||
}
|
||||
|
||||
impl Window {
|
||||
|
@ -215,6 +217,10 @@ impl<'a> WindowMethods for JSRef<'a, Window> {
|
|||
self.console.or_init(|| Console::new(GlobalRef::Window(self)))
|
||||
}
|
||||
|
||||
fn GetFrameElement(self) -> Option<Temporary<Element>> {
|
||||
self.browser_context().as_ref().unwrap().frame_element()
|
||||
}
|
||||
|
||||
fn Navigator(self) -> Temporary<Navigator> {
|
||||
self.navigator.or_init(|| Navigator::new(self))
|
||||
}
|
||||
|
@ -278,7 +284,14 @@ impl<'a> WindowMethods for JSRef<'a, Window> {
|
|||
|
||||
// https://html.spec.whatwg.org/multipage/browsers.html#dom-parent
|
||||
fn Parent(self) -> Temporary<Window> {
|
||||
self.browser_context().as_ref().unwrap().parent().unwrap_or(self.Window())
|
||||
let browser_context = self.browser_context();
|
||||
let browser_context = browser_context.as_ref().unwrap();
|
||||
|
||||
browser_context.frame_element().map_or(self.Window(), |fe| {
|
||||
let frame_element = fe.root();
|
||||
let window = window_from_node(frame_element.r()).root();
|
||||
window.r().browser_context().as_ref().unwrap().active_window()
|
||||
})
|
||||
}
|
||||
|
||||
fn Performance(self) -> Temporary<Performance> {
|
||||
|
@ -318,7 +331,7 @@ impl<'a> WindowMethods for JSRef<'a, Window> {
|
|||
|
||||
pub trait WindowHelpers {
|
||||
fn flush_layout(self, goal: ReflowGoal, query: ReflowQueryType);
|
||||
fn init_browser_context(self, doc: JSRef<Document>, parent: Option<JSRef<Window>>);
|
||||
fn init_browser_context(self, doc: JSRef<Document>, frame_element: Option<JSRef<Element>>);
|
||||
fn load_url(self, href: DOMString);
|
||||
fn handle_fire_timer(self, timer_id: TimerId);
|
||||
fn IndexedGetter(self, _index: u32, _found: &mut bool) -> Option<Temporary<Window>>;
|
||||
|
@ -361,8 +374,8 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
|
|||
self.page().flush_layout(goal, query);
|
||||
}
|
||||
|
||||
fn init_browser_context(self, doc: JSRef<Document>, parent: Option<JSRef<Window>>) {
|
||||
*self.browser_context.borrow_mut() = Some(BrowserContext::new(doc, parent));
|
||||
fn init_browser_context(self, doc: JSRef<Document>, frame_element: Option<JSRef<Element>>) {
|
||||
*self.browser_context.borrow_mut() = Some(BrowserContext::new(doc, frame_element));
|
||||
}
|
||||
|
||||
/// Commence a new URL load which will either replace this window or scroll to a fragment.
|
||||
|
@ -413,7 +426,7 @@ impl Window {
|
|||
navigation_start_precise: time::precise_time_ns() as f64,
|
||||
screen: Default::default(),
|
||||
session_storage: Default::default(),
|
||||
timers: TimerManager::new()
|
||||
timers: TimerManager::new(),
|
||||
};
|
||||
|
||||
WindowBinding::Wrap(cx, win)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue