aw_render_process.cc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "android_webview/browser/aw_render_process.h"
  5. #include "android_webview/browser_jni_headers/AwRenderProcess_jni.h"
  6. #include "base/android/jni_android.h"
  7. #include "base/android/scoped_java_ref.h"
  8. #include "content/public/browser/browser_thread.h"
  9. #include "content/public/browser/render_process_host.h"
  10. #include "ipc/ipc_channel_proxy.h"
  11. using base::android::AttachCurrentThread;
  12. using content::BrowserThread;
  13. using content::ChildProcessTerminationInfo;
  14. using content::RenderProcessHost;
  15. namespace android_webview {
  16. const void* const kAwRenderProcessKey = &kAwRenderProcessKey;
  17. // static
  18. AwRenderProcess* AwRenderProcess::GetInstanceForRenderProcessHost(
  19. RenderProcessHost* host) {
  20. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  21. AwRenderProcess* render_process =
  22. static_cast<AwRenderProcess*>(host->GetUserData(kAwRenderProcessKey));
  23. if (!render_process) {
  24. std::unique_ptr<AwRenderProcess> created_render_process =
  25. std::make_unique<AwRenderProcess>(host);
  26. render_process = created_render_process.get();
  27. host->SetUserData(kAwRenderProcessKey, std::move(created_render_process));
  28. }
  29. return render_process;
  30. }
  31. AwRenderProcess::AwRenderProcess(RenderProcessHost* render_process_host)
  32. : render_process_host_(render_process_host) {
  33. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  34. java_obj_.Reset(Java_AwRenderProcess_create(AttachCurrentThread()));
  35. CHECK(java_obj_);
  36. if (render_process_host_->IsReady()) {
  37. Ready();
  38. }
  39. render_process_host_->GetChannel()->GetRemoteAssociatedInterface(
  40. &renderer_remote_);
  41. render_process_host->AddObserver(this);
  42. }
  43. AwRenderProcess::~AwRenderProcess() {
  44. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  45. Java_AwRenderProcess_setNative(AttachCurrentThread(), java_obj_, 0);
  46. java_obj_.Reset();
  47. }
  48. void AwRenderProcess::ClearCache() {
  49. renderer_remote_->ClearCache();
  50. }
  51. void AwRenderProcess::SetJsOnlineProperty(bool network_up) {
  52. renderer_remote_->SetJsOnlineProperty(network_up);
  53. }
  54. void AwRenderProcess::Ready() {
  55. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  56. Java_AwRenderProcess_setNative(AttachCurrentThread(), java_obj_,
  57. reinterpret_cast<jlong>(this));
  58. }
  59. void AwRenderProcess::Cleanup() {
  60. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  61. render_process_host_->RemoveObserver(this);
  62. render_process_host_->RemoveUserData(kAwRenderProcessKey);
  63. // |this| is now deleted.
  64. }
  65. bool AwRenderProcess::TerminateChildProcess(
  66. JNIEnv* env,
  67. const base::android::JavaParamRef<jobject>& obj) {
  68. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  69. return render_process_host_->Shutdown(0);
  70. }
  71. bool AwRenderProcess::IsProcessLockedToSiteForTesting(
  72. JNIEnv* env,
  73. const base::android::JavaParamRef<jobject>& obj) {
  74. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  75. return render_process_host_->IsProcessLockedToSiteForTesting(); // IN-TEST
  76. }
  77. base::android::ScopedJavaLocalRef<jobject> AwRenderProcess::GetJavaObject() {
  78. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  79. return base::android::ScopedJavaLocalRef<jobject>(java_obj_);
  80. }
  81. void AwRenderProcess::RenderProcessReady(RenderProcessHost* host) {
  82. DCHECK(host == render_process_host_);
  83. Ready();
  84. }
  85. void AwRenderProcess::RenderProcessExited(
  86. RenderProcessHost* host,
  87. const ChildProcessTerminationInfo& info) {
  88. DCHECK(host == render_process_host_);
  89. Cleanup();
  90. }
  91. } // namespace android_webview