From 17390e75ece0afafdffc0fb4df4040b696a02c6f Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 8 May 2015 21:53:26 -0400 Subject: [PATCH 1/8] fix embedding rendering when using a child window compositing must be initialized automatically in this case --- ports/cef/browser.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs index 90e13801bec..d533b526026 100644 --- a/ports/cef/browser.rs +++ b/ports/cef/browser.rs @@ -137,6 +137,9 @@ impl ServoCefBrowserExtensions for CefBrowser { self.downcast().host.set_browser((*self).clone()); self.downcast().frame.set_browser((*self).clone()); + if window_info.parent_window != 0 { + self.downcast().host.initialize_compositing(); + } } fn send_window_event(&self, event: WindowEvent) { From 49d91a5606d2ec604ed0b3977a33460cf2ef3537 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 8 May 2015 22:06:32 -0400 Subject: [PATCH 2/8] fix async browser on_created callback broken since 3bf779cd21f42f488c6590d681b61f860e635692 --- ports/cef/browser.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs index d533b526026..876e773712e 100644 --- a/ports/cef/browser.rs +++ b/ports/cef/browser.rs @@ -176,6 +176,9 @@ impl ServoCefBrowserExtensions for CefBrowser { 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); } }); From 797aa364843869e5a4b780ad5e06241682a2625b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 8 May 2015 22:58:43 -0400 Subject: [PATCH 3/8] implement cef_browser_t::get_identifier() --- ports/cef/browser.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs index 876e773712e..0bc3035917e 100644 --- a/ports/cef/browser.rs +++ b/ports/cef/browser.rs @@ -72,6 +72,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 + }} } } From 28968023ba08d50313cb243aff8d30d92832301f Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 8 May 2015 22:59:07 -0400 Subject: [PATCH 4/8] load passed url when creating cef_browser --- ports/cef/browser.rs | 16 ++++++++++------ ports/cef/core.rs | 4 +--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs index 0bc3035917e..2df1357762e 100644 --- a/ports/cef/browser.rs +++ b/ports/cef/browser.rs @@ -11,12 +11,14 @@ use interfaces::{cef_request_context_t}; use servo::Browser; use types::{cef_browser_settings_t, cef_string_t, cef_window_info_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)); @@ -211,6 +213,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(); @@ -218,6 +221,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()); }); @@ -227,27 +233,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/core.rs b/ports/cef/core.rs index 02f884e3c71..3c3df0599f7 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")] @@ -71,7 +70,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; From c1d6d6fe1c777e95e4fd8f59a234e8a68373cbdb Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 11 May 2015 21:17:29 -0400 Subject: [PATCH 5/8] implement cef_browser_host_t::get_browser() method --- ports/cef/browser_host.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ports/cef/browser_host.rs b/ports/cef/browser_host.rs index 96804c770b5..67939d1d74f 100644 --- a/ports/cef/browser_host.rs +++ b/ports/cef/browser_host.rs @@ -3,7 +3,7 @@ * 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 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}; 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(); From 4513d45c04b392a7b5205fe7645f8fcbb3b50d8f Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 11 May 2015 21:18:42 -0400 Subject: [PATCH 6/8] implement cef_browser_host_t::get_window_handle() --- ports/cef/browser.rs | 11 ++++++++++- ports/cef/browser_host.rs | 8 +++++++- ports/glutin/window.rs | 4 ++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs index 2df1357762e..206b2e2f92a 100644 --- a/ports/cef/browser.rs +++ b/ports/cef/browser.rs @@ -9,7 +9,7 @@ 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; @@ -90,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, @@ -100,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 = 0; let servo_browser = if window_info.windowless_rendering_enabled == 0 { let glutin_window = glutin_app::create_window(); 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 @@ -121,6 +125,7 @@ impl ServoCefBrowser { servo_browser: RefCell::new(servo_browser), message_queue: RefCell::new(vec!()), id: id, + window_handle: window_handle, } } } @@ -199,6 +204,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 diff --git a/ports/cef/browser_host.rs b/ports/cef/browser_host.rs index 67939d1d74f..412fd51f3da 100644 --- a/ports/cef/browser_host.rs +++ b/ports/cef/browser_host.rs @@ -4,7 +4,7 @@ use eutil::Downcast; 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}; +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}; @@ -164,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/glutin/window.rs b/ports/glutin/window.rs index 48a1c9b61c9..98c9ed1f4c2 100644 --- a/ports/glutin/window.rs +++ b/ports/glutin/window.rs @@ -105,6 +105,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 { From 6c32998100404d1f35bba2665043fc9be9065ba1 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 13 May 2015 17:13:36 -0400 Subject: [PATCH 7/8] update rust-layers version --- components/servo/Cargo.lock | 2 +- ports/cef/Cargo.lock | 2 +- ports/gonk/Cargo.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 9af6b01feba..a810532632f 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -603,7 +603,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 9c2a4d368d9..a962595a3ac 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -605,7 +605,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/gonk/Cargo.lock b/ports/gonk/Cargo.lock index 6c4d3d750e0..4caaf0c594a 100644 --- a/ports/gonk/Cargo.lock +++ b/ports/gonk/Cargo.lock @@ -503,7 +503,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)", From 6f6945aafc3e6bc43873a1c949592bebd25ec0dd Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 13 May 2015 22:18:54 -0400 Subject: [PATCH 8/8] try fixing macos embedding build --- ports/cef/browser.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs index 206b2e2f92a..f526578a2e8 100644 --- a/ports/cef/browser.rs +++ b/ports/cef/browser.rs @@ -102,7 +102,7 @@ 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 = 0; + 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(); @@ -148,7 +148,7 @@ impl ServoCefBrowserExtensions for CefBrowser { self.downcast().host.set_browser((*self).clone()); self.downcast().frame.set_browser((*self).clone()); - if window_info.parent_window != 0 { + if window_info.windowless_rendering_enabled == 0 { self.downcast().host.initialize_compositing(); } } @@ -184,6 +184,15 @@ 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() {