diff --git a/core/src/constants.rs b/core/src/constants.rs index 23c70b8..954a52d 100644 --- a/core/src/constants.rs +++ b/core/src/constants.rs @@ -1,4 +1,4 @@ -//! Constant variables. +//! Constant variables for UI. pub static WHITE: u32 = 0xffffff; pub static _RED: u32 = 0xff0000; diff --git a/core/src/renderer/dom/mod.rs b/core/src/renderer/dom/mod.rs index 128ecfd..1f70a6c 100644 --- a/core/src/renderer/dom/mod.rs +++ b/core/src/renderer/dom/mod.rs @@ -4,3 +4,4 @@ pub mod activation_behavior; pub mod api; pub mod event; +pub mod window; diff --git a/core/src/renderer/dom/window.rs b/core/src/renderer/dom/window.rs new file mode 100644 index 0000000..898426e --- /dev/null +++ b/core/src/renderer/dom/window.rs @@ -0,0 +1,41 @@ +//! This is a DOM Window object. +//! https://html.spec.whatwg.org/multipage/nav-history-apis.html#window + +use crate::browser::Browser; +use crate::renderer::html::dom::Node; +use crate::renderer::html::dom::NodeKind; +use crate::renderer::page::Page; +use alloc::rc::Rc; +use alloc::rc::Weak; +use core::cell::RefCell; + +/// https://html.spec.whatwg.org/multipage/nav-history-apis.html#window +/// +/// https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/dom_window.h +#[derive(Debug, Clone)] +pub struct Window { + _browser: Weak>, + _page: Weak>, + pub document: Rc>, +} + +impl Window { + pub fn new(browser: Weak>) -> Self { + let window = Self { + _browser: browser, + _page: Weak::new(), + document: Rc::new(RefCell::new(Node::new(NodeKind::Document))), + }; + + window + .document + .borrow_mut() + .set_window(Rc::downgrade(&Rc::new(RefCell::new(window.clone())))); + + window + } + + pub fn document(&self) -> Rc> { + self.document.clone() + } +} diff --git a/core/src/renderer/html/dom.rs b/core/src/renderer/html/dom.rs index 4fe697e..d0f5dfc 100644 --- a/core/src/renderer/html/dom.rs +++ b/core/src/renderer/html/dom.rs @@ -8,9 +8,9 @@ use crate::renderer::dom::event::Event; use crate::renderer::dom::event::EventListener; use crate::renderer::dom::event::EventListenerCallback; use crate::renderer::dom::event::EventTarget; +use crate::renderer::dom::window::Window; use crate::renderer::html::attribute::Attribute; use crate::renderer::html::token::{HtmlToken, HtmlTokenizer, State}; -use crate::renderer::page::Page; use crate::utils::console_warning; use alloc::format; use alloc::rc::{Rc, Weak}; @@ -20,32 +20,6 @@ use core::cell::RefCell; use core::fmt::{Display, Formatter}; use core::str::FromStr; -#[derive(Debug, Clone)] -/// https://html.spec.whatwg.org/multipage/nav-history-apis.html#window -pub struct Window { - _browser: Weak>, - _page: Weak>, - document: Rc>, -} - -impl Window { - pub fn new(browser: Weak>) -> Self { - let window = Self { - _browser: browser, - _page: Weak::new(), - document: Rc::new(RefCell::new(Node::new(NodeKind::Document))), - }; - - window.document.borrow_mut().window = Rc::downgrade(&Rc::new(RefCell::new(window.clone()))); - - window - } - - pub fn document(&self) -> Rc> { - self.document.clone() - } -} - #[derive(Debug, Clone)] /// https://dom.spec.whatwg.org/#interface-node pub struct Node { @@ -82,6 +56,10 @@ impl Node { self.kind.clone() } + pub fn set_window(&mut self, window: Weak>) { + self.window = window; + } + pub fn get_window(&self) -> Weak> { if self.window.upgrade().is_some() { return self.window.clone(); diff --git a/core/src/renderer/page.rs b/core/src/renderer/page.rs index 1940b2b..c008aff 100644 --- a/core/src/renderer/page.rs +++ b/core/src/renderer/page.rs @@ -1,7 +1,9 @@ //! This is corresponding to a page. //! -//! https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/ -//! https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/local_frame_view.h +//! In Chromium, a page can contain multiple frames (iframe, etc.), but this browser has one frame per page. This module implements a subset of Page and Frame. +//! https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/page/page.h +//! https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/frame.h +//! https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/local_frame.h use crate::alloc::string::ToString; use crate::browser::Browser; @@ -11,8 +13,8 @@ use crate::renderer::css::cssom::CssParser; use crate::renderer::css::cssom::StyleSheet; use crate::renderer::css::token::CssTokenizer; use crate::renderer::dom::api::{get_js_content, get_style_content}; +use crate::renderer::dom::window::Window; use crate::renderer::html::dom::HtmlParser; -use crate::renderer::html::dom::Window; use crate::renderer::html::html_builder::dom_to_html; use crate::renderer::html::token::HtmlTokenizer; use crate::renderer::js::ast::JsParser; @@ -45,6 +47,7 @@ impl Subresource { pub struct Page { browser: Weak>, url: Option, + /// https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/frame.h;drc=ac83a5a2d3c04763d86ce16d92f3904cc9566d3a;bpv=1;bpt=1;l=505 window: Option>>, style: Option, layout_view: Option,