mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
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:
@@ -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()));
|
||||||
}
|
}
|
||||||
|
@@ -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,7 +152,9 @@ 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());
|
||||||
else if (::GetFocus() == host->view_handle())
|
else if (::GetFocus() == host->view_handle())
|
||||||
|
@@ -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())
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user