embedding: redo browser creation and message loop code to be more CEF-like

big thanks to @alexcrichton for his help with this
This commit is contained in:
Mike Blumenkrantz 2014-11-19 22:48:32 -05:00
parent 0341444ce9
commit 8aceb59824
3 changed files with 107 additions and 49 deletions

View file

@ -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)
}
}

View file

@ -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;
}
}
}
}
});
});
}

View file

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