Commit e03c880a authored by Donn Denman's avatar Donn Denman Committed by Commit Bot

[WebContents] Refactor RWHV out of WebContents.

There are about 5 accessors in WebContentImpl that end up
just going through that class to get to RenderWidgetHostView.

This CL moves those accessors onto a new class with an interface in
RenderWidgetHostView.java and java implementation in
RenderWidgetHostViewImpl.java that links to the native
RanderWidgetHostViewAndroid.

Updates callers to access RWHV through
WebContents#getRenderWidgetHostView, which can return null.

BUG=974430

Change-Id: I815c4f1791164aea0303c83fb5da62f7e87df274
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1663398
Commit-Queue: Donn Denman <donnd@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Auto-Submit: Donn Denman <donnd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#671774}
parent d708790e
...@@ -47,6 +47,7 @@ import org.chromium.base.VisibleForTesting; ...@@ -47,6 +47,7 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.base.metrics.CachedMetrics; import org.chromium.base.metrics.CachedMetrics;
import org.chromium.base.task.AsyncTask; import org.chromium.base.task.AsyncTask;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.content_public.browser.RenderWidgetHostView;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.UiUtils; import org.chromium.ui.UiUtils;
...@@ -417,10 +418,12 @@ public class ShareHelper { ...@@ -417,10 +418,12 @@ public class ShareHelper {
*/ */
public static void captureScreenshotForContents( public static void captureScreenshotForContents(
WebContents contents, int width, int height, Callback<Uri> callback) { WebContents contents, int width, int height, Callback<Uri> callback) {
RenderWidgetHostView rwhv = contents.getRenderWidgetHostView();
if (rwhv == null) callback.onResult(null);
try { try {
String path = UiUtils.getDirectoryForImageCapture(ContextUtils.getApplicationContext()) String path = UiUtils.getDirectoryForImageCapture(ContextUtils.getApplicationContext())
+ File.separator + SHARE_IMAGES_DIRECTORY_NAME; + File.separator + SHARE_IMAGES_DIRECTORY_NAME;
contents.writeContentBitmapToDiskAsync( rwhv.writeContentBitmapToDiskAsync(
width, height, path, new ExternallyVisibleUriCallback(callback)); width, height, path, new ExternallyVisibleUriCallback(callback));
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, "Error getting content bitmap: ", e); Log.e(TAG, "Error getting content bitmap: ", e);
......
...@@ -64,6 +64,7 @@ import org.chromium.components.embedder_support.view.ContentView; ...@@ -64,6 +64,7 @@ import org.chromium.components.embedder_support.view.ContentView;
import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.components.security_state.ConnectionSecurityLevel;
import org.chromium.content_public.browser.ChildProcessImportance; import org.chromium.content_public.browser.ChildProcessImportance;
import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.RenderWidgetHostView;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsAccessibility; import org.chromium.content_public.browser.WebContentsAccessibility;
import org.chromium.content_public.common.ResourceRequestBody; import org.chromium.content_public.common.ResourceRequestBody;
...@@ -498,7 +499,12 @@ public class Tab { ...@@ -498,7 +499,12 @@ public class Tab {
* @return Whether or not the tab has something valid to render. * @return Whether or not the tab has something valid to render.
*/ */
public boolean isReady() { public boolean isReady() {
return mNativePage != null || (getWebContents() != null && getWebContents().isReady()); if (mNativePage != null) return true;
WebContents webContents = getWebContents();
if (webContents == null) return false;
RenderWidgetHostView rwhv = webContents.getRenderWidgetHostView();
return rwhv != null && rwhv.isReady();
} }
/** /**
......
...@@ -12,6 +12,8 @@ import org.chromium.base.VisibleForTesting; ...@@ -12,6 +12,8 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.ColorUtils;
import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.components.security_state.ConnectionSecurityLevel;
import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.content_public.browser.RenderWidgetHostView;
import org.chromium.content_public.browser.WebContents;
/** /**
* Manages theme color used for {@link Tab}. Destroyed together with the tab. * Manages theme color used for {@link Tab}. Destroyed together with the tab.
...@@ -165,9 +167,15 @@ public class TabThemeColorHelper extends EmptyTabObserver implements UserData { ...@@ -165,9 +167,15 @@ public class TabThemeColorHelper extends EmptyTabObserver implements UserData {
public int getBackgroundColor() { public int getBackgroundColor() {
if (mTab.isNativePage()) return mTab.getNativePage().getBackgroundColor(); if (mTab.isNativePage()) return mTab.getNativePage().getBackgroundColor();
final int backgroundColor = mTab.getWebContents() != null WebContents tabWebContents = mTab.getWebContents();
? mTab.getWebContents().getBackgroundColor() RenderWidgetHostView rwhv =
: Color.TRANSPARENT; tabWebContents == null ? null : tabWebContents.getRenderWidgetHostView();
final int backgroundColor = rwhv != null ? rwhv.getBackgroundColor() : Color.TRANSPARENT;
// TODO(donnd): remove this and support for WebContents#getBackgroundColor when
// addressing https://crbug.com/968150.
assert backgroundColor
== (mTab.getWebContents() != null ? mTab.getWebContents().getBackgroundColor()
: Color.TRANSPARENT);
return backgroundColor == Color.TRANSPARENT ? mDefaultBackgroundColor : backgroundColor; return backgroundColor == Color.TRANSPARENT ? mDefaultBackgroundColor : backgroundColor;
} }
......
...@@ -3,6 +3,7 @@ include_rules = [ ...@@ -3,6 +3,7 @@ include_rules = [
"+components/viz/common", "+components/viz/common",
"+components/viz/host", "+components/viz/host",
"+components/viz/service", "+components/viz/service",
"+jni",
"+third_party/blink/public/platform/web_gesture_curve.h", "+third_party/blink/public/platform/web_gesture_curve.h",
"+third_party/zlib", "+third_party/zlib",
"+ui/events/gestures/blink/web_gesture_curve_impl.h", "+ui/events/gestures/blink/web_gesture_curve_impl.h",
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#include <utility> #include <utility>
#include "base/android/build_info.h" #include "base/android/build_info.h"
#include "base/android/callback_android.h"
#include "base/android/jni_string.h"
#include "base/auto_reset.h" #include "base/auto_reset.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/callback_helpers.h" #include "base/callback_helpers.h"
...@@ -21,6 +23,7 @@ ...@@ -21,6 +23,7 @@
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/system/sys_info.h" #include "base/system/sys_info.h"
#include "base/threading/scoped_blocking_call.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "cc/base/math_util.h" #include "cc/base/math_util.h"
#include "cc/layers/layer.h" #include "cc/layers/layer.h"
...@@ -74,6 +77,7 @@ ...@@ -74,6 +77,7 @@
#include "content/public/common/content_features.h" #include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "content/public/common/use_zoom_for_dsf_policy.h" #include "content/public/common/use_zoom_for_dsf_policy.h"
#include "content/public/android/content_jni_headers/RenderWidgetHostViewImpl_jni.h"
#include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColor.h"
...@@ -92,6 +96,7 @@ ...@@ -92,6 +96,7 @@
#include "ui/events/blink/web_input_event_traits.h" #include "ui/events/blink/web_input_event_traits.h"
#include "ui/events/gesture_detection/gesture_provider_config_helper.h" #include "ui/events/gesture_detection/gesture_provider_config_helper.h"
#include "ui/gfx/android/view_configuration.h" #include "ui/gfx/android/view_configuration.h"
#include "ui/gfx/codec/jpeg_codec.h"
#include "ui/gfx/geometry/dip_util.h" #include "ui/gfx/geometry/dip_util.h"
#include "ui/gfx/geometry/size_conversions.h" #include "ui/gfx/geometry/size_conversions.h"
#include "ui/touch_selection/touch_selection_controller.h" #include "ui/touch_selection/touch_selection_controller.h"
...@@ -154,6 +159,44 @@ void WakeUpGpu(GpuProcessHost* host) { ...@@ -154,6 +159,44 @@ void WakeUpGpu(GpuProcessHost* host) {
} }
} }
std::string CompressAndSaveBitmap(const std::string& dir,
const SkBitmap& bitmap) {
base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
base::BlockingType::WILL_BLOCK);
std::vector<unsigned char> data;
if (!gfx::JPEGCodec::Encode(bitmap, 85, &data)) {
LOG(ERROR) << "Failed to encode bitmap to JPEG";
return std::string();
}
base::FilePath screenshot_dir(dir);
if (!base::DirectoryExists(screenshot_dir)) {
if (!base::CreateDirectory(screenshot_dir)) {
LOG(ERROR) << "Failed to create screenshot directory";
return std::string();
}
}
base::FilePath screenshot_path;
base::ScopedFILE out_file(
base::CreateAndOpenTemporaryFileInDir(screenshot_dir, &screenshot_path));
if (!out_file) {
LOG(ERROR) << "Failed to create temporary screenshot file";
return std::string();
}
unsigned int bytes_written =
fwrite(reinterpret_cast<const char*>(data.data()), 1, data.size(),
out_file.get());
// If there were errors, don't leave a partial file around.
if (bytes_written != data.size()) {
base::DeleteFile(screenshot_path, false);
LOG(ERROR) << "Error writing screenshot file to disk";
return std::string();
}
return screenshot_path.value();
}
} // namespace } // namespace
RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
...@@ -244,6 +287,11 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { ...@@ -244,6 +287,11 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
view_.set_event_handler(nullptr); view_.set_event_handler(nullptr);
DCHECK(!ime_adapter_android_); DCHECK(!ime_adapter_android_);
DCHECK(!delegated_frame_host_); DCHECK(!delegated_frame_host_);
if (obj_) {
Java_RenderWidgetHostViewImpl_clearNativePtr(
base::android::AttachCurrentThread(), obj_);
obj_.Reset();
}
} }
void RenderWidgetHostViewAndroid::AddDestructionObserver( void RenderWidgetHostViewAndroid::AddDestructionObserver(
...@@ -444,6 +492,68 @@ void RenderWidgetHostViewAndroid::OnRenderFrameMetadataChangedBeforeActivation( ...@@ -444,6 +492,68 @@ void RenderWidgetHostViewAndroid::OnRenderFrameMetadataChangedBeforeActivation(
UpdateWebViewBackgroundColorIfNecessary(); UpdateWebViewBackgroundColorIfNecessary();
} }
base::android::ScopedJavaLocalRef<jobject>
RenderWidgetHostViewAndroid::GetJavaObject() {
if (!obj_) {
JNIEnv* env = base::android::AttachCurrentThread();
obj_.Reset(env, Java_RenderWidgetHostViewImpl_create(
env, reinterpret_cast<intptr_t>(this))
.obj());
}
return base::android::ScopedJavaLocalRef<jobject>(obj_);
}
bool RenderWidgetHostViewAndroid::IsReady(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
return HasValidFrame();
}
void RenderWidgetHostViewAndroid::DismissTextHandles(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
DismissTextHandles();
}
jint RenderWidgetHostViewAndroid::GetBackgroundColor(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
base::Optional<SkColor> color =
RenderWidgetHostViewAndroid::GetCachedBackgroundColor();
if (!color)
return SK_ColorTRANSPARENT;
return *color;
}
void RenderWidgetHostViewAndroid::ShowContextMenuAtTouchHandle(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jint x,
jint y) {
if (host()) {
host()->ShowContextMenuAtPoint(gfx::Point(x, y),
ui::MENU_SOURCE_TOUCH_HANDLE);
}
}
void RenderWidgetHostViewAndroid::WriteContentBitmapToDiskAsync(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jint width,
jint height,
const base::android::JavaParamRef<jstring>& jpath,
const base::android::JavaParamRef<jobject>& jcallback) {
base::OnceCallback<void(const SkBitmap&)> result_callback = base::BindOnce(
&RenderWidgetHostViewAndroid::OnFinishGetContentBitmap,
weak_ptr_factory_.GetWeakPtr(),
base::android::ScopedJavaGlobalRef<jobject>(env, obj),
base::android::ScopedJavaGlobalRef<jobject>(env, jcallback),
base::android::ConvertJavaStringToUTF8(env, jpath));
CopyFromSurface(gfx::Rect(), gfx::Size(width, height),
std::move(result_callback));
}
void RenderWidgetHostViewAndroid::Focus() { void RenderWidgetHostViewAndroid::Focus() {
if (view_.HasFocus()) if (view_.HasFocus())
GotFocus(); GotFocus();
...@@ -1404,6 +1514,27 @@ void RenderWidgetHostViewAndroid::OnDidUpdateVisualPropertiesComplete( ...@@ -1404,6 +1514,27 @@ void RenderWidgetHostViewAndroid::OnDidUpdateVisualPropertiesComplete(
EvictFrameIfNecessary(); EvictFrameIfNecessary();
} }
void RenderWidgetHostViewAndroid::OnFinishGetContentBitmap(
const base::android::JavaRef<jobject>& obj,
const base::android::JavaRef<jobject>& callback,
const std::string& path,
const SkBitmap& bitmap) {
JNIEnv* env = base::android::AttachCurrentThread();
if (!bitmap.drawsNothing()) {
auto task_runner = base::CreateSequencedTaskRunnerWithTraits(
{base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
base::PostTaskAndReplyWithResult(
task_runner.get(), FROM_HERE,
base::BindOnce(&CompressAndSaveBitmap, path, bitmap),
base::BindOnce(
&base::android::RunStringCallbackAndroid,
base::android::ScopedJavaGlobalRef<jobject>(env, callback.obj())));
return;
}
// If readback failed, call empty callback
base::android::RunStringCallbackAndroid(callback, std::string());
}
void RenderWidgetHostViewAndroid::ShowInternal() { void RenderWidgetHostViewAndroid::ShowInternal() {
bool show = is_showing_ && is_window_activity_started_ && is_window_visible_; bool show = is_showing_ && is_window_activity_started_ && is_window_visible_;
if (!show) if (!show)
...@@ -1931,13 +2062,6 @@ void RenderWidgetHostViewAndroid::MoveCaret(const gfx::Point& point) { ...@@ -1931,13 +2062,6 @@ void RenderWidgetHostViewAndroid::MoveCaret(const gfx::Point& point) {
host()->delegate()->MoveCaret(point); host()->delegate()->MoveCaret(point);
} }
void RenderWidgetHostViewAndroid::ShowContextMenuAtPoint(
const gfx::Point& point,
ui::MenuSourceType source_type) {
if (host())
host()->ShowContextMenuAtPoint(point, source_type);
}
void RenderWidgetHostViewAndroid::DismissTextHandles() { void RenderWidgetHostViewAndroid::DismissTextHandles() {
if (touch_selection_controller_) if (touch_selection_controller_)
touch_selection_controller_->HideAndDisallowShowingAutomatically(); touch_selection_controller_->HideAndDisallowShowingAutomatically();
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <map> #include <map>
#include <memory> #include <memory>
#include "base/android/jni_android.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/containers/queue.h" #include "base/containers/queue.h"
...@@ -353,6 +354,33 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid ...@@ -353,6 +354,33 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
void SetWebContentsAccessibility( void SetWebContentsAccessibility(
WebContentsAccessibilityAndroid* web_contents_accessibility); WebContentsAccessibilityAndroid* web_contents_accessibility);
base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
// Methods called from Java
bool IsReady(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
void DismissTextHandles(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
// Returns an int equivalent to an Optional<SKColor>, with a value of 0
// indicating SKTransparent for not set.
jint GetBackgroundColor(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void ShowContextMenuAtTouchHandle(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jint x,
jint y);
void WriteContentBitmapToDiskAsync(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jint width,
jint height,
const base::android::JavaParamRef<jstring>& jpath,
const base::android::JavaParamRef<jobject>& jcallback);
ui::DelegatedFrameHostAndroid* delegated_frame_host_for_testing() { ui::DelegatedFrameHostAndroid* delegated_frame_host_for_testing() {
return delegated_frame_host_.get(); return delegated_frame_host_.get();
} }
...@@ -389,6 +417,11 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid ...@@ -389,6 +417,11 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
void OnDidUpdateVisualPropertiesComplete( void OnDidUpdateVisualPropertiesComplete(
const cc::RenderFrameMetadata& metadata); const cc::RenderFrameMetadata& metadata);
void OnFinishGetContentBitmap(const base::android::JavaRef<jobject>& obj,
const base::android::JavaRef<jobject>& callback,
const std::string& path,
const SkBitmap& bitmap);
void ShowInternal(); void ShowInternal();
void HideInternal(); void HideInternal();
void AttachLayers(); void AttachLayers();
...@@ -557,6 +590,8 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid ...@@ -557,6 +590,8 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
WebContentsAccessibilityAndroid* web_contents_accessibility_ = nullptr; WebContentsAccessibilityAndroid* web_contents_accessibility_ = nullptr;
base::android::ScopedJavaGlobalRef<jobject> obj_;
base::WeakPtrFactory<RenderWidgetHostViewAndroid> weak_ptr_factory_; base::WeakPtrFactory<RenderWidgetHostViewAndroid> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAndroid); DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAndroid);
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "base/android/callback_android.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_array.h" #include "base/android/jni_array.h"
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
...@@ -49,7 +48,6 @@ ...@@ -49,7 +48,6 @@
#include "ui/android/overscroll_refresh_handler.h" #include "ui/android/overscroll_refresh_handler.h"
#include "ui/android/window_android.h" #include "ui/android/window_android.h"
#include "ui/gfx/android/java_bitmap.h" #include "ui/gfx/android/java_bitmap.h"
#include "ui/gfx/codec/jpeg_codec.h"
#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
...@@ -142,45 +140,6 @@ void AXTreeSnapshotCallback(const ScopedJavaGlobalRef<jobject>& callback, ...@@ -142,45 +140,6 @@ void AXTreeSnapshotCallback(const ScopedJavaGlobalRef<jobject>& callback,
Java_WebContentsImpl_onAccessibilitySnapshot(env, j_root, callback); Java_WebContentsImpl_onAccessibilitySnapshot(env, j_root, callback);
} }
std::string CompressAndSaveBitmap(const std::string& dir,
const SkBitmap& bitmap) {
base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
base::BlockingType::WILL_BLOCK);
std::vector<unsigned char> data;
if (!gfx::JPEGCodec::Encode(bitmap, 85, &data)) {
LOG(ERROR) << "Failed to encode bitmap to JPEG";
return std::string();
}
base::FilePath screenshot_dir(dir);
if (!base::DirectoryExists(screenshot_dir)) {
if (!base::CreateDirectory(screenshot_dir)) {
LOG(ERROR) << "Failed to create screenshot directory";
return std::string();
}
}
base::FilePath screenshot_path;
base::ScopedFILE out_file(
base::CreateAndOpenTemporaryFileInDir(screenshot_dir, &screenshot_path));
if (!out_file) {
LOG(ERROR) << "Failed to create temporary screenshot file";
return std::string();
}
unsigned int bytes_written =
fwrite(reinterpret_cast<const char*>(data.data()), 1, data.size(),
out_file.get());
// If there were errors, don't leave a partial file around.
if (bytes_written != data.size()) {
base::DeleteFile(screenshot_path, false);
LOG(ERROR) << "Error writing screenshot file to disk";
return std::string();
}
return screenshot_path.value();
}
} // namespace } // namespace
// static // static
...@@ -395,6 +354,15 @@ void WebContentsAndroid::CollapseSelection(JNIEnv* env, ...@@ -395,6 +354,15 @@ void WebContentsAndroid::CollapseSelection(JNIEnv* env,
web_contents_->CollapseSelection(); web_contents_->CollapseSelection();
} }
ScopedJavaLocalRef<jobject> WebContentsAndroid::GetRenderWidgetHostView(
JNIEnv* env,
const JavaParamRef<jobject>& obj) {
RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid();
if (!rwhva)
return nullptr;
return rwhva->GetJavaObject();
}
RenderWidgetHostViewAndroid* RenderWidgetHostViewAndroid*
WebContentsAndroid::GetRenderWidgetHostViewAndroid() { WebContentsAndroid::GetRenderWidgetHostViewAndroid() {
RenderWidgetHostView* rwhv = NULL; RenderWidgetHostView* rwhv = NULL;
...@@ -479,13 +447,6 @@ jboolean WebContentsAndroid::FocusLocationBarByDefault( ...@@ -479,13 +447,6 @@ jboolean WebContentsAndroid::FocusLocationBarByDefault(
return web_contents_->FocusLocationBarByDefault(); return web_contents_->FocusLocationBarByDefault();
} }
jboolean WebContentsAndroid::IsRenderWidgetHostViewReady(
JNIEnv* env,
const JavaParamRef<jobject>& obj) {
RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
return view && view->HasValidFrame();
}
void WebContentsAndroid::ExitFullscreen(JNIEnv* env, void WebContentsAndroid::ExitFullscreen(JNIEnv* env,
const JavaParamRef<jobject>& obj) { const JavaParamRef<jobject>& obj) {
web_contents_->ExitFullscreen(/*will_cause_resize=*/false); web_contents_->ExitFullscreen(/*will_cause_resize=*/false);
...@@ -695,27 +656,6 @@ void WebContentsAndroid::SetSpatialNavigationDisabled( ...@@ -695,27 +656,6 @@ void WebContentsAndroid::SetSpatialNavigationDisabled(
web_contents_->SetSpatialNavigationDisabled(disabled); web_contents_->SetSpatialNavigationDisabled(disabled);
} }
void WebContentsAndroid::WriteContentBitmapToDisk(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
jint width,
jint height,
const JavaParamRef<jstring>& jpath,
const JavaParamRef<jobject>& jcallback) {
base::OnceCallback<void(const SkBitmap&)> result_callback = base::BindOnce(
&WebContentsAndroid::OnFinishGetContentBitmap, weak_factory_.GetWeakPtr(),
ScopedJavaGlobalRef<jobject>(env, obj),
ScopedJavaGlobalRef<jobject>(env, jcallback),
ConvertJavaStringToUTF8(env, jpath));
RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
if (!view) {
std::move(result_callback).Run(SkBitmap());
return;
}
view->CopyFromSurface(gfx::Rect(), gfx::Size(width, height),
std::move(result_callback));
}
void WebContentsAndroid::ReloadLoFiImages(JNIEnv* env, void WebContentsAndroid::ReloadLoFiImages(JNIEnv* env,
const JavaParamRef<jobject>& obj) { const JavaParamRef<jobject>& obj) {
static_cast<WebContentsImpl*>(web_contents_)->ReloadLoFiImages(); static_cast<WebContentsImpl*>(web_contents_)->ReloadLoFiImages();
...@@ -738,25 +678,6 @@ int WebContentsAndroid::DownloadImage( ...@@ -738,25 +678,6 @@ int WebContentsAndroid::DownloadImage(
ScopedJavaGlobalRef<jobject>(env, jcallback))); ScopedJavaGlobalRef<jobject>(env, jcallback)));
} }
void WebContentsAndroid::DismissTextHandles(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
if (view)
view->DismissTextHandles();
}
void WebContentsAndroid::ShowContextMenuAtTouchHandle(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
int x,
int y) {
RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
if (view)
view->ShowContextMenuAtPoint(gfx::Point(x, y),
ui::MENU_SOURCE_TOUCH_HANDLE);
}
void WebContentsAndroid::SetHasPersistentVideo( void WebContentsAndroid::SetHasPersistentVideo(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& obj,
...@@ -814,26 +735,6 @@ ScopedJavaLocalRef<jobject> WebContentsAndroid::GetOrCreateEventForwarder( ...@@ -814,26 +735,6 @@ ScopedJavaLocalRef<jobject> WebContentsAndroid::GetOrCreateEventForwarder(
return native_view->GetEventForwarder(); return native_view->GetEventForwarder();
} }
void WebContentsAndroid::OnFinishGetContentBitmap(
const JavaRef<jobject>& obj,
const JavaRef<jobject>& callback,
const std::string& path,
const SkBitmap& bitmap) {
JNIEnv* env = base::android::AttachCurrentThread();
if (!bitmap.drawsNothing()) {
auto task_runner = base::CreateSequencedTaskRunnerWithTraits(
{base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
base::PostTaskAndReplyWithResult(
task_runner.get(), FROM_HERE,
base::BindOnce(&CompressAndSaveBitmap, path, bitmap),
base::BindOnce(&base::android::RunStringCallbackAndroid,
ScopedJavaGlobalRef<jobject>(env, callback.obj())));
return;
}
// If readback failed, call empty callback
base::android::RunStringCallbackAndroid(callback, std::string());
}
void WebContentsAndroid::OnFinishDownloadImage( void WebContentsAndroid::OnFinishDownloadImage(
const JavaRef<jobject>& obj, const JavaRef<jobject>& obj,
const JavaRef<jobject>& callback, const JavaRef<jobject>& callback,
......
...@@ -109,9 +109,6 @@ class CONTENT_EXPORT WebContentsAndroid { ...@@ -109,9 +109,6 @@ class CONTENT_EXPORT WebContentsAndroid {
jboolean FocusLocationBarByDefault( jboolean FocusLocationBarByDefault(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj); const base::android::JavaParamRef<jobject>& obj);
jboolean IsRenderWidgetHostViewReady(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void ExitFullscreen(JNIEnv* env, void ExitFullscreen(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj); const base::android::JavaParamRef<jobject>& obj);
void ScrollFocusedEditableNodeIntoView( void ScrollFocusedEditableNodeIntoView(
...@@ -189,15 +186,6 @@ class CONTENT_EXPORT WebContentsAndroid { ...@@ -189,15 +186,6 @@ class CONTENT_EXPORT WebContentsAndroid {
const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& obj,
bool disabled); bool disabled);
// Relay the access from Java layer to RWHV::CopyFromSurface() through JNI.
void WriteContentBitmapToDisk(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jint width,
jint height,
const base::android::JavaParamRef<jstring>& jpath,
const base::android::JavaParamRef<jobject>& jcallback);
void ReloadLoFiImages(JNIEnv* env, void ReloadLoFiImages(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj); const base::android::JavaParamRef<jobject>& obj);
...@@ -208,13 +196,6 @@ class CONTENT_EXPORT WebContentsAndroid { ...@@ -208,13 +196,6 @@ class CONTENT_EXPORT WebContentsAndroid {
jint max_bitmap_size, jint max_bitmap_size,
jboolean bypass_cache, jboolean bypass_cache,
const base::android::JavaParamRef<jobject>& jcallback); const base::android::JavaParamRef<jobject>& jcallback);
void DismissTextHandles(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void ShowContextMenuAtTouchHandle(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
int x,
int y);
void SetHasPersistentVideo(JNIEnv* env, void SetHasPersistentVideo(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& obj,
jboolean value); jboolean value);
...@@ -265,6 +246,10 @@ class CONTENT_EXPORT WebContentsAndroid { ...@@ -265,6 +246,10 @@ class CONTENT_EXPORT WebContentsAndroid {
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj); const base::android::JavaParamRef<jobject>& obj);
base::android::ScopedJavaLocalRef<jobject> GetRenderWidgetHostView(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid(); RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid();
class DestructionObserver : public base::CheckedObserver { class DestructionObserver : public base::CheckedObserver {
...@@ -278,11 +263,6 @@ class CONTENT_EXPORT WebContentsAndroid { ...@@ -278,11 +263,6 @@ class CONTENT_EXPORT WebContentsAndroid {
void RemoveDestructionObserver(DestructionObserver* observer); void RemoveDestructionObserver(DestructionObserver* observer);
private: private:
void OnFinishGetContentBitmap(const base::android::JavaRef<jobject>& obj,
const base::android::JavaRef<jobject>& callback,
const std::string& path,
const SkBitmap& bitmap);
void OnFinishDownloadImage(const base::android::JavaRef<jobject>& obj, void OnFinishDownloadImage(const base::android::JavaRef<jobject>& obj,
const base::android::JavaRef<jobject>& callback, const base::android::JavaRef<jobject>& callback,
int id, int id,
......
...@@ -148,6 +148,7 @@ android_library("content_java") { ...@@ -148,6 +148,7 @@ android_library("content_java") {
"java/src/org/chromium/content/browser/TtsPlatformImpl.java", "java/src/org/chromium/content/browser/TtsPlatformImpl.java",
"java/src/org/chromium/content/browser/PopupController.java", "java/src/org/chromium/content/browser/PopupController.java",
"java/src/org/chromium/content/browser/RenderCoordinatesImpl.java", "java/src/org/chromium/content/browser/RenderCoordinatesImpl.java",
"java/src/org/chromium/content/browser/RenderWidgetHostViewImpl.java",
"java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java", "java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java",
"java/src/org/chromium/content/browser/SmsReceiver.java", "java/src/org/chromium/content/browser/SmsReceiver.java",
"java/src/org/chromium/content/browser/SpareChildConnection.java", "java/src/org/chromium/content/browser/SpareChildConnection.java",
...@@ -269,6 +270,7 @@ android_library("content_java") { ...@@ -269,6 +270,7 @@ android_library("content_java") {
"java/src/org/chromium/content_public/browser/NavigationHistory.java", "java/src/org/chromium/content_public/browser/NavigationHistory.java",
"java/src/org/chromium/content_public/browser/RenderCoordinates.java", "java/src/org/chromium/content_public/browser/RenderCoordinates.java",
"java/src/org/chromium/content_public/browser/RenderFrameHost.java", "java/src/org/chromium/content_public/browser/RenderFrameHost.java",
"java/src/org/chromium/content_public/browser/RenderWidgetHostView.java",
"java/src/org/chromium/content_public/browser/ScreenOrientationDelegate.java", "java/src/org/chromium/content_public/browser/ScreenOrientationDelegate.java",
"java/src/org/chromium/content_public/browser/ScreenOrientationProvider.java", "java/src/org/chromium/content_public/browser/ScreenOrientationProvider.java",
"java/src/org/chromium/content_public/browser/SelectionClient.java", "java/src/org/chromium/content_public/browser/SelectionClient.java",
...@@ -405,6 +407,7 @@ generate_jni("content_jni_headers") { ...@@ -405,6 +407,7 @@ generate_jni("content_jni_headers") {
"java/src/org/chromium/content/browser/MediaSessionImpl.java", "java/src/org/chromium/content/browser/MediaSessionImpl.java",
"java/src/org/chromium/content/browser/MemoryMonitorAndroid.java", "java/src/org/chromium/content/browser/MemoryMonitorAndroid.java",
"java/src/org/chromium/content/browser/NfcHost.java", "java/src/org/chromium/content/browser/NfcHost.java",
"java/src/org/chromium/content/browser/RenderWidgetHostViewImpl.java",
"java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java", "java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java",
"java/src/org/chromium/content/browser/SmsReceiver.java", "java/src/org/chromium/content/browser/SmsReceiver.java",
"java/src/org/chromium/content/browser/SpeechRecognitionImpl.java", "java/src/org/chromium/content/browser/SpeechRecognitionImpl.java",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.content.browser;
import org.chromium.base.Callback;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.content_public.browser.RenderWidgetHostView;
/**
* The Android implementation of RenderWidgetHostView. This is a Java wrapper to allow
* communicating with the native RenderWidgetHostViewAndroid object (note the different class
* names). This object allows the browser to access and control the renderer's top level View.
*/
@JNINamespace("content")
public class RenderWidgetHostViewImpl implements RenderWidgetHostView {
private long mNativeRenderWidgetHostView;
// Remember the stack for clearing native the native stack for debugging use after destroy.
private Throwable mNativeDestroyThrowable;
@CalledByNative
private static RenderWidgetHostViewImpl create(long renderWidgetHostViewLong) {
return new RenderWidgetHostViewImpl(renderWidgetHostViewLong);
}
/** Do not call this constructor from Java, use native WebContents->GetRenderWidgetHostView. */
private RenderWidgetHostViewImpl(long renderWidgetHostViewLong) {
mNativeRenderWidgetHostView = renderWidgetHostViewLong;
}
@Override
public boolean isReady() {
checkNotDestroyed();
return nativeIsReady(getNativePtr());
}
@Override
public int getBackgroundColor() {
return nativeGetBackgroundColor(getNativePtr());
}
/**
* Removes handles used in text selection.
*/
public void dismissTextHandles() {
if (isDestroyed()) return;
nativeDismissTextHandles(getNativePtr());
}
/**
* Shows the paste popup menu and the touch handles at the specified location.
* @param x The horizontal location of the touch in dps.
* @param y The vertical location of the touch in dps.
*/
public void showContextMenuAtTouchHandle(int x, int y) {
checkNotDestroyed();
nativeShowContextMenuAtTouchHandle(getNativePtr(), x, y);
}
@Override
public void writeContentBitmapToDiskAsync(
int width, int height, String path, Callback<String> callback) {
if (isDestroyed()) callback.onResult("RWHVA already destroyed!");
nativeWriteContentBitmapToDiskAsync(getNativePtr(), width, height, path, callback);
}
//====================
// Support for native.
//====================
public boolean isDestroyed() {
return getNativePtr() == 0;
}
private long getNativePtr() {
return mNativeRenderWidgetHostView;
}
@CalledByNative
private void clearNativePtr() {
mNativeRenderWidgetHostView = 0;
mNativeDestroyThrowable = new RuntimeException("clearNativePtr");
}
private void checkNotDestroyed() {
if (getNativePtr() != 0) return;
throw new IllegalStateException(
"Native RenderWidgetHostViewAndroid already destroyed", mNativeDestroyThrowable);
}
private native boolean nativeIsReady(long nativeRenderWidgetHostViewAndroid);
private native int nativeGetBackgroundColor(long nativeRenderWidgetHostViewAndroid);
private native void nativeDismissTextHandles(long nativeRenderWidgetHostViewAndroid);
private native void nativeShowContextMenuAtTouchHandle(
long nativeRenderWidgetHostViewAndroid, int x, int y);
private native void nativeWriteContentBitmapToDiskAsync(long nativeRenderWidgetHostViewAndroid,
int width, int height, String path, Callback<String> callback);
}
...@@ -807,7 +807,9 @@ public class ImeAdapterImpl implements ImeAdapter, WindowEventObserver, UserData ...@@ -807,7 +807,9 @@ public class ImeAdapterImpl implements ImeAdapter, WindowEventObserver, UserData
private void onImeEvent() { private void onImeEvent() {
for (ImeEventObserver observer : mEventObservers) observer.onImeEvent(); for (ImeEventObserver observer : mEventObservers) observer.onImeEvent();
if (mNodeEditable) mWebContents.dismissTextHandles(); if (mNodeEditable && mWebContents.getRenderWidgetHostView() != null) {
mWebContents.getRenderWidgetHostView().dismissTextHandles();
}
} }
boolean sendCompositionToNative( boolean sendCompositionToNative(
......
...@@ -442,6 +442,18 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper ...@@ -442,6 +442,18 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
return actionMode; return actionMode;
} }
private void dismissTextHandles() {
if (mWebContents.getRenderWidgetHostView() != null) {
mWebContents.getRenderWidgetHostView().dismissTextHandles();
}
}
private void showContextMenuAtTouchHandle(int left, int bottom) {
if (mWebContents.getRenderWidgetHostView() != null) {
mWebContents.getRenderWidgetHostView().showContextMenuAtTouchHandle(left, bottom);
}
}
private void createAndShowPastePopup() { private void createAndShowPastePopup() {
if (mView.getParent() == null || mView.getVisibility() != View.VISIBLE) { if (mView.getParent() == null || mView.getVisibility() != View.VISIBLE) {
return; return;
...@@ -454,13 +466,13 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper ...@@ -454,13 +466,13 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
@Override @Override
public void paste() { public void paste() {
SelectionPopupControllerImpl.this.paste(); SelectionPopupControllerImpl.this.paste();
mWebContents.dismissTextHandles(); dismissTextHandles();
} }
@Override @Override
public void pasteAsPlainText() { public void pasteAsPlainText() {
SelectionPopupControllerImpl.this.pasteAsPlainText(); SelectionPopupControllerImpl.this.pasteAsPlainText();
mWebContents.dismissTextHandles(); dismissTextHandles();
} }
@Override @Override
...@@ -606,7 +618,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper ...@@ -606,7 +618,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
} else { } else {
// Hide popups and clear selection. // Hide popups and clear selection.
destroyActionModeAndUnselect(); destroyActionModeAndUnselect();
mWebContents.dismissTextHandles(); dismissTextHandles();
PopupController.hideAll(mWebContents); PopupController.hideAll(mWebContents);
// Clear the selection. The selection is cleared on destroying IME // Clear the selection. The selection is cleared on destroying IME
// and also here since we may receive destroy first, for example // and also here since we may receive destroy first, for example
...@@ -1256,7 +1268,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper ...@@ -1256,7 +1268,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
break; break;
case SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED: case SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED:
mWebContents.showContextMenuAtTouchHandle(left, bottom); showContextMenuAtTouchHandle(left, bottom);
if (mHandleObserver != null) { if (mHandleObserver != null) {
mHandleObserver.handleDragStopped(); mHandleObserver.handleDragStopped();
} }
...@@ -1284,8 +1296,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper ...@@ -1284,8 +1296,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
if (mWasPastePopupShowingOnInsertionDragStart) { if (mWasPastePopupShowingOnInsertionDragStart) {
destroyPastePopup(); destroyPastePopup();
} else { } else {
mWebContents.showContextMenuAtTouchHandle( showContextMenuAtTouchHandle(mSelectionRect.left, mSelectionRect.bottom);
mSelectionRect.left, mSelectionRect.bottom);
} }
mWasPastePopupShowingOnInsertionDragStart = false; mWasPastePopupShowingOnInsertionDragStart = false;
break; break;
...@@ -1304,8 +1315,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper ...@@ -1304,8 +1315,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
case SelectionEventType.INSERTION_HANDLE_DRAG_STOPPED: case SelectionEventType.INSERTION_HANDLE_DRAG_STOPPED:
if (mWasPastePopupShowingOnInsertionDragStart) { if (mWasPastePopupShowingOnInsertionDragStart) {
mWebContents.showContextMenuAtTouchHandle( showContextMenuAtTouchHandle(mSelectionRect.left, mSelectionRect.bottom);
mSelectionRect.left, mSelectionRect.bottom);
} }
mWasPastePopupShowingOnInsertionDragStart = false; mWasPastePopupShowingOnInsertionDragStart = false;
if (mHandleObserver != null) { if (mHandleObserver != null) {
......
...@@ -17,7 +17,6 @@ import android.os.Parcelable; ...@@ -17,7 +17,6 @@ import android.os.Parcelable;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.view.Surface; import android.view.Surface;
import org.chromium.base.Callback;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.base.UserData; import org.chromium.base.UserData;
...@@ -28,6 +27,7 @@ import org.chromium.base.annotations.JNINamespace; ...@@ -28,6 +27,7 @@ import org.chromium.base.annotations.JNINamespace;
import org.chromium.content.browser.AppWebMessagePort; import org.chromium.content.browser.AppWebMessagePort;
import org.chromium.content.browser.MediaSessionImpl; import org.chromium.content.browser.MediaSessionImpl;
import org.chromium.content.browser.RenderCoordinatesImpl; import org.chromium.content.browser.RenderCoordinatesImpl;
import org.chromium.content.browser.RenderWidgetHostViewImpl;
import org.chromium.content.browser.ViewEventSinkImpl; import org.chromium.content.browser.ViewEventSinkImpl;
import org.chromium.content.browser.WindowEventObserver; import org.chromium.content.browser.WindowEventObserver;
import org.chromium.content.browser.WindowEventObserverManager; import org.chromium.content.browser.WindowEventObserverManager;
...@@ -364,6 +364,15 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -364,6 +364,15 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
return nativeGetFocusedFrame(mNativeWebContentsAndroid); return nativeGetFocusedFrame(mNativeWebContentsAndroid);
} }
@Override
public @Nullable RenderWidgetHostViewImpl getRenderWidgetHostView() {
if (mNativeWebContentsAndroid == 0) return null;
RenderWidgetHostViewImpl rwhvi = nativeGetRenderWidgetHostView(mNativeWebContentsAndroid);
if (rwhvi == null || rwhvi.isDestroyed()) return null;
return rwhvi;
}
@Override @Override
public String getTitle() { public String getTitle() {
checkNotDestroyed(); checkNotDestroyed();
...@@ -517,11 +526,6 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -517,11 +526,6 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
return nativeFocusLocationBarByDefault(mNativeWebContentsAndroid); return nativeFocusLocationBarByDefault(mNativeWebContentsAndroid);
} }
@Override
public boolean isReady() {
checkNotDestroyed();
return nativeIsRenderWidgetHostViewReady(mNativeWebContentsAndroid);
}
@Override @Override
public void exitFullscreen() { public void exitFullscreen() {
...@@ -750,13 +754,6 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -750,13 +754,6 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
nativeSetSpatialNavigationDisabled(mNativeWebContentsAndroid, disabled); nativeSetSpatialNavigationDisabled(mNativeWebContentsAndroid, disabled);
} }
@Override
public void writeContentBitmapToDiskAsync(
int width, int height, String path, Callback<String> callback) {
checkNotDestroyed();
nativeWriteContentBitmapToDisk(mNativeWebContentsAndroid, width, height, path, callback);
}
@Override @Override
public void reloadLoFiImages() { public void reloadLoFiImages() {
checkNotDestroyed(); checkNotDestroyed();
...@@ -777,22 +774,6 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -777,22 +774,6 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
callback.onFinishDownloadImage(id, httpStatusCode, imageUrl, bitmaps, sizes); callback.onFinishDownloadImage(id, httpStatusCode, imageUrl, bitmaps, sizes);
} }
/**
* Removes handles used in text selection.
*/
public void dismissTextHandles() {
if (isDestroyed()) return;
nativeDismissTextHandles(mNativeWebContentsAndroid);
}
/**
* Shows paste popup menu at the touch handle at specified location.
*/
public void showContextMenuAtTouchHandle(int x, int y) {
checkNotDestroyed();
nativeShowContextMenuAtTouchHandle(mNativeWebContentsAndroid, x, y);
}
@Override @Override
public void setHasPersistentVideo(boolean value) { public void setHasPersistentVideo(boolean value) {
checkNotDestroyed(); checkNotDestroyed();
...@@ -988,6 +969,8 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -988,6 +969,8 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
long nativeWebContentsAndroid, WindowAndroid windowAndroid); long nativeWebContentsAndroid, WindowAndroid windowAndroid);
private native RenderFrameHost nativeGetMainFrame(long nativeWebContentsAndroid); private native RenderFrameHost nativeGetMainFrame(long nativeWebContentsAndroid);
private native RenderFrameHost nativeGetFocusedFrame(long nativeWebContentsAndroid); private native RenderFrameHost nativeGetFocusedFrame(long nativeWebContentsAndroid);
private native RenderWidgetHostViewImpl nativeGetRenderWidgetHostView(
long nativeWebContentsAndroid);
private native String nativeGetTitle(long nativeWebContentsAndroid); private native String nativeGetTitle(long nativeWebContentsAndroid);
private native String nativeGetVisibleURL(long nativeWebContentsAndroid); private native String nativeGetVisibleURL(long nativeWebContentsAndroid);
private native String nativeGetEncoding(long nativeWebContentsAndroid); private native String nativeGetEncoding(long nativeWebContentsAndroid);
...@@ -1009,7 +992,6 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -1009,7 +992,6 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
private native int nativeGetBackgroundColor(long nativeWebContentsAndroid); private native int nativeGetBackgroundColor(long nativeWebContentsAndroid);
private native boolean nativeIsShowingInterstitialPage(long nativeWebContentsAndroid); private native boolean nativeIsShowingInterstitialPage(long nativeWebContentsAndroid);
private native boolean nativeFocusLocationBarByDefault(long nativeWebContentsAndroid); private native boolean nativeFocusLocationBarByDefault(long nativeWebContentsAndroid);
private native boolean nativeIsRenderWidgetHostViewReady(long nativeWebContentsAndroid);
private native void nativeExitFullscreen(long nativeWebContentsAndroid); private native void nativeExitFullscreen(long nativeWebContentsAndroid);
private native void nativeScrollFocusedEditableNodeIntoView(long nativeWebContentsAndroid); private native void nativeScrollFocusedEditableNodeIntoView(long nativeWebContentsAndroid);
private native void nativeSelectWordAroundCaret(long nativeWebContentsAndroid); private native void nativeSelectWordAroundCaret(long nativeWebContentsAndroid);
...@@ -1038,15 +1020,10 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -1038,15 +1020,10 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
long nativeWebContentsAndroid, OverscrollRefreshHandler nativeOverscrollRefreshHandler); long nativeWebContentsAndroid, OverscrollRefreshHandler nativeOverscrollRefreshHandler);
private native void nativeSetSpatialNavigationDisabled( private native void nativeSetSpatialNavigationDisabled(
long nativeWebContentsAndroid, boolean disabled); long nativeWebContentsAndroid, boolean disabled);
private native void nativeWriteContentBitmapToDisk(long nativeWebContentsAndroid, int width,
int height, String path, Callback<String> callback);
private native void nativeReloadLoFiImages(long nativeWebContentsAndroid); private native void nativeReloadLoFiImages(long nativeWebContentsAndroid);
private native int nativeDownloadImage(long nativeWebContentsAndroid, private native int nativeDownloadImage(long nativeWebContentsAndroid,
String url, boolean isFavicon, int maxBitmapSize, String url, boolean isFavicon, int maxBitmapSize,
boolean bypassCache, ImageDownloadCallback callback); boolean bypassCache, ImageDownloadCallback callback);
private native void nativeDismissTextHandles(long nativeWebContentsAndroid);
private native void nativeShowContextMenuAtTouchHandle(
long nativeWebContentsAndroid, int x, int y);
private native void nativeSetHasPersistentVideo(long nativeWebContentsAndroid, boolean value); private native void nativeSetHasPersistentVideo(long nativeWebContentsAndroid, boolean value);
private native boolean nativeHasActiveEffectivelyFullscreenVideo(long nativeWebContentsAndroid); private native boolean nativeHasActiveEffectivelyFullscreenVideo(long nativeWebContentsAndroid);
private native boolean nativeIsPictureInPictureAllowedForFullscreenVideo( private native boolean nativeIsPictureInPictureAllowedForFullscreenVideo(
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.content_public.browser;
import org.chromium.base.Callback;
/**
* The Android interface to allow communicating with the RenderWidgetHostViewImpl and the native
* RenderWidgetHostViewAndroid object. This object allows the browser to access and control the
* renderer's top level View.
*/
public interface RenderWidgetHostView {
/**
* If the view is ready to draw contents to the screen. In hardware mode,
* the initialization of the surface texture may not occur until after the
* view has been added to the layout. This method will return {@code true}
* once the texture is actually ready.
*/
boolean isReady();
/**
* Get the Background color from underlying RenderWidgetHost for this WebContent.
*/
int getBackgroundColor();
/**
* Requests an image snapshot of the content and stores it in the specified folder.
*
* @param width The width of the resulting bitmap, or 0 for "auto."
* @param height The height of the resulting bitmap, or 0 for "auto."
* @param path The folder in which to store the screenshot.
* @param callback May be called synchronously, or at a later point, to deliver the bitmap
* result (or a failure code).
*/
void writeContentBitmapToDiskAsync(
int width, int height, String path, Callback<String> callback);
}
...@@ -10,7 +10,6 @@ import android.os.Parcelable; ...@@ -10,7 +10,6 @@ import android.os.Parcelable;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import org.chromium.base.Callback;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.ui.OverscrollRefreshHandler; import org.chromium.ui.OverscrollRefreshHandler;
import org.chromium.ui.base.EventForwarder; import org.chromium.ui.base.EventForwarder;
...@@ -94,6 +93,7 @@ public interface WebContents extends Parcelable { ...@@ -94,6 +93,7 @@ public interface WebContents extends Parcelable {
/** /**
* @return The top level WindowAndroid associated with this WebContents. This can be null. * @return The top level WindowAndroid associated with this WebContents. This can be null.
*/ */
@Nullable
WindowAndroid getTopLevelNativeWindow(); WindowAndroid getTopLevelNativeWindow();
/* /*
...@@ -108,6 +108,7 @@ public interface WebContents extends Parcelable { ...@@ -108,6 +108,7 @@ public interface WebContents extends Parcelable {
* @return The {@link ViewAndroidDelegate} from which to get the container view. * @return The {@link ViewAndroidDelegate} from which to get the container view.
* This can be null. * This can be null.
*/ */
@Nullable
ViewAndroidDelegate getViewAndroidDelegate(); ViewAndroidDelegate getViewAndroidDelegate();
/** /**
...@@ -140,8 +141,16 @@ public interface WebContents extends Parcelable { ...@@ -140,8 +141,16 @@ public interface WebContents extends Parcelable {
* @return The focused frame associated with this WebContents. Will be null if the WebContents * @return The focused frame associated with this WebContents. Will be null if the WebContents
* does not have focus. * does not have focus.
*/ */
@Nullable
RenderFrameHost getFocusedFrame(); RenderFrameHost getFocusedFrame();
/**
* @return The root level view from the renderer, or {@code null} in some cases where there is
* none.
*/
@Nullable
RenderWidgetHostView getRenderWidgetHostView();
/** /**
* @return The title for the current visible page. * @return The title for the current visible page.
*/ */
...@@ -206,7 +215,9 @@ public interface WebContents extends Parcelable { ...@@ -206,7 +215,9 @@ public interface WebContents extends Parcelable {
/** /**
* Get the Background color from underlying RenderWidgetHost for this WebContent. * Get the Background color from underlying RenderWidgetHost for this WebContent.
* @deprecated TODO(donnd): remove this when addressing https://crbug.com/968150.
*/ */
@Deprecated()
int getBackgroundColor(); int getBackgroundColor();
/** /**
...@@ -219,13 +230,6 @@ public interface WebContents extends Parcelable { ...@@ -219,13 +230,6 @@ public interface WebContents extends Parcelable {
*/ */
boolean focusLocationBarByDefault(); boolean focusLocationBarByDefault();
/**
* If the view is ready to draw contents to the screen. In hardware mode,
* the initialization of the surface texture may not occur until after the
* view has been added to the layout. This method will return {@code true}
* once the texture is actually ready.
*/
boolean isReady();
/** /**
* Inform WebKit that Fullscreen mode has been exited by the user. * Inform WebKit that Fullscreen mode has been exited by the user.
...@@ -287,7 +291,7 @@ public interface WebContents extends Parcelable { ...@@ -287,7 +291,7 @@ public interface WebContents extends Parcelable {
* will be made on the main thread. * will be made on the main thread.
* If no result is required, pass null. * If no result is required, pass null.
*/ */
void evaluateJavaScript(String script, JavaScriptCallback callback); void evaluateJavaScript(String script, @Nullable JavaScriptCallback callback);
/** /**
* Injects the passed Javascript code in the current page and evaluates it. * Injects the passed Javascript code in the current page and evaluates it.
...@@ -300,7 +304,7 @@ public interface WebContents extends Parcelable { ...@@ -300,7 +304,7 @@ public interface WebContents extends Parcelable {
* If no result is required, pass null. * If no result is required, pass null.
*/ */
@VisibleForTesting @VisibleForTesting
void evaluateJavaScriptForTests(String script, JavaScriptCallback callback); void evaluateJavaScriptForTests(String script, @Nullable JavaScriptCallback callback);
/** /**
* Adds a log message to dev tools console. |level| must be a value of * Adds a log message to dev tools console. |level| must be a value of
...@@ -319,8 +323,8 @@ public interface WebContents extends Parcelable { ...@@ -319,8 +323,8 @@ public interface WebContents extends Parcelable {
* @param sentPorts The sent message ports, if any. Pass null if there is no * @param sentPorts The sent message ports, if any. Pass null if there is no
* message ports to pass. * message ports to pass.
*/ */
void postMessageToFrame(String frameName, String message, void postMessageToFrame(@Nullable String frameName, String message, String sourceOrigin,
String sourceOrigin, String targetOrigin, MessagePort[] ports); String targetOrigin, @Nullable MessagePort[] ports);
/** /**
* Creates a message channel for sending postMessage requests and returns the ports for * Creates a message channel for sending postMessage requests and returns the ports for
...@@ -405,18 +409,6 @@ public interface WebContents extends Parcelable { ...@@ -405,18 +409,6 @@ public interface WebContents extends Parcelable {
*/ */
void setSpatialNavigationDisabled(boolean disabled); void setSpatialNavigationDisabled(boolean disabled);
/**
* Requests an image snapshot of the content and stores it in the specified folder.
*
* @param width The width of the resulting bitmap, or 0 for "auto."
* @param height The height of the resulting bitmap, or 0 for "auto."
* @param path The folder in which to store the screenshot.
* @param callback May be called synchronously, or at a later point, to deliver the bitmap
* result (or a failure code).
*/
void writeContentBitmapToDiskAsync(
int width, int height, String path, Callback<String> callback);
/** /**
* Reloads all the Lo-Fi images in this WebContents. * Reloads all the Lo-Fi images in this WebContents.
*/ */
......
...@@ -43,6 +43,7 @@ import org.chromium.content.browser.ContentClassFactory; ...@@ -43,6 +43,7 @@ import org.chromium.content.browser.ContentClassFactory;
import org.chromium.content.browser.GestureListenerManagerImpl; import org.chromium.content.browser.GestureListenerManagerImpl;
import org.chromium.content.browser.PopupController; import org.chromium.content.browser.PopupController;
import org.chromium.content.browser.RenderCoordinatesImpl; import org.chromium.content.browser.RenderCoordinatesImpl;
import org.chromium.content.browser.RenderWidgetHostViewImpl;
import org.chromium.content.browser.webcontents.WebContentsImpl; import org.chromium.content.browser.webcontents.WebContentsImpl;
import org.chromium.content_public.browser.SelectionClient; import org.chromium.content_public.browser.SelectionClient;
import org.chromium.content_public.browser.SelectionMetricsLogger; import org.chromium.content_public.browser.SelectionMetricsLogger;
...@@ -70,6 +71,7 @@ public class SelectionPopupControllerTest { ...@@ -70,6 +71,7 @@ public class SelectionPopupControllerTest {
private ActionMode mActionMode; private ActionMode mActionMode;
private PackageManager mPackageManager; private PackageManager mPackageManager;
private SmartSelectionMetricsLogger mLogger; private SmartSelectionMetricsLogger mLogger;
private RenderWidgetHostViewImpl mRenderWidgetHostViewImpl;
private RenderCoordinatesImpl mRenderCoordinates; private RenderCoordinatesImpl mRenderCoordinates;
private ContentResolver mContentResolver; private ContentResolver mContentResolver;
private PopupController mPopupController; private PopupController mPopupController;
...@@ -142,6 +144,7 @@ public class SelectionPopupControllerTest { ...@@ -142,6 +144,7 @@ public class SelectionPopupControllerTest {
mViewAndroidDelegate = ViewAndroidDelegate.createBasicDelegate(mView); mViewAndroidDelegate = ViewAndroidDelegate.createBasicDelegate(mView);
mActionMode = Mockito.mock(ActionMode.class); mActionMode = Mockito.mock(ActionMode.class);
mPackageManager = Mockito.mock(PackageManager.class); mPackageManager = Mockito.mock(PackageManager.class);
mRenderWidgetHostViewImpl = Mockito.mock(RenderWidgetHostViewImpl.class);
mRenderCoordinates = Mockito.mock(RenderCoordinatesImpl.class); mRenderCoordinates = Mockito.mock(RenderCoordinatesImpl.class);
mLogger = Mockito.mock(SmartSelectionMetricsLogger.class); mLogger = Mockito.mock(SmartSelectionMetricsLogger.class);
mPopupController = Mockito.mock(PopupController.class); mPopupController = Mockito.mock(PopupController.class);
...@@ -160,6 +163,7 @@ public class SelectionPopupControllerTest { ...@@ -160,6 +163,7 @@ public class SelectionPopupControllerTest {
when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getContentResolver()).thenReturn(mContentResolver); when(mContext.getContentResolver()).thenReturn(mContentResolver);
when(mWebContents.getRenderWidgetHostView()).thenReturn(mRenderWidgetHostViewImpl);
when(mWebContents.getRenderCoordinates()).thenReturn(mRenderCoordinates); when(mWebContents.getRenderCoordinates()).thenReturn(mRenderCoordinates);
when(mRenderCoordinates.getDeviceScaleFactor()).thenReturn(1.f); when(mRenderCoordinates.getDeviceScaleFactor()).thenReturn(1.f);
when(mWebContents.getViewAndroidDelegate()).thenReturn(mViewAndroidDelegate); when(mWebContents.getViewAndroidDelegate()).thenReturn(mViewAndroidDelegate);
......
...@@ -8,14 +8,15 @@ import android.annotation.SuppressLint; ...@@ -8,14 +8,15 @@ import android.annotation.SuppressLint;
import android.graphics.Rect; import android.graphics.Rect;
import android.os.Handler; import android.os.Handler;
import android.os.Parcel; import android.os.Parcel;
import android.support.annotation.Nullable;
import org.chromium.base.Callback;
import org.chromium.content_public.browser.AccessibilitySnapshotCallback; import org.chromium.content_public.browser.AccessibilitySnapshotCallback;
import org.chromium.content_public.browser.ImageDownloadCallback; import org.chromium.content_public.browser.ImageDownloadCallback;
import org.chromium.content_public.browser.JavaScriptCallback; import org.chromium.content_public.browser.JavaScriptCallback;
import org.chromium.content_public.browser.MessagePort; import org.chromium.content_public.browser.MessagePort;
import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.NavigationController;
import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.RenderFrameHost;
import org.chromium.content_public.browser.RenderWidgetHostView;
import org.chromium.content_public.browser.ViewEventSink; import org.chromium.content_public.browser.ViewEventSink;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsObserver; import org.chromium.content_public.browser.WebContentsObserver;
...@@ -83,6 +84,12 @@ public class MockWebContents implements WebContents { ...@@ -83,6 +84,12 @@ public class MockWebContents implements WebContents {
return null; return null;
} }
@Override
@Nullable
public RenderWidgetHostView getRenderWidgetHostView() {
return null;
}
@Override @Override
public String getTitle() { public String getTitle() {
return null; return null;
...@@ -141,11 +148,6 @@ public class MockWebContents implements WebContents { ...@@ -141,11 +148,6 @@ public class MockWebContents implements WebContents {
return false; return false;
} }
@Override
public boolean isReady() {
return false;
}
@Override @Override
public void exitFullscreen() {} public void exitFullscreen() {}
...@@ -231,10 +233,6 @@ public class MockWebContents implements WebContents { ...@@ -231,10 +233,6 @@ public class MockWebContents implements WebContents {
@Override @Override
public void setSpatialNavigationDisabled(boolean disabled) {} public void setSpatialNavigationDisabled(boolean disabled) {}
@Override
public void writeContentBitmapToDiskAsync(
int width, int height, String path, Callback<String> callback) {}
@Override @Override
public void reloadLoFiImages() {} public void reloadLoFiImages() {}
......
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