void ClientHandler::OnBeforeContextMenu( CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model) { if ((params->GetTypeFlags() & (CM_TYPEFLAG_PAGE | CM_TYPEFLAG_FRAME)) != 0) { // Add a separator if the menu already has items. if (model->GetCount() > 0) model->AddSeparator(); // Add a "Show DevTools" item to all context menus. model->AddItem(CLIENT_ID_SHOW_DEVTOOLS, "&Show DevTools"); CefString devtools_url = browser->GetHost()->GetDevToolsURL(true); if (devtools_url.empty() || m_OpenDevToolsURLs.find(devtools_url) != m_OpenDevToolsURLs.end()) { // Disable the menu option if DevTools isn't enabled or if a window is // already open for the current URL. model->SetEnabled(CLIENT_ID_SHOW_DEVTOOLS, false); } // Test context menu features. BuildTestMenu(model); } }
void ClientHandler::OnBeforeContextMenu( CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model) { if ((params->GetTypeFlags() & (CM_TYPEFLAG_PAGE | CM_TYPEFLAG_FRAME)) != 0) { // Clear all context menus. //model->Clear(); // Clear all context menus except MENU_ID_VIEW_SOURCE. int count = model->GetCount(); for (int i = count - 1; i >=0; i--) { if (model->GetCommandIdAt(i) != MENU_ID_VIEW_SOURCE) { model->RemoveAt(i); } } // Add a "Show DevTools" item to all context menus. model->AddItem(CLIENT_ID_SHOW_DEVTOOLS, "&Show DevTools"); CefString devtools_url = browser->GetHost()->GetDevToolsURL(true); if (devtools_url.empty() || m_OpenDevToolsURLs.find(devtools_url) != m_OpenDevToolsURLs.end()) { // Disable the menu option if DevTools isn't enabled or if a window is // already open for the current URL. model->SetEnabled(CLIENT_ID_SHOW_DEVTOOLS, false); } } }
void CWebClient::OnBeforeContextMenu( CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model) { CEF_REQUIRE_UI_THREAD(); if ((params->GetTypeFlags() & (CM_TYPEFLAG_PAGE | CM_TYPEFLAG_FRAME)) != 0) { // Add a separator if the menu already has items. if (model->GetCount() > 0) model->AddSeparator(); // Add DevTools items to all context menus. model->AddItem(CLIENT_ID_SHOW_DEVTOOLS, "&Show DevTools"); model->AddItem(CLIENT_ID_CLOSE_DEVTOOLS, "Close DevTools"); model->AddSeparator(); model->AddItem(CLIENT_ID_INSPECT_ELEMENT, "Inspect Element"); // Test context menu features. //BuildTestMenu(model); model->AddSeparator(); model->AddItem(CLIENT_ID_RELOAD, "&Reload"); } }
void CBrowerDialogContextMenu::OnBeforeContextMenu(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model) { std::string url = params->GetLinkUrl().ToString(); if (!url.empty()) { model->InsertItemAt(0, CLIENT_ID_OPEN_SELECTED_SIDE, kodi::GetLocalizedString(30000 + CLIENT_ID_OPEN_SELECTED_SIDE)); if (!m_client->IsFullscreen()) model->InsertItemAt(0, CLIENT_ID_OPEN_SELECTED_SIDE_IN_NEW_TAB, kodi::GetLocalizedString(30000 + CLIENT_ID_OPEN_SELECTED_SIDE_IN_NEW_TAB)); } int flags = params->GetTypeFlags(); if (flags & CM_TYPEFLAG_EDITABLE) model->InsertItemAt(0, CLIENT_ID_OPEN_KEYBOARD, kodi::GetLocalizedString(30000 + CLIENT_ID_OPEN_KEYBOARD)); #ifdef DEBUG_LOGS LOG_MESSAGE(ADDON_LOG_DEBUG, "CefContextMenuParams"); LOG_MESSAGE(ADDON_LOG_DEBUG, "- %ix%i - TypeFlags: 0x%X - ImageContents: %s - MediaType: %i - MediaStateFlags %i - EditStateFlags %i", params->GetXCoord(), params->GetYCoord(), (int)params->GetTypeFlags(), params->HasImageContents() ? "yes" : "no", (int)params->GetMediaType(), (int)params->GetMediaStateFlags(), (int)params->GetEditStateFlags()); LOG_MESSAGE(ADDON_LOG_DEBUG, "- LinkUrl: %s", params->GetLinkUrl().ToString().c_str()); LOG_MESSAGE(ADDON_LOG_DEBUG, "- UnfilteredLinkUrl: %s", params->GetUnfilteredLinkUrl().ToString().c_str()); LOG_MESSAGE(ADDON_LOG_DEBUG, "- SourceUrl: %s", params->GetSourceUrl().ToString().c_str()); LOG_MESSAGE(ADDON_LOG_DEBUG, "- PageUrl: %s", params->GetPageUrl().ToString().c_str()); LOG_MESSAGE(ADDON_LOG_DEBUG, "- FrameUrl : %s", params->GetFrameUrl().ToString().c_str()); LOG_MESSAGE(ADDON_LOG_DEBUG, "- FrameCharset : %s", params->GetFrameCharset().ToString().c_str()); LOG_MESSAGE(ADDON_LOG_DEBUG, "- SelectionText : %s", params->GetSelectionText().ToString().c_str()); LOG_MESSAGE(ADDON_LOG_DEBUG, "- MisspelledWord : %s", params->GetMisspelledWord().ToString().c_str()); std::vector<CefString> suggestions; LOG_MESSAGE(ADDON_LOG_DEBUG, "- DictionarySuggestions : %s", params->GetDictionarySuggestions(suggestions) ? "OK" : "fail"); for (unsigned int i = 0; i < suggestions.size(); i++) LOG_MESSAGE(ADDON_LOG_DEBUG, " - %02i: %s", i, suggestions[i].ToString().c_str()); LOG_MESSAGE(ADDON_LOG_DEBUG, "- IsEditable : %s", params->IsEditable() ? "yes" : "no"); LOG_MESSAGE(ADDON_LOG_DEBUG, "- IsSpellCheckEnabled : %s", params->IsSpellCheckEnabled() ? "yes" : "no"); LOG_MESSAGE(ADDON_LOG_DEBUG, "- IsCustomMenu : %s", params->IsCustomMenu() ? "yes" : "no"); LOG_MESSAGE(ADDON_LOG_DEBUG, "- IsPepperMenu : %s", params->IsPepperMenu() ? "yes" : "no"); LOG_MESSAGE(ADDON_LOG_DEBUG, "CefMenuModel"); LOG_MESSAGE(ADDON_LOG_DEBUG, "- Count: %i", model->GetCount()); for (int i = 0; i < model->GetCount(); i++) LOG_MESSAGE(ADDON_LOG_DEBUG, " - %02i: ID '%i' Type '%i' - Name '%s'", i, model->GetCommandIdAt(i), model->GetTypeAt(i), model->GetLabelAt(i).ToString().c_str()); #endif }
bool CBrowerDialogContextMenu::RunContextMenu(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model, CefRefPtr<CefRunContextMenuCallback> callback) { std::vector<std::pair<int, std::string>> entries; for (int i = 0; i < model->GetCount(); ++i) { int id = model->GetCommandIdAt(i); if (id < 0 || id == MENU_ID_PRINT || id == MENU_ID_VIEW_SOURCE || !model->IsEnabled(id)) { // ignored parts! continue; } cef_menu_item_type_t type = model->GetTypeAt(i); switch (type) { case MENUITEMTYPE_COMMAND: entries.push_back(std::pair<int, std::string>(id, kodi::GetLocalizedString(30000 + id))); break; // TODO add support for other formats e.g. boolean check case MENUITEMTYPE_CHECK: case MENUITEMTYPE_RADIO: case MENUITEMTYPE_SUBMENU: LOG_MESSAGE(ADDON_LOG_ERROR, "Context menu \"cef_menu_item_type_t '%i'\" currently not supported!", type); break; // TODO add support for separator case MENUITEMTYPE_SEPARATOR: break; case MENUITEMTYPE_NONE: default: break; } } if (!entries.empty()) { m_client->SetContextMenuOpen(true); /* Start the independent thread to prevent block on main thread */ std::thread(RunContextMenuProcess, m_client, entries, callback).detach(); } else { /* If no entries cancel the context menu */ callback->Cancel(); } /* Always true, otherwise Chromium's own context menu might be displayed. */ return true; }
void ClientHandler::OnBeforeContextMenu( CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model) { if ((params->GetTypeFlags() & (CM_TYPEFLAG_PAGE | CM_TYPEFLAG_FRAME)) != 0) { // Add a separator if the menu already has items. if (model->GetCount() > 0) model->AddSeparator(); } }
void ClientAdapter::OnBeforeContextMenu(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model) { // Something like this... auto winFormsWebBrowserControl = dynamic_cast<IWinFormsWebBrowser^>((IWebBrowserInternal^)_browserControl); if (winFormsWebBrowserControl == nullptr) return; IMenuHandler^ handler = winFormsWebBrowserControl->MenuHandler; if (handler == nullptr) return; auto result = handler->OnBeforeContextMenu(_browserControl); if (!result) { // The only way I found for preventing the context menu to be displayed is by removing all items. :-) while (model->GetCount() > 0) { model->RemoveAt(0); } } }
void ClientHandler::BuildTestMenu(CefRefPtr<CefMenuModel> model) { // Henry, do not build testmenu return; if (model->GetCount() > 0) model->AddSeparator(); // Build the sub menu. CefRefPtr<CefMenuModel> submenu = model->AddSubMenu(CLIENT_ID_TESTMENU_SUBMENU, "Context Menu Test"); submenu->AddCheckItem(CLIENT_ID_TESTMENU_CHECKITEM, "Check Item"); submenu->AddRadioItem(CLIENT_ID_TESTMENU_RADIOITEM1, "Radio Item 1", 0); submenu->AddRadioItem(CLIENT_ID_TESTMENU_RADIOITEM2, "Radio Item 2", 0); submenu->AddRadioItem(CLIENT_ID_TESTMENU_RADIOITEM3, "Radio Item 3", 0); // Check the check item. if (m_TestMenuState.check_item) submenu->SetChecked(CLIENT_ID_TESTMENU_CHECKITEM, true); // Check the selected radio item. submenu->SetChecked( CLIENT_ID_TESTMENU_RADIOITEM1 + m_TestMenuState.radio_item, true); }