From 1aed319684eb3434420eb480d34f4cb130b6ff4f Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 18 May 2015 15:52:05 -0400 Subject: [PATCH] add pointer checks for cef method calls to avoid crashing on nonexistent methods --- ports/cef/browser_host.rs | 17 ++++++++++++++--- ports/cef/window.rs | 32 +++++++++++++++++++++----------- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/ports/cef/browser_host.rs b/ports/cef/browser_host.rs index 412fd51f3da..b9112db85c9 100644 --- a/ports/cef/browser_host.rs +++ b/ports/cef/browser_host.rs @@ -7,6 +7,7 @@ use interfaces::{CefBrowser, CefBrowserHost, CefClient, cef_browser_t, cef_brows 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}; +use wrappers::CefWrap; use compositing::windowing::{WindowEvent, MouseWindowEvent}; use geom::point::TypedPoint2D; @@ -35,9 +36,19 @@ full_cef_class_impl! { fn was_resized(&this,) -> () {{ let mut rect = cef_rect_t::zero(); - this.get_client() - .get_render_handler() - .get_backing_rect(this.downcast().browser.borrow().clone().unwrap(), &mut rect); + if cfg!(target_os="macos") { + if check_ptr_exist!(this.get_client(), get_render_handler) && + check_ptr_exist!(this.get_client().get_render_handler(), get_backing_rect) { + this.get_client() + .get_render_handler() + .get_backing_rect(this.downcast().browser.borrow().clone().unwrap(), &mut rect); + } + } else if check_ptr_exist!(this.get_client(), get_render_handler) && + check_ptr_exist!(this.get_client().get_render_handler(), get_view_rect) { + this.get_client() + .get_render_handler() + .get_view_rect(this.downcast().browser.borrow().clone().unwrap(), &mut rect); + } let size = TypedSize2D(rect.width as u32, rect.height as u32); this.downcast().send_window_event(WindowEvent::Resize(size)); }} diff --git a/ports/cef/window.rs b/ports/cef/window.rs index 328152f8067..8662627fd5c 100644 --- a/ports/cef/window.rs +++ b/ports/cef/window.rs @@ -12,6 +12,7 @@ use interfaces::CefBrowser; use render_handler::CefRenderHandlerExtensions; use rustc_unicode::str::Utf16Encoder; use types::{cef_cursor_handle_t, cef_cursor_type_t, cef_rect_t}; +use wrappers::CefWrap; use compositing::compositor_task::{self, CompositorProxy, CompositorReceiver}; use compositing::windowing::{WindowEvent, WindowMethods}; @@ -20,7 +21,7 @@ use geom::size::TypedSize2D; use gleam::gl; use layers::geometry::DevicePixel; use layers::platform::surface::NativeGraphicsMetadata; -use libc::{c_char, c_void}; +use libc::{c_char, c_int, c_void}; use msg::constellation_msg::{Key, KeyModifiers}; use std::ptr; use std_url::Url; @@ -222,7 +223,10 @@ impl WindowMethods for Window { match *browser { None => {} Some(ref browser) => { - browser.get_host().get_client().get_render_handler().on_present(browser.clone()); + if check_ptr_exist!(browser.get_host().get_client(), get_render_handler) && + check_ptr_exist!(browser.get_host().get_client().get_render_handler(), on_present) { + browser.get_host().get_client().get_render_handler().on_present(browser.clone()); + } } } } @@ -295,10 +299,13 @@ impl WindowMethods for Window { None => return, Some(ref browser) => browser, }; - browser.get_host() - .get_client() - .get_load_handler() - .on_load_end((*browser).clone(), browser.get_main_frame(), 200); + if check_ptr_exist!(browser.get_host().get_client(), get_load_handler) && + check_ptr_exist!(browser.get_host().get_client().get_load_handler(), on_load_end) { + browser.get_host() + .get_client() + .get_load_handler() + .on_load_end((*browser).clone(), browser.get_main_frame(), 200); + } } fn set_page_title(&self, string: Option) { @@ -349,11 +356,14 @@ impl WindowMethods for Window { Some(ref browser) => { let cursor_handle = self.cursor_handle_for_cursor(cursor); let info = CefCursorInfo { hotspot: cef_point_t {x: 0, y: 0}, image_scale_factor: 0.0, buffer: 0 as *mut isize, size: cef_size_t { width: 0, height: 0 } }; - browser.get_host() - .get_client() - .get_render_handler() - .on_cursor_change(browser.clone(), cursor_handle, - self.cursor_type_for_cursor(cursor), &info) + if check_ptr_exist!(browser.get_host().get_client(), get_render_handler) && + check_ptr_exist!(browser.get_host().get_client().get_render_handler(), on_cursor_change) { + browser.get_host() + .get_client() + .get_render_handler() + .on_cursor_change(browser.clone(), cursor_handle, + self.cursor_type_for_cursor(cursor), &info) + } } } }