/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use browser::ServoCefBrowserExtensions; use eutil::Downcast; use interfaces::{CefBrowser, CefFrame, CefStringVisitor, cef_frame_t, cef_string_visitor_t}; use types::{cef_string_t, cef_string_userfree_t}; use compositing::windowing::WindowEvent; use servo::servo_url::ServoUrl; use std::cell::RefCell; pub struct ServoCefFrame { pub url: RefCell, pub title: RefCell>, /// A reference to the browser. pub browser: RefCell>, } impl ServoCefFrame { pub fn new() -> ServoCefFrame { ServoCefFrame { url: RefCell::new(String::new()), title: RefCell::new(vec![]), browser: RefCell::new(None), } } } full_cef_class_impl! { ServoCefFrame : CefFrame, cef_frame_t { fn load_url(&this, url: *const cef_string_t [&[u16]],) -> () {{ let this = this.downcast(); let url = String::from_utf16(url).unwrap(); *this.url.borrow_mut() = url.clone(); let id = this.browser.borrow().as_ref().unwrap().get_browser_id(); let url = ServoUrl::parse(&url).or(ServoUrl::parse("about:blank")).unwrap(); let event = WindowEvent::LoadUrl(id, url); this.browser.borrow_mut().as_mut().unwrap().send_window_event(event); }} fn get_url(&this,) -> cef_string_userfree_t {{ // FIXME(https://github.com/rust-lang/rust/issues/23338) let url = this.downcast().url.borrow(); (*url).clone() }} fn get_text(&this, visitor: *mut cef_string_visitor_t [CefStringVisitor],) -> () {{ let this = this.downcast(); let str = &*this.title.borrow(); visitor.visit(str) }} } } pub trait ServoCefFrameExtensions { fn set_browser(&self, browser: CefBrowser); fn load(&self); } impl ServoCefFrameExtensions for CefFrame { fn set_browser(&self, browser: CefBrowser) { *self.downcast().browser.borrow_mut() = Some(browser) } fn load(&self) { let id = self.downcast().browser.borrow().as_ref().unwrap().get_browser_id(); let url = self.downcast().url.borrow(); let url = ServoUrl::parse(&*url).or(ServoUrl::parse("about:blank")).unwrap(); let event = WindowEvent::LoadUrl(id, url); self.downcast().browser.borrow_mut().as_mut().unwrap().send_window_event(event); } }