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:
parent
7a3154c9ba
commit
1c2f102bb0
|
@ -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; }
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue