diff options
author | Mike Blumenkrantz <zmike@osg.samsung.com> | 2014-11-19 22:48:32 -0500 |
---|---|---|
committer | Mike Blumenkrantz <zmike@osg.samsung.com> | 2014-11-21 21:54:09 -0500 |
commit | 8aceb59824b867ba371df6720efa02d84d142c34 (patch) | |
tree | 1f8f9cb55759dd6dc1e35c600ed919d94d309abe | |
parent | 0341444ce9f1f4154efd41c8e7250b812bb04056 (diff) | |
download | servo-8aceb59824b867ba371df6720efa02d84d142c34.tar.gz servo-8aceb59824b867ba371df6720efa02d84d142c34.zip |
embedding: redo browser creation and message loop code to be more CEF-like
big thanks to @alexcrichton for his help with this
-rw-r--r-- | ports/cef/browser.rs | 96 | ||||
-rw-r--r-- | ports/cef/core.rs | 59 | ||||
-rw-r--r-- | ports/cef/lib.rs | 1 |
3 files changed, 107 insertions, 49 deletions
diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs index 4f1c71a26fb..33432846ab0 100644 --- a/ports/cef/browser.rs +++ b/ports/cef/browser.rs @@ -2,30 +2,104 @@ * 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 compositing::windowing::{WindowMethods}; +use geom::size::TypedSize2D; +use glfw_app; use libc::{calloc, size_t,c_int}; +use servo::Browser; +use servo_util::opts; +use servo_util::opts::OpenGL; +use std::cell::RefCell; use std::mem; +use std::rc::Rc; +use std::string; use types::{cef_browser_settings_t, cef_browser_t, cef_client_t, cef_request_context_t, cef_string_t, cef_window_info_t}; +pub type servo_browser_t = servo_browser; +pub struct servo_browser { + pub browser: cef_browser_t, + pub servo_browser: Option<Browser<glfw_app::window::Window>>, + pub window: Rc<glfw_app::window::Window>, + pub running: bool +} + +local_data_key!(pub GLOBAL_BROWSERS: RefCell<Vec<*mut servo_browser_t>>) + #[no_mangle] -pub extern "C" fn cef_browser_host_create_browser(_window_info: *const cef_window_info_t, - _client: *mut cef_client_t, - _url: *const cef_string_t, - _settings: *const cef_browser_settings_t, - _request_context: *mut cef_request_context_t) +pub extern "C" fn cef_browser_host_create_browser(window_info: *const cef_window_info_t, + client: *mut cef_client_t, + url: *const cef_string_t, + settings: *const cef_browser_settings_t, + request_context: *mut cef_request_context_t) -> c_int { - 0 + cef_browser_host_create_browser_sync(window_info, client, url, settings, request_context); + 1 } #[no_mangle] pub extern "C" fn cef_browser_host_create_browser_sync(_window_info: *const cef_window_info_t, - _client: *mut cef_client_t, - _url: *const cef_string_t, + client: *mut cef_client_t, + url: *const cef_string_t, _settings: *const cef_browser_settings_t, _request_context: *mut cef_request_context_t) -> *mut cef_browser_t { unsafe { - let browser = calloc(1, mem::size_of::<cef_browser_t>() as size_t) as *mut cef_browser_t; - browser + let mut urls = Vec::new(); + if url.is_null() || (*url).str.is_null() { + urls.push("http://s27.postimg.org/vqbtrolyr/servo.jpg".to_string()); + } + else { + urls.push(string::raw::from_buf((*url).str as *const u8)); + } + opts::set_opts(opts::Opts { + urls: urls, + n_render_threads: 1, + gpu_painting: false, + tile_size: 512, + device_pixels_per_px: None, + time_profiler_period: None, + memory_profiler_period: None, + enable_experimental: false, + layout_threads: 1, + nonincremental_layout: false, + //layout_threads: cmp::max(rt::default_sched_threads() * 3 / 4, 1), + exit_after_load: false, + output_file: None, + headless: false, + hard_fail: false, + bubble_inline_sizes_separately: false, + show_debug_borders: false, + show_debug_fragment_borders: false, + enable_text_antialiasing: true, + trace_layout: false, + devtools_port: None, + initial_window_size: TypedSize2D(800, 600), + profile_tasks: false, + user_agent: None, + dump_flow_tree: false, + validate_display_list_geometry: false, + render_api: OpenGL, + }); + let browser = calloc(1, mem::size_of::<servo_browser_t>() as size_t) as *mut servo_browser_t; + (*browser).browser.base.size = mem::size_of::<cef_browser_t>() as size_t; + if client.is_not_null() { + (*client).get_life_span_handler.map(|cb| { + let handler = cb(client); + if handler.is_not_null() { + (*handler).on_after_created.map(|createcb| createcb(handler, mem::transmute(browser))); + } + }); + } + match GLOBAL_BROWSERS.replace(None) { + Some(brs) => { + brs.borrow_mut().push(browser); + GLOBAL_BROWSERS.replace(Some(brs)); + }, + None => { + let brs = RefCell::new(vec!(browser)); + GLOBAL_BROWSERS.replace(Some(brs)); + } + } + mem::transmute(browser) } } diff --git a/ports/cef/core.rs b/ports/cef/core.rs index 62abedd4054..5dc5f805962 100644 --- a/ports/cef/core.rs +++ b/ports/cef/core.rs @@ -2,16 +2,13 @@ * 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::{GLOBAL_BROWSERS, browser_callback_after_created}; use command_line::command_line_init; -use geom::size::TypedSize2D; use glfw_app; use libc::funcs::c95::string::strlen; use libc::{c_int, c_void}; use native; use servo::Browser; -use servo_util::opts; -use servo_util::opts::OpenGL; use std::slice; use switches::{KPROCESSTYPE, KWAITFORDEBUGGER}; use types::{cef_app_t, cef_main_args_t, cef_settings_t}; @@ -43,41 +40,27 @@ pub extern "C" fn cef_shutdown() { #[no_mangle] pub extern "C" fn cef_run_message_loop() { - let mut urls = Vec::new(); - urls.push("http://s27.postimg.org/vqbtrolyr/servo.jpg".to_string()); - opts::set_opts(opts::Opts { - urls: urls, - n_render_threads: 1, - gpu_painting: false, - tile_size: 512, - device_pixels_per_px: None, - time_profiler_period: None, - memory_profiler_period: None, - enable_experimental: false, - layout_threads: 1, - nonincremental_layout: false, - //layout_threads: cmp::max(rt::default_sched_threads() * 3 / 4, 1), - output_file: None, - headless: false, - hard_fail: false, - bubble_inline_sizes_separately: false, - show_debug_borders: false, - show_debug_fragment_borders: false, - enable_text_antialiasing: true, - trace_layout: false, - devtools_port: None, - initial_window_size: TypedSize2D(800, 600), - profile_tasks: false, - user_agent: None, - dump_flow_tree: false, - validate_display_list_geometry: false, - render_api: OpenGL, - }); native::start(0, 0 as *const *const u8, proc() { - let window = glfw_app::create_window(); - let mut browser = Browser::new(Some(window.clone())); - while browser.handle_event(window.wait_events()) {} - browser.shutdown() + GLOBAL_BROWSERS.get().map(|refcellbrowsers| { + unsafe { + let browsers = refcellbrowsers.borrow(); + let mut num = browsers.len(); + for servobrowser in browsers.iter() { + (**servobrowser).window = glfw_app::create_window(); + (**servobrowser).servo_browser = Some(Browser::new(Some((**servobrowser).window.clone()))); + } + while num > 0 { + for servobrowser in browsers.iter().filter(|&servobrowser| (**servobrowser).servo_browser.is_some()) { + let ref mut browser = **servobrowser; + let mut optionlessservobrowser = browser.servo_browser.take().unwrap(); + if !optionlessservobrowser.handle_event(browser.window.wait_events()) { + optionlessservobrowser.shutdown(); + num -= 1; + } + } + } + } + }); }); } diff --git a/ports/cef/lib.rs b/ports/cef/lib.rs index 5391c571799..fb61e3ef196 100644 --- a/ports/cef/lib.rs +++ b/ports/cef/lib.rs @@ -18,6 +18,7 @@ extern crate rustuv; extern crate servo; extern crate azure; +extern crate compositing; extern crate geom; extern crate gfx; extern crate glfw; |