int HTMLBodyElement::scrollTop() const { // Update the document's layout. Document* document = this->document(); document->updateLayoutIgnorePendingStylesheets(); FrameView* view = document->view(); return view ? adjustForZoom(view->scrollY(), document) : 0; }
static int contentsY(Frame* frame) { if (!frame) return 0; FrameView* frameView = frame->view(); if (!frameView) return 0; return frameView->scrollY() / frame->pageZoomFactor(); }
int HTMLBodyElement::scrollTop() { document().updateLayoutIgnorePendingStylesheets(); Frame* frame = document().frame(); if (!frame) return 0; FrameView* view = frame->view(); if (!view) return 0; return adjustForZoom(view->scrollY(), *frame); }
static int contentsY(AbstractView* abstractView) { if (!abstractView) return 0; Frame* frame = abstractView->frame(); if (!frame) return 0; FrameView* frameView = frame->view(); if (!frameView) return 0; return frameView->scrollY() / frame->pageZoomFactor(); }
static LayoutSize contentsScrollOffset(AbstractView* abstractView) { if (!abstractView) return LayoutSize(); Frame* frame = abstractView->frame(); if (!frame) return LayoutSize(); FrameView* frameView = frame->view(); if (!frameView) return LayoutSize(); return LayoutSize(frameView->scrollX() / frame->pageZoomFactor(), frameView->scrollY() / frame->pageZoomFactor()); }
static LayoutSize contentsScrollOffset(AbstractView* abstractView) { if (!abstractView || !abstractView->isLocalDOMWindow()) return LayoutSize(); LocalFrame* frame = toLocalDOMWindow(abstractView)->frame(); if (!frame) return LayoutSize(); FrameView* frameView = frame->view(); if (!frameView) return LayoutSize(); float scaleFactor = frame->pageZoomFactor(); return LayoutSize(frameView->scrollX() / scaleFactor, frameView->scrollY() / scaleFactor); }
static LayoutSize contentsScrollOffset(AbstractView* abstractView) { if (!abstractView) return LayoutSize(); Frame* frame = abstractView->frame(); if (!frame) return LayoutSize(); FrameView* frameView = frame->view(); if (!frameView) return LayoutSize(); #if !PLATFORM(IOS) float scaleFactor = frame->pageZoomFactor() * frame->frameScaleFactor(); return LayoutSize(frameView->scrollX() / scaleFactor, frameView->scrollY() / scaleFactor); #else return LayoutSize(frameView->actualScrollX(), frameView->actualScrollY()); #endif }
int HTMLBodyElement::scrollTop() { Document& document = this->document(); document.updateLayoutIgnorePendingStylesheets(); if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { RenderBox* render = renderBox(); if (!render) return 0; if (render->hasOverflowClip()) return adjustForAbsoluteZoom(render->scrollTop(), render); if (!document.inQuirksMode()) return 0; } FrameView* view = document.view(); return view ? adjustForZoom(view->scrollY(), &document) : 0; }
void DateTimeChooserImpl::writeDocument(WebCore::DocumentWriter& writer) { WebCore::DateComponents date; date.setMillisecondsSinceEpochForDate(m_parameters.minimum); String minString = date.toString(); date.setMillisecondsSinceEpochForDate(m_parameters.maximum); String maxString = date.toString(); String stepString = String::number(m_parameters.step); String stepBaseString = String::number(m_parameters.stepBase, 11, WTF::TruncateTrailingZeros); IntRect anchorRectInScreen = m_chromeClient->rootViewToScreen(m_parameters.anchorRectInRootView); FrameView* view = static_cast<WebViewImpl*>(m_chromeClient->webView())->page()->mainFrame()->view(); IntRect rootViewVisibleContentRect = view->visibleContentRect(true /* include scrollbars */); IntRect rootViewRectInScreen = m_chromeClient->rootViewToScreen(rootViewVisibleContentRect); rootViewRectInScreen.move(-view->scrollX(), -view->scrollY()); addString("<!DOCTYPE html><head><meta charset='UTF-8'><style>\n", writer); writer.addData(WebCore::pickerCommonCss, sizeof(WebCore::pickerCommonCss)); writer.addData(WebCore::suggestionPickerCss, sizeof(WebCore::suggestionPickerCss)); writer.addData(WebCore::calendarPickerCss, sizeof(WebCore::calendarPickerCss)); CString extraStyle = WebCore::RenderTheme::defaultTheme()->extraCalendarPickerStyleSheet(); if (extraStyle.length()) writer.addData(extraStyle.data(), extraStyle.length()); addString("</style></head><body><div id=main>Loading...</div><script>\n" "window.dialogArguments = {\n", writer); addProperty("anchorRectInScreen", anchorRectInScreen, writer); addProperty("rootViewRectInScreen", rootViewRectInScreen, writer); #if OS(MAC_OS_X) addProperty("confineToRootView", true, writer); #else addProperty("confineToRootView", false, writer); #endif addProperty("min", minString, writer); addProperty("max", maxString, writer); addProperty("step", stepString, writer); addProperty("stepBase", stepBaseString, writer); addProperty("required", m_parameters.required, writer); addProperty("currentValue", m_parameters.currentValue, writer); addProperty("locale", WebCore::defaultLanguage(), writer); addProperty("todayLabel", Platform::current()->queryLocalizedString(WebLocalizedString::CalendarToday), writer); addProperty("clearLabel", Platform::current()->queryLocalizedString(WebLocalizedString::CalendarClear), writer); addProperty("weekStartDay", m_locale->firstDayOfWeek(), writer); addProperty("monthLabels", m_locale->monthLabels(), writer); addProperty("dayLabels", m_locale->weekDayShortLabels(), writer); addProperty("isCalendarRTL", m_locale->isRTL(), writer); addProperty("isRTL", m_parameters.isAnchorElementRTL, writer); if (m_parameters.suggestionValues.size()) { addProperty("inputWidth", static_cast<unsigned>(m_parameters.anchorRectInRootView.width()), writer); addProperty("suggestionValues", m_parameters.suggestionValues, writer); addProperty("localizedSuggestionValues", m_parameters.localizedSuggestionValues, writer); addProperty("suggestionLabels", m_parameters.suggestionLabels, writer); addProperty("showOtherDateEntry", m_parameters.type == WebCore::InputTypeNames::date(), writer); addProperty("otherDateLabel", Platform::current()->queryLocalizedString(WebLocalizedString::OtherDateLabel), writer); addProperty("suggestionHighlightColor", WebCore::RenderTheme::defaultTheme()->activeListBoxSelectionBackgroundColor().serialized(), writer); addProperty("suggestionHighlightTextColor", WebCore::RenderTheme::defaultTheme()->activeListBoxSelectionForegroundColor().serialized(), writer); } addString("}\n", writer); writer.addData(WebCore::pickerCommonJs, sizeof(WebCore::pickerCommonJs)); writer.addData(WebCore::suggestionPickerJs, sizeof(WebCore::suggestionPickerJs)); writer.addData(WebCore::calendarPickerJs, sizeof(WebCore::calendarPickerJs)); addString("</script></body>\n", writer); }
Node* nodeFromPoint(Document* document, int x, int y, LayoutPoint* localPoint) { Frame* frame = document->frame(); if (!frame) return 0; FrameView* frameView = frame->view(); if (!frameView) return 0; float scaleFactor = frame->pageZoomFactor(); IntPoint point = roundedIntPoint(FloatPoint(x * scaleFactor + frameView->scrollX(), y * scaleFactor + frameView->scrollY())); if (!frameView->visibleContentRect().contains(point)) return 0; HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::DisallowShadowContent); HitTestResult result(point); document->renderView()->hitTest(request, result); if (localPoint) *localPoint = result.localPoint(); return result.innerNode(); }
void HTMLBodyElement::setScrollLeft(int scrollLeft) { Document* document = this->document(); document->updateLayoutIgnorePendingStylesheets(); Frame* frame = document->frame(); if (!frame) return; FrameView* view = frame->view(); if (!view) return; view->setScrollPosition(IntPoint(static_cast<int>(scrollLeft * frame->pageZoomFactor() * frame->pageScaleFactor()), view->scrollY())); }
int Frame::checkOverflowScroll(OverflowScrollAction action) { Position extent = selection().selection().extent(); if (extent.isNull()) return OverflowScrollNone; RenderObject* renderer = extent.deprecatedNode()->renderer(); if (!renderer) return OverflowScrollNone; FrameView* view = this->view(); if (!view) return OverflowScrollNone; RenderBlock* containingBlock = renderer->containingBlock(); if (!containingBlock || !containingBlock->hasOverflowClip()) return OverflowScrollNone; RenderLayer* layer = containingBlock->layer(); ASSERT(layer); IntRect visibleRect = IntRect(view->scrollX(), view->scrollY(), view->visibleWidth(), view->visibleHeight()); IntPoint position = m_overflowAutoScrollPos; if (visibleRect.contains(position.x(), position.y())) return OverflowScrollNone; int scrollType = 0; int deltaX = 0; int deltaY = 0; IntPoint selectionPosition; // This constant will make the selection draw a little bit beyond the edge of the visible area. // This prevents a visual glitch, in that you can fail to select a portion of a character that // is being rendered right at the edge of the visible rectangle. // FIXME: This probably needs improvement, and may need to take the font size into account. static const int scrollBoundsAdjustment = 3; // FIXME: Make a small buffer at the end of a visible rectangle so that autoscrolling works // even if the visible extends to the limits of the screen. if (position.x() < visibleRect.x()) { scrollType |= OverflowScrollLeft; if (action == PerformOverflowScroll) { deltaX -= static_cast<int>(m_overflowAutoScrollDelta); selectionPosition.setX(view->scrollX() - scrollBoundsAdjustment); } } else if (position.x() > visibleRect.maxX()) { scrollType |= OverflowScrollRight; if (action == PerformOverflowScroll) { deltaX += static_cast<int>(m_overflowAutoScrollDelta); selectionPosition.setX(view->scrollX() + view->visibleWidth() + scrollBoundsAdjustment); } } if (position.y() < visibleRect.y()) { scrollType |= OverflowScrollUp; if (action == PerformOverflowScroll) { deltaY -= static_cast<int>(m_overflowAutoScrollDelta); selectionPosition.setY(view->scrollY() - scrollBoundsAdjustment); } } else if (position.y() > visibleRect.maxY()) { scrollType |= OverflowScrollDown; if (action == PerformOverflowScroll) { deltaY += static_cast<int>(m_overflowAutoScrollDelta); selectionPosition.setY(view->scrollY() + view->visibleHeight() + scrollBoundsAdjustment); } } Ref<Frame> protectedThis(*this); if (action == PerformOverflowScroll && (deltaX || deltaY)) { layer->scrollToOffset(layer->scrollOffset() + IntSize(deltaX, deltaY)); // Handle making selection. VisiblePosition visiblePosition(renderer->positionForPoint(selectionPosition, nullptr)); if (visiblePosition.isNotNull()) { VisibleSelection visibleSelection = selection().selection(); visibleSelection.setExtent(visiblePosition); if (selection().granularity() != CharacterGranularity) visibleSelection.expandUsingGranularity(selection().granularity()); if (selection().shouldChangeSelection(visibleSelection)) selection().setSelection(visibleSelection); } m_overflowAutoScrollDelta *= 1.02f; // Accelerate the scroll } return scrollType; }
void HTMLBodyElement::setScrollLeft(int scrollLeft) { Document& document = this->document(); document.updateLayoutIgnorePendingStylesheets(); if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { RenderBox* render = renderBox(); if (!render) return; if (render->hasOverflowClip()) { // FIXME: Investigate how are other browsers casting to int (rounding, ceiling, ...). render->setScrollLeft(static_cast<int>(scrollLeft * render->style()->effectiveZoom())); return; } if (!document.inQuirksMode()) return; } LocalFrame* frame = document.frame(); if (!frame) return; FrameView* view = frame->view(); if (!view) return; view->setScrollPosition(IntPoint(static_cast<int>(scrollLeft * frame->pageZoomFactor()), view->scrollY())); }
void HTMLBodyElement::setScrollLeft(int scrollLeft) { FrameView* sview = ownerDocument()->view(); if (sview) { // Update the document's layout document()->updateLayoutIgnorePendingStylesheets(); sview->setScrollPosition(IntPoint(static_cast<int>(scrollLeft * sview->frame()->zoomFactor()), sview->scrollY())); } }
HitTestResult hitTestInDocument(const Document* document, int x, int y) { LocalFrame* frame = document->frame(); if (!frame) return HitTestResult(); FrameView* frameView = frame->view(); if (!frameView) return HitTestResult(); float scaleFactor = frame->pageZoomFactor(); IntPoint point = roundedIntPoint(FloatPoint(x * scaleFactor + frameView->scrollX(), y * scaleFactor + frameView->scrollY())); if (!frameView->visibleContentRect().contains(point)) return HitTestResult(); HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active); HitTestResult result(point); document->renderView()->hitTest(request, result); return result; }