diff options
Diffstat (limited to 'Source/WebKit/chromium/src/WebViewImpl.cpp')
-rw-r--r-- | Source/WebKit/chromium/src/WebViewImpl.cpp | 176 |
1 files changed, 142 insertions, 34 deletions
diff --git a/Source/WebKit/chromium/src/WebViewImpl.cpp b/Source/WebKit/chromium/src/WebViewImpl.cpp index 626da8a21..f74c802a9 100644 --- a/Source/WebKit/chromium/src/WebViewImpl.cpp +++ b/Source/WebKit/chromium/src/WebViewImpl.cpp @@ -99,6 +99,7 @@ #include "PointerLockController.h" #include "PopupContainer.h" #include "PopupMenuClient.h" +#include "PrerendererClientImpl.h" #include "ProgressTracker.h" #include "RenderLayerCompositor.h" #include "RenderView.h" @@ -164,11 +165,6 @@ #include "PlatformGestureEvent.h" #endif -#if USE(CG) -#include <CoreGraphics/CGBitmapContext.h> -#include <CoreGraphics/CGContext.h> -#endif - #if OS(WINDOWS) #include "RenderThemeChromiumWin.h" #else @@ -243,6 +239,20 @@ static const PopupContainerSettings autofillPopupSettings = { static bool shouldUseExternalPopupMenus = false; +static int webInputEventKeyStateToPlatformEventKeyState(int webInputEventKeyState) +{ + int platformEventKeyState = 0; + if (webInputEventKeyState & WebInputEvent::ShiftKey) + platformEventKeyState = platformEventKeyState | WebCore::PlatformEvent::ShiftKey; + if (webInputEventKeyState & WebInputEvent::ControlKey) + platformEventKeyState = platformEventKeyState | WebCore::PlatformEvent::CtrlKey; + if (webInputEventKeyState & WebInputEvent::AltKey) + platformEventKeyState = platformEventKeyState | WebCore::PlatformEvent::AltKey; + if (webInputEventKeyState & WebInputEvent::MetaKey) + platformEventKeyState = platformEventKeyState | WebCore::PlatformEvent::MetaKey; + return platformEventKeyState; +} + // WebView ---------------------------------------------------------------- WebView* WebView::create(WebViewClient* client) @@ -321,6 +331,11 @@ void WebViewImpl::setPermissionClient(WebPermissionClient* permissionClient) m_permissionClient = permissionClient; } +void WebViewImpl::setPrerendererClient(WebPrerendererClient* prerendererClient) +{ + providePrerendererClientTo(m_page.get(), new PrerendererClientImpl(prerendererClient)); +} + void WebViewImpl::setSpellCheckClient(WebSpellCheckClient* spellCheckClient) { m_spellCheckClient = spellCheckClient; @@ -381,6 +396,7 @@ WebViewImpl::WebViewImpl(WebViewClient* client) , m_compositorCreationFailed(false) , m_recreatingGraphicsContext(false) , m_compositorSurfaceReady(false) + , m_deviceScaleInCompositor(1) #endif #if ENABLE(INPUT_SPEECH) , m_speechInputClient(SpeechInputClientImpl::create(client)) @@ -1261,11 +1277,6 @@ WebViewImpl* WebViewImpl::fromPage(Page* page) return static_cast<WebViewImpl*>(chromeClient->webView()); } -PageGroup* WebViewImpl::defaultPageGroup() -{ - return PageGroup::pageGroup(pageGroupName); -} - // WebWidget ------------------------------------------------------------------ void WebViewImpl::close() @@ -1310,6 +1321,13 @@ void WebViewImpl::resize(const WebSize& newSize) return; m_size = newSize; +#if ENABLE(VIEWPORT) + if (settings()->viewportEnabled()) { + ViewportArguments viewportArguments = mainFrameImpl()->frame()->document()->viewportArguments(); + m_page->chrome()->client()->dispatchViewportPropertiesDidChange(viewportArguments); + } +#endif + WebDevToolsAgentPrivate* agentPrivate = devToolsAgentPrivate(); if (agentPrivate && agentPrivate->metricsOverridden()) agentPrivate->webViewResized(); @@ -1476,18 +1494,13 @@ void WebViewImpl::layout() void WebViewImpl::doPixelReadbackToCanvas(WebCanvas* canvas, const IntRect& rect) { ASSERT(!m_layerTreeView.isNull()); -#if USE(SKIA) + PlatformContextSkia context(canvas); // PlatformGraphicsContext is actually a pointer to PlatformContextSkia GraphicsContext gc(reinterpret_cast<PlatformGraphicsContext*>(&context)); int bitmapHeight = canvas->getDevice()->accessBitmap(false).height(); -#elif USE(CG) - GraphicsContext gc(canvas); - int bitmapHeight = CGBitmapContextGetHeight(reinterpret_cast<CGContextRef>(canvas)); -#else - notImplemented(); -#endif + // Compute rect to sample from inverted GPU buffer. IntRect invertRect(rect.x(), bitmapHeight - rect.maxY(), rect.width(), rect.height()); @@ -1602,8 +1615,10 @@ void WebViewImpl::enterFullScreenForElement(WebCore::Element* element) #if USE(NATIVE_FULLSCREEN_VIDEO) if (element && element->isMediaElement()) { HTMLMediaElement* mediaElement = static_cast<HTMLMediaElement*>(element); - if (mediaElement->player() && mediaElement->player()->enterFullscreen()) + if (mediaElement->player() && mediaElement->player()->canEnterFullscreen()) { + mediaElement->player()->enterFullscreen(); m_provisionalFullScreenElement = element; + } return; } #endif @@ -1965,6 +1980,21 @@ bool WebViewImpl::selectionBounds(WebRect& start, WebRect& end) const return true; } +bool WebViewImpl::selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const +{ + const Frame* frame = focusedWebCoreFrame(); + if (!frame) + return false; + FrameSelection* selection = frame->selection(); + if (!selection) + return false; + if (!selection->toNormalizedRange()) + return false; + start = selection->start().primaryDirection() == RTL ? WebTextDirectionRightToLeft : WebTextDirectionLeftToRight; + end = selection->end().primaryDirection() == RTL ? WebTextDirectionRightToLeft : WebTextDirectionLeftToRight; + return true; +} + bool WebViewImpl::caretOrSelectionRange(size_t* location, size_t* length) { const Frame* focused = focusedWebCoreFrame(); @@ -2058,7 +2088,7 @@ void WebViewImpl::didChangeWindowResizerRect() // WebView -------------------------------------------------------------------- -WebSettings* WebViewImpl::settings() +WebSettingsImpl* WebViewImpl::settingsImpl() { if (!m_webSettings) m_webSettings = adoptPtr(new WebSettingsImpl(m_page->settings())); @@ -2066,6 +2096,11 @@ WebSettings* WebViewImpl::settings() return m_webSettings.get(); } +WebSettings* WebViewImpl::settings() +{ + return settingsImpl(); +} + WebString WebViewImpl::pageEncoding() const { if (!m_page) @@ -2327,6 +2362,12 @@ void WebViewImpl::setPageScaleFactor(float scaleFactor, const WebPoint& origin) if (!scaleFactor) scaleFactor = 1; + if (m_deviceScaleInCompositor != 1) { + // Don't allow page scaling when compositor scaling is being used, + // as they are currently incompatible. + ASSERT(scaleFactor == 1); + } + scaleFactor = clampPageScaleFactorToLimits(scaleFactor); WebPoint clampedOrigin = clampOffsetAtScale(origin, scaleFactor); page()->setPageScaleFactor(scaleFactor, clampedOrigin); @@ -2347,6 +2388,13 @@ void WebViewImpl::setDeviceScaleFactor(float scaleFactor) return; page()->setDeviceScaleFactor(scaleFactor); + + if (m_deviceScaleInCompositor != 1) { + // Don't allow page scaling when compositor scaling is being used, + // as they are currently incompatible. This means the deviceScale + // needs to match the one in the compositor. + ASSERT(scaleFactor == m_deviceScaleInCompositor); + } } bool WebViewImpl::isFixedLayoutModeEnabled() const @@ -2374,10 +2422,8 @@ void WebViewImpl::enableFixedLayoutMode(bool enable) #if USE(ACCELERATED_COMPOSITING) // Also notify the base layer, which RenderLayerCompositor does not see. - if (m_nonCompositedContentHost) { - m_nonCompositedContentHost->topLevelRootLayer()->deviceOrPageScaleFactorChanged(); + if (m_nonCompositedContentHost) updateLayerTreeViewport(); - } #endif } @@ -2411,8 +2457,8 @@ bool WebViewImpl::computePageScaleFactorLimits() if (!mainFrame() || !page() || !page()->mainFrame() || !page()->mainFrame()->view()) return false; - m_minimumPageScaleFactor = min(max(m_pageDefinedMinimumPageScaleFactor, minPageScaleFactor), maxPageScaleFactor) * deviceScaleFactor(); - m_maximumPageScaleFactor = max(min(m_pageDefinedMaximumPageScaleFactor, maxPageScaleFactor), minPageScaleFactor) * deviceScaleFactor(); + m_minimumPageScaleFactor = min(max(m_pageDefinedMinimumPageScaleFactor, minPageScaleFactor), maxPageScaleFactor) * (deviceScaleFactor() / m_deviceScaleInCompositor); + m_maximumPageScaleFactor = max(min(m_pageDefinedMaximumPageScaleFactor, maxPageScaleFactor), minPageScaleFactor) * (deviceScaleFactor() / m_deviceScaleInCompositor); int viewWidthNotIncludingScrollbars = page()->mainFrame()->view()->visibleContentRect(false).width(); int contentsWidth = mainFrame()->contentsSize().width; @@ -2588,12 +2634,22 @@ WebDragOperation WebViewImpl::dragTargetDragEnter( const WebPoint& screenPoint, WebDragOperationsMask operationsAllowed) { + return dragTargetDragEnter(webDragData, clientPoint, screenPoint, operationsAllowed, 0); +} + +WebDragOperation WebViewImpl::dragTargetDragEnter( + const WebDragData& webDragData, + const WebPoint& clientPoint, + const WebPoint& screenPoint, + WebDragOperationsMask operationsAllowed, + int keyModifiers) +{ ASSERT(!m_currentDragData); m_currentDragData = webDragData; m_operationsAllowed = operationsAllowed; - return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragEnter); + return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragEnter, keyModifiers); } WebDragOperation WebViewImpl::dragTargetDragOver( @@ -2601,9 +2657,18 @@ WebDragOperation WebViewImpl::dragTargetDragOver( const WebPoint& screenPoint, WebDragOperationsMask operationsAllowed) { + return dragTargetDragOver(clientPoint, screenPoint, operationsAllowed, 0); +} + +WebDragOperation WebViewImpl::dragTargetDragOver( + const WebPoint& clientPoint, + const WebPoint& screenPoint, + WebDragOperationsMask operationsAllowed, + int keyModifiers) +{ m_operationsAllowed = operationsAllowed; - return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragOver); + return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragOver, keyModifiers); } void WebViewImpl::dragTargetDragLeave() @@ -2627,6 +2692,13 @@ void WebViewImpl::dragTargetDragLeave() void WebViewImpl::dragTargetDrop(const WebPoint& clientPoint, const WebPoint& screenPoint) { + dragTargetDrop(clientPoint, screenPoint, 0); +} + +void WebViewImpl::dragTargetDrop(const WebPoint& clientPoint, + const WebPoint& screenPoint, + int keyModifiers) +{ ASSERT(m_currentDragData); // If this webview transitions from the "drop accepting" state to the "not @@ -2641,6 +2713,7 @@ void WebViewImpl::dragTargetDrop(const WebPoint& clientPoint, return; } + m_currentDragData->setModifierKeyState(webInputEventKeyStateToPlatformEventKeyState(keyModifiers)); DragData dragData( m_currentDragData.get(), clientPoint, @@ -2655,10 +2728,11 @@ void WebViewImpl::dragTargetDrop(const WebPoint& clientPoint, m_dragScrollTimer->stop(); } -WebDragOperation WebViewImpl::dragTargetDragEnterOrOver(const WebPoint& clientPoint, const WebPoint& screenPoint, DragAction dragAction) +WebDragOperation WebViewImpl::dragTargetDragEnterOrOver(const WebPoint& clientPoint, const WebPoint& screenPoint, DragAction dragAction, int keyModifiers) { ASSERT(m_currentDragData); + m_currentDragData->setModifierKeyState(webInputEventKeyStateToPlatformEventKeyState(keyModifiers)); DragData dragData( m_currentDragData.get(), clientPoint, @@ -2993,9 +3067,21 @@ void WebViewImpl::layoutUpdated(WebFrameImpl* webframe) void WebViewImpl::didChangeContentsSize() { - bool didClampScale = computePageScaleFactorLimits(); +#if ENABLE(VIEWPORT) + if (!settings()->viewportEnabled()) + return; - if (!didClampScale) + bool didChangeScale = false; + if (!isPageScaleFactorSet()) { + // If the viewport tag failed to be processed earlier, we need + // to recompute it now. + ViewportArguments viewportArguments = mainFrameImpl()->frame()->document()->viewportArguments(); + m_page->chrome()->client()->dispatchViewportPropertiesDidChange(viewportArguments); + didChangeScale = true; + } else + didChangeScale = computePageScaleFactorLimits(); + + if (!didChangeScale) return; if (!mainFrameImpl()) @@ -3004,6 +3090,7 @@ void WebViewImpl::didChangeContentsSize() FrameView* view = mainFrameImpl()->frameView(); if (view && view->needsLayout()) view->layout(); +#endif } bool WebViewImpl::useExternalPopupMenus() @@ -3047,7 +3134,8 @@ bool WebViewImpl::navigationPolicyFromMouseEvent(unsigned short button, return true; } -void WebViewImpl::startDragging(const WebDragData& dragData, +void WebViewImpl::startDragging(Frame* frame, + const WebDragData& dragData, WebDragOperationsMask mask, const WebImage& dragImage, const WebPoint& dragImageOffset) @@ -3056,7 +3144,7 @@ void WebViewImpl::startDragging(const WebDragData& dragData, return; ASSERT(!m_doingDragAndDrop); m_doingDragAndDrop = true; - m_client->startDragging(dragData, mask, dragImage, dragImageOffset); + m_client->startDragging(WebFrameImpl::fromFrame(frame), dragData, mask, dragImage, dragImageOffset); } void WebViewImpl::observeNewNavigation() @@ -3306,16 +3394,31 @@ void WebViewImpl::setIsAcceleratedCompositingActive(bool active) WebLayerTreeView::Settings layerTreeViewSettings; layerTreeViewSettings.acceleratePainting = page()->settings()->acceleratedDrawingEnabled(); - layerTreeViewSettings.showFPSCounter = settings()->showFPSCounter(); - layerTreeViewSettings.showPlatformLayerTree = settings()->showPlatformLayerTree(); + layerTreeViewSettings.showFPSCounter = settingsImpl()->showFPSCounter(); + layerTreeViewSettings.showPlatformLayerTree = settingsImpl()->showPlatformLayerTree(); + layerTreeViewSettings.showPaintRects = settingsImpl()->showPaintRects(); layerTreeViewSettings.perTilePainting = page()->settings()->perTileDrawingEnabled(); layerTreeViewSettings.partialSwapEnabled = page()->settings()->partialSwapEnabled(); layerTreeViewSettings.threadedAnimationEnabled = page()->settings()->threadedAnimationEnabled(); + layerTreeViewSettings.defaultTileSize = settingsImpl()->defaultTileSize(); + layerTreeViewSettings.maxUntiledLayerSize = settingsImpl()->maxUntiledLayerSize(); + m_nonCompositedContentHost = NonCompositedContentHost::create(WebViewImplContentPainter::create(this)); m_nonCompositedContentHost->setShowDebugBorders(page()->settings()->showDebugBorders()); + if (m_webSettings->applyDefaultDeviceScaleFactorInCompositor() && page()->settings()->defaultDeviceScaleFactor() != 1) { + ASSERT(page()->settings()->defaultDeviceScaleFactor()); + + m_deviceScaleInCompositor = page()->settings()->defaultDeviceScaleFactor(); + layerTreeViewSettings.deviceScaleFactor = m_deviceScaleInCompositor; + setDeviceScaleFactor(m_deviceScaleInCompositor); + // When applying a scale factor in the compositor, we disallow page + // scaling as they are currently incompatible. + setPageScaleFactorLimits(1, 1); + } + m_layerTreeView.initialize(this, m_rootLayer, layerTreeViewSettings); if (!m_layerTreeView.isNull()) { m_layerTreeView.setPageScaleFactorAndLimits(pageScaleFactor(), m_minimumPageScaleFactor, m_maximumPageScaleFactor); @@ -3459,7 +3562,12 @@ void WebViewImpl::updateLayerTreeViewport() // layer. layerAdjustX = -view->contentsSize().width() + view->visibleContentRect(false).width(); } - m_nonCompositedContentHost->setViewport(visibleRect.size(), view->contentsSize(), scroll, pageScaleFactor(), layerAdjustX); + + // This part of the deviceScale will be used to scale the contents of + // the NCCH's GraphicsLayer. + float deviceScale = m_deviceScaleInCompositor; + m_nonCompositedContentHost->setViewport(visibleRect.size(), view->contentsSize(), scroll, deviceScale, layerAdjustX); + m_layerTreeView.setViewportSize(size()); m_layerTreeView.setPageScaleFactorAndLimits(pageScaleFactor(), m_minimumPageScaleFactor, m_maximumPageScaleFactor); } |