diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 4c48122f79e..3202bcf3859 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -623,7 +623,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "layers" version = "0.1.0" -source = "git+https://github.com/servo/rust-layers#018259e838c3842032010829feeaba316e577376" +source = "git+https://github.com/servo/rust-layers#ff65707d621498949ed428077da7e42a9f9d2745" dependencies = [ "azure 0.1.0 (git+https://github.com/servo/rust-azure)", "cgl 0.0.1 (git+https://github.com/servo/rust-cgl)", diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index 6d264c1307a..ce8b96337e1 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -625,7 +625,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "layers" version = "0.1.0" -source = "git+https://github.com/servo/rust-layers#018259e838c3842032010829feeaba316e577376" +source = "git+https://github.com/servo/rust-layers#ff65707d621498949ed428077da7e42a9f9d2745" dependencies = [ "azure 0.1.0 (git+https://github.com/servo/rust-azure)", "cgl 0.0.1 (git+https://github.com/servo/rust-cgl)", diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs index 58b3a8b1919..1e2d722cfc8 100644 --- a/ports/cef/browser.rs +++ b/ports/cef/browser.rs @@ -9,14 +9,16 @@ use interfaces::{CefBrowser, CefBrowserHost, CefClient, CefFrame, CefRequestCont use interfaces::{cef_browser_t, cef_browser_host_t, cef_client_t, cef_frame_t}; use interfaces::{cef_request_context_t}; use servo::Browser; -use types::{cef_browser_settings_t, cef_string_t, cef_window_info_t}; +use types::{cef_browser_settings_t, cef_string_t, cef_window_info_t, cef_window_handle_t}; use window; +use wrappers::CefWrap; use compositing::windowing::{WindowNavigateMsg, WindowEvent}; use glutin_app; use libc::c_int; use std::borrow::ToOwned; use std::cell::{Cell, RefCell, BorrowState}; +use std::ptr; use std::sync::atomic::{AtomicIsize, Ordering}; thread_local!(pub static ID_COUNTER: AtomicIsize = AtomicIsize::new(0)); @@ -72,6 +74,10 @@ cef_class_impl! { fn get_main_frame(&this,) -> *mut cef_frame_t {{ this.downcast().frame.clone() }} + + fn get_identifier(&this,) -> c_int {{ + this.downcast().id as c_int + }} } } @@ -84,6 +90,8 @@ pub struct ServoCefBrowser { pub client: CefClient, /// Whether the on-created callback has fired yet. pub callback_executed: Cell, + /// the display system window handle: only to be used with host.get_window_handle() + window_handle: cef_window_handle_t, id: isize, servo_browser: RefCell, @@ -94,10 +102,12 @@ impl ServoCefBrowser { pub fn new(window_info: &cef_window_info_t, client: CefClient) -> ServoCefBrowser { let frame = ServoCefFrame::new().as_cef_interface(); let host = ServoCefBrowserHost::new(client.clone()).as_cef_interface(); + let mut window_handle: cef_window_handle_t = get_null_window_handle(); let servo_browser = if window_info.windowless_rendering_enabled == 0 { let glutin_window = glutin_app::create_window(window_info.parent_window as glutin_app::WindowID); let servo_browser = Browser::new(Some(glutin_window.clone())); + window_handle = glutin_window.platform_window() as cef_window_handle_t; ServoBrowser::OnScreen(servo_browser) } else { ServoBrowser::Invalid @@ -115,6 +125,7 @@ impl ServoCefBrowser { servo_browser: RefCell::new(servo_browser), message_queue: RefCell::new(vec!()), id: id, + window_handle: window_handle, } } } @@ -137,6 +148,9 @@ impl ServoCefBrowserExtensions for CefBrowser { self.downcast().host.set_browser((*self).clone()); self.downcast().frame.set_browser((*self).clone()); + if window_info.windowless_rendering_enabled == 0 { + self.downcast().host.initialize_compositing(); + } } fn send_window_event(&self, event: WindowEvent) { @@ -170,9 +184,21 @@ impl ServoCefBrowserExtensions for CefBrowser { } } +#[cfg(target_os="macos")] +pub fn get_null_window_handle() -> cef_window_handle_t { + ptr::null_mut() +} +#[cfg(target_os="linux")] +pub fn get_null_window_handle() -> cef_window_handle_t { + 0 +} + pub fn update() { BROWSERS.with(|browsers| { for browser in browsers.borrow().iter() { + if browser.downcast().callback_executed.get() == false { + browser_callback_after_created(browser.clone()); + } browser.send_window_event(WindowEvent::Idle); } }); @@ -187,6 +213,10 @@ pub fn close(browser: CefBrowser) { }); } +pub fn get_window(browser: &CefBrowser) -> cef_window_handle_t { + browser.downcast().window_handle +} + pub fn browser_callback_after_created(browser: CefBrowser) { if browser.downcast().client.is_null_cef_object() { return @@ -201,6 +231,7 @@ pub fn browser_callback_after_created(browser: CefBrowser) { fn browser_host_create(window_info: &cef_window_info_t, client: CefClient, + url: *const cef_string_t, callback_executed: bool) -> CefBrowser { let browser = ServoCefBrowser::new(window_info, client).as_cef_interface(); @@ -208,6 +239,9 @@ fn browser_host_create(window_info: &cef_window_info_t, if callback_executed { browser_callback_after_created(browser.clone()); } + if url != ptr::null() { + unsafe { browser.downcast().frame.load_url(CefWrap::to_rust(url)); } + } BROWSERS.with(|browsers| { browsers.borrow_mut().push(browser.clone()); }); @@ -217,27 +251,25 @@ fn browser_host_create(window_info: &cef_window_info_t, cef_static_method_impls! { fn cef_browser_host_create_browser(window_info: *const cef_window_info_t, client: *mut cef_client_t, - _url: *const cef_string_t, + url: *const cef_string_t, _browser_settings: *const cef_browser_settings_t, _request_context: *mut cef_request_context_t) -> c_int {{ let client: CefClient = client; - let _url: &[u16] = _url; let _browser_settings: &cef_browser_settings_t = _browser_settings; let _request_context: CefRequestContext = _request_context; - browser_host_create(window_info, client, false); + browser_host_create(window_info, client, url, false); 1i32 }} fn cef_browser_host_create_browser_sync(window_info: *const cef_window_info_t, client: *mut cef_client_t, - _url: *const cef_string_t, + url: *const cef_string_t, _browser_settings: *const cef_browser_settings_t, _request_context: *mut cef_request_context_t) -> *mut cef_browser_t {{ let client: CefClient = client; - let _url: &[u16] = _url; let _browser_settings: &cef_browser_settings_t = _browser_settings; let _request_context: CefRequestContext = _request_context; - browser_host_create(window_info, client, true) + browser_host_create(window_info, client, url, true) }} } diff --git a/ports/cef/browser_host.rs b/ports/cef/browser_host.rs index 96804c770b5..412fd51f3da 100644 --- a/ports/cef/browser_host.rs +++ b/ports/cef/browser_host.rs @@ -3,8 +3,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use eutil::Downcast; -use interfaces::{CefBrowser, CefBrowserHost, CefClient, cef_browser_host_t, cef_client_t}; -use types::{cef_mouse_button_type_t, cef_mouse_event, cef_rect_t, cef_key_event}; +use interfaces::{CefBrowser, CefBrowserHost, CefClient, cef_browser_t, cef_browser_host_t, cef_client_t}; +use types::{cef_mouse_button_type_t, cef_mouse_event, cef_rect_t, cef_key_event, cef_window_handle_t}; use types::cef_key_event_type_t::{KEYEVENT_CHAR, KEYEVENT_KEYDOWN, KEYEVENT_KEYUP, KEYEVENT_RAWKEYDOWN}; use browser::{self, ServoCefBrowserExtensions}; @@ -28,6 +28,10 @@ full_cef_class_impl! { fn get_client(&this,) -> *mut cef_client_t {{ this.downcast().client.clone() }} + fn get_browser(&this,) -> *mut cef_browser_t {{ + let browser = this.downcast().browser.borrow_mut(); + browser.clone().unwrap() + }} fn was_resized(&this,) -> () {{ let mut rect = cef_rect_t::zero(); @@ -160,6 +164,12 @@ full_cef_class_impl! { fn initialize_compositing(&this,) -> () {{ this.downcast().send_window_event(WindowEvent::InitializeCompositing); }} + + fn get_window_handle(&this,) -> cef_window_handle_t {{ + let t = this.downcast(); + let browser = t.browser.borrow(); + browser::get_window(&browser.as_ref().unwrap()) as cef_window_handle_t + }} } } diff --git a/ports/cef/core.rs b/ports/cef/core.rs index c3b16cf9a50..a0c790d0360 100644 --- a/ports/cef/core.rs +++ b/ports/cef/core.rs @@ -16,8 +16,7 @@ use std_url::Url; const MAX_RENDERING_THREADS: usize = 128; -// TODO(pcwalton): Get the home page via the CEF API. -static HOME_URL: &'static str = "http://s27.postimg.org/vqbtrolyr/servo.jpg"; +//static HOME_URL: &'static str = "http://s27.postimg.org/vqbtrolyr/servo.jpg"; static CEF_API_HASH_UNIVERSAL: &'static [u8] = b"8efd129f4afc344bd04b2feb7f73a149b6c4e27f\0"; #[cfg(target_os="windows")] @@ -62,7 +61,6 @@ pub extern "C" fn cef_initialize(args: *const cef_main_args_t, }; let mut temp_opts = opts::default_opts(); - temp_opts.url = Url::parse(HOME_URL).unwrap(); temp_opts.paint_threads = rendering_threads; temp_opts.layout_threads = rendering_threads; temp_opts.headless = false; diff --git a/ports/glutin/window.rs b/ports/glutin/window.rs index a3c1bb0eb1a..75746349ec2 100644 --- a/ports/glutin/window.rs +++ b/ports/glutin/window.rs @@ -101,6 +101,10 @@ impl Window { Rc::new(window) } + pub fn platform_window(&self) -> glutin::WindowID { + unsafe { self.window.platform_window() } + } + fn nested_window_resize(width: u32, height: u32) { unsafe { match g_nested_event_loop_listener { diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock index 01ef555ec5b..0a272d5fd01 100644 --- a/ports/gonk/Cargo.lock +++ b/ports/gonk/Cargo.lock @@ -523,7 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "layers" version = "0.1.0" -source = "git+https://github.com/servo/rust-layers#018259e838c3842032010829feeaba316e577376" +source = "git+https://github.com/servo/rust-layers#ff65707d621498949ed428077da7e42a9f9d2745" dependencies = [ "azure 0.1.0 (git+https://github.com/servo/rust-azure)", "cgl 0.0.1 (git+https://github.com/servo/rust-cgl)",