Skip to content

Commit

Permalink
add Window module
Browse files Browse the repository at this point in the history
  • Loading branch information
d0iasm committed Jun 2, 2024
1 parent 8015eea commit 232e87d
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 31 deletions.
2 changes: 1 addition & 1 deletion core/src/constants.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! Constant variables.
//! Constant variables for UI.
pub static WHITE: u32 = 0xffffff;
pub static _RED: u32 = 0xff0000;
Expand Down
1 change: 1 addition & 0 deletions core/src/renderer/dom/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
pub mod activation_behavior;
pub mod api;
pub mod event;
pub mod window;
41 changes: 41 additions & 0 deletions core/src/renderer/dom/window.rs
Original file line number Diff line number Diff line change
@@ -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<RefCell<Browser>>,
_page: Weak<RefCell<Page>>,
pub document: Rc<RefCell<Node>>,
}

impl Window {
pub fn new(browser: Weak<RefCell<Browser>>) -> 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<RefCell<Node>> {
self.document.clone()
}
}
32 changes: 5 additions & 27 deletions core/src/renderer/html/dom.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand All @@ -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<RefCell<Browser>>,
_page: Weak<RefCell<Page>>,
document: Rc<RefCell<Node>>,
}

impl Window {
pub fn new(browser: Weak<RefCell<Browser>>) -> 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<RefCell<Node>> {
self.document.clone()
}
}

#[derive(Debug, Clone)]
/// https://dom.spec.whatwg.org/#interface-node
pub struct Node {
Expand Down Expand Up @@ -82,6 +56,10 @@ impl Node {
self.kind.clone()
}

pub fn set_window(&mut self, window: Weak<RefCell<Window>>) {
self.window = window;
}

pub fn get_window(&self) -> Weak<RefCell<Window>> {
if self.window.upgrade().is_some() {
return self.window.clone();
Expand Down
9 changes: 6 additions & 3 deletions core/src/renderer/page.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -45,6 +47,7 @@ impl Subresource {
pub struct Page {
browser: Weak<RefCell<Browser>>,
url: Option<String>,
/// 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<Rc<RefCell<Window>>>,
style: Option<StyleSheet>,
layout_view: Option<LayoutView>,
Expand Down

0 comments on commit 232e87d

Please sign in to comment.