bool WebPageContextMenuClient::getContextMenuFromProposedMenu(WebPageProxy* page, const Vector<WebContextMenuItemData>& proposedMenuVector, Vector<WebContextMenuItemData>& customMenu, APIObject* userData) { if (!m_client.getContextMenuFromProposedMenu) return false; unsigned size = proposedMenuVector.size(); RefPtr<MutableArray> proposedMenu = MutableArray::create(); proposedMenu->reserveCapacity(size); for (unsigned i = 0; i < size; ++i) proposedMenu->append(WebContextMenuItem::create(proposedMenuVector[i]).get()); WKArrayRef newMenu = 0; m_client.getContextMenuFromProposedMenu(toAPI(page), toAPI(proposedMenu.get()), &newMenu, toAPI(userData), m_client.clientInfo); RefPtr<ImmutableArray> array = adoptRef(toImpl(newMenu)); customMenu.clear(); size_t newSize = array ? array->size() : 0; for (size_t i = 0; i < newSize; ++i) { WebContextMenuItem* item = array->at<WebContextMenuItem>(i); if (!item) { LOG(ContextMenu, "New menu entry at index %i is not a WebContextMenuItem", (int)i); continue; } customMenu.append(*item->data()); } return true; }
bool InjectedBundlePageContextMenuClient::getCustomMenuFromDefaultItems(WebPage* page, InjectedBundleHitTestResult* hitTestResult, const Vector<WebContextMenuItemData>& defaultMenu, Vector<WebContextMenuItemData>& newMenu, RefPtr<APIObject>& userData) { if (!m_client.getContextMenuFromDefaultMenu) return false; RefPtr<MutableArray> defaultMenuArray = MutableArray::create(); defaultMenuArray->reserveCapacity(defaultMenu.size()); for (unsigned i = 0; i < defaultMenu.size(); ++i) defaultMenuArray->append(WebContextMenuItem::create(defaultMenu[i]).get()); WKArrayRef newMenuWK = 0; WKTypeRef userDataToPass = 0; m_client.getContextMenuFromDefaultMenu(toAPI(page), toAPI(hitTestResult), toAPI(defaultMenuArray.get()), &newMenuWK, &userDataToPass, m_client.clientInfo); RefPtr<ImmutableArray> array = adoptRef(toImpl(newMenuWK)); userData = adoptRef(toImpl(userDataToPass)); newMenu.clear(); if (!array || !array->size()) return true; size_t size = array->size(); for (size_t i = 0; i < size; ++i) { WebContextMenuItem* item = array->at<WebContextMenuItem>(i); if (!item) { LOG(ContextMenu, "New menu entry at index %i is not a WebContextMenuItem", (int)i); continue; } newMenu.append(*item->data()); } return true; }
bool InjectedBundlePageContextMenuClient::getCustomMenuFromDefaultItems(WebPage& page, const HitTestResult& hitTestResult, const Vector<ContextMenuItem>& proposedMenu, Vector<WebContextMenuItemData>& newMenu, RefPtr<API::Object>& userData) { if (!m_client.getContextMenuFromDefaultMenu) return false; Vector<WebContextMenuItemData> defaultMenu = kitItems(proposedMenu); Vector<RefPtr<API::Object>> defaultMenuItems; defaultMenuItems.reserveInitialCapacity(defaultMenu.size()); for (const auto& item : defaultMenu) defaultMenuItems.uncheckedAppend(WebContextMenuItem::create(item)); WKArrayRef newMenuWK = nullptr; WKTypeRef userDataToPass = nullptr; m_client.getContextMenuFromDefaultMenu(toAPI(&page), toAPI(InjectedBundleHitTestResult::create(hitTestResult).get()), toAPI(API::Array::create(WTF::move(defaultMenuItems)).ptr()), &newMenuWK, &userDataToPass, m_client.base.clientInfo); RefPtr<API::Array> array = adoptRef(toImpl(newMenuWK)); userData = adoptRef(toImpl(userDataToPass)); newMenu.clear(); if (!array || !array->size()) return true; size_t size = array->size(); for (size_t i = 0; i < size; ++i) { WebContextMenuItem* item = array->at<WebContextMenuItem>(i); if (!item) { LOG(ContextMenu, "New menu entry at index %i is not a WebContextMenuItem", (int)i); continue; } newMenu.append(*item->data()); } return true; }