From 8aceb59824b867ba371df6720efa02d84d142c34 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 19 Nov 2014 22:48:32 -0500 Subject: [PATCH] embedding: redo browser creation and message loop code to be more CEF-like big thanks to @alexcrichton for his help with this --- ports/cef/browser.rs | 96 +++++++++++++++++++++++++++++++++++++++----- ports/cef/core.rs | 59 ++++++++++----------------- 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>, + pub window: Rc, + pub running: bool +} + +local_data_key!(pub GLOBAL_BROWSERS: RefCell>) + #[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::() 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::() as size_t) as *mut servo_browser_t; + (*browser).browser.base.size = mem::size_of::() 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;