void FindPageOverlay::drawRect(GraphicsContext& graphicsContext, const IntRect& dirtyRect) { Vector<IntRect> rects = rectsForTextMatches(); ASSERT(!rects.isEmpty()); FrameView* frameView = webPage()->corePage()->mainFrame()->view(); int width = frameView->width(); if (frameView->verticalScrollbar()) width -= frameView->verticalScrollbar()->width(); int height = frameView->height(); if (frameView->horizontalScrollbar()) height -= frameView->horizontalScrollbar()->height(); IntRect paintRect = intersection(dirtyRect, IntRect(0, 0, width, height)); if (paintRect.isEmpty()) return; graphicsContext.beginTransparencyLayer(1); graphicsContext.setCompositeOperation(CompositeCopy); // Draw the background. graphicsContext.fillRect(paintRect, overlayBackgroundColor(), sRGBColorSpace); // FIXME: Draw the holes. graphicsContext.endTransparencyLayer(); }
IntRect PageOverlay::bounds() const { FrameView* frameView = m_webPage->corePage()->mainFrame()->view(); int width = frameView->width(); int height = frameView->height(); if (!ScrollbarTheme::theme()->usesOverlayScrollbars()) { if (frameView->verticalScrollbar()) width -= frameView->verticalScrollbar()->width(); if (frameView->horizontalScrollbar()) height -= frameView->horizontalScrollbar()->height(); } return IntRect(0, 0, width, height); }
void WebChromeClient::contentsSizeChanged(Frame* frame, const IntSize& size) const { if (!m_page->corePage()->settings().frameFlatteningEnabled()) { WebFrame* largestFrame = findLargestFrameInFrameSet(m_page); if (largestFrame != m_cachedFrameSetLargestFrame.get()) { m_cachedFrameSetLargestFrame = largestFrame; m_page->send(Messages::WebPageProxy::FrameSetLargestFrameChanged(largestFrame ? largestFrame->frameID() : 0)); } } if (&frame->page()->mainFrame() != frame) return; m_page->send(Messages::WebPageProxy::DidChangeContentSize(size)); m_page->drawingArea()->mainFrameContentSizeChanged(size); FrameView* frameView = frame->view(); if (frameView && !frameView->delegatesScrolling()) { bool hasHorizontalScrollbar = frameView->horizontalScrollbar(); bool hasVerticalScrollbar = frameView->verticalScrollbar(); if (hasHorizontalScrollbar != m_cachedMainFrameHasHorizontalScrollbar || hasVerticalScrollbar != m_cachedMainFrameHasVerticalScrollbar) { m_page->send(Messages::WebPageProxy::DidChangeScrollbarsForMainFrame(hasHorizontalScrollbar, hasVerticalScrollbar)); m_cachedMainFrameHasHorizontalScrollbar = hasHorizontalScrollbar; m_cachedMainFrameHasVerticalScrollbar = hasVerticalScrollbar; } } }
void AsyncScrollingCoordinator::frameViewLayoutUpdated(FrameView& frameView) { ASSERT(isMainThread()); ASSERT(m_page); // If there isn't a root node yet, don't do anything. We'll be called again after creating one. if (!m_scrollingStateTree->rootStateNode()) return; // Compute the region of the page that we can't do fast scrolling for. This currently includes // all scrollable areas, such as subframes, overflow divs and list boxes. We need to do this even if the // frame view whose layout was updated is not the main frame. // In the future, we may want to have the ability to set non-fast scrolling regions for more than // just the root node. But right now, this concept only applies to the root. m_scrollingStateTree->rootStateNode()->setNonFastScrollableRegion(computeNonFastScrollableRegion(m_page->mainFrame(), IntPoint())); m_nonFastScrollableRegionDirty = false; if (!coordinatesScrollingForFrameView(frameView)) return; ScrollingStateFrameScrollingNode* node = downcast<ScrollingStateFrameScrollingNode>(m_scrollingStateTree->stateNodeForID(frameView.scrollLayerID())); if (!node) return; Scrollbar* verticalScrollbar = frameView.verticalScrollbar(); Scrollbar* horizontalScrollbar = frameView.horizontalScrollbar(); node->setScrollbarPaintersFromScrollbars(verticalScrollbar, horizontalScrollbar); node->setFrameScaleFactor(frameView.frame().frameScaleFactor()); node->setHeaderHeight(frameView.headerHeight()); node->setFooterHeight(frameView.footerHeight()); node->setTopContentInset(frameView.topContentInset()); node->setScrollOrigin(frameView.scrollOrigin()); node->setScrollableAreaSize(frameView.visibleContentRect().size()); node->setTotalContentsSize(frameView.totalContentsSize()); node->setReachableContentsSize(frameView.totalContentsSize()); #if ENABLE(CSS_SCROLL_SNAP) frameView.updateSnapOffsets(); if (const Vector<LayoutUnit>* horizontalSnapOffsets = frameView.horizontalSnapOffsets()) setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Horizontal, *horizontalSnapOffsets, m_page->deviceScaleFactor()); if (const Vector<LayoutUnit>* verticalSnapOffsets = frameView.verticalSnapOffsets()) setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Vertical, *verticalSnapOffsets, m_page->deviceScaleFactor()); #endif ScrollableAreaParameters scrollParameters; scrollParameters.horizontalScrollElasticity = frameView.horizontalScrollElasticity(); scrollParameters.verticalScrollElasticity = frameView.verticalScrollElasticity(); scrollParameters.hasEnabledHorizontalScrollbar = horizontalScrollbar && horizontalScrollbar->enabled(); scrollParameters.hasEnabledVerticalScrollbar = verticalScrollbar && verticalScrollbar->enabled(); scrollParameters.horizontalScrollbarMode = frameView.horizontalScrollbarMode(); scrollParameters.verticalScrollbarMode = frameView.verticalScrollbarMode(); node->setScrollableAreaParameters(scrollParameters); }
bool WebFrame::hasHorizontalScrollbar() const { if (!m_coreFrame) return false; FrameView* view = m_coreFrame->view(); if (!view) return false; return view->horizontalScrollbar(); }
bool WebFrame::hasScrollBars() { Frame* coreFrame = core(this); if (!coreFrame) return false; FrameView* view = coreFrame->view(); if (!view) return false; if (view->horizontalScrollbar() || view->verticalScrollbar()) return true; return false; }
void GtkAdjustmentWatcher::adjustmentValueChanged(GtkAdjustment* adjustment) { FrameView* frameView = core(m_webView)->mainFrame()->view(); Scrollbar* scrollbar = (adjustment == m_horizontalAdjustment.get()) ? frameView->horizontalScrollbar() : frameView->verticalScrollbar(); if (!scrollbar) return; int newValue = static_cast<int>(gtk_adjustment_get_value(adjustment)); if (newValue != scrollbar->value()) { m_handlingGtkAdjustmentChange = true; frameView->scrollToOffsetWithoutAnimation(scrollbar->orientation(), newValue); m_handlingGtkAdjustmentChange = false; } }
void GtkAdjustmentWatcher::updateAdjustmentsFromScrollbars() { if (m_scrollbarsDisabled) return; if (m_handlingGtkAdjustmentChange) return; if (!core(m_webView) || !core(m_webView)->mainFrame()) return; FrameView* frameView = core(m_webView)->mainFrame()->view(); updateAdjustmentFromScrollbar(m_horizontalAdjustment.get(), frameView->horizontalScrollbar()); updateAdjustmentFromScrollbar(m_verticalAdjustment.get(), frameView->verticalScrollbar()); if (m_updateAdjustmentCallbackId) { g_source_remove(m_updateAdjustmentCallbackId); m_updateAdjustmentCallbackId = 0; } }
void WebChromeClient::contentsSizeChanged(Frame* frame, const IntSize& size) const { if (!m_page->corePage()->settings()->frameFlatteningEnabled()) { WebFrame* largestFrame = findLargestFrameInFrameSet(m_page); if (largestFrame != m_cachedFrameSetLargestFrame.get()) { m_cachedFrameSetLargestFrame = largestFrame; m_page->send(Messages::WebPageProxy::FrameSetLargestFrameChanged(largestFrame ? largestFrame->frameID() : 0)); } } if (frame->page()->mainFrame() != frame) return; #if PLATFORM(QT) || (PLATFORM(EFL) && USE(TILED_BACKING_STORE)) if (m_page->useFixedLayout()) { // The below method updates the size(). m_page->resizeToContentsIfNeeded(); m_page->drawingArea()->layerTreeHost()->sizeDidChange(m_page->size()); } m_page->send(Messages::WebPageProxy::DidChangeContentsSize(m_page->size())); #elif PLATFORM(EFL) m_page->send(Messages::WebPageProxy::DidChangeContentsSize(size)); #endif m_page->drawingArea()->mainFrameContentSizeChanged(size); FrameView* frameView = frame->view(); if (frameView && !frameView->delegatesScrolling()) { bool hasHorizontalScrollbar = frameView->horizontalScrollbar(); bool hasVerticalScrollbar = frameView->verticalScrollbar(); if (hasHorizontalScrollbar != m_cachedMainFrameHasHorizontalScrollbar || hasVerticalScrollbar != m_cachedMainFrameHasVerticalScrollbar) { m_page->send(Messages::WebPageProxy::DidChangeScrollbarsForMainFrame(hasHorizontalScrollbar, hasVerticalScrollbar)); m_cachedMainFrameHasHorizontalScrollbar = hasHorizontalScrollbar; m_cachedMainFrameHasVerticalScrollbar = hasVerticalScrollbar; } } }
void WebChromeClient::contentsSizeChanged(Frame* frame, const IntSize& size) const { #if PLATFORM(QT) #if ENABLE(TILED_BACKING_STORE) if (frame->page()->mainFrame() == frame) m_page->resizeToContentsIfNeeded(); #endif WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame(); if (!m_page->mainFrame() || m_page->mainFrame() != webFrame) return; m_page->send(Messages::WebPageProxy::DidChangeContentsSize(size)); #endif WebFrame* largestFrame = findLargestFrameInFrameSet(m_page); if (largestFrame != m_cachedFrameSetLargestFrame.get()) { m_cachedFrameSetLargestFrame = largestFrame; m_page->send(Messages::WebPageProxy::FrameSetLargestFrameChanged(largestFrame ? largestFrame->frameID() : 0)); } if (frame->page()->mainFrame() != frame) return; FrameView* frameView = frame->view(); if (!frameView) return; bool hasHorizontalScrollbar = frameView->horizontalScrollbar(); bool hasVerticalScrollbar = frameView->verticalScrollbar(); if (hasHorizontalScrollbar != m_cachedMainFrameHasHorizontalScrollbar || hasVerticalScrollbar != m_cachedMainFrameHasVerticalScrollbar) { m_page->send(Messages::WebPageProxy::DidChangeScrollbarsForMainFrame(hasHorizontalScrollbar, hasVerticalScrollbar)); m_cachedMainFrameHasHorizontalScrollbar = hasHorizontalScrollbar; m_cachedMainFrameHasVerticalScrollbar = hasVerticalScrollbar; } }
void AsyncScrollingCoordinator::frameViewLayoutUpdated(FrameView& frameView) { ASSERT(isMainThread()); ASSERT(m_page); // If there isn't a root node yet, don't do anything. We'll be called again after creating one. if (!m_scrollingStateTree->rootStateNode()) return; // Compute the region of the page that we can't do fast scrolling for. This currently includes // all scrollable areas, such as subframes, overflow divs and list boxes. We need to do this even if the // frame view whose layout was updated is not the main frame. // In the future, we may want to have the ability to set non-fast scrolling regions for more than // just the root node. But right now, this concept only applies to the root. m_scrollingStateTree->rootStateNode()->setNonFastScrollableRegion(absoluteNonFastScrollableRegion()); m_nonFastScrollableRegionDirty = false; if (!coordinatesScrollingForFrameView(frameView)) return; ScrollingStateFrameScrollingNode* node = downcast<ScrollingStateFrameScrollingNode>(m_scrollingStateTree->stateNodeForID(frameView.scrollLayerID())); if (!node) return; Scrollbar* verticalScrollbar = frameView.verticalScrollbar(); Scrollbar* horizontalScrollbar = frameView.horizontalScrollbar(); node->setScrollbarPaintersFromScrollbars(verticalScrollbar, horizontalScrollbar); node->setFrameScaleFactor(frameView.frame().frameScaleFactor()); node->setHeaderHeight(frameView.headerHeight()); node->setFooterHeight(frameView.footerHeight()); node->setTopContentInset(frameView.topContentInset()); node->setScrollOrigin(frameView.scrollOrigin()); node->setScrollableAreaSize(frameView.visibleContentRect().size()); node->setTotalContentsSize(frameView.totalContentsSize()); node->setReachableContentsSize(frameView.totalContentsSize()); node->setFixedElementsLayoutRelativeToFrame(frameView.fixedElementsLayoutRelativeToFrame()); #if ENABLE(CSS_SCROLL_SNAP) frameView.updateSnapOffsets(); updateScrollSnapPropertiesWithFrameView(frameView); #endif #if PLATFORM(COCOA) Page* page = frameView.frame().page(); if (page && page->expectsWheelEventTriggers()) { LOG(WheelEventTestTriggers, " AsyncScrollingCoordinator::frameViewLayoutUpdated: Expects wheel event test trigger=%d", page->expectsWheelEventTriggers()); node->setExpectsWheelEventTestTrigger(page->expectsWheelEventTriggers()); } #endif ScrollableAreaParameters scrollParameters; scrollParameters.horizontalScrollElasticity = frameView.horizontalScrollElasticity(); scrollParameters.verticalScrollElasticity = frameView.verticalScrollElasticity(); scrollParameters.hasEnabledHorizontalScrollbar = horizontalScrollbar && horizontalScrollbar->enabled(); scrollParameters.hasEnabledVerticalScrollbar = verticalScrollbar && verticalScrollbar->enabled(); scrollParameters.horizontalScrollbarMode = frameView.horizontalScrollbarMode(); scrollParameters.verticalScrollbarMode = frameView.verticalScrollbarMode(); node->setScrollableAreaParameters(scrollParameters); }