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
{
public:
typedef cef_handler_focus_source_t FocusSource;
///
// 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|
@ -1322,14 +1324,13 @@ public:
bool next) {}
///
// Called when the browser component is requesting focus. |isWidget| will be
// true if the focus is requested for a child widget of the browser window.
// Return false to allow the focus to be set or true to cancel setting the
// focus.
// Called when the browser component is requesting focus. |source| indicates
// where the focus request is originating from. Return false to allow the
// focus to be set or true to cancel setting the focus.
///
/*--cef()--*/
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);
///
// Called when the browser component is requesting focus. |isWidget| will be
// true (1) if the focus is requested for a child widget of the browser
// window. Return false (0) to allow the focus to be set or true (1) to cancel
// setting the focus.
// Called when the browser component is requesting focus. |source| indicates
// where the focus request is originating from. Return false (0) to allow the
// focus to be set or true (1) to cancel setting the focus.
///
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;

View File

@ -777,6 +777,25 @@ enum cef_weburlrequest_state_t
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.
///

View File

@ -971,7 +971,8 @@ bool CefBrowserImpl::UIT_Navigate(const BrowserNavigationEntry& entry,
if (client_.get()) {
CefRefPtr<CefFocusHandler> handler = client_->GetFocusHandler();
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.
// This makes sure that we don't have a focused iframe. Otherwise, that
// 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()) {
CefRefPtr<CefFocusHandler> handler = client->GetFocusHandler();
if (handler.get())
handled = handler->OnSetFocus(browser, false);
handled = handler->OnSetFocus(browser, FOCUS_SOURCE_SYSTEM);
}
if (!handled)

View File

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

View File

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

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,
cef_browser_t* browser, int isWidget)
cef_browser_t* browser, enum cef_handler_focus_source_t source)
{
DCHECK(self);
DCHECK(browser);
@ -37,7 +37,7 @@ int CEF_CALLBACK focus_handler_on_set_focus(struct _cef_focus_handler_t* self,
return 0;
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 isWidget)
FocusSource source)
{
if (CEF_MEMBER_MISSING(struct_, on_set_focus))
return false;
return struct_->on_set_focus(struct_, CefBrowserCppToC::Wrap(browser),
isWidget) ? true : false;
source) ? true : false;
}

View File

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