add pointer checks for cef method calls to avoid crashing on nonexistent methods

This commit is contained in:
Mike Blumenkrantz 2015-05-18 15:52:05 -04:00
parent ca7fc036fe
commit 1aed319684
2 changed files with 35 additions and 14 deletions

View file

@ -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_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 types::cef_key_event_type_t::{KEYEVENT_CHAR, KEYEVENT_KEYDOWN, KEYEVENT_KEYUP, KEYEVENT_RAWKEYDOWN};
use browser::{self, ServoCefBrowserExtensions}; use browser::{self, ServoCefBrowserExtensions};
use wrappers::CefWrap;
use compositing::windowing::{WindowEvent, MouseWindowEvent}; use compositing::windowing::{WindowEvent, MouseWindowEvent};
use geom::point::TypedPoint2D; use geom::point::TypedPoint2D;
@ -35,9 +36,19 @@ full_cef_class_impl! {
fn was_resized(&this,) -> () {{ fn was_resized(&this,) -> () {{
let mut rect = cef_rect_t::zero(); let mut rect = cef_rect_t::zero();
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() this.get_client()
.get_render_handler() .get_render_handler()
.get_backing_rect(this.downcast().browser.borrow().clone().unwrap(), &mut rect); .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); let size = TypedSize2D(rect.width as u32, rect.height as u32);
this.downcast().send_window_event(WindowEvent::Resize(size)); this.downcast().send_window_event(WindowEvent::Resize(size));
}} }}

View file

@ -12,6 +12,7 @@ use interfaces::CefBrowser;
use render_handler::CefRenderHandlerExtensions; use render_handler::CefRenderHandlerExtensions;
use rustc_unicode::str::Utf16Encoder; use rustc_unicode::str::Utf16Encoder;
use types::{cef_cursor_handle_t, cef_cursor_type_t, cef_rect_t}; 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::compositor_task::{self, CompositorProxy, CompositorReceiver};
use compositing::windowing::{WindowEvent, WindowMethods}; use compositing::windowing::{WindowEvent, WindowMethods};
@ -20,7 +21,7 @@ use geom::size::TypedSize2D;
use gleam::gl; use gleam::gl;
use layers::geometry::DevicePixel; use layers::geometry::DevicePixel;
use layers::platform::surface::NativeGraphicsMetadata; 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 msg::constellation_msg::{Key, KeyModifiers};
use std::ptr; use std::ptr;
use std_url::Url; use std_url::Url;
@ -222,10 +223,13 @@ impl WindowMethods for Window {
match *browser { match *browser {
None => {} None => {}
Some(ref browser) => { Some(ref browser) => {
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()); browser.get_host().get_client().get_render_handler().on_present(browser.clone());
} }
} }
} }
}
fn hidpi_factor(&self) -> ScaleFactor<ScreenPx,DevicePixel,f32> { fn hidpi_factor(&self) -> ScaleFactor<ScreenPx,DevicePixel,f32> {
let browser = self.cef_browser.borrow(); let browser = self.cef_browser.borrow();
@ -295,11 +299,14 @@ impl WindowMethods for Window {
None => return, None => return,
Some(ref browser) => browser, Some(ref browser) => browser,
}; };
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() browser.get_host()
.get_client() .get_client()
.get_load_handler() .get_load_handler()
.on_load_end((*browser).clone(), browser.get_main_frame(), 200); .on_load_end((*browser).clone(), browser.get_main_frame(), 200);
} }
}
fn set_page_title(&self, string: Option<String>) { fn set_page_title(&self, string: Option<String>) {
let browser = self.cef_browser.borrow(); let browser = self.cef_browser.borrow();
@ -349,6 +356,8 @@ impl WindowMethods for Window {
Some(ref browser) => { Some(ref browser) => {
let cursor_handle = self.cursor_handle_for_cursor(cursor); 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 } }; 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 } };
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() browser.get_host()
.get_client() .get_client()
.get_render_handler() .get_render_handler()
@ -357,6 +366,7 @@ impl WindowMethods for Window {
} }
} }
} }
}
} }
struct CefCompositorProxy { struct CefCompositorProxy {