Index: Source/web/WebDevToolsAgentImpl.cpp |
diff --git a/Source/web/WebDevToolsAgentImpl.cpp b/Source/web/WebDevToolsAgentImpl.cpp |
index 2ff512f877ec1d538902889581a4d735c1f9fccb..6cb9c6eb46754210790c62c870c2b6ef5af39ad5 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" |
@@ -187,170 +189,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 +196,8 @@ WebDevToolsAgentImpl::WebDevToolsAgentImpl( |
, m_client(client) |
, m_webViewImpl(webViewImpl) |
, m_attached(false) |
+ , m_deviceMetricsEnabled(false) |
+ , m_isOverlayScrollbarsEnabled(false) |
{ |
ASSERT(m_hostId > 0); |
ClientMessageLoopAdapter::ensureClientMessageLoopCreated(m_client); |
@@ -440,23 +280,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) |
@@ -488,29 +315,21 @@ 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; |
- } |
- |
- if (!m_metricsSupport) |
- m_metricsSupport = adoptPtr(new DeviceMetricsSupport(m_webViewImpl)); |
- |
- m_metricsSupport->setDeviceMetrics(width, height, fontScaleFactor, fitWindow); |
- if (InspectorController* ic = inspectorController()) { |
- WebSize size = m_webViewImpl->size(); |
- ic->webViewResized(IntSize(size.width, size.height)); |
+ if (m_deviceMetricsEnabled) { |
+ RuntimeEnabledFeatures::setOverlayScrollbarsEnabled(m_isOverlayScrollbarsEnabled); |
+ m_client->disableDeviceEmulation(); |
+ } |
+ m_deviceMetricsEnabled = false; |
+ } else { |
+ if (!m_deviceMetricsEnabled) { |
+ m_isOverlayScrollbarsEnabled = RuntimeEnabledFeatures::overlayScrollbarsEnabled(); |
+ RuntimeEnabledFeatures::setOverlayScrollbarsEnabled(true); |
+ } |
+ m_client->enableDeviceEmulation(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()); |
-} |
- |
void WebDevToolsAgentImpl::getAllocatedObjects(HashSet<const void*>& set) |
{ |
class CountingVisitor : public WebDevToolsAgentClient::AllocatedObjectVisitor { |