Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1140)

Unified Diff: Source/web/WebDevToolsAgentImpl.cpp

Issue 23187005: [DevTools] Use device metrics emulation implemented in content. (Closed) Base URL: svn://svn.chromium.org/blink/trunk/
Patch Set: Reupload Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698