mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-02-28 09:57:50 +01:00
Add CefRenderHandler::OnVirtualKeyboardRequested (issue #2607)
This commit is contained in:
parent
c72d57aa60
commit
379fb8d39e
@ -33,7 +33,7 @@
|
||||
// by hand. See the translator.README.txt file in the tools directory for
|
||||
// more information.
|
||||
//
|
||||
// $hash=cf5dc6f6d2c64d5dc706edd5adc5cf6c7c752750$
|
||||
// $hash=0640490eead86e5631e8db67f3a0de8b43c10640$
|
||||
//
|
||||
|
||||
#ifndef CEF_INCLUDE_CAPI_CEF_RENDER_HANDLER_CAPI_H_
|
||||
@ -231,6 +231,17 @@ typedef struct _cef_render_handler_t {
|
||||
struct _cef_browser_t* browser,
|
||||
const cef_string_t* selected_text,
|
||||
const cef_range_t* selected_range);
|
||||
|
||||
///
|
||||
// Called when an on-screen keyboard should be shown or hidden for the
|
||||
// specified |browser|. |input_mode| specifies what kind of keyboard should be
|
||||
// opened. If |input_mode| is CEF_TEXT_INPUT_MODE_NONE, any existing keyboard
|
||||
// for this browser should be hidden.
|
||||
///
|
||||
void(CEF_CALLBACK* on_virtual_keyboard_requested)(
|
||||
struct _cef_render_handler_t* self,
|
||||
struct _cef_browser_t* browser,
|
||||
cef_text_input_mode_t input_mode);
|
||||
} cef_render_handler_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -57,6 +57,7 @@ class CefRenderHandler : public virtual CefBaseRefCounted {
|
||||
typedef cef_drag_operations_mask_t DragOperationsMask;
|
||||
typedef cef_paint_element_type_t PaintElementType;
|
||||
typedef std::vector<CefRect> RectList;
|
||||
typedef cef_text_input_mode_t TextInputMode;
|
||||
|
||||
///
|
||||
// Return the handler for accessibility notifications. If no handler is
|
||||
@ -231,6 +232,16 @@ class CefRenderHandler : public virtual CefBaseRefCounted {
|
||||
virtual void OnTextSelectionChanged(CefRefPtr<CefBrowser> browser,
|
||||
const CefString& selected_text,
|
||||
const CefRange& selected_range) {}
|
||||
|
||||
///
|
||||
// Called when an on-screen keyboard should be shown or hidden for the
|
||||
// specified |browser|. |input_mode| specifies what kind of keyboard
|
||||
// should be opened. If |input_mode| is CEF_TEXT_INPUT_MODE_NONE, any
|
||||
// existing keyboard for this browser should be hidden.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void OnVirtualKeyboardRequested(CefRefPtr<CefBrowser> browser,
|
||||
TextInputMode input_mode) {}
|
||||
};
|
||||
|
||||
#endif // CEF_INCLUDE_CEF_RENDER_HANDLER_H_
|
||||
|
@ -994,6 +994,25 @@ typedef enum {
|
||||
DRAG_OPERATION_EVERY = UINT_MAX
|
||||
} cef_drag_operations_mask_t;
|
||||
|
||||
///
|
||||
// Input mode of a virtual keyboard. These constants match their equivalents
|
||||
// in Chromium's text_input_mode.h and should not be renumbered.
|
||||
// See https://html.spec.whatwg.org/#input-modalities:-the-inputmode-attribute
|
||||
///
|
||||
typedef enum {
|
||||
CEF_TEXT_INPUT_MODE_DEFAULT,
|
||||
CEF_TEXT_INPUT_MODE_NONE,
|
||||
CEF_TEXT_INPUT_MODE_TEXT,
|
||||
CEF_TEXT_INPUT_MODE_TEL,
|
||||
CEF_TEXT_INPUT_MODE_URL,
|
||||
CEF_TEXT_INPUT_MODE_EMAIL,
|
||||
CEF_TEXT_INPUT_MODE_NUMERIC,
|
||||
CEF_TEXT_INPUT_MODE_DECIMAL,
|
||||
CEF_TEXT_INPUT_MODE_SEARCH,
|
||||
|
||||
CEF_TEXT_INPUT_MODE_MAX = CEF_TEXT_INPUT_MODE_SEARCH,
|
||||
} cef_text_input_mode_t;
|
||||
|
||||
///
|
||||
// V8 access control values.
|
||||
///
|
||||
|
@ -396,6 +396,9 @@ CefRenderWidgetHostViewOSR::CefRenderWidgetHostViewOSR(
|
||||
|
||||
// Do this last because it may result in a call to SetNeedsBeginFrames.
|
||||
render_widget_host_->SetView(this);
|
||||
|
||||
if (GetTextInputManager())
|
||||
GetTextInputManager()->AddObserver(this);
|
||||
}
|
||||
|
||||
CefRenderWidgetHostViewOSR::~CefRenderWidgetHostViewOSR() {
|
||||
@ -425,6 +428,9 @@ CefRenderWidgetHostViewOSR::~CefRenderWidgetHostViewOSR() {
|
||||
DCHECK(popup_host_view_ == NULL);
|
||||
DCHECK(child_host_view_ == NULL);
|
||||
DCHECK(guest_host_views_.empty());
|
||||
|
||||
if (text_input_manager_)
|
||||
text_input_manager_->RemoveObserver(this);
|
||||
}
|
||||
|
||||
// Called for full-screen widgets.
|
||||
@ -1424,6 +1430,31 @@ void CefRenderWidgetHostViewOSR::SendFocusEvent(bool focus) {
|
||||
}
|
||||
}
|
||||
|
||||
void CefRenderWidgetHostViewOSR::OnUpdateTextInputStateCalled(
|
||||
content::TextInputManager* text_input_manager,
|
||||
content::RenderWidgetHostViewBase* updated_view,
|
||||
bool did_update_state) {
|
||||
const content::TextInputState* state =
|
||||
text_input_manager->GetTextInputState();
|
||||
if (state && !state->show_ime_if_needed)
|
||||
return;
|
||||
|
||||
CefRenderHandler::TextInputMode mode = CEF_TEXT_INPUT_MODE_NONE;
|
||||
if (state && state->type != ui::TEXT_INPUT_TYPE_NONE) {
|
||||
static_assert(
|
||||
static_cast<int>(CEF_TEXT_INPUT_MODE_MAX) ==
|
||||
static_cast<int>(ui::TEXT_INPUT_MODE_MAX),
|
||||
"Enum values in cef_text_input_mode_t must match ui::TextInputMode");
|
||||
mode = static_cast<CefRenderHandler::TextInputMode>(state->mode);
|
||||
}
|
||||
|
||||
CefRefPtr<CefRenderHandler> handler =
|
||||
browser_impl_->GetClient()->GetRenderHandler();
|
||||
CHECK(handler);
|
||||
|
||||
handler->OnVirtualKeyboardRequested(browser_impl_->GetBrowser(), mode);
|
||||
}
|
||||
|
||||
void CefRenderWidgetHostViewOSR::UpdateFrameRate() {
|
||||
frame_rate_threshold_us_ = 0;
|
||||
SetFrameRate();
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
|
||||
#include "content/browser/renderer_host/input/mouse_wheel_phase_handler.h"
|
||||
#include "content/browser/renderer_host/render_widget_host_view_base.h"
|
||||
#include "content/browser/renderer_host/text_input_manager.h"
|
||||
#include "content/public/common/widget_type.h"
|
||||
#include "ui/compositor/compositor.h"
|
||||
#include "ui/compositor/external_begin_frame_client.h"
|
||||
@ -96,7 +97,8 @@ class MacHelper;
|
||||
|
||||
class CefRenderWidgetHostViewOSR : public content::RenderWidgetHostViewBase,
|
||||
public ui::ExternalBeginFrameClient,
|
||||
public ui::CompositorDelegate {
|
||||
public ui::CompositorDelegate,
|
||||
public content::TextInputManager::Observer {
|
||||
public:
|
||||
CefRenderWidgetHostViewOSR(SkColor background_color,
|
||||
bool use_shared_texture,
|
||||
@ -205,6 +207,12 @@ class CefRenderWidgetHostViewOSR : public content::RenderWidgetHostViewBase,
|
||||
std::unique_ptr<viz::SoftwareOutputDevice> CreateSoftwareOutputDevice(
|
||||
ui::Compositor* compositor) override;
|
||||
|
||||
// TextInputManager::Observer implementation.
|
||||
void OnUpdateTextInputStateCalled(
|
||||
content::TextInputManager* text_input_manager,
|
||||
RenderWidgetHostViewBase* updated_view,
|
||||
bool did_update_state) override;
|
||||
|
||||
bool InstallTransparency();
|
||||
|
||||
void SynchronizeVisualProperties();
|
||||
|
@ -9,7 +9,7 @@
|
||||
// implementations. See the translator.README.txt file in the tools directory
|
||||
// for more information.
|
||||
//
|
||||
// $hash=7af995d59f8f171a08ea92b3b0c3428fb26f93ad$
|
||||
// $hash=94f5afecaaa5c9c534438a1c97a4af27a97d148c$
|
||||
//
|
||||
|
||||
#include "libcef_dll/cpptoc/render_handler_cpptoc.h"
|
||||
@ -500,6 +500,27 @@ render_handler_on_text_selection_changed(struct _cef_render_handler_t* self,
|
||||
selected_rangeVal);
|
||||
}
|
||||
|
||||
void CEF_CALLBACK
|
||||
render_handler_on_virtual_keyboard_requested(struct _cef_render_handler_t* self,
|
||||
cef_browser_t* browser,
|
||||
cef_text_input_mode_t input_mode) {
|
||||
shutdown_checker::AssertNotShutdown();
|
||||
|
||||
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||
|
||||
DCHECK(self);
|
||||
if (!self)
|
||||
return;
|
||||
// Verify param: browser; type: refptr_diff
|
||||
DCHECK(browser);
|
||||
if (!browser)
|
||||
return;
|
||||
|
||||
// Execute
|
||||
CefRenderHandlerCppToC::Get(self)->OnVirtualKeyboardRequested(
|
||||
CefBrowserCToCpp::Wrap(browser), input_mode);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// CONSTRUCTOR - Do not edit by hand.
|
||||
@ -524,6 +545,8 @@ CefRenderHandlerCppToC::CefRenderHandlerCppToC() {
|
||||
render_handler_on_ime_composition_range_changed;
|
||||
GetStruct()->on_text_selection_changed =
|
||||
render_handler_on_text_selection_changed;
|
||||
GetStruct()->on_virtual_keyboard_requested =
|
||||
render_handler_on_virtual_keyboard_requested;
|
||||
}
|
||||
|
||||
// DESTRUCTOR - Do not edit by hand.
|
||||
|
@ -9,7 +9,7 @@
|
||||
// implementations. See the translator.README.txt file in the tools directory
|
||||
// for more information.
|
||||
//
|
||||
// $hash=bb77b018f638f1bc43208d48a84b02696b9c055c$
|
||||
// $hash=9a7d89bc978623c025c82f438eec0da543aaa7a6$
|
||||
//
|
||||
|
||||
#include "libcef_dll/ctocpp/render_handler_ctocpp.h"
|
||||
@ -431,6 +431,28 @@ void CefRenderHandlerCToCpp::OnTextSelectionChanged(
|
||||
&selected_range);
|
||||
}
|
||||
|
||||
NO_SANITIZE("cfi-icall")
|
||||
void CefRenderHandlerCToCpp::OnVirtualKeyboardRequested(
|
||||
CefRefPtr<CefBrowser> browser,
|
||||
TextInputMode input_mode) {
|
||||
shutdown_checker::AssertNotShutdown();
|
||||
|
||||
cef_render_handler_t* _struct = GetStruct();
|
||||
if (CEF_MEMBER_MISSING(_struct, on_virtual_keyboard_requested))
|
||||
return;
|
||||
|
||||
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||
|
||||
// Verify param: browser; type: refptr_diff
|
||||
DCHECK(browser.get());
|
||||
if (!browser.get())
|
||||
return;
|
||||
|
||||
// Execute
|
||||
_struct->on_virtual_keyboard_requested(
|
||||
_struct, CefBrowserCppToC::Wrap(browser), input_mode);
|
||||
}
|
||||
|
||||
// CONSTRUCTOR - Do not edit by hand.
|
||||
|
||||
CefRenderHandlerCToCpp::CefRenderHandlerCToCpp() {}
|
||||
|
@ -9,7 +9,7 @@
|
||||
// implementations. See the translator.README.txt file in the tools directory
|
||||
// for more information.
|
||||
//
|
||||
// $hash=f76bdd2d055df74b08fe6c77b40b68d908f20dc9$
|
||||
// $hash=b4922b3f59c932edf64692772b300f231e588388$
|
||||
//
|
||||
|
||||
#ifndef CEF_LIBCEF_DLL_CTOCPP_RENDER_HANDLER_CTOCPP_H_
|
||||
@ -77,6 +77,8 @@ class CefRenderHandlerCToCpp
|
||||
void OnTextSelectionChanged(CefRefPtr<CefBrowser> browser,
|
||||
const CefString& selected_text,
|
||||
const CefRange& selected_range) override;
|
||||
void OnVirtualKeyboardRequested(CefRefPtr<CefBrowser> browser,
|
||||
TextInputMode input_mode) override;
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_DLL_CTOCPP_RENDER_HANDLER_CTOCPP_H_
|
||||
|
@ -158,6 +158,8 @@ enum OSRTestType {
|
||||
OSR_TEST_IME_CANCEL_COMPOSITION,
|
||||
// text selection range changed
|
||||
OSR_TEST_TEXT_SELECTION_CHANGE,
|
||||
// clicking on text input will call OnVirtualKeyboardRequested
|
||||
OSR_TEST_VIRTUAL_KEYBOARD,
|
||||
|
||||
// Define the range for popup tests.
|
||||
OSR_TEST_POPUP_FIRST = OSR_TEST_POPUP_PAINT,
|
||||
@ -948,6 +950,19 @@ class OSRTestHandler : public RoutingTestHandler,
|
||||
1);
|
||||
}
|
||||
} break;
|
||||
case OSR_TEST_VIRTUAL_KEYBOARD: {
|
||||
if (StartTest()) {
|
||||
CefMouseEvent mouse_event;
|
||||
const CefRect& input = GetElementBounds("email");
|
||||
mouse_event.x = MiddleX(input);
|
||||
mouse_event.y = MiddleY(input);
|
||||
mouse_event.modifiers = 0;
|
||||
browser->GetHost()->SendMouseClickEvent(mouse_event, MBT_LEFT, false,
|
||||
1);
|
||||
browser->GetHost()->SendMouseClickEvent(mouse_event, MBT_LEFT, true,
|
||||
1);
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -1103,6 +1118,28 @@ class OSRTestHandler : public RoutingTestHandler,
|
||||
}
|
||||
}
|
||||
|
||||
void OnVirtualKeyboardRequested(CefRefPtr<CefBrowser> browser,
|
||||
TextInputMode input_mode) override {
|
||||
if (test_type_ == OSR_TEST_VIRTUAL_KEYBOARD && started()) {
|
||||
if (!got_virtual_keyboard_event_.isSet()) {
|
||||
got_virtual_keyboard_event_.yes();
|
||||
EXPECT_EQ(CEF_TEXT_INPUT_MODE_EMAIL, input_mode);
|
||||
|
||||
CefMouseEvent mouse_event;
|
||||
const CefRect& input = GetElementBounds("LI01");
|
||||
mouse_event.x = MiddleX(input);
|
||||
mouse_event.y = MiddleY(input);
|
||||
mouse_event.modifiers = 0;
|
||||
browser->GetHost()->SendMouseClickEvent(mouse_event, MBT_LEFT, false,
|
||||
1);
|
||||
browser->GetHost()->SendMouseClickEvent(mouse_event, MBT_LEFT, true, 1);
|
||||
} else {
|
||||
EXPECT_EQ(CEF_TEXT_INPUT_MODE_NONE, input_mode);
|
||||
DestroySucceededTestSoon();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool OnTooltip(CefRefPtr<CefBrowser> browser, CefString& text) override {
|
||||
if (test_type_ == OSR_TEST_TOOLTIP && started()) {
|
||||
EXPECT_STREQ("EXPECTED_TOOLTIP", text.ToString().c_str());
|
||||
@ -1319,6 +1356,7 @@ class OSRTestHandler : public RoutingTestHandler,
|
||||
TrackCallback got_navigation_focus_event_;
|
||||
TrackCallback got_system_focus_event_;
|
||||
TrackCallback got_initial_text_selection_event_;
|
||||
TrackCallback got_virtual_keyboard_event_;
|
||||
|
||||
typedef std::map<std::string, CefRect> ElementBoundsMap;
|
||||
ElementBoundsMap element_bounds_;
|
||||
@ -1405,3 +1443,4 @@ OSR_TEST(IMECancelComposition, OSR_TEST_IME_CANCEL_COMPOSITION, 1.0f);
|
||||
OSR_TEST(IMECancelComposition2x, OSR_TEST_IME_CANCEL_COMPOSITION, 2.0f);
|
||||
OSR_TEST(TextSelectionChanged, OSR_TEST_TEXT_SELECTION_CHANGE, 1.0f);
|
||||
OSR_TEST(TextSelectionChanged2x, OSR_TEST_TEXT_SELECTION_CHANGE, 2.0f);
|
||||
OSR_TEST(VirtualKeyboard, OSR_TEST_VIRTUAL_KEYBOARD, 1.0f);
|
||||
|
@ -48,6 +48,7 @@
|
||||
elems.push(getElementBounds('LI10'));
|
||||
elems.push(getElementBounds('LI11'));
|
||||
elems.push(getElementBounds('LI11select'));
|
||||
elems.push(getElementBounds('email'));
|
||||
elems.push(getElementBounds('editbox'));
|
||||
elems.push(getElementBounds('btnnavigate'));
|
||||
elems.push(getElementBounds('dropdiv'));
|
||||
@ -143,6 +144,7 @@
|
||||
<li id='LI10' title='EXPECTED_TOOLTIP'>Mouse over this element will
|
||||
trigger show a tooltip</li>
|
||||
<li id='LI11' onclick='selectText(event)'>SELECTED_TEXT_RANGE</li>
|
||||
<li><input id='email' type='text' size=10 inputmode='email'></li>
|
||||
</ol>
|
||||
<div class="dropdiv" id="dropdiv" ondrop="drop(event)" ondragover="allowDrop(event)">
|
||||
<span id="draghere">Drag here</span>
|
||||
|
Loading…
x
Reference in New Issue
Block a user