diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs index 33432846ab0..432228ba1d0 100644 --- a/ports/cef/browser.rs +++ b/ports/cef/browser.rs @@ -3,12 +3,10 @@ * 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; @@ -18,77 +16,49 @@ use types::{cef_browser_settings_t, cef_browser_t, cef_client_t, cef_request_con pub type servo_browser_t = servo_browser; pub struct servo_browser { pub browser: cef_browser_t, + pub client: *mut cef_client_t, pub servo_browser: Option>, pub window: Rc, - pub running: bool + pub callback_executed: 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) - -> c_int { - cef_browser_host_create_browser_sync(window_info, client, url, settings, request_context); - 1 +pub fn browser_callback_after_created(browser: *mut servo_browser_t) { + unsafe { + if (*browser).client.is_null() { return; } + let client = (*browser).client; + (*client).get_life_span_handler.map(|cb| { + let handler = cb(client); + if handler.is_not_null() { + (*handler).on_after_created.map(|createcb| createcb(handler, browser as *mut cef_browser_t)); + } + }); + (*browser).callback_executed = true; + } } -#[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, - _settings: *const cef_browser_settings_t, - _request_context: *mut cef_request_context_t) - -> *mut cef_browser_t { +fn browser_host_create(_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, + callback_executed: bool) + -> *mut cef_browser_t { unsafe { 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 { + } 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 mut opts = opts::default_opts(); + opts.urls = urls; 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))); - } - }); + (*browser).client = client; + if callback_executed { + browser_callback_after_created(browser); } match GLOBAL_BROWSERS.replace(None) { Some(brs) => { @@ -100,6 +70,27 @@ pub extern "C" fn cef_browser_host_create_browser_sync(_window_info: *const cef_ GLOBAL_BROWSERS.replace(Some(brs)); } } - mem::transmute(browser) + browser as *mut cef_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) + -> c_int { + browser_host_create(window_info, client, url, settings, request_context, false); + 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, + settings: *const cef_browser_settings_t, + request_context: *mut cef_request_context_t) + -> *mut cef_browser_t { + browser_host_create(window_info, client, url, settings, request_context, true) +} diff --git a/ports/cef/core.rs b/ports/cef/core.rs index 5dc5f805962..5c4d5b8f6de 100644 --- a/ports/cef/core.rs +++ b/ports/cef/core.rs @@ -45,16 +45,17 @@ pub extern "C" fn cef_run_message_loop() { 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()))); + for active_browser in browsers.iter() { + (**active_browser).window = glfw_app::create_window(); + (**active_browser).servo_browser = Some(Browser::new(Some((**active_browser).window.clone()))); + if !(**active_browser).callback_executed { browser_callback_after_created(*active_browser); } } 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(); + for active_browser in browsers.iter().filter(|&active_browser| (**active_browser).servo_browser.is_some()) { + let ref mut browser = **active_browser; + let mut servobrowser = browser.servo_browser.take().unwrap(); + if !servobrowser.handle_event(browser.window.wait_events()) { + servobrowser.shutdown(); num -= 1; } } diff --git a/ports/cef/types.rs b/ports/cef/types.rs index 3fd7798dd0c..a8caa46f406 100644 --- a/ports/cef/types.rs +++ b/ports/cef/types.rs @@ -1214,7 +1214,7 @@ pub struct cef_run_file_dialog_callback { // will be NULL. /// pub cont: Option, } @@ -1638,7 +1638,7 @@ pub struct cef_render_process_handler { // cannot be modified in this callback. /// pub on_before_navigation: Option, @@ -1662,7 +1662,7 @@ pub struct cef_render_process_handler { // references to the context should be kept after this function is called. /// pub on_context_released: Option, @@ -1672,7 +1672,7 @@ pub struct cef_render_process_handler { // CefSettings.uncaught_exception_stack_size 0. /// pub on_uncaught_exception: Option, @@ -1697,7 +1697,7 @@ pub struct cef_render_process_handler { // reference to or attempt to access the message outside of this callback. /// pub on_process_message_received: Optionc_int>, } @@ -1934,7 +1934,7 @@ pub struct cef_display_handler { // Called when the page title changes. /// pub on_title_change: Option, + browser: *mut cef_browser_t, title: *const cef_string_t)>, /// // Called when the browser is about to display a tooltip. |text| contains the @@ -1945,21 +1945,21 @@ pub struct cef_display_handler { // for drawing tooltips and the return value is ignored. /// pub on_tooltip: Option c_int>, + browser: *mut cef_browser_t, text: *mut cef_string_t) -> c_int>, /// // Called when the browser receives a status message. |value| contains the // text that will be displayed in the status message. /// pub on_status_message: Option, + browser: *mut cef_browser_t, value: *const cef_string_t)>, /// // Called to display a console message. Return true (1) to stop the message // from being output to the console. /// pub on_console_message: Option c_int> } @@ -1988,7 +1988,7 @@ pub struct cef_life_span_handler { // indicates whether the new browser window should be scriptable and in the // same process as the source browser. pub on_before_popup: Option c_int>, + browser: *mut cef_browser_t, source_process: cef_process_id_t, + message: *mut cef_process_message_t) -> c_int>, } ///