Check for a valid pointer in all places where GetWebView() and GetWebViewHost() are directly used in order to prevent potential crashes after WM_DESTROY is processed (issue #84).

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@97 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt
2010-08-31 14:10:31 +00:00
parent c439ed160f
commit 79134a77f2
4 changed files with 57 additions and 23 deletions

View File

@@ -164,17 +164,21 @@ CefRefPtr<CefHandler> CefBrowserImpl::GetHandler()
CefRefPtr<CefFrame> CefBrowserImpl::GetMainFrame() CefRefPtr<CefFrame> CefBrowserImpl::GetMainFrame()
{ {
return GetCefFrame(GetWebView()->mainFrame()); return GetWebView() ? GetCefFrame(GetWebView()->mainFrame()) : NULL;
} }
CefRefPtr<CefFrame> CefBrowserImpl::GetFocusedFrame() CefRefPtr<CefFrame> CefBrowserImpl::GetFocusedFrame()
{ {
return GetCefFrame(GetWebView()->focusedFrame()); return GetWebView() ? GetCefFrame(GetWebView()->focusedFrame()) : NULL;
} }
CefRefPtr<CefFrame> CefBrowserImpl::GetFrame(const std::wstring& name) CefRefPtr<CefFrame> CefBrowserImpl::GetFrame(const std::wstring& name)
{ {
WebFrame* frame = GetWebView()->findFrameByName(name); WebView* view = GetWebView();
if (!view)
return NULL;
WebFrame* frame = view->findFrameByName(name);
if(frame) if(frame)
return GetCefFrame(frame); return GetCefFrame(frame);
return NULL; return NULL;
@@ -183,6 +187,9 @@ CefRefPtr<CefFrame> CefBrowserImpl::GetFrame(const std::wstring& name)
void CefBrowserImpl::GetFrameNames(std::vector<std::wstring>& names) void CefBrowserImpl::GetFrameNames(std::vector<std::wstring>& names)
{ {
WebView* view = GetWebView(); WebView* view = GetWebView();
if (!view)
return;
WebFrame* main_frame = view->mainFrame(); WebFrame* main_frame = view->mainFrame();
WebFrame* it = main_frame; WebFrame* it = main_frame;
do { do {
@@ -259,10 +266,14 @@ void CefBrowserImpl::RemoveCefFrame(const std::wstring& name)
WebFrame* CefBrowserImpl::GetWebFrame(CefRefPtr<CefFrame> frame) WebFrame* CefBrowserImpl::GetWebFrame(CefRefPtr<CefFrame> frame)
{ {
WebView* view = GetWebView();
if (!view)
return NULL;
std::wstring name = frame->GetName(); std::wstring name = frame->GetName();
if(name.empty()) if(name.empty())
return GetWebView()->mainFrame(); return view ->mainFrame();
return GetWebView()->findFrameByName(name); return view ->findFrameByName(name);
} }
void CefBrowserImpl::Undo(CefRefPtr<CefFrame> frame) void CefBrowserImpl::Undo(CefRefPtr<CefFrame> frame)
@@ -663,12 +674,16 @@ bool CefBrowserImpl::UIT_Navigate(const BrowserNavigationEntry& entry,
{ {
REQUIRE_UIT(); REQUIRE_UIT();
WebView* view = GetWebView();
if (!view)
return false;
// Get the right target frame for the entry. // Get the right target frame for the entry.
WebFrame* frame; WebFrame* frame;
if (!entry.GetTargetFrame().empty()) if (!entry.GetTargetFrame().empty())
frame = GetWebView()->findFrameByName(entry.GetTargetFrame()); frame = view->findFrameByName(entry.GetTargetFrame());
else else
frame = GetWebView()->mainFrame(); frame = view->mainFrame();
// TODO(mpcomplete): should we clear the target frame, or should // TODO(mpcomplete): should we clear the target frame, or should
// back/forward navigations maintain the target frame? // back/forward navigations maintain the target frame?
@@ -731,7 +746,7 @@ bool CefBrowserImpl::UIT_Navigate(const BrowserNavigationEntry& entry,
// setFocusedFrame() may be unnecessary or in the wrong place. See this // setFocusedFrame() may be unnecessary or in the wrong place. See this
// thread for additional details: // thread for additional details:
// http://groups.google.com/group/chromium-dev/browse_thread/thread/42bcd31b59e3a168 // http://groups.google.com/group/chromium-dev/browse_thread/thread/42bcd31b59e3a168
GetWebView()->setFocusedFrame(frame); view->setFocusedFrame(frame);
UIT_SetFocus(GetWebViewHost(), true); UIT_SetFocus(GetWebViewHost(), true);
} }
@@ -795,7 +810,8 @@ void CefBrowserImpl::UIT_HandleAction(CefHandler::MenuId menuId,
UIT_Reload(); UIT_Reload();
break; break;
case MENU_ID_NAV_STOP: case MENU_ID_NAV_STOP:
GetWebView()->mainFrame()->stopLoading(); if (GetWebView())
GetWebView()->mainFrame()->stopLoading();
break; break;
case MENU_ID_UNDO: case MENU_ID_UNDO:
if(web_frame) if(web_frame)
@@ -907,7 +923,11 @@ void CefBrowserImpl::UIT_CanGoForwardNotify(bool *retVal,
void CefBrowserImpl::UIT_Find(int identifier, const std::wstring& search_text, void CefBrowserImpl::UIT_Find(int identifier, const std::wstring& search_text,
const WebKit::WebFindOptions& options) const WebKit::WebFindOptions& options)
{ {
WebFrame* main_frame = GetWebView()->mainFrame(); WebView* view = GetWebView();
if (!view)
return;
WebFrame* main_frame = view->mainFrame();
if (main_frame->document().isPluginDocument()) { if (main_frame->document().isPluginDocument()) {
WebPlugin* plugin = main_frame->document().to<WebPluginDocument>().plugin(); WebPlugin* plugin = main_frame->document().to<WebPluginDocument>().plugin();
@@ -928,7 +948,7 @@ void CefBrowserImpl::UIT_Find(int identifier, const std::wstring& search_text,
} }
WebFrame* frame_after_main = main_frame->traverseNext(true); WebFrame* frame_after_main = main_frame->traverseNext(true);
WebFrame* focused_frame = GetWebView()->focusedFrame(); WebFrame* focused_frame = view->focusedFrame();
WebFrame* search_frame = focused_frame; // start searching focused frame. WebFrame* search_frame = focused_frame; // start searching focused frame.
bool multi_frame = (frame_after_main != main_frame); bool multi_frame = (frame_after_main != main_frame);
@@ -977,7 +997,7 @@ void CefBrowserImpl::UIT_Find(int identifier, const std::wstring& search_text,
} }
} }
GetWebView()->setFocusedFrame(search_frame); view->setFocusedFrame(search_frame);
} while (!result && search_frame != focused_frame); } while (!result && search_frame != focused_frame);
if (options.findNext && current_selection.isNull()) { if (options.findNext && current_selection.isNull()) {
@@ -1070,6 +1090,7 @@ void CefBrowserImpl::UIT_NotifyFindStatus(int identifier, int count,
bool CefFrameImpl::IsFocused() bool CefFrameImpl::IsFocused()
{ {
return (browser_->GetWebFrame(this) == return (browser_->GetWebView() &&
browser_->GetWebView()->focusedFrame()); (browser_->GetWebFrame(this) ==
browser_->GetWebView()->focusedFrame()));
} }

View File

@@ -46,6 +46,7 @@ LRESULT CALLBACK CefBrowserImpl::WndProc(HWND hwnd, UINT message,
break; break;
case WM_DESTROY: case WM_DESTROY:
if (browser)
{ {
CefRefPtr<CefHandler> handler = browser->GetHandler(); CefRefPtr<CefHandler> handler = browser->GetHandler();
if(handler.get()) { if(handler.get()) {
@@ -56,6 +57,7 @@ LRESULT CALLBACK CefBrowserImpl::WndProc(HWND hwnd, UINT message,
// Clean up anything associated with the WebViewHost widget. // Clean up anything associated with the WebViewHost widget.
browser->GetWebViewHost()->webwidget()->close(); browser->GetWebViewHost()->webwidget()->close();
browser->webviewhost_.reset();
// Clear the user data pointer. // Clear the user data pointer.
win_util::SetWindowUserData(hwnd, NULL); win_util::SetWindowUserData(hwnd, NULL);
@@ -150,6 +152,8 @@ void CefBrowserImpl::UIT_CreateBrowser(const std::wstring& url)
void CefBrowserImpl::UIT_SetFocus(WebWidgetHost* host, bool enable) void CefBrowserImpl::UIT_SetFocus(WebWidgetHost* host, bool enable)
{ {
REQUIRE_UIT(); REQUIRE_UIT();
if (!host)
return;
if (enable) if (enable)
::SetFocus(host->view_handle()); ::SetFocus(host->view_handle());

View File

@@ -129,14 +129,16 @@ int next_page_id_ = 1;
void BrowserWebViewDelegate::SetUserStyleSheetEnabled(bool is_enabled) { void BrowserWebViewDelegate::SetUserStyleSheetEnabled(bool is_enabled) {
WebPreferences* prefs = _Context->web_preferences(); WebPreferences* prefs = _Context->web_preferences();
prefs->user_style_sheet_enabled = is_enabled; prefs->user_style_sheet_enabled = is_enabled;
prefs->Apply(browser_->GetWebView()); if (browser_->GetWebView())
prefs->Apply(browser_->GetWebView());
} }
void BrowserWebViewDelegate::SetUserStyleSheetLocation(const GURL& location) { void BrowserWebViewDelegate::SetUserStyleSheetLocation(const GURL& location) {
WebPreferences* prefs = _Context->web_preferences(); WebPreferences* prefs = _Context->web_preferences();
prefs->user_style_sheet_enabled = true; prefs->user_style_sheet_enabled = true;
prefs->user_style_sheet_location = location; prefs->user_style_sheet_location = location;
prefs->Apply(browser_->GetWebView()); if (browser_->GetWebView())
prefs->Apply(browser_->GetWebView());
} }
// WebViewClient ------------------------------------------------------------- // WebViewClient -------------------------------------------------------------
@@ -187,9 +189,10 @@ void BrowserWebViewDelegate::didAddMessageToConsole(
} }
void BrowserWebViewDelegate::printPage(WebFrame* frame) { void BrowserWebViewDelegate::printPage(WebFrame* frame) {
if(frame == NULL) if (!frame)
frame = browser_->GetWebView()->mainFrame(); frame = browser_->GetWebView() ? browser_->GetWebView()->mainFrame() : NULL;
browser_->UIT_PrintPages(frame); if (frame)
browser_->UIT_PrintPages(frame);
} }
void BrowserWebViewDelegate::didStartLoading() { void BrowserWebViewDelegate::didStartLoading() {
@@ -297,7 +300,8 @@ bool BrowserWebViewDelegate::handleCurrentKeyboardEvent() {
if (edit_command_name_.empty()) if (edit_command_name_.empty())
return false; return false;
WebFrame* frame = browser_->GetWebView()->focusedFrame(); WebFrame* frame = browser_->GetWebView() ?
browser_->GetWebView()->focusedFrame() : NULL;
if (!frame) if (!frame)
return false; return false;
@@ -420,7 +424,8 @@ void BrowserWebViewDelegate::startDragging(
//HRESULT res = DoDragDrop(drop_data.data_object, drag_delegate_.get(), //HRESULT res = DoDragDrop(drop_data.data_object, drag_delegate_.get(),
// ok_effect, &effect); // ok_effect, &effect);
//DCHECK(DRAGDROP_S_DROP == res || DRAGDROP_S_CANCEL == res); //DCHECK(DRAGDROP_S_DROP == res || DRAGDROP_S_CANCEL == res);
browser_->GetWebView()->dragSourceSystemDragEnded(); if (browser_->GetWebView())
browser_->GetWebView()->dragSourceSystemDragEnded();
} }
void BrowserWebViewDelegate::focusNext() { void BrowserWebViewDelegate::focusNext() {
@@ -916,6 +921,9 @@ void BrowserWebViewDelegate::UpdateSessionHistory(WebFrame* frame) {
if (!entry) if (!entry)
return; return;
if (!browser_->GetWebView())
return;
const WebHistoryItem& history_item = const WebHistoryItem& history_item =
browser_->GetWebView()->mainFrame()->previousHistoryItem(); browser_->GetWebView()->mainFrame()->previousHistoryItem();
if (history_item.isNull()) if (history_item.isNull())

View File

@@ -152,7 +152,8 @@ webkit_glue::WebPluginDelegate* BrowserWebViewDelegate::CreatePluginDelegate(
const FilePath& file_path, const FilePath& file_path,
const std::string& mime_type) const std::string& mime_type)
{ {
HWND hwnd = browser_->GetWebViewHost()->view_handle(); HWND hwnd = browser_->GetWebViewHost() ?
browser_->GetWebViewHost()->view_handle() : NULL;
if (!hwnd) if (!hwnd)
return NULL; return NULL;