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
|
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; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
///
|
///
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue