Commit 9762fe19 authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Commit Bot

Android: Route frame metadata update to GestureListenerManager

Made GestureListenerManager a bit more responsible and take over
update using the frame metadata from renderer.

GestureListenerManager was already handling scroll/scale limit
changed through frame metadata update, which I believe gives
justification to the refactoring.

This also helps reduce the layering-violating reference to
ContentViewCore from RenderWidgetHostViewAndroid.

Bug: 626765
Change-Id: Iaa63e2ccd2e3e3b87c8c06b140ff93687f6601a1
Reviewed-on: https://chromium-review.googlesource.com/950526
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: default avatarBo <boliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#541672}
parent 39775084
......@@ -55,7 +55,6 @@
#include "ui/gfx/android/java_bitmap.h"
#include "ui/gfx/geometry/point_conversions.h"
#include "ui/gfx/geometry/size_conversions.h"
#include "ui/gfx/geometry/size_f.h"
using base::android::AttachCurrentThread;
using base::android::ConvertJavaStringToUTF16;
......@@ -283,41 +282,6 @@ jint ContentViewCore::GetBackgroundColor(JNIEnv* env, jobject obj) {
return rwhva->GetCachedBackgroundColor();
}
// All positions and sizes (except |top_shown_pix|) are in CSS pixels.
// Note that viewport_width/height is a best effort based.
// ContentViewCore has the actual information about the physical viewport size.
void ContentViewCore::UpdateFrameInfo(const gfx::Vector2dF& scroll_offset,
float page_scale_factor,
const float min_page_scale,
const float max_page_scale,
const gfx::SizeF& content_size,
const gfx::SizeF& viewport_size,
const float content_offset,
const float top_shown_pix,
bool top_changed) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
if (obj.is_null() || !GetWindowAndroid())
return;
GetViewAndroid()->UpdateFrameInfo({viewport_size, content_offset});
// Current viewport size in css.
gfx::SizeF view_size = gfx::SizeF(gfx::ScaleToCeiledSize(
GetViewportSizePix(), 1.0f / (dpi_scale() * page_scale_factor)));
// Adjust content size to be always at least as big as the actual
// viewport (as set by onSizeChanged).
float content_width = std::max(content_size.width(), view_size.width());
float content_height = std::max(content_size.height(), view_size.height());
Java_ContentViewCoreImpl_updateFrameInfo(
env, obj, scroll_offset.x(), scroll_offset.y(), page_scale_factor,
min_page_scale, max_page_scale, content_width, content_height,
viewport_size.width(), viewport_size.height(), top_shown_pix,
top_changed);
}
void ContentViewCore::RequestDisallowInterceptTouchEvent() {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
......@@ -325,15 +289,6 @@ void ContentViewCore::RequestDisallowInterceptTouchEvent() {
Java_ContentViewCoreImpl_requestDisallowInterceptTouchEvent(env, obj);
}
gfx::Size ContentViewCore::GetViewportSizePix() const {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
if (j_obj.is_null())
return gfx::Size();
return gfx::Size(Java_ContentViewCoreImpl_getViewportWidthPix(env, j_obj),
Java_ContentViewCoreImpl_getViewportHeightPix(env, j_obj));
}
void ContentViewCore::SendScreenRectsAndResizeWidget() {
RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
if (view) {
......
......@@ -137,18 +137,6 @@ class ContentViewCore : public WebContentsObserver {
void HidePopupsAndPreserveSelection();
// All sizes and offsets are in CSS pixels (except |top_show_pix|)
// as cached by the renderer.
void UpdateFrameInfo(const gfx::Vector2dF& scroll_offset,
float page_scale_factor,
float min_page_scale,
float max_page_scale,
const gfx::SizeF& content_size,
const gfx::SizeF& viewport_size,
const float top_content_offset,
const float top_shown_pix,
bool top_changed);
void RequestDisallowInterceptTouchEvent();
// Returns the context with which the ContentViewCore was created, typically
......@@ -185,8 +173,6 @@ class ContentViewCore : public WebContentsObserver {
RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid() const;
gfx::Size GetViewportSizePix() const;
// Update focus state of the RenderWidgetHostView.
void SetFocusInternal(bool focused);
......
......@@ -10,6 +10,7 @@
#include "jni/GestureListenerManagerImpl_jni.h"
#include "third_party/WebKit/public/platform/WebInputEvent.h"
#include "ui/events/android/gesture_event_type.h"
#include "ui/gfx/geometry/size_f.h"
using blink::WebGestureEvent;
using blink::WebInputEvent;
......@@ -169,6 +170,30 @@ bool GestureListenerManager::FilterInputEvent(const WebInputEvent& event) {
env, j_obj, gesture_type, gesture.x * dip_scale, gesture.y * dip_scale);
}
// All positions and sizes (except |top_shown_pix|) are in CSS pixels.
// Note that viewport_width/height is a best effort based.
void GestureListenerManager::UpdateScrollInfo(
const gfx::Vector2dF& scroll_offset,
float page_scale_factor,
const float min_page_scale,
const float max_page_scale,
const gfx::SizeF& content,
const gfx::SizeF& viewport,
const float content_offset,
const float top_shown_pix,
bool top_changed) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
if (obj.is_null())
return;
web_contents_->GetNativeView()->UpdateFrameInfo({viewport, content_offset});
Java_GestureListenerManagerImpl_updateScrollInfo(
env, obj, scroll_offset.x(), scroll_offset.y(), page_scale_factor,
min_page_scale, max_page_scale, content.width(), content.height(),
viewport.width(), viewport.height(), top_shown_pix, top_changed);
}
void GestureListenerManager::UpdateRenderProcessConnection(
RenderWidgetHostViewAndroid* old_rwhva,
RenderWidgetHostViewAndroid* new_rwhva) {
......
......@@ -15,6 +15,11 @@ namespace blink {
class WebGestureEvent;
}
namespace gfx {
class SizeF;
class Vector2dF;
} // namespace gfx
namespace content {
class WebContentsImpl;
......@@ -33,6 +38,18 @@ class GestureListenerManager : public RenderWidgetHostConnector {
void DidStopFlinging();
bool FilterInputEvent(const blink::WebInputEvent& event);
// All sizes and offsets are in CSS pixels (except |top_show_pix|)
// as cached by the renderer.
void UpdateScrollInfo(const gfx::Vector2dF& scroll_offset,
float page_scale_factor,
const float min_page_scale,
const float max_page_scale,
const gfx::SizeF& content,
const gfx::SizeF& viewport,
const float content_offset,
const float top_shown_pix,
bool top_changed);
// RendetWidgetHostConnector implementation.
void UpdateRenderProcessConnection(
RenderWidgetHostViewAndroid* old_rwhva,
......
......@@ -1224,7 +1224,7 @@ void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated(
if (wcax)
wcax->UpdateFrameInfo();
if (!content_view_core_)
if (!gesture_listener_manager_)
return;
if (overscroll_controller_)
......@@ -1278,7 +1278,7 @@ void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated(
max_page_scale_ = frame_metadata.max_page_scale_factor;
// All offsets and sizes except |top_shown_pix| are in CSS pixels.
content_view_core_->UpdateFrameInfo(
gesture_listener_manager_->UpdateScrollInfo(
root_scroll_offset_dip, frame_metadata.page_scale_factor,
frame_metadata.min_page_scale_factor,
frame_metadata.max_page_scale_factor, root_layer_size_dip,
......
......@@ -396,6 +396,7 @@ public class ContentViewCoreImpl implements ContentViewCore, DisplayAndroidObser
@Override
public void setContainerViewInternals(InternalAccessDelegate internalDispatcher) {
mContainerViewInternals = internalDispatcher;
getGestureListenerManager().setScrollDelegate(internalDispatcher);
}
@Override
......@@ -426,16 +427,6 @@ public class ContentViewCoreImpl implements ContentViewCore, DisplayAndroidObser
return mNativeContentViewCore != 0;
}
@CalledByNative
private int getViewportWidthPix() {
return mContainerView.getWidth();
}
@CalledByNative
private int getViewportHeightPix() {
return mContainerView.getHeight();
}
@VisibleForTesting
@Override
public int getTopControlsShrinkBlinkHeightForTesting() {
......@@ -805,49 +796,6 @@ public class ContentViewCoreImpl implements ContentViewCore, DisplayAndroidObser
nativeSetTextHandlesTemporarilyHidden(mNativeContentViewCore, hide);
}
@SuppressWarnings("unused")
@CalledByNative
private void updateFrameInfo(float scrollOffsetX, float scrollOffsetY, float pageScaleFactor,
float minPageScaleFactor, float maxPageScaleFactor, float contentWidth,
float contentHeight, float viewportWidth, float viewportHeight, float topBarShownPix,
boolean topBarChanged) {
TraceEvent.begin("ContentViewCore:updateFrameInfo");
final boolean contentSizeChanged = contentWidth != mRenderCoordinates.getContentWidthCss()
|| contentHeight != mRenderCoordinates.getContentHeightCss();
final boolean scaleLimitsChanged =
minPageScaleFactor != mRenderCoordinates.getMinPageScaleFactor()
|| maxPageScaleFactor != mRenderCoordinates.getMaxPageScaleFactor();
final boolean pageScaleChanged = pageScaleFactor != mRenderCoordinates.getPageScaleFactor();
final boolean scrollChanged = pageScaleChanged
|| scrollOffsetX != mRenderCoordinates.getScrollX()
|| scrollOffsetY != mRenderCoordinates.getScrollY();
if (contentSizeChanged || scrollChanged) getTapDisambiguator().hidePopup(true);
if (scrollChanged) {
mContainerViewInternals.onScrollChanged(
(int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetX),
(int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetY),
(int) mRenderCoordinates.getScrollXPix(),
(int) mRenderCoordinates.getScrollYPix());
}
mRenderCoordinates.updateFrameInfo(scrollOffsetX, scrollOffsetY, contentWidth,
contentHeight, viewportWidth, viewportHeight, pageScaleFactor, minPageScaleFactor,
maxPageScaleFactor, topBarShownPix);
if (scrollChanged || topBarChanged) {
getGestureListenerManager().updateOnScrollChanged(
computeVerticalScrollOffset(), computeVerticalScrollExtent());
}
if (scaleLimitsChanged) {
getGestureListenerManager().updateOnScaleLimitsChanged(
minPageScaleFactor, maxPageScaleFactor);
}
TraceEvent.end("ContentViewCore:updateFrameInfo");
}
/**
* Called when the &lt;select&gt; popup needs to be hidden. This calls
* nativeSelectMenuItems() with null indices.
......
......@@ -8,11 +8,13 @@ import android.view.View;
import org.chromium.base.ObserverList;
import org.chromium.base.ObserverList.RewindableIterator;
import org.chromium.base.TraceEvent;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.content.browser.webcontents.WebContentsImpl;
import org.chromium.content.browser.webcontents.WebContentsUserData;
import org.chromium.content.browser.webcontents.WebContentsUserData.UserDataFactory;
import org.chromium.content_public.browser.ContentViewCore.InternalAccessDelegate;
import org.chromium.content_public.browser.GestureListenerManager;
import org.chromium.content_public.browser.GestureStateListener;
import org.chromium.content_public.browser.WebContents;
......@@ -36,6 +38,7 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
private final ObserverList<GestureStateListener> mListeners;
private final RewindableIterator<GestureStateListener> mIterator;
private View mContainerView;
private InternalAccessDelegate mScrollDelegate;
// The outstanding fling start events that hasn't got fling end yet. It may be > 1 because
// onFlingEnd() is called asynchronously.
......@@ -71,6 +74,10 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
mContainerView = containerView;
}
public void setScrollDelegate(InternalAccessDelegate scrollDelegate) {
mScrollDelegate = scrollDelegate;
}
@Override
public void addListener(GestureStateListener listener) {
mListeners.addObserver(listener);
......@@ -215,6 +222,52 @@ public class GestureListenerManagerImpl implements GestureListenerManager, Windo
return false;
}
@SuppressWarnings("unused")
@CalledByNative
private void updateScrollInfo(float scrollOffsetX, float scrollOffsetY, float pageScaleFactor,
float minPageScaleFactor, float maxPageScaleFactor, float contentWidth,
float contentHeight, float viewportWidth, float viewportHeight, float topBarShownPix,
boolean topBarChanged) {
TraceEvent.begin("GestureListenerManagerImpl:updateScrollInfo");
RenderCoordinates rc = mWebContents.getRenderCoordinates();
// Adjust contentWidth/Height to be always at least as big as
// the actual viewport (as set by onSizeChanged).
final float deviceScale = rc.getDeviceScaleFactor();
contentWidth =
Math.max(contentWidth, mContainerView.getWidth() / (deviceScale * pageScaleFactor));
contentHeight = Math.max(
contentHeight, mContainerView.getHeight() / (deviceScale * pageScaleFactor));
final boolean contentSizeChanged = contentWidth != rc.getContentWidthCss()
|| contentHeight != rc.getContentHeightCss();
final boolean scaleLimitsChanged = minPageScaleFactor != rc.getMinPageScaleFactor()
|| maxPageScaleFactor != rc.getMaxPageScaleFactor();
final boolean pageScaleChanged = pageScaleFactor != rc.getPageScaleFactor();
final boolean scrollChanged = pageScaleChanged || scrollOffsetX != rc.getScrollX()
|| scrollOffsetY != rc.getScrollY();
if (contentSizeChanged || scrollChanged)
TapDisambiguator.fromWebContents(mWebContents).hidePopup(true);
if (scrollChanged) {
mScrollDelegate.onScrollChanged((int) rc.fromLocalCssToPix(scrollOffsetX),
(int) rc.fromLocalCssToPix(scrollOffsetY), (int) rc.getScrollXPix(),
(int) rc.getScrollYPix());
}
// TODO(jinsukkim): Consider updating the info directly through RenderCoordinates.
rc.updateFrameInfo(scrollOffsetX, scrollOffsetY, contentWidth, contentHeight, viewportWidth,
viewportHeight, pageScaleFactor, minPageScaleFactor, maxPageScaleFactor,
topBarShownPix);
if (scrollChanged || topBarChanged) {
updateOnScrollChanged(verticalScrollOffset(), verticalScrollExtent());
}
if (scaleLimitsChanged) updateOnScaleLimitsChanged(minPageScaleFactor, maxPageScaleFactor);
TraceEvent.end("GestureListenerManagerImpl:updateScrollInfo");
}
/**
* Offer a long press gesture to the embedding View, primarily for WebView compatibility.
*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment