When a user long click on the link in webpage, context menu should popup.
Reference :
- https://review.tizen.org/gerrit/#/c/291848/
Change-Id: Id307f33fdcc3bbda45c2c0feec1bdff3adcde14c
Signed-off-by: jiangyuwei <yuwei.jiang@samsung.com>
if (auto* event_handler = GetEventHandler())
event_handler->SetMouseEventsEnabled(enable);
}
+
+void RWHVAuraCommonHelperEfl::SetMouseEventCallbacks(
+ const base::RepeatingCallback<void(int, int)>& on_mouse_down,
+ const base::RepeatingCallback<bool(void)>& on_mouse_up,
+ const base::RepeatingCallback<void(void)>& on_mouse_move) {
+ if (auto* event_handler = GetEventHandler())
+ event_handler->SetMouseEventCallbacks(on_mouse_down, on_mouse_up,
+ on_mouse_move);
+}
+
+void RWHVAuraCommonHelperEfl::MouseDownCallback(int x, int y) {
+ if (!on_mouse_down_callback_.is_null())
+ on_mouse_down_callback_.Run(x, y);
+}
+
+bool RWHVAuraCommonHelperEfl::MouseUpCallback() {
+ if (!on_mouse_up_callback_.is_null())
+ return on_mouse_up_callback_.Run();
+
+ return false;
+}
+
+void RWHVAuraCommonHelperEfl::MouseMoveCallback() {
+ if (!on_mouse_move_callback_.is_null())
+ on_mouse_move_callback_.Run();
+}
#endif
void RWHVAuraCommonHelperEfl::OnGetMainFrameScrollbarVisible(
// notify web browser video playing status
void RequestVideoPlaying(int callback_id);
void VideoPlayingStatusReceived(bool is_playing, int callback_id);
+ void SetMouseEventCallbacks(
+ const base::RepeatingCallback<void(int, int)>& on_mouse_down,
+ const base::RepeatingCallback<bool(void)>& on_mouse_up,
+ const base::RepeatingCallback<void(void)>& on_mouse_move);
+ void MouseDownCallback(int x, int y);
+ bool MouseUpCallback();
+ void MouseMoveCallback();
#endif
void CompositingCompleteSwapWithNewSize(const gfx::Size& size) {
// When WebBrowser sets their own cursor, set the flag
// not to set the WebPage cursor
bool cursor_set_by_client_ = false;
+ base::RepeatingCallback<void(int, int)> on_mouse_down_callback_;
+ base::RepeatingCallback<bool(void)> on_mouse_up_callback_;
+ base::RepeatingCallback<void(void)> on_mouse_move_callback_;
#endif
std::unique_ptr<RenderWidgetHostHelper> rwh_helper_;
enum { kLeftButton = 1, kMiddleButton = 2, kRightButton = 3 };
+#if BUILDFLAG(IS_TIZEN_TV)
+static void TranslateEvasCoordToWebKitCoord(Evas_Object* web_view,
+ gfx::PointF* point) {
+ Evas_Coord tmpX, tmpY;
+ evas_object_geometry_get(web_view, &tmpX, &tmpY, 0, 0);
+ point->Offset(-tmpX, -tmpY);
+}
+#endif
+
EventFlags EvasToUIMouseButton(int button) {
if (button == kLeftButton)
return EF_LEFT_MOUSE_BUTTON;
MouseEvent event =
MakeWebMouseEvent(ET_MOUSE_PRESSED, ev, thiz->GetTopControlsHeight());
EflPlatformEventSource::GetInstance()->DispatchEflEvent(&event);
+#if BUILDFLAG(IS_TIZEN_TV)
+ if (!thiz->on_mouse_down_callback_.is_null()) {
+ const float sf = GetDeviceScaleFactor();
+ gfx::PointF location(ev->canvas.x / sf, ev->canvas.y / sf);
+ TranslateEvasCoordToWebKitCoord(obj, &location);
+ thiz->on_mouse_down_callback_.Run(location.x(), location.y());
+ }
+#endif
}
}
MouseEvent event =
MakeWebMouseEvent(ET_MOUSE_RELEASED, ev, thiz->GetTopControlsHeight());
EflPlatformEventSource::GetInstance()->DispatchEflEvent(&event);
+#if BUILDFLAG(IS_TIZEN_TV)
+ if (!thiz->on_mouse_up_callback_.is_null() &&
+ thiz->on_mouse_up_callback_.Run())
+ return;
+#endif
}
}
gfx::Vector2dF((ev->cur.canvas.x / sf - ev->prev.canvas.x / sf),
(ev->cur.canvas.y / sf - ev->prev.canvas.y / sf)));
EflPlatformEventSource::GetInstance()->DispatchEflEvent(&event);
+#if BUILDFLAG(IS_TIZEN_TV)
+ if (!thiz->on_mouse_move_callback_.is_null())
+ thiz->on_mouse_move_callback_.Run();
+#endif
}
}
const base::RepeatingCallback<bool(void*, bool)>& checker) {
key_event_checker_ = checker;
}
+
+void EflEventHandler::SetMouseEventCallbacks(
+ const base::RepeatingCallback<void(int, int)>& on_mouse_down,
+ const base::RepeatingCallback<bool(void)>& on_mouse_up,
+ const base::RepeatingCallback<void(void)>& on_mouse_move) {
+ on_mouse_down_callback_ = on_mouse_down;
+ on_mouse_up_callback_ = on_mouse_up;
+ on_mouse_move_callback_ = on_mouse_move;
+}
#endif
void EflEventHandler::OnMultiTouchDownEvent(void* data,
EflEventHandler(const EflEventHandler&) = delete;
EflEventHandler& operator=(const EflEventHandler&) = delete;
+#if BUILDFLAG(IS_TIZEN_TV)
+ void SetMouseEventCallbacks(
+ const base::RepeatingCallback<void(int, int)>& on_mouse_down,
+ const base::RepeatingCallback<bool(void)>& on_mouse_up,
+ const base::RepeatingCallback<void(void)>& on_mouse_move);
+#endif
+
void SetMouseEventsEnabled(bool enabled);
bool MouseEventsEnabled() const { return mouse_events_enabled_; }
void SetTouchEventsEnabled(bool enabled);
#if BUILDFLAG(IS_TIZEN_TV)
base::RepeatingCallback<bool(void*, bool)> key_event_checker_;
+ base::RepeatingCallback<void(int, int)> on_mouse_down_callback_;
+ base::RepeatingCallback<bool(void)> on_mouse_up_callback_;
+ base::RepeatingCallback<void(void)> on_mouse_move_callback_;
#endif
};
WebContents& web_contents)
: ContextMenuControllerBase(web_contents),
webview_(wv),
+ menu_items_parent_(nullptr),
weak_ptr_factory_(this) {}
ContextMenuControllerEfl::~ContextMenuControllerEfl() {
return false;
params_ = params;
+
+#if BUILDFLAG(IS_TIZEN_TV)
+ if (params_.link_url.is_empty()) {
+ LOG(INFO) << "link url is empty";
+ return false;
+ }
+#endif
is_text_selection_ =
params_.is_editable ||
(params_.link_url.is_empty() && params_.src_url.is_empty() &&
params_.media_type == ContextMenuDataMediaType::kNone);
+ menu_items_parent_.reset(new _Ewk_Context_Menu(this));
+#if BUILDFLAG(IS_TIZEN_TV)
+ menu_items_parent_.get()->SetPosition(params_.x, params_.y);
+#endif
GetProposedContextMenu();
- menu_items_parent_.reset(new _Ewk_Context_Menu(menu_items_));
+#if BUILDFLAG(IS_TIZEN_TV)
+ LOG(INFO) << "Context Menu Show";
+ webview_->SmartCallback<EWebViewCallbacks::ContextMenuShow>().call(
+ menu_items_parent_.get());
+ return true;
+#endif
+ LOG(INFO) << "Context Menu Customize";
webview_->SmartCallback<EWebViewCallbacks::ContextMenuCustomize>().call(
menu_items_parent_.get());
- menu_items_ = menu_items_parent_->TakeMenuList();
if (!CreateContextMenu(params))
return false;
void ContextMenuControllerEfl::GetProposedContextMenu() {
if (!params_.link_url.is_empty()) {
AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
- EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK,
- dgettext("WebKit",
- "IDS_WEBVIEW_OPT_OPEN_LINK_IN_CURRENT_TAB_ABB"),
- params_.link_url.spec(),
- params_.link_url.spec());
- AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
+ EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK,
+ dgettext("WebKit",
+#if BUILDFLAG(IS_TIZEN_TV)
+ "IDS_WEBVIEW_OPEN"),
+#else
+ "IDS_WEBVIEW_OPT_OPEN_LINK_IN_CURRENT_TAB_"
+ "ABB"),
+#endif
+ params_.link_url.spec(), params_.link_url.spec());
+ AddItemToProposedList(
+ EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW,
- std::string(dgettext("WebKit",
- "IDS_WEBVIEW_OPT_OPEN_LINK_IN_NEW_TAB_ABB")),
- params_.link_url.spec(),
- params_.link_url.spec());
+ std::string(
+ dgettext("WebKit", "IDS_TPLATFORM_OPT_OPEN_LINK_IN_NEW_TAB_ABB")),
+ params_.link_url.spec(), params_.link_url.spec());
AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_DATA,
std::string(dgettext("WebKit",
}
if (params_.has_image_contents && !params_.src_url.is_empty()) {
- AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
+ AddItemToProposedList(
+ EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_CURRENT_WINDOW,
- std::string(dgettext(
- "WebKit",
- "IDS_WEBVIEW_OPT_OPEN_IMAGE_IN_CURRENT_TAB_ABB")),
- params_.src_url.spec(),
- params_.src_url.spec());
+ std::string(
+ dgettext("WebKit", "IDS_WEBVIEW_OPT_OPEN_IMAGE_IN_CURRENT_TAB")),
+ params_.src_url.spec(), params_.src_url.spec());
AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION,
EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW,
std::string(dgettext("WebKit",
if (!item) {
save_fail_dialog_.reset(JavaScriptModalDialogEfl::CreateDialogAndShow(
&web_contents_, JavaScriptModalDialogEfl::ALERT,
- base::UTF8ToUTF16(
- std::string(dgettext("WebKit", "IDS_WEBVIEW_POP_FAIL"))),
+ base::UTF8ToUTF16(std::string(dgettext("WebKit", "IDS_BR_POP_FAIL"))),
std::u16string(), base::BindOnce(&EmptyDialogClosedCallback)));
return;
}
file_saved_dialog_.reset(JavaScriptModalDialogEfl::CreateDialogAndShow(
&web_contents_, JavaScriptModalDialogEfl::ALERT,
base::UTF8ToUTF16(
- std::string(dgettext("WebKit", "IDS_WEBVIEW_POP_SAVED"))),
+ std::string(dgettext("WebKit", "IDS_BR_POP_SAVED"))),
std::u16string(), base::BindOnce(&EmptyDialogClosedCallback)));
download->RemoveObserver(this);
disk_download_items_.erase(download);
ContextMenuControllerBase::Resize(webview_rect);
}
+
+void ContextMenuControllerEfl::AppendItem(const _Ewk_Context_Menu_Item* item) {
+ menu_items_ = eina_list_append(menu_items_, item);
+}
+
+void ContextMenuControllerEfl::RemoveItem(const _Ewk_Context_Menu_Item* item) {
+ menu_items_ = eina_list_remove(menu_items_, item);
+ delete item;
+}
}
void MenuItemSelected(ContextMenuItemEfl* menu_item) override;
gfx::Point GetContextMenuShowPos() const { return context_menu_show_pos_; };
void Resize(const gfx::Rect& webview_rect) override;
+ Eina_List* GetMenuItems() const { return menu_items_; }
+ void AppendItem(const _Ewk_Context_Menu_Item* item);
+ void RemoveItem(const _Ewk_Context_Menu_Item* item);
private:
// ContextMenuControllerBase
FILE_PATH_LITERAL("saved_page");
const char kReplaceChars[] = " ";
const char kReplaceWith[] = "_";
+#if BUILDFLAG(IS_TIZEN_TV)
+static const int kMousePressAndHoldTimeout = 500; // long press: 500ms
+#endif
static const char* kRendererCrashedHTMLMessage =
"<html><body><h1>Renderer process has crashed!</h1></body></html>";
is_processing_edge_scroll_(false),
use_early_rwi_(false),
rwi_info_showed_(false),
+ context_menu_show_(false),
#endif
#if defined(TIZEN_PEPPER_EXTENSIONS)
render_frame_id_{0, 0},
host->AddFilter(new WebViewBrowserMessageFilter(content));
}
}
+#if BUILDFLAG(IS_TIZEN_TV)
+ if (rwhva() && IsWebBrowser()) {
+ rwhva()->aura_efl_helper()->SetMouseEventCallbacks(
+ base::BindRepeating(&EWebView::OnMouseDown, base::Unretained(this)),
+ base::BindRepeating(&EWebView::OnMouseUp, base::Unretained(this)),
+ base::BindRepeating(&EWebView::OnMouseMove, base::Unretained(this)));
+ }
+#endif
}
void EWebView::SetQuotaPermissionRequestCallback(
}
}
}
+
+void EWebView::OnMouseLongPressed(int x, int y) {
+ RenderViewHost* render_view_host = web_contents_->GetRenderViewHost();
+ if (!render_view_host)
+ return;
+
+ LOG(INFO) << __FUNCTION__;
+ RenderWidgetHostImpl* render_wiget_host_impl =
+ static_cast<RenderViewHostImpl*>(render_view_host)->GetWidget();
+ if (!render_wiget_host_impl)
+ return;
+
+ render_wiget_host_impl->ShowContextMenuAtPoint(
+ gfx::Point(x, y), ui::MenuSourceType::MENU_SOURCE_MOUSE);
+ context_menu_show_ = true;
+}
+
+void EWebView::OnMouseDown(int x, int y) {
+ mouse_long_press_timer_.Start(
+ FROM_HERE, base::Milliseconds(kMousePressAndHoldTimeout),
+ base::BindRepeating(&EWebView::OnMouseLongPressed, base::Unretained(this),
+ x, y));
+}
+
+bool EWebView::OnMouseUp() {
+ LOG(INFO) << __FUNCTION__;
+ mouse_long_press_timer_.Stop();
+ if (context_menu_show_) {
+ context_menu_show_ = false;
+ return true;
+ }
+ return false;
+}
+
+void EWebView::OnMouseMove() {
+ mouse_long_press_timer_.Stop();
+}
#endif
#if defined(TIZEN_TBM_SUPPORT)
void SetTranslatedURL(const char* url);
void NotifyParentalRatingInfo(const char* info, const char* url);
void SetParentalRatingResult(const char* info, bool is_pass);
+ void OnMouseLongPressed(int x, int y);
+ void OnMouseDown(int x, int y);
+ bool OnMouseUp();
+ void OnMouseMove();
#endif // IS_TIZEN_TV
void SetDidChangeThemeColorCallback(
bool rwi_info_showed_;
GURL rwi_gurl_;
bool is_high_bitrate_ = false;
-
+ bool context_menu_show_;
+ base::OneShotTimer mouse_long_press_timer_;
base::OnceClosure pending_setfocus_closure_;
enum PlaybackState {
EdgeScrollLeft,
EdgeScrollRight,
EdgeScrollTop,
+ ContextMenuShow,
+ ContextMenuHide,
DeviceConnectionChanged,
PlaybackLoad,
PlaybackVideoReady,
DECLARE_EWK_VIEW_CALLBACK(DeviceConnectionChanged,
"device,connection,changed",
int*);
+DECLARE_EWK_VIEW_CALLBACK(ContextMenuShow,
+ "contextmenu,show",
+ _Ewk_Context_Menu*);
+DECLARE_EWK_VIEW_CALLBACK(ContextMenuHide,
+ "contextmenu,hide",
+ _Ewk_Context_Menu*);
DECLARE_EWK_VIEW_CALLBACK(PlaybackLoad, "notification,playback,load", void*);
DECLARE_EWK_VIEW_CALLBACK(PlaybackVideoReady,
"notification,playback,videoready",
char* label = NULL;
if (options_[index] == CALL)
- label = strdup(dgettext("WebKit","IDS_WEBVIEW_OPT_CALL"));
+ label = strdup(dgettext("WebKit", "IDS_BR_OPT_CALL"));
else if (options_[index] == SEND_EMAIL)
- label = strdup(dgettext("WebKit","IDS_WEBVIEW_OPT_SEND_EMAIL"));
+ label = strdup(dgettext("WebKit", "IDS_BR_OPT_SEND_EMAIL"));
else if (options_[index] == SEND_MESSAGE)
- label = strdup(dgettext("WebKit","IDS_WEBVIEW_OPT_SEND_MESSAGE"));
+ label = strdup(dgettext("WebKit", "IDS_COM_BODY_OPT_SEND_MESSAGE"));
else if (options_[index] == ADD_CONTACT)
- label = strdup(dgettext("WebKit","IDS_WEBVIEW_BODY_ADD_TO_CONTACT"));
+ label = strdup(dgettext("WebKit", "IDS_BR_BODY_ADD_TO_CONTACT"));
else if (options_[index] == COPY)
label = strdup(dgettext("WebKit","IDS_WEBVIEW_OPT_COPY"));
menu_item_ = nullptr;
}
- _Ewk_Context_Menu_Item(const _Ewk_Context_Menu_Item&) = delete;
- _Ewk_Context_Menu_Item& operator=(const _Ewk_Context_Menu_Item&) = delete;
-
content::ContextMenuItemEfl* GetMenuItem() const { return menu_item_; }
_Ewk_Context_Menu* ParentMenu() const { return parent_menu_; }
#include "context_menu_controller_efl.h"
#include "ewk_context_menu_item_private.h"
+#if BUILDFLAG(IS_TIZEN_TV)
+#include "ui/display/screen.h"
+#endif
+
// Wrapper for context_menu_controller items
class _Ewk_Context_Menu {
public:
- _Ewk_Context_Menu(Eina_List* menu_list)
- : menu_list_(menu_list) {
+ _Ewk_Context_Menu(content::ContextMenuControllerEfl* controller)
+#if BUILDFLAG(IS_TIZEN_TV)
+ : controller_(controller), position_(0, 0) {
+#else
+ : controller_(controller) {
+#endif
}
- ~_Ewk_Context_Menu() {
- if (menu_list_) {
- void* data;
- EINA_LIST_FREE(menu_list_, data) {
- _Ewk_Context_Menu_Item *item = static_cast<_Ewk_Context_Menu_Item*> (data);
- delete item;
- }
- }
+ const Eina_List* GetMenuList() const {
+ if (controller_)
+ return controller_->GetMenuItems(); // LCOV_EXCL_LINE
+ else
+ return nullptr; // LCOV_EXCL_LINE
}
- const Eina_List* GetMenuList() const {
- return menu_list_;
+ content::ContextMenuControllerEfl* GetController() const {
+ return controller_; // LCOV_EXCL_LINE
+ }
+
+ void AppendItem(const _Ewk_Context_Menu_Item* item) {
+ if (controller_)
+ controller_->AppendItem(item);
+ }
+
+ void RemoveItem(const _Ewk_Context_Menu_Item* item) {
+ if (controller_)
+ controller_->RemoveItem(item);
}
- Eina_List* TakeMenuList() {
- Eina_List* ptr = menu_list_;
- menu_list_ = NULL;
- return ptr;
+ void MenuItemSelected(const _Ewk_Context_Menu_Item* item) {
+ content::ContextMenuItemEfl* info_item = item->GetMenuItem();
+ if (controller_)
+ controller_->MenuItemSelected(info_item);
}
- void AppendItem(const void* item) {
- menu_list_ = eina_list_append(menu_list_, item);
+ void HideContextMenu() {
+ if (controller_)
+ controller_->HideContextMenu();
}
- void RemoveItem(_Ewk_Context_Menu_Item* item) {
- menu_list_ = eina_list_remove(menu_list_, item);
- delete item;
+#if BUILDFLAG(IS_TIZEN_TV)
+ void SetPosition(int x, int y) {
+ position_.set_x(x);
+ position_.set_y(y);
}
+ gfx::Point GetPosition() { return position_; } // LCOV_EXCL_LINE
+#endif
+
private:
- Eina_List* menu_list_;
+ content::ContextMenuControllerEfl* controller_;
+#if BUILDFLAG(IS_TIZEN_TV)
+ gfx::Point position_;
+#endif
};
#endif // ewk_context_menu_private_h
const char* ewk_context_menu_item_title_get(const Ewk_Context_Menu_Item* item)
{
- LOG_EWK_API_MOCKUP();
+ EINA_SAFETY_ON_NULL_RETURN_VAL(item, NULL);
+ if (item->GetMenuItem())
+ return item->GetMenuItem()->Title().c_str();
return NULL;
}
const Eina_List* ewk_context_menu_items_get(const Ewk_Context_Menu* menu)
{
- LOG_EWK_API_MOCKUP();
- return NULL;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(menu, NULL);
+ return menu->GetMenuList();
}
Ewk_Context_Menu* ewk_context_menu_item_parent_menu_get(const Ewk_Context_Menu_Item* item)
Eina_Bool ewk_context_menu_item_select(Ewk_Context_Menu* menu, Ewk_Context_Menu_Item* item)
{
- LOG_EWK_API_MOCKUP();
- return false;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(menu, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(item, EINA_FALSE);
+ menu->MenuItemSelected(item);
+ return EINA_TRUE;
}
Eina_Bool ewk_context_menu_hide(Ewk_Context_Menu* menu)
{
- LOG_EWK_API_MOCKUP();
- return false;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(menu, EINA_FALSE);
+ menu->HideContextMenu();
+ return EINA_TRUE;
}
int ewk_context_menu_pos_x_get(Ewk_Context_Menu* menu)
{
#if BUILDFLAG(IS_TIZEN_TV)
- LOG_EWK_API_MOCKUP();
- return 0;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(menu, 0);
+ return menu->GetPosition().x();
#else
LOG_EWK_API_MOCKUP("Only for Tizen TV.");
return 0;
int ewk_context_menu_pos_y_get(Ewk_Context_Menu* menu)
{
#if BUILDFLAG(IS_TIZEN_TV)
- LOG_EWK_API_MOCKUP();
- return 0;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(menu, 0);
+ return menu->GetPosition().y();
#else
LOG_EWK_API_MOCKUP("Only for Tizen TV.");
return 0;