Chromium Code Reviews| Index: Source/WebKit/chromium/src/WebViewImpl.cpp |
| diff --git a/Source/WebKit/chromium/src/WebViewImpl.cpp b/Source/WebKit/chromium/src/WebViewImpl.cpp |
| index c32e639d772eb4efe6d4a36d0db1e80bd0c775d9..2d6a2889ee122730e24310bb9816d6004a396eb1 100644 |
| --- a/Source/WebKit/chromium/src/WebViewImpl.cpp |
| +++ b/Source/WebKit/chromium/src/WebViewImpl.cpp |
| @@ -214,8 +214,6 @@ namespace WebKit { |
| const double WebView::textSizeMultiplierRatio = 1.2; |
| const double WebView::minTextSizeMultiplier = 0.5; |
| const double WebView::maxTextSizeMultiplier = 3.0; |
| -const float WebView::minPageScaleFactor = 0.25f; |
| -const float WebView::maxPageScaleFactor = 4.0f; |
| // Used to defer all page activity in cases where the embedder wishes to run |
| // a nested event loop. Using a stack enables nesting of message loop invocations. |
| @@ -389,14 +387,6 @@ WebViewImpl::WebViewImpl(WebViewClient* client) |
| , m_zoomLevel(0) |
| , m_minimumZoomLevel(zoomFactorToZoomLevel(minTextSizeMultiplier)) |
| , m_maximumZoomLevel(zoomFactorToZoomLevel(maxTextSizeMultiplier)) |
| - , m_pageDefinedMinimumPageScaleFactor(-1) |
| - , m_pageDefinedMaximumPageScaleFactor(-1) |
| - , m_minimumPageScaleFactor(minPageScaleFactor) |
| - , m_maximumPageScaleFactor(maxPageScaleFactor) |
| - , m_initialPageScaleFactorOverride(-1) |
| - , m_initialPageScaleFactor(-1) |
| - , m_ignoreViewportTagMaximumScale(false) |
| - , m_pageScaleFactorIsSet(false) |
| , m_savedPageScaleFactor(0) |
| , m_doubleTapZoomPageScaleFactor(0) |
| , m_doubleTapZoomPending(false) |
| @@ -490,8 +480,10 @@ WebViewImpl::WebViewImpl(WebViewClient* client) |
| unsigned layoutMilestones = DidFirstLayout | DidFirstVisuallyNonEmptyLayout; |
| m_page->addLayoutMilestones(static_cast<LayoutMilestones>(layoutMilestones)); |
| - if (m_client) |
| + if (m_client) { |
| + setDeviceScaleFactor(m_client->screenInfo().deviceScaleFactor); |
|
dshwang
2013/05/13 12:38:01
Could you explain what this code results?
aelias_OOO_until_Jul13
2013/05/13 18:13:06
This setDeviceScaleFactor() call previously happen
|
| setVisibilityState(m_client->visibilityState(), true); |
| + } |
| m_inspectorSettingsMap = adoptPtr(new SettingsMap); |
| } |
| @@ -807,7 +799,7 @@ bool WebViewImpl::handleGestureEvent(const WebGestureEvent& event) |
| break; |
| } |
| case WebInputEvent::GestureDoubleTap: |
| - if (m_webSettings->doubleTapToZoomEnabled() && m_minimumPageScaleFactor != m_maximumPageScaleFactor) { |
| + if (m_webSettings->doubleTapToZoomEnabled() && minimumPageScaleFactor() != maximumPageScaleFactor()) { |
| m_client->cancelScheduledContentIntents(); |
| animateZoomAroundPoint(platformEvent.position(), DoubleTap); |
| } |
| @@ -1180,12 +1172,12 @@ void WebViewImpl::computeScaleAndScrollForHitRect(const WebRect& hitRect, AutoZo |
| // need to zoom in further when automatically determining zoom level |
| // (after double tap, find in page, etc), though the user should still |
| // be allowed to manually pinch zoom in further if they desire. |
| - const float defaultScaleWhenAlreadyLegible = m_minimumPageScaleFactor * doubleTapZoomAlreadyLegibleRatio; |
| + const float defaultScaleWhenAlreadyLegible = minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio; |
| float legibleScale = 1; |
| if (page() && page()->settings()) |
| legibleScale *= page()->settings()->textAutosizingFontScaleFactor(); |
| if (legibleScale < defaultScaleWhenAlreadyLegible) |
| - legibleScale = (scale == m_minimumPageScaleFactor) ? defaultScaleWhenAlreadyLegible : m_minimumPageScaleFactor; |
| + legibleScale = (scale == minimumPageScaleFactor()) ? defaultScaleWhenAlreadyLegible : minimumPageScaleFactor(); |
|
kenneth.r.christiansen
2013/05/13 11:00:18
Why are these changes not in a separate patch
aelias_OOO_until_Jul13
2013/05/13 18:13:06
Because the field m_minimumScaleFactor was deleted
|
| float defaultMargin = doubleTapZoomContentDefaultMargin; |
| float minimumMargin = doubleTapZoomContentMinimumMargin; |
| @@ -1207,11 +1199,11 @@ void WebViewImpl::computeScaleAndScrollForHitRect(const WebRect& hitRect, AutoZo |
| } |
| bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPageScaleFactor |
| - && m_doubleTapZoomPageScaleFactor != m_minimumPageScaleFactor) |
| + && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor()) |
| || m_doubleTapZoomPending; |
| if (zoomType == DoubleTap && (rect.isEmpty() || scaleUnchanged || stillAtPreviousDoubleTapScale)) { |
| // Zoom out to minimum scale. |
| - scale = m_minimumPageScaleFactor; |
| + scale = minimumPageScaleFactor(); |
| scroll = WebPoint(hitRect.x, hitRect.y); |
| isAnchor = true; |
| } else { |
| @@ -1650,8 +1642,8 @@ void WebViewImpl::resize(const WebSize& newSize) |
| FloatSize(viewportAnchorXCoord, viewportAnchorYCoord)); |
| } |
| - ViewportArguments viewportArguments = mainFrameImpl()->frame()->document()->viewportArguments(); |
| - m_page->chrome()->client()->dispatchViewportPropertiesDidChange(viewportArguments); |
| + // Set the fixed layout size from the viewport attributes before resizing. |
| + updatePageDefinedViewportAttributes(mainFrameImpl()->frame()->document()->viewportArguments()); |
| WebDevToolsAgentPrivate* agentPrivate = devToolsAgentPrivate(); |
| if (agentPrivate) |
| @@ -2852,15 +2844,6 @@ double WebView::zoomFactorToZoomLevel(double factor) |
| return log(factor) / log(textSizeMultiplierRatio); |
| } |
| -void WebViewImpl::setInitialPageScaleOverride(float initialPageScaleFactorOverride) |
| -{ |
| - if (m_initialPageScaleFactorOverride == initialPageScaleFactorOverride) |
| - return; |
| - m_initialPageScaleFactorOverride = initialPageScaleFactorOverride; |
| - m_pageScaleFactorIsSet = false; |
| - computePageScaleFactorLimits(); |
| -} |
| - |
| float WebViewImpl::pageScaleFactor() const |
| { |
| if (!page()) |
| @@ -2869,33 +2852,24 @@ float WebViewImpl::pageScaleFactor() const |
| return page()->pageScaleFactor(); |
| } |
| -bool WebViewImpl::isPageScaleFactorSet() const |
| +float WebViewImpl::clampPageScaleFactorToLimits(float scaleFactor) const |
| { |
| - return m_pageScaleFactorIsSet; |
| + return m_viewportAttributesManager.finalAttributes().clampToConstraints(scaleFactor); |
| } |
| -float WebViewImpl::clampPageScaleFactorToLimits(float scaleFactor) |
| +IntPoint WebViewImpl::clampOffsetAtScale(const IntPoint& offset, float scale) |
| { |
| - return min(max(scaleFactor, m_minimumPageScaleFactor), m_maximumPageScaleFactor); |
| -} |
| + FrameView* view = mainFrameImpl()->frameView(); |
| + if (!view) |
| + return offset; |
| -IntPoint WebViewImpl::clampOffsetAtScale(const IntPoint& offset, float scale) const |
| -{ |
| IntPoint clampedOffset = offset; |
| - clampedOffset = clampedOffset.shrunkTo(IntPoint(contentsSize() - scaledSize(scale))); |
| - clampedOffset.clampNegativeToZero(); |
| - |
| - return clampedOffset; |
| -} |
| - |
| -void WebViewImpl::setPageScaleFactorPreservingScrollOffset(float scaleFactor) |
| -{ |
| - scaleFactor = clampPageScaleFactorToLimits(scaleFactor); |
| - IntPoint scrollOffset(mainFrame()->scrollOffset().width, mainFrame()->scrollOffset().height); |
| - scrollOffset = clampOffsetAtScale(scrollOffset, scaleFactor); |
| + IntSize maxScrollExtent = contentsSize(); |
| + clampedOffset = clampedOffset.shrunkTo(IntPoint(maxScrollExtent - scaledSize(scale))); |
| + clampedOffset = clampedOffset.expandedTo(-view->scrollOrigin()); |
| - setPageScaleFactor(scaleFactor, scrollOffset); |
| + return clampedOffset; |
| } |
| void WebViewImpl::setPageScaleFactor(float scaleFactor, const WebPoint& origin) |
| @@ -2903,27 +2877,17 @@ void WebViewImpl::setPageScaleFactor(float scaleFactor, const WebPoint& origin) |
| if (!page()) |
| return; |
| - if (!scaleFactor) |
| - scaleFactor = 1; |
| - |
| IntPoint newScrollOffset = origin; |
| scaleFactor = clampPageScaleFactorToLimits(scaleFactor); |
| newScrollOffset = clampOffsetAtScale(newScrollOffset, scaleFactor); |
| - Frame* frame = page()->mainFrame(); |
| - FrameView* view = frame->view(); |
| - IntPoint oldScrollOffset = view->scrollPosition(); |
| - |
| - // Adjust the page scale in two steps. First, without change to scroll |
| - // position, and then with a user scroll to the desired position. |
| - // We do this because Page::setPageScaleFactor calls |
| - // FrameView::setScrollPosition which is a programmatic scroll |
| - // and we need this method to perform only user scrolls. |
| - page()->setPageScaleFactor(scaleFactor, oldScrollOffset); |
| - if (newScrollOffset != oldScrollOffset) |
| - updateMainFrameScrollPosition(newScrollOffset, false); |
| + page()->setPageScaleFactor(scaleFactor, newScrollOffset); |
| +} |
| - m_pageScaleFactorIsSet = true; |
| +void WebViewImpl::setPageScaleFactorPreservingScrollOffset(float scaleFactor) |
| +{ |
| + IntPoint scrollOffset(mainFrame()->scrollOffset().width, mainFrame()->scrollOffset().height); |
| + setPageScaleFactor(scaleFactor, scrollOffset); |
| } |
| float WebViewImpl::deviceScaleFactor() const |
| @@ -2988,103 +2952,112 @@ void WebViewImpl::disableAutoResizeMode() |
| configureAutoResizeMode(); |
| } |
| -void WebViewImpl::setPageScaleFactorLimits(float minPageScale, float maxPageScale) |
| +void WebViewImpl::overridePageScaleConstraints(ViewportAttributes newConstraints) |
|
kenneth.r.christiansen
2013/05/13 11:00:18
Here the methods is called overwriteSomething
aelias_OOO_until_Jul13
2013/05/13 18:13:06
I renamed this to setUserAgentViewportConstraints.
|
| { |
| - if (minPageScale == m_pageDefinedMinimumPageScaleFactor && maxPageScale == m_pageDefinedMaximumPageScaleFactor) |
| + if (newConstraints == m_viewportAttributesManager.embedderConstraints()) |
| return; |
| - m_pageDefinedMinimumPageScaleFactor = minPageScale; |
| - m_pageDefinedMaximumPageScaleFactor = maxPageScale; |
| + m_viewportAttributesManager.setEmbedderConstraints(newConstraints); |
| - if (settings()->viewportEnabled()) { |
| - // If we're in viewport tag mode, we need to layout to obtain the latest |
| - // contents size and compute the final limits. |
| - FrameView* view = mainFrameImpl()->frameView(); |
| - if (view) |
| - view->setNeedsLayout(); |
| - } else { |
| - // Otherwise just compute the limits immediately. |
| - computePageScaleFactorLimits(); |
| - } |
| + if (!mainFrameImpl() || !mainFrameImpl()->frameView()) |
| + return; |
| + |
| + mainFrameImpl()->frameView()->setNeedsLayout(); |
| } |
| -void WebViewImpl::setIgnoreViewportTagMaximumScale(bool flag) |
| +void WebViewImpl::setInitialPageScaleOverride(float initialPageScaleFactorOverride) |
|
kenneth.r.christiansen
2013/05/13 11:00:18
here setSomethingOverride.. why the inconsistency?
|
| { |
| - m_ignoreViewportTagMaximumScale = flag; |
| + ViewportAttributes constraints = m_viewportAttributesManager.embedderConstraints(); |
| + constraints.initialScale = initialPageScaleFactorOverride; |
| - if (!page() || !page()->mainFrame()) |
| + if (constraints == m_viewportAttributesManager.embedderConstraints()) |
| return; |
| - m_page->chrome()->client()->dispatchViewportPropertiesDidChange(page()->mainFrame()->document()->viewportArguments()); |
| + m_viewportAttributesManager.setNeedsReset(true); |
| + overridePageScaleConstraints(constraints); |
| } |
| -IntSize WebViewImpl::contentsSize() const |
| +void WebViewImpl::setPageScaleFactorLimits(float minPageScale, float maxPageScale) |
| { |
| - RenderView* root = page()->mainFrame()->contentRenderer(); |
| - if (!root) |
| - return IntSize(); |
| - return root->documentRect().size(); |
| + ViewportAttributes constraints = m_viewportAttributesManager.embedderConstraints(); |
| + constraints.minimumScale = minPageScale; |
| + constraints.maximumScale = maxPageScale; |
| + overridePageScaleConstraints(constraints); |
| } |
| -void WebViewImpl::computePageScaleFactorLimits() |
| +void WebViewImpl::setIgnoreViewportTagScaleLimits(bool ignore) |
| +{ |
| + ViewportAttributes constraints = m_viewportAttributesManager.embedderConstraints(); |
| + if (ignore) { |
| + constraints.minimumScale = m_viewportAttributesManager.defaultConstraints().minimumScale; |
| + constraints.maximumScale = m_viewportAttributesManager.defaultConstraints().maximumScale; |
| + } else { |
| + constraints.minimumScale = -1; |
| + constraints.maximumScale = -1; |
| + } |
| + overridePageScaleConstraints(constraints); |
| +} |
| + |
| +void WebViewImpl::refreshPageScaleFactorAfterLayout() |
| { |
| if (!mainFrame() || !page() || !page()->mainFrame() || !page()->mainFrame()->view()) |
| return; |
| - |
| FrameView* view = page()->mainFrame()->view(); |
| - if (m_pageDefinedMinimumPageScaleFactor == -1 || m_pageDefinedMaximumPageScaleFactor == -1) { |
| - m_minimumPageScaleFactor = minPageScaleFactor; |
| - m_maximumPageScaleFactor = maxPageScaleFactor; |
| - } else { |
| - m_minimumPageScaleFactor = min(max(m_pageDefinedMinimumPageScaleFactor, minPageScaleFactor), maxPageScaleFactor); |
| - m_maximumPageScaleFactor = max(min(m_pageDefinedMaximumPageScaleFactor, maxPageScaleFactor), minPageScaleFactor); |
| - } |
| + updatePageDefinedViewportAttributes(mainFrameImpl()->frame()->document()->viewportArguments()); |
|
kenneth.r.christiansen
2013/05/13 11:00:18
why bother with all this if viewportEnabled() is n
aelias_OOO_until_Jul13
2013/05/13 18:13:06
Because we want to support pinch zoom on touch-ena
|
| + m_viewportAttributesManager.computeFinalAttributes(); |
| - if (settings()->viewportEnabled()) { |
| - if (!contentsSize().width() || !m_size.width) |
| - return; |
| - |
| - // When viewport tag is enabled, the scale needed to see the full |
| - // content width is the default minimum. |
| - int viewWidthNotIncludingScrollbars = m_size.width; |
| + if (settings()->viewportEnabled() || settingsImpl()->supportDeprecatedTargetDensityDPI()) { |
| + int verticalScrollbarWidth = 0; |
| if (view->verticalScrollbar() && !view->verticalScrollbar()->isOverlayScrollbar()) |
| - viewWidthNotIncludingScrollbars -= view->verticalScrollbar()->width(); |
| - m_minimumPageScaleFactor = max(m_minimumPageScaleFactor, static_cast<float>(viewWidthNotIncludingScrollbars) / contentsSize().width()); |
| - m_maximumPageScaleFactor = max(m_minimumPageScaleFactor, m_maximumPageScaleFactor); |
| - if (m_initialPageScaleFactorOverride != -1) { |
| - m_minimumPageScaleFactor = min(m_minimumPageScaleFactor, m_initialPageScaleFactorOverride); |
| - m_maximumPageScaleFactor = max(m_maximumPageScaleFactor, m_initialPageScaleFactorOverride); |
| - } |
| + verticalScrollbarWidth = view->verticalScrollbar()->width(); |
| + m_viewportAttributesManager.adjustFinalAttributesToContentsSize(m_size, contentsSize(), verticalScrollbarWidth); |
| } |
| - ASSERT(m_minimumPageScaleFactor <= m_maximumPageScaleFactor); |
| - |
| - // Initialize and/or clamp the page scale factor if needed. |
| - float initialPageScaleFactor = m_initialPageScaleFactor; |
| - if (!settings()->viewportEnabled()) |
| - initialPageScaleFactor = 1; |
| - if (m_initialPageScaleFactorOverride != -1) |
| - initialPageScaleFactor = m_initialPageScaleFactorOverride; |
| + |
| float newPageScaleFactor = pageScaleFactor(); |
| - if (!m_pageScaleFactorIsSet && initialPageScaleFactor != -1) { |
| - newPageScaleFactor = initialPageScaleFactor; |
| - m_pageScaleFactorIsSet = true; |
| + if (m_viewportAttributesManager.needsReset() && m_viewportAttributesManager.finalAttributes().initialScale != -1) { |
| + newPageScaleFactor = m_viewportAttributesManager.finalAttributes().initialScale; |
| + m_viewportAttributesManager.setNeedsReset(false); |
| } |
| - newPageScaleFactor = clampPageScaleFactorToLimits(newPageScaleFactor); |
| - if (m_layerTreeView) |
| - m_layerTreeView->setPageScaleFactorAndLimits(newPageScaleFactor, m_minimumPageScaleFactor, m_maximumPageScaleFactor); |
| - if (newPageScaleFactor != pageScaleFactor()) |
| - setPageScaleFactorPreservingScrollOffset(newPageScaleFactor); |
| + setPageScaleFactorPreservingScrollOffset(newPageScaleFactor); |
| + |
| + updateLayerTreeViewport(); |
| + |
| + // Relayout immediately to avoid violating the rule that needsLayout() |
| + // isn't set at the end of a layout. |
| + if (view->needsLayout()) |
| + view->layout(); |
| +} |
| + |
| +void WebViewImpl::updatePageDefinedViewportAttributes(const ViewportArguments& arguments) |
| +{ |
| + if (!settings()->viewportEnabled() || !isFixedLayoutModeEnabled() || !page() || !m_size.width || !m_size.height) |
| + return; |
| + |
| + m_viewportAttributesManager.updatePageDefined(arguments, m_size, page()->settings()->layoutFallbackWidth()); |
| + |
| + if (settingsImpl()->supportDeprecatedTargetDensityDPI()) |
| + m_viewportAttributesManager.adjustPageDefinedForAndroidWebView(arguments, m_size, page()->settings()->layoutFallbackWidth(), deviceScaleFactor(), settingsImpl()->useWideViewport(), settingsImpl()->initializeAtMinimumPageScale()); |
| + |
| + setFixedLayoutSize(flooredIntSize(m_viewportAttributesManager.pageDefined().layoutSize)); |
| +} |
| + |
| +IntSize WebViewImpl::contentsSize() const |
| +{ |
| + RenderView* root = page()->mainFrame()->contentRenderer(); |
| + if (!root) |
| + return IntSize(); |
| + return root->documentRect().size(); |
| } |
| float WebViewImpl::minimumPageScaleFactor() const |
| { |
| - return m_minimumPageScaleFactor; |
| + return m_viewportAttributesManager.finalAttributes().minimumScale; |
| } |
| float WebViewImpl::maximumPageScaleFactor() const |
| { |
| - return m_maximumPageScaleFactor; |
| + return m_viewportAttributesManager.finalAttributes().maximumScale; |
| } |
| void WebViewImpl::saveScrollAndScaleState() |
| @@ -3116,7 +3089,7 @@ void WebViewImpl::resetScrollAndScaleState() |
| // value determined during page scale initialization, which may be less than 1. |
| page()->mainFrame()->loader()->history()->saveDocumentAndScrollState(); |
| page()->mainFrame()->loader()->history()->clearScrollPositionAndViewState(); |
| - m_pageScaleFactorIsSet = false; |
| + m_viewportAttributesManager.setNeedsReset(true); |
| // Clobber saved scales and scroll offsets. |
| if (FrameView* view = page()->mainFrame()->document()->view()) |
| @@ -3648,7 +3621,7 @@ void WebViewImpl::didCommitLoad(bool* isNewNavigation, bool isNavigationWithinPa |
| #endif |
| m_observedNewNavigation = false; |
| if (*isNewNavigation && !isNavigationWithinPage) |
| - m_pageScaleFactorIsSet = false; |
| + m_viewportAttributesManager.setNeedsReset(true); |
| // Make sure link highlight from previous page is cleared. |
| m_linkHighlight.clear(); |
| @@ -3672,37 +3645,22 @@ void WebViewImpl::layoutUpdated(WebFrameImpl* webframe) |
| } |
| } |
| - if (settings()->viewportEnabled()) { |
| - 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); |
| - } |
| - |
| - // Contents size is an input to the page scale limits, so a good time to |
| - // recalculate is after layout has occurred. |
| - computePageScaleFactorLimits(); |
| - |
| - // Relayout immediately to avoid violating the rule that needsLayout() |
| - // isn't set at the end of a layout. |
| - FrameView* view = mainFrameImpl()->frameView(); |
| - if (view && view->needsLayout()) |
| - view->layout(); |
| - } |
| + if (m_viewportAttributesManager.constraintsDirty()) |
| + refreshPageScaleFactorAfterLayout(); |
| m_client->didUpdateLayout(); |
| - |
| } |
| void WebViewImpl::didChangeContentsSize() |
| { |
| + m_viewportAttributesManager.didChangeContentsSize(contentsSize(), pageScaleFactor()); |
| } |
| void WebViewImpl::deviceOrPageScaleFactorChanged() |
| { |
| if (pageScaleFactor() && pageScaleFactor() != 1) |
| enterForceCompositingMode(true); |
| + m_viewportAttributesManager.setNeedsReset(false); |
| updateLayerTreeViewport(); |
| } |
| @@ -4025,7 +3983,6 @@ void WebViewImpl::setIsAcceleratedCompositingActive(bool active) |
| bool visible = page()->visibilityState() == PageVisibilityStateVisible; |
| m_layerTreeView->setVisible(visible); |
| m_layerTreeView->setDeviceScaleFactor(page()->deviceScaleFactor()); |
| - m_layerTreeView->setPageScaleFactorAndLimits(pageScaleFactor(), m_minimumPageScaleFactor, m_maximumPageScaleFactor); |
| m_layerTreeView->setHasTransparentBackground(isTransparent()); |
| updateLayerTreeViewport(); |
| m_client->didActivateCompositor(m_inputHandlerIdentifier); |
| @@ -4114,7 +4071,7 @@ void WebViewImpl::updateLayerTreeViewport() |
| FrameView* view = page()->mainFrame()->view(); |
| m_nonCompositedContentHost->setViewport(m_size, view->contentsSize(), view->scrollPosition(), view->scrollOrigin()); |
| - m_layerTreeView->setPageScaleFactorAndLimits(pageScaleFactor(), m_minimumPageScaleFactor, m_maximumPageScaleFactor); |
| + m_layerTreeView->setPageScaleFactorAndLimits(pageScaleFactor(), minimumPageScaleFactor(), maximumPageScaleFactor()); |
| } |
| void WebViewImpl::selectAutofillSuggestionAtIndex(unsigned listIndex) |