void InspectorFrontendHost::showContextMenu(Event* event, const Vector<ContextMenuItem*>& items) { if (!m_inspectorController) return; if (!m_inspectorController->windowVisible()) return; m_menuProvider = MenuProvider::create(this, items); ContextMenuController* menuController = m_inspectorController->m_page->contextMenuController(); menuController->showContextMenu(event, m_menuProvider); }
void InspectorFrontendHost::showContextMenu(Event* event, const Vector<ContextMenuItem*>& items) { ASSERT(m_frontendPage); ScriptState* frontendScriptState = scriptStateFromPage(debuggerWorld(), m_frontendPage); ScriptObject webInspectorObj; if (!ScriptGlobalObject::get(frontendScriptState, "WebInspector", webInspectorObj)) { ASSERT_NOT_REACHED(); return; } RefPtr<FrontendMenuProvider> menuProvider = FrontendMenuProvider::create(this, webInspectorObj, items); ContextMenuController* menuController = m_frontendPage->contextMenuController(); menuController->showContextMenu(event, menuProvider); m_menuProvider = menuProvider.get(); }
v8::Handle<v8::Value> WebDevToolsFrontendImpl::jsShowContextMenu(const v8::Arguments& args) { if (args.Length() < 2) return v8::Undefined(); v8::Local<v8::Object> eventWrapper = v8::Local<v8::Object>::Cast(args[0]); if (V8DOMWrapper::domWrapperType(eventWrapper) != V8ClassIndex::MOUSEEVENT) return v8::Undefined(); Event* event = V8Event::toNative(eventWrapper); if (!args[1]->IsArray()) return v8::Undefined(); v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(args[1]); Vector<ContextMenuItem*> items; for (size_t i = 0; i < array->Length(); ++i) { v8::Local<v8::Object> item = v8::Local<v8::Object>::Cast(array->Get(v8::Integer::New(i))); v8::Local<v8::Value> label = item->Get(v8::String::New("label")); v8::Local<v8::Value> id = item->Get(v8::String::New("id")); if (label->IsUndefined() || id->IsUndefined()) { items.append(new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String())); } else { ContextMenuAction typedId = static_cast<ContextMenuAction>( ContextMenuItemBaseCustomTag + id->ToInt32()->Value()); items.append(new ContextMenuItem(ActionType, typedId, toWebCoreStringWithNullCheck(label))); } } WebDevToolsFrontendImpl* frontend = static_cast<WebDevToolsFrontendImpl*>(v8::External::Cast(*args.Data())->Value()); frontend->m_menuProvider = MenuProvider::create(frontend, items); ContextMenuController* menuController = frontend->m_webViewImpl->page()->contextMenuController(); menuController->showContextMenu(event, frontend->m_menuProvider); return v8::Undefined(); }
void WebContextMenu::show() { ContextMenuController* controller = m_page->corePage()->contextMenuController(); if (!controller) return; ContextMenu* menu = controller->contextMenu(); if (!menu) return; Node* node = controller->hitTestResult().innerNonSharedNode(); if (!node) return; Frame* frame = node->document()->frame(); if (!frame) return; FrameView* view = frame->view(); if (!view) return; // Give the bundle client a chance to process the menu. #if USE(CROSS_PLATFORM_CONTEXT_MENUS) const Vector<ContextMenuItem>& coreItems = menu->items(); #else Vector<ContextMenuItem> coreItems = contextMenuItemVector(menu->platformDescription()); #endif Vector<WebContextMenuItemData> proposedMenu = kitItems(coreItems, menu); Vector<WebContextMenuItemData> newMenu; RefPtr<APIObject> userData; RefPtr<InjectedBundleHitTestResult> hitTestResult = InjectedBundleHitTestResult::create(controller->hitTestResult()); if (m_page->injectedBundleContextMenuClient().getCustomMenuFromDefaultItems(m_page, hitTestResult.get(), proposedMenu, newMenu, userData)) proposedMenu = newMenu; WebHitTestResult::Data webHitTestResultData(controller->hitTestResult()); // Mark the WebPage has having a shown context menu then notify the UIProcess. m_page->contextMenuShowing(); m_page->send(Messages::WebPageProxy::ShowContextMenu(view->contentsToWindow(controller->hitTestResult().roundedPoint()), webHitTestResultData, proposedMenu, InjectedBundleUserMessageEncoder(userData.get()))); }