Chromium Code Reviews| Index: Source/web/WebDevToolsAgentImpl.cpp |
| diff --git a/Source/web/WebDevToolsAgentImpl.cpp b/Source/web/WebDevToolsAgentImpl.cpp |
| index 1d9bd96b01a1c0e130b7a57cc0dc4d2901245c6e..f1b197a2dc9ea1f143e8fd12112b8c6bed48d88d 100644 |
| --- a/Source/web/WebDevToolsAgentImpl.cpp |
| +++ b/Source/web/WebDevToolsAgentImpl.cpp |
| @@ -34,11 +34,13 @@ |
| #include "InspectorBackendDispatcher.h" |
| #include "InspectorFrontend.h" |
| #include "InspectorProtocolVersion.h" |
| +#include "RuntimeEnabledFeatures.h" |
| #include "WebDataSource.h" |
| #include "WebDevToolsAgentClient.h" |
| #include "WebFrameImpl.h" |
| #include "WebInputEventConversion.h" |
| #include "WebMemoryUsageInfo.h" |
| +#include "WebSettings.h" |
| #include "WebViewClient.h" |
| #include "WebViewImpl.h" |
| #include "bindings/v8/PageScriptDebugServer.h" |
| @@ -53,6 +55,7 @@ |
| #include "core/page/FrameView.h" |
| #include "core/page/Page.h" |
| #include "core/page/PageGroup.h" |
| +#include "core/page/Settings.h" |
| #include "core/platform/JSONValues.h" |
| #include "core/platform/graphics/GraphicsContext.h" |
| #include "core/platform/network/ResourceError.h" |
| @@ -187,170 +190,6 @@ private: |
| OwnPtr<WebDevToolsAgent::MessageDescriptor> m_descriptor; |
| }; |
| -class DeviceMetricsSupport { |
| -public: |
| - DeviceMetricsSupport(WebViewImpl* webView) |
| - : m_webView(webView) |
| - , m_fitWindow(false) |
| - , m_originalZoomFactor(0) |
| - { |
| - } |
| - |
| - ~DeviceMetricsSupport() |
| - { |
| - restore(); |
| - } |
| - |
| - void setDeviceMetrics(int width, int height, float textZoomFactor, bool fitWindow) |
| - { |
| - WebCore::FrameView* view = frameView(); |
| - if (!view) |
| - return; |
| - |
| - m_emulatedFrameSize = WebSize(width, height); |
| - m_fitWindow = fitWindow; |
| - m_originalZoomFactor = 0; |
| - m_webView->setTextZoomFactor(textZoomFactor); |
| - applySizeOverrideInternal(view, FitWindowAllowed); |
| - autoZoomPageToFitWidth(&view->frame()); |
| - |
| - m_webView->sendResizeEventAndRepaint(); |
| - } |
| - |
| - void autoZoomPageToFitWidthOnNavigation(Frame* frame) |
| - { |
| - FrameView* frameView = frame->view(); |
| - applySizeOverrideInternal(frameView, FitWindowNotAllowed); |
| - m_originalZoomFactor = 0; |
| - applySizeOverrideInternal(frameView, FitWindowAllowed); |
| - autoZoomPageToFitWidth(frame); |
| - } |
| - |
| - void autoZoomPageToFitWidth(Frame* frame) |
| - { |
| - frame->setTextZoomFactor(m_webView->textZoomFactor()); |
| - ensureOriginalZoomFactor(frame->view()); |
| - Document* document = frame->document(); |
| - float numerator = document->renderView() ? document->renderView()->viewWidth() : frame->view()->contentsWidth(); |
| - float factor = m_originalZoomFactor * (numerator / m_emulatedFrameSize.width); |
| - frame->setPageAndTextZoomFactors(factor, m_webView->textZoomFactor()); |
| - document->styleResolverChanged(RecalcStyleImmediately); |
| - document->updateLayout(); |
| - } |
| - |
| - void webViewResized() |
| - { |
| - if (!m_fitWindow) |
| - return; |
| - |
| - applySizeOverrideIfNecessary(); |
| - autoZoomPageToFitWidth(m_webView->mainFrameImpl()->frame()); |
| - } |
| - |
| - void applySizeOverrideIfNecessary() |
| - { |
| - FrameView* view = frameView(); |
| - if (!view) |
| - return; |
| - |
| - applySizeOverrideInternal(view, FitWindowAllowed); |
| - } |
| - |
| -private: |
| - enum FitWindowFlag { FitWindowAllowed, FitWindowNotAllowed }; |
| - |
| - void ensureOriginalZoomFactor(FrameView* frameView) |
| - { |
| - if (m_originalZoomFactor) |
| - return; |
| - |
| - m_webView->setPageScaleFactor(1, WebPoint()); |
| - m_webView->setZoomLevel(0); |
| - WebSize scaledEmulatedSize = scaledEmulatedFrameSize(frameView); |
| - double denominator = frameView->contentsWidth(); |
| - if (!denominator) |
| - denominator = 1; |
| - m_originalZoomFactor = static_cast<double>(scaledEmulatedSize.width) / denominator; |
| - } |
| - |
| - void restore() |
| - { |
| - WebCore::FrameView* view = frameView(); |
| - if (!view) |
| - return; |
| - |
| - m_webView->setZoomLevel(0); |
| - m_webView->setTextZoomFactor(1); |
| - view->setHorizontalScrollbarLock(false); |
| - view->setVerticalScrollbarLock(false); |
| - view->setScrollbarModes(ScrollbarAuto, ScrollbarAuto, false, false); |
| - view->setFrameRect(IntRect(IntPoint(), IntSize(m_webView->size()))); |
| - m_webView->sendResizeEventAndRepaint(); |
| - } |
| - |
| - WebSize scaledEmulatedFrameSize(FrameView* frameView) |
| - { |
| - if (!m_fitWindow) |
| - return m_emulatedFrameSize; |
| - |
| - WebSize scrollbarDimensions = forcedScrollbarDimensions(frameView); |
| - |
| - int overrideWidth = m_emulatedFrameSize.width; |
| - int overrideHeight = m_emulatedFrameSize.height; |
| - |
| - WebSize webViewSize = m_webView->size(); |
| - int availableViewWidth = max(webViewSize.width - scrollbarDimensions.width, 1); |
| - int availableViewHeight = max(webViewSize.height - scrollbarDimensions.height, 1); |
| - |
| - double widthRatio = static_cast<double>(overrideWidth) / availableViewWidth; |
| - double heightRatio = static_cast<double>(overrideHeight) / availableViewHeight; |
| - double dimensionRatio = max(widthRatio, heightRatio); |
| - overrideWidth = static_cast<int>(ceil(static_cast<double>(overrideWidth) / dimensionRatio)); |
| - overrideHeight = static_cast<int>(ceil(static_cast<double>(overrideHeight) / dimensionRatio)); |
| - |
| - return WebSize(overrideWidth, overrideHeight); |
| - } |
| - |
| - WebSize forcedScrollbarDimensions(FrameView* frameView) |
| - { |
| - frameView->setScrollbarModes(ScrollbarAlwaysOn, ScrollbarAlwaysOn, true, true); |
| - |
| - int verticalScrollbarWidth = 0; |
| - int horizontalScrollbarHeight = 0; |
| - if (Scrollbar* verticalBar = frameView->verticalScrollbar()) |
| - verticalScrollbarWidth = !verticalBar->isOverlayScrollbar() ? verticalBar->width() : 0; |
| - if (Scrollbar* horizontalBar = frameView->horizontalScrollbar()) |
| - horizontalScrollbarHeight = !horizontalBar->isOverlayScrollbar() ? horizontalBar->height() : 0; |
| - return WebSize(verticalScrollbarWidth, horizontalScrollbarHeight); |
| - } |
| - |
| - void applySizeOverrideInternal(FrameView* frameView, FitWindowFlag fitWindowFlag) |
| - { |
| - WebSize scrollbarDimensions = forcedScrollbarDimensions(frameView); |
| - |
| - WebSize effectiveEmulatedSize = (fitWindowFlag == FitWindowAllowed) ? scaledEmulatedFrameSize(frameView) : m_emulatedFrameSize; |
| - int overrideWidth = effectiveEmulatedSize.width + scrollbarDimensions.width; |
| - int overrideHeight = effectiveEmulatedSize.height + scrollbarDimensions.height; |
| - |
| - if (IntSize(overrideWidth, overrideHeight) != frameView->size()) |
| - frameView->resize(overrideWidth, overrideHeight); |
| - |
| - Document* doc = frameView->frame().document(); |
| - doc->styleResolverChanged(RecalcStyleImmediately); |
| - doc->updateLayout(); |
| - } |
| - |
| - WebCore::FrameView* frameView() |
| - { |
| - return m_webView->mainFrameImpl() ? m_webView->mainFrameImpl()->frameView() : 0; |
| - } |
| - |
| - WebViewImpl* m_webView; |
| - WebSize m_emulatedFrameSize; |
| - bool m_fitWindow; |
| - double m_originalZoomFactor; |
| -}; |
| - |
| WebDevToolsAgentImpl::WebDevToolsAgentImpl( |
| WebViewImpl* webViewImpl, |
| WebDevToolsAgentClient* client) |
| @@ -358,6 +197,9 @@ WebDevToolsAgentImpl::WebDevToolsAgentImpl( |
| , m_client(client) |
| , m_webViewImpl(webViewImpl) |
| , m_attached(false) |
| + , m_deviceMetricsEnabled(false) |
| + , m_isCSSViewportEnabled(false) |
| + , m_isOverlayScrollbarsEnabled(false) |
| { |
| ASSERT(m_hostId > 0); |
| ClientMessageLoopAdapter::ensureClientMessageLoopCreated(m_client); |
| @@ -440,23 +282,10 @@ void WebDevToolsAgentImpl::didCreateScriptContext(WebFrameImpl* webframe, int wo |
| frame->script()->setContextDebugId(m_hostId); |
| } |
| -void WebDevToolsAgentImpl::mainFrameViewCreated(WebFrameImpl* webFrame) |
| -{ |
| - if (m_metricsSupport) |
| - m_metricsSupport->applySizeOverrideIfNecessary(); |
| -} |
| - |
| -bool WebDevToolsAgentImpl::metricsOverridden() |
| -{ |
| - return !!m_metricsSupport; |
| -} |
| - |
| void WebDevToolsAgentImpl::webViewResized(const WebSize& size) |
| { |
| - if (m_metricsSupport) |
| - m_metricsSupport->webViewResized(); |
| if (InspectorController* ic = inspectorController()) |
| - ic->webViewResized(m_metricsSupport ? IntSize(size.width, size.height) : IntSize()); |
| + ic->webViewResized(IntSize()); |
| } |
| bool WebDevToolsAgentImpl::handleInputEvent(WebCore::Page* page, const WebInputEvent& inputEvent) |
| @@ -487,28 +316,53 @@ bool WebDevToolsAgentImpl::handleInputEvent(WebCore::Page* page, const WebInputE |
| void WebDevToolsAgentImpl::overrideDeviceMetrics(int width, int height, float fontScaleFactor, bool fitWindow) |
| { |
| - if (!width && !height) { |
| - if (m_metricsSupport) |
| - m_metricsSupport.clear(); |
| - if (InspectorController* ic = inspectorController()) |
| - ic->webViewResized(IntSize()); |
| - return; |
| - } |
| + // FIXME: enable viewport after UI problems with pageScaleFactor will be fixed. |
|
aelias_OOO_until_Jul13
2013/10/01 08:08:51
I don't think this should land with dead code, it
dgozman
2013/10/01 15:26:34
Done.
|
| + bool enableViewport = false; |
| - if (!m_metricsSupport) |
| - m_metricsSupport = adoptPtr(new DeviceMetricsSupport(m_webViewImpl)); |
| + bool needReload = false; |
| + if (!width && !height) { |
| + if (m_deviceMetricsEnabled) { |
| + needReload = true; |
| + RuntimeEnabledFeatures::setOverlayScrollbarsEnabled(m_isOverlayScrollbarsEnabled); |
| + if (enableViewport) { |
| + RuntimeEnabledFeatures::setCSSViewportEnabled(m_isCSSViewportEnabled); |
| + m_webViewImpl->enableFixedLayoutMode(false); |
| + m_webViewImpl->settings()->setViewportEnabled(false); |
| + m_webViewImpl->page()->settings().setTextAutosizingEnabled(false); |
| + m_webViewImpl->setIgnoreViewportTagScaleLimits(false); |
| + m_webViewImpl->setPageScaleFactorLimits(1, 1); |
| + } |
| + m_client->emulateDevice(false /* enabled */, IntSize(), IntRect(), 1, false); |
| + } |
| + m_deviceMetricsEnabled = false; |
| + } else { |
| + if (!m_deviceMetricsEnabled) { |
| + needReload = true; |
| + |
| + m_isOverlayScrollbarsEnabled = RuntimeEnabledFeatures::overlayScrollbarsEnabled(); |
| + RuntimeEnabledFeatures::setOverlayScrollbarsEnabled(true); |
| + |
| + if (enableViewport) { |
| + m_isCSSViewportEnabled = RuntimeEnabledFeatures::cssViewportEnabled(); |
| + RuntimeEnabledFeatures::setCSSViewportEnabled(true); |
| + // FIXME: save and restore next two values when enableViewport is switched on. |
| + m_webViewImpl->enableFixedLayoutMode(true); |
| + m_webViewImpl->settings()->setViewportEnabled(true); |
| + // FIXME: text autosizing should be enabled only for several user agents which implement it. |
| + // Either pass it from frontend or whitelist here, when enableViewport is switched on. |
| + m_webViewImpl->page()->settings().setTextAutosizingEnabled(true); |
| + m_webViewImpl->setIgnoreViewportTagScaleLimits(fontScaleFactor > 1); |
| + m_webViewImpl->setPageScaleFactorLimits(-1, -1); |
| + } |
| + } |
| + if (enableViewport) |
| + m_webViewImpl->page()->settings().setTextAutosizingFontScaleFactor(fontScaleFactor); |
| - m_metricsSupport->setDeviceMetrics(width, height, fontScaleFactor, fitWindow); |
| - if (InspectorController* ic = inspectorController()) { |
| - WebSize size = m_webViewImpl->size(); |
| - ic->webViewResized(IntSize(size.width, size.height)); |
| + m_client->emulateDevice(true /* enabled */, IntSize(width, height), IntRect(0, 0, width, height), 2, fitWindow); |
| + m_deviceMetricsEnabled = true; |
| } |
| -} |
| - |
| -void WebDevToolsAgentImpl::autoZoomPageToFitWidth() |
| -{ |
| - if (m_metricsSupport) |
| - m_metricsSupport->autoZoomPageToFitWidthOnNavigation(m_webViewImpl->mainFrameImpl()->frame()); |
| + if (needReload && m_webViewImpl->mainFrameImpl()) |
| + m_webViewImpl->mainFrameImpl()->reload(false /* ignoreCache */); |
| } |
| void WebDevToolsAgentImpl::getAllocatedObjects(HashSet<const void*>& set) |