Add a FocusSource parameter to OnSetFocus() that indicates where the focus request is originating from (issue #369).

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@306 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt 2011-10-07 10:30:10 +00:00
parent 7a3154c9ba
commit 1c2f102bb0
10 changed files with 41 additions and 19 deletions

View File

@ -1311,6 +1311,8 @@ public:
class CefFocusHandler : public virtual CefBase class CefFocusHandler : public virtual CefBase
{ {
public: public:
typedef cef_handler_focus_source_t FocusSource;
/// ///
// Called when the browser component is about to loose focus. For instance, if // Called when the browser component is about to loose focus. For instance, if
// focus was on the last HTML element and the user pressed the TAB key. |next| // focus was on the last HTML element and the user pressed the TAB key. |next|
@ -1322,14 +1324,13 @@ public:
bool next) {} bool next) {}
/// ///
// Called when the browser component is requesting focus. |isWidget| will be // Called when the browser component is requesting focus. |source| indicates
// true if the focus is requested for a child widget of the browser window. // where the focus request is originating from. Return false to allow the
// Return false to allow the focus to be set or true to cancel setting the // focus to be set or true to cancel setting the focus.
// focus.
/// ///
/*--cef()--*/ /*--cef()--*/
virtual bool OnSetFocus(CefRefPtr<CefBrowser> browser, virtual bool OnSetFocus(CefRefPtr<CefBrowser> browser,
bool isWidget) { return false; } FocusSource source) { return false; }
}; };

View File

@ -1131,13 +1131,12 @@ typedef struct _cef_focus_handler_t
struct _cef_browser_t* browser, int next); struct _cef_browser_t* browser, int next);
/// ///
// Called when the browser component is requesting focus. |isWidget| will be // Called when the browser component is requesting focus. |source| indicates
// true (1) if the focus is requested for a child widget of the browser // where the focus request is originating from. Return false (0) to allow the
// window. Return false (0) to allow the focus to be set or true (1) to cancel // focus to be set or true (1) to cancel setting the focus.
// setting the focus.
/// ///
int (CEF_CALLBACK *on_set_focus)(struct _cef_focus_handler_t* self, int (CEF_CALLBACK *on_set_focus)(struct _cef_focus_handler_t* self,
struct _cef_browser_t* browser, int isWidget); struct _cef_browser_t* browser, enum cef_handler_focus_source_t source);
} cef_focus_handler_t; } cef_focus_handler_t;

View File

@ -777,6 +777,25 @@ enum cef_weburlrequest_state_t
WUR_STATE_ABORT = 6, WUR_STATE_ABORT = 6,
}; };
///
// Focus sources.
///
enum cef_handler_focus_source_t
{
///
// The source is explicit navigation via the API (LoadURL(), etc).
///
FOCUS_SOURCE_NAVIGATION = 0,
///
// The source is a system-generated focus event.
///
FOCUS_SOURCE_SYSTEM,
///
// The source is a child widget of the browser window requesting focus.
///
FOCUS_SOURCE_WIDGET,
};
/// ///
// Key event types. // Key event types.
/// ///

View File

@ -971,7 +971,8 @@ bool CefBrowserImpl::UIT_Navigate(const BrowserNavigationEntry& entry,
if (client_.get()) { if (client_.get()) {
CefRefPtr<CefFocusHandler> handler = client_->GetFocusHandler(); CefRefPtr<CefFocusHandler> handler = client_->GetFocusHandler();
if (!handler.get() || if (!handler.get() ||
(handler.get() && !handler->OnSetFocus(this, false))) { (handler.get() &&
!handler->OnSetFocus(this, FOCUS_SOURCE_NAVIGATION))) {
// Restore focus to the main frame prior to loading new request. // Restore focus to the main frame prior to loading new request.
// This makes sure that we don't have a focused iframe. Otherwise, that // This makes sure that we don't have a focused iframe. Otherwise, that
// iframe would keep focus when the SetFocus called immediately after // iframe would keep focus when the SetFocus called immediately after

View File

@ -89,7 +89,7 @@ LRESULT CALLBACK CefBrowserImpl::WndProc(HWND hwnd, UINT message,
if (client.get()) { if (client.get()) {
CefRefPtr<CefFocusHandler> handler = client->GetFocusHandler(); CefRefPtr<CefFocusHandler> handler = client->GetFocusHandler();
if (handler.get()) if (handler.get())
handled = handler->OnSetFocus(browser, false); handled = handler->OnSetFocus(browser, FOCUS_SOURCE_SYSTEM);
} }
if (!handled) if (!handled)

View File

@ -521,7 +521,7 @@ void BrowserWebViewDelegate::didFocus() {
if (client.get()) { if (client.get()) {
CefRefPtr<CefFocusHandler> handler = client->GetFocusHandler(); CefRefPtr<CefFocusHandler> handler = client->GetFocusHandler();
if (handler.get()) if (handler.get())
handled = handler->OnSetFocus(browser_, true); handled = handler->OnSetFocus(browser_, FOCUS_SOURCE_WIDGET);
} }
if (!handled) if (!handled)

View File

@ -158,9 +158,11 @@
CefRefPtr<CefClient> client = browser_->GetClient(); CefRefPtr<CefClient> client = browser_->GetClient();
if (client.get()) { if (client.get()) {
CefRefPtr<CefFocusHandler> handler = client->GetFocusHandler(); CefRefPtr<CefFocusHandler> handler = client->GetFocusHandler();
if (handler.get() && handler->OnSetFocus(browser_, false)) if (handler.get() &&
handler->OnSetFocus(browser_, FOCUS_SOURCE_SYSTEM)) {
return NO; return NO;
} }
}
browser_->UIT_GetWebViewHost()->SetFocus(YES); browser_->UIT_GetWebViewHost()->SetFocus(YES);
return [super becomeFirstResponder]; return [super becomeFirstResponder];

View File

@ -29,7 +29,7 @@ void CEF_CALLBACK focus_handler_on_take_focus(struct _cef_focus_handler_t* self,
} }
int CEF_CALLBACK focus_handler_on_set_focus(struct _cef_focus_handler_t* self, int CEF_CALLBACK focus_handler_on_set_focus(struct _cef_focus_handler_t* self,
cef_browser_t* browser, int isWidget) cef_browser_t* browser, enum cef_handler_focus_source_t source)
{ {
DCHECK(self); DCHECK(self);
DCHECK(browser); DCHECK(browser);
@ -37,7 +37,7 @@ int CEF_CALLBACK focus_handler_on_set_focus(struct _cef_focus_handler_t* self,
return 0; return 0;
return CefFocusHandlerCppToC::Get(self)->OnSetFocus( return CefFocusHandlerCppToC::Get(self)->OnSetFocus(
CefBrowserCToCpp::Wrap(browser), isWidget?true:false); CefBrowserCToCpp::Wrap(browser), source);
} }

View File

@ -26,13 +26,13 @@ void CefFocusHandlerCToCpp::OnTakeFocus(CefRefPtr<CefBrowser> browser,
} }
bool CefFocusHandlerCToCpp::OnSetFocus(CefRefPtr<CefBrowser> browser, bool CefFocusHandlerCToCpp::OnSetFocus(CefRefPtr<CefBrowser> browser,
bool isWidget) FocusSource source)
{ {
if (CEF_MEMBER_MISSING(struct_, on_set_focus)) if (CEF_MEMBER_MISSING(struct_, on_set_focus))
return false; return false;
return struct_->on_set_focus(struct_, CefBrowserCppToC::Wrap(browser), return struct_->on_set_focus(struct_, CefBrowserCppToC::Wrap(browser),
isWidget) ? true : false; source) ? true : false;
} }

View File

@ -35,7 +35,7 @@ public:
// CefFocusHandler methods // CefFocusHandler methods
virtual void OnTakeFocus(CefRefPtr<CefBrowser> browser, bool next) OVERRIDE; virtual void OnTakeFocus(CefRefPtr<CefBrowser> browser, bool next) OVERRIDE;
virtual bool OnSetFocus(CefRefPtr<CefBrowser> browser, virtual bool OnSetFocus(CefRefPtr<CefBrowser> browser,
bool isWidget) OVERRIDE; FocusSource source) OVERRIDE;
}; };
#endif // BUILDING_CEF_SHARED #endif // BUILDING_CEF_SHARED