Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Embedding windowing #6016

Merged
merged 8 commits into from May 15, 2015

Some generated files are not rendered by default. Learn more.

Some generated files are not rendered by default. Learn more.

@@ -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<bool>,
/// 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<ServoBrowser>,
@@ -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();
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,13 +231,17 @@ 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();
browser.init(window_info);
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)
}}
}
@@ -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
}}
}
}

@@ -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;
@@ -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 {

Some generated files are not rendered by default. Learn more.

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.