summaryrefslogtreecommitdiff
path: root/Source/WebKit/chromium/src/WebViewImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit/chromium/src/WebViewImpl.cpp')
-rw-r--r--Source/WebKit/chromium/src/WebViewImpl.cpp176
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);
}