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()
{
return GetCefFrame(GetWebView()->mainFrame());
return GetWebView() ? GetCefFrame(GetWebView()->mainFrame()) : NULL;
}
CefRefPtr<CefFrame> CefBrowserImpl::GetFocusedFrame()
{
return GetCefFrame(GetWebView()->focusedFrame());
return GetWebView() ? GetCefFrame(GetWebView()->focusedFrame()) : NULL;
}
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)
return GetCefFrame(frame);
return NULL;
@ -183,6 +187,9 @@ CefRefPtr<CefFrame> CefBrowserImpl::GetFrame(const std::wstring& name)
void CefBrowserImpl::GetFrameNames(std::vector<std::wstring>& names)
{
WebView* view = GetWebView();
if (!view)
return;
WebFrame* main_frame = view->mainFrame();
WebFrame* it = main_frame;
do {
@ -259,10 +266,14 @@ void CefBrowserImpl::RemoveCefFrame(const std::wstring& name)
WebFrame* CefBrowserImpl::GetWebFrame(CefRefPtr<CefFrame> frame)
{
WebView* view = GetWebView();
if (!view)
return NULL;
std::wstring name = frame->GetName();
if(name.empty())
return GetWebView()->mainFrame();
return GetWebView()->findFrameByName(name);
return view ->mainFrame();
return view ->findFrameByName(name);
}
void CefBrowserImpl::Undo(CefRefPtr<CefFrame> frame)
@ -663,12 +674,16 @@ bool CefBrowserImpl::UIT_Navigate(const BrowserNavigationEntry& entry,
{
REQUIRE_UIT();
WebView* view = GetWebView();
if (!view)
return false;
// Get the right target frame for the entry.
WebFrame* frame;
if (!entry.GetTargetFrame().empty())
frame = GetWebView()->findFrameByName(entry.GetTargetFrame());
frame = view->findFrameByName(entry.GetTargetFrame());
else
frame = GetWebView()->mainFrame();
frame = view->mainFrame();
// TODO(mpcomplete): should we clear the target frame, or should
// 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
// thread for additional details:
// http://groups.google.com/group/chromium-dev/browse_thread/thread/42bcd31b59e3a168
GetWebView()->setFocusedFrame(frame);
view->setFocusedFrame(frame);
UIT_SetFocus(GetWebViewHost(), true);
}
@ -795,7 +810,8 @@ void CefBrowserImpl::UIT_HandleAction(CefHandler::MenuId menuId,
UIT_Reload();
break;
case MENU_ID_NAV_STOP:
GetWebView()->mainFrame()->stopLoading();
if (GetWebView())
GetWebView()->mainFrame()->stopLoading();
break;
case MENU_ID_UNDO:
if(web_frame)
@ -907,7 +923,11 @@ void CefBrowserImpl::UIT_CanGoForwardNotify(bool *retVal,
void CefBrowserImpl::UIT_Find(int identifier, const std::wstring& search_text,
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()) {
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* focused_frame = GetWebView()->focusedFrame();
WebFrame* focused_frame = view->focusedFrame();
WebFrame* search_frame = focused_frame; // start searching focused 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);
if (options.findNext && current_selection.isNull()) {
@ -1070,6 +1090,7 @@ void CefBrowserImpl::UIT_NotifyFindStatus(int identifier, int count,
bool CefFrameImpl::IsFocused()
{
return (browser_->GetWebFrame(this) ==
browser_->GetWebView()->focusedFrame());
return (browser_->GetWebView() &&
(browser_->GetWebFrame(this) ==
browser_->GetWebView()->focusedFrame()));
}

View File

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

View File

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

View File

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