void ValidationMessageClientImpl::showValidationMessage(const Element& anchor, const String& message, TextDirection messageDir, const String& subMessage, TextDirection subMessageDir) { if (message.isEmpty()) { hideValidationMessage(anchor); return; } if (!anchor.layoutBox()) return; if (m_currentAnchor) hideValidationMessage(*m_currentAnchor); m_currentAnchor = &anchor; IntRect anchorInViewport = currentView()->contentsToViewport(anchor.pixelSnappedBoundingBox()); m_lastAnchorRectInScreen = currentView()->getHostWindow()->viewportToScreen(anchorInViewport, currentView()); m_lastPageScaleFactor = m_webView.pageScaleFactor(); m_message = message; const double minimumSecondToShowValidationMessage = 5.0; const double secondPerCharacter = 0.05; const double statusCheckInterval = 0.1; m_webView.client()->showValidationMessage(anchorInViewport, m_message, toWebTextDirection(messageDir), subMessage, toWebTextDirection(subMessageDir)); m_finishTime = monotonicallyIncreasingTime() + std::max(minimumSecondToShowValidationMessage, (message.length() + subMessage.length()) * secondPerCharacter); // FIXME: We should invoke checkAnchorStatus actively when layout, scroll, // or page scale change happen. m_timer.startRepeating(statusCheckInterval, BLINK_FROM_HERE); }
void ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir) { if (!m_webView->client()) return; if (!tooltipText.isEmpty()) { m_webView->client()->setToolTipText(tooltipText, toWebTextDirection(dir)); m_didRequestNonEmptyToolTip = true; } else if (m_didRequestNonEmptyToolTip) { // WebViewClient::setToolTipText will send an IPC message. We'd like to // reduce the number of setToolTipText calls. m_webView->client()->setToolTipText(tooltipText, toWebTextDirection(dir)); m_didRequestNonEmptyToolTip = false; } }
void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo& info, PopupMenuClient& popupMenuClient) { int itemCount = popupMenuClient.listSize(); int count = 0; Vector<WebMenuItemInfo> items(static_cast<size_t>(itemCount)); for (int i = 0; i < itemCount; ++i) { PopupMenuStyle style = popupMenuClient.itemStyle(i); if (style.isDisplayNone()) continue; WebMenuItemInfo& popupItem = items[count++]; popupItem.label = popupMenuClient.itemText(i); popupItem.toolTip = popupMenuClient.itemToolTip(i); if (popupMenuClient.itemIsSeparator(i)) popupItem.type = WebMenuItemInfo::Separator; else if (popupMenuClient.itemIsLabel(i)) popupItem.type = WebMenuItemInfo::Group; else popupItem.type = WebMenuItemInfo::Option; popupItem.enabled = popupMenuClient.itemIsEnabled(i); popupItem.checked = popupMenuClient.itemIsSelected(i); popupItem.textDirection = toWebTextDirection(style.textDirection()); popupItem.hasTextDirectionOverride = style.hasTextDirectionOverride(); } info.itemHeight = popupMenuClient.menuStyle().font().fontMetrics().height(); info.itemFontSize = static_cast<int>(popupMenuClient.menuStyle().font().fontDescription().computedSize()); info.selectedIndex = toExternalPopupMenuItemIndex(popupMenuClient.selectedIndex(), popupMenuClient); info.rightAligned = popupMenuClient.menuStyle().textDirection() == RTL; info.allowMultipleSelection = popupMenuClient.multiple(); if (count < itemCount) items.shrink(count); info.items = items; }
void PopupContainer::getPopupMenuInfo(WebPopupMenuInfo* info) { const Vector<PopupItem*>& inputItems = popupData(); WebVector<WebMenuItemInfo> outputItems(inputItems.size()); for (size_t i = 0; i < inputItems.size(); ++i) { const PopupItem& inputItem = *inputItems[i]; WebMenuItemInfo& outputItem = outputItems[i]; outputItem.label = inputItem.label; outputItem.enabled = inputItem.enabled; outputItem.textDirection = toWebTextDirection(inputItem.textDirection); outputItem.hasTextDirectionOverride = inputItem.hasTextDirectionOverride; switch (inputItem.type) { case PopupItem::TypeOption: outputItem.type = WebMenuItemInfo::Option; break; case PopupItem::TypeGroup: outputItem.type = WebMenuItemInfo::Group; break; case PopupItem::TypeSeparator: outputItem.type = WebMenuItemInfo::Separator; break; } } info->itemHeight = menuItemHeight(); info->itemFontSize = menuItemFontSize(); info->selectedIndex = selectedIndex(); info->items.swap(outputItems); info->rightAligned = menuStyle().textDirection() == RTL; }
void setToolTip(LocalFrame&, const String& tooltipText, TextDirection dir) override { if (m_popup->widgetClient()) m_popup->widgetClient()->setToolTipText(tooltipText, toWebTextDirection(dir)); }
void ChromeClientImpl::setToolTip(LocalFrame& frame, const String& tooltipText, TextDirection dir) { WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(&frame)->localRoot(); if (!tooltipText.isEmpty()) { webFrame->frameWidget()->client()->setToolTipText(tooltipText, toWebTextDirection(dir)); m_didRequestNonEmptyToolTip = true; } else if (m_didRequestNonEmptyToolTip) { // WebWidgetClient::setToolTipText will send an IPC message. We'd like to // reduce the number of setToolTipText calls. webFrame->frameWidget()->client()->setToolTipText(tooltipText, toWebTextDirection(dir)); m_didRequestNonEmptyToolTip = false; } }
void WebPopupMenuImpl::handleMouseMove(const WebMouseEvent& event) { // Don't send mouse move messages if the mouse hasn't moved. if (event.x != m_lastMousePosition.x || event.y != m_lastMousePosition.y) { m_lastMousePosition = WebPoint(event.x, event.y); m_widget->handleMouseMoveEvent(PlatformMouseEventBuilder(m_widget, event)); // We cannot call setToolTipText() in PopupContainer, because PopupContainer is in WebCore, and we cannot refer to WebKit from Webcore. PopupContainer* container = static_cast<PopupContainer*>(m_widget); client()->setToolTipText(container->getSelectedItemToolTip(), toWebTextDirection(container->menuStyle().textDirection())); } }
void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo& info, HTMLSelectElement& ownerElement) { const WillBeHeapVector<RawPtrWillBeMember<HTMLElement>>& listItems = ownerElement.listItems(); size_t itemCount = listItems.size(); size_t count = 0; Vector<WebMenuItemInfo> items(itemCount); for (size_t i = 0; i < itemCount; ++i) { if (ownerElement.itemIsDisplayNone(*listItems[i])) continue; Element& itemElement = *listItems[i]; WebMenuItemInfo& popupItem = items[count++]; popupItem.label = ownerElement.itemText(itemElement); popupItem.toolTip = itemElement.title(); popupItem.checked = false; if (isHTMLHRElement(itemElement)) { popupItem.type = WebMenuItemInfo::Separator; } else if (isHTMLOptGroupElement(itemElement)) { popupItem.type = WebMenuItemInfo::Group; } else { popupItem.type = WebMenuItemInfo::Option; popupItem.checked = toHTMLOptionElement(itemElement).selected(); } popupItem.enabled = !itemElement.isDisabledFormControl(); const ComputedStyle& style = *ownerElement.itemComputedStyle(itemElement); popupItem.textDirection = toWebTextDirection(style.direction()); popupItem.hasTextDirectionOverride = isOverride(style.unicodeBidi()); } const ComputedStyle& menuStyle = ownerElement.computedStyle() ? *ownerElement.computedStyle() : *ownerElement.ensureComputedStyle(); info.itemHeight = menuStyle.font().fontMetrics().height(); info.itemFontSize = static_cast<int>(menuStyle.font().fontDescription().computedSize()); info.selectedIndex = toExternalPopupMenuItemIndex(ownerElement.optionToListIndex(ownerElement.selectedIndex()), ownerElement); info.rightAligned = menuStyle.direction() == RTL; info.allowMultipleSelection = ownerElement.multiple(); if (count < itemCount) items.shrink(count); info.items = items; }
void ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir) { if (m_webView->client()) m_webView->client()->setToolTipText(tooltipText, toWebTextDirection(dir)); }