| // Copyright 2013 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_ANDROID_H_ | 
 | #define CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_ANDROID_H_ | 
 |  | 
 | #include <jni.h> | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/android/jni_android.h" | 
 | #include "base/memory/raw_ptr.h" | 
 | #include "base/memory/weak_ptr.h" | 
 | #include "content/browser/android/render_widget_host_connector.h" | 
 | #include "content/browser/navigation_transitions/back_forward_transition_animator.h" | 
 | #include "content/browser/renderer_host/navigation_controller_android.h" | 
 | #include "content/browser/renderer_host/render_widget_host_view_android.h" | 
 | #include "content/common/content_export.h" | 
 | #include "content/public/browser/back_forward_transition_animation_manager.h" | 
 | #include "third_party/blink/public/mojom/input/input_handler.mojom-forward.h" | 
 | #include "ui/android/browser_controls_offset_tag_definitions.h" | 
 |  | 
 | class GURL; | 
 |  | 
 | namespace ui { | 
 | struct AXTreeUpdate; | 
 | } | 
 |  | 
 | namespace content { | 
 |  | 
 | class WebContents; | 
 | class WebContentsImpl; | 
 |  | 
 | // Android wrapper around WebContents that provides safer passage from java and | 
 | // back to native and provides java with a means of communicating with its | 
 | // native counterpart. | 
 | class CONTENT_EXPORT WebContentsAndroid { | 
 |  public: | 
 |   explicit WebContentsAndroid(WebContentsImpl* web_contents); | 
 |  | 
 |   WebContentsAndroid(const WebContentsAndroid&) = delete; | 
 |   WebContentsAndroid& operator=(const WebContentsAndroid&) = delete; | 
 |  | 
 |   ~WebContentsAndroid(); | 
 |  | 
 |   void Init(); | 
 |  | 
 |   WebContentsImpl* web_contents() const { return web_contents_; } | 
 |  | 
 |   base::android::ScopedJavaLocalRef<jobject> GetJavaObject(); | 
 |  | 
 |   // Ensure that the RenderFrameHost etc are ready to handle JS eval | 
 |   // (e.g. recover from a crashed state). | 
 |   bool InitializeRenderFrameForJavaScript(); | 
 |  | 
 |   // Methods called from Java | 
 |   void ClearNativeReference(JNIEnv* env); | 
 |   base::android::ScopedJavaLocalRef<jobject> GetTopLevelNativeWindow( | 
 |       JNIEnv* env); | 
 |   void SetTopLevelNativeWindow( | 
 |       JNIEnv* env, | 
 |       const base::android::JavaParamRef<jobject>& jwindow_android); | 
 |   void SetViewAndroidDelegate( | 
 |       JNIEnv* env, | 
 |       const base::android::JavaParamRef<jobject>& jview_delegate); | 
 |   base::android::ScopedJavaLocalRef<jobject> GetMainFrame(JNIEnv* env) const; | 
 |   base::android::ScopedJavaLocalRef<jobject> GetFocusedFrame(JNIEnv* env) const; | 
 |   bool IsFocusedElementEditable(JNIEnv* env); | 
 |   base::android::ScopedJavaLocalRef<jobject> GetRenderFrameHostFromId( | 
 |       JNIEnv* env, | 
 |       jint render_process_id, | 
 |       jint render_frame_id) const; | 
 |   base::android::ScopedJavaLocalRef<jobjectArray> GetAllRenderFrameHosts( | 
 |       JNIEnv* env) const; | 
 |   base::android::ScopedJavaLocalRef<jstring> GetTitle(JNIEnv* env) const; | 
 |   base::android::ScopedJavaLocalRef<jobject> GetVisibleURL(JNIEnv* env) const; | 
 |   jint GetVirtualKeyboardMode(JNIEnv* env) const; | 
 |  | 
 |   bool IsLoading(JNIEnv* env) const; | 
 |   bool ShouldShowLoadingUI(JNIEnv* env) const; | 
 |   bool HasUncommittedNavigationInPrimaryMainFrame(JNIEnv* env) const; | 
 |  | 
 |   void DispatchBeforeUnload(JNIEnv* env, bool auto_cancel); | 
 |  | 
 |   void Stop(JNIEnv* env); | 
 |   void Cut(JNIEnv* env); | 
 |   void Copy(JNIEnv* env); | 
 |   void Paste(JNIEnv* env); | 
 |   void PasteAsPlainText(JNIEnv* env); | 
 |   void Replace(JNIEnv* env, const base::android::JavaParamRef<jstring>& jstr); | 
 |   void SelectAll(JNIEnv* env); | 
 |   void CollapseSelection(JNIEnv* env); | 
 |   jint GetBackgroundColor(JNIEnv* env); | 
 |   base::android::ScopedJavaLocalRef<jobject> GetLastCommittedURL( | 
 |       JNIEnv* env) const; | 
 |   jboolean IsIncognito(JNIEnv* env); | 
 |  | 
 |   void ResumeLoadingCreatedWebContents(JNIEnv* env); | 
 |  | 
 |   void SetPrimaryPageImportance(JNIEnv* env, | 
 |                                 jint main_frame_importance, | 
 |                                 jint subframe_importance); | 
 |   void SuspendAllMediaPlayers(JNIEnv* env); | 
 |   void SetAudioMuted(JNIEnv* env, jboolean mute); | 
 |   jboolean IsAudioMuted(JNIEnv* env); | 
 |  | 
 |   jboolean FocusLocationBarByDefault(JNIEnv* env); | 
 |   bool IsFullscreenForCurrentTab(JNIEnv* env); | 
 |   void ExitFullscreen(JNIEnv* env); | 
 |   void ScrollFocusedEditableNodeIntoView(JNIEnv* env); | 
 |   void SelectAroundCaret(JNIEnv* env, | 
 |                          jint granularity, | 
 |                          jboolean should_show_handle, | 
 |                          jboolean should_show_context_menu, | 
 |                          jint startOffset, | 
 |                          jint endOffset, | 
 |                          jint surroundingTextLength); | 
 |   void AdjustSelectionByCharacterOffset(JNIEnv* env, | 
 |                                         jint start_adjust, | 
 |                                         jint end_adjust, | 
 |                                         jboolean show_selection_menu); | 
 |   void EvaluateJavaScript(JNIEnv* env, | 
 |                           const base::android::JavaParamRef<jstring>& script, | 
 |                           const base::android::JavaParamRef<jobject>& callback); | 
 |   void EvaluateJavaScriptForTests( | 
 |       JNIEnv* env, | 
 |       const base::android::JavaParamRef<jstring>& script, | 
 |       const base::android::JavaParamRef<jobject>& callback); | 
 |  | 
 |   void AddMessageToDevToolsConsole( | 
 |       JNIEnv* env, | 
 |       jint level, | 
 |       const base::android::JavaParamRef<jstring>& message); | 
 |  | 
 |   void PostMessageToMainFrame( | 
 |       JNIEnv* env, | 
 |       const base::android::JavaParamRef<jobject>& jmessage, | 
 |       const base::android::JavaParamRef<jstring>& jsource_origin, | 
 |       const base::android::JavaParamRef<jstring>& jtarget_origin, | 
 |       const base::android::JavaParamRef<jobjectArray>& jports); | 
 |  | 
 |   jboolean HasAccessedInitialDocument(JNIEnv* env); | 
 |  | 
 |   jboolean HasViewTransitionOptIn(JNIEnv* env); | 
 |  | 
 |   // No theme color is represented by SK_ColorTRANSPARENT. | 
 |   jint GetThemeColor(JNIEnv* env); | 
 |  | 
 |   jfloat GetLoadProgress(JNIEnv* env); | 
 |  | 
 |   void RequestSmartClipExtract( | 
 |       JNIEnv* env, | 
 |       const base::android::JavaParamRef<jobject>& callback, | 
 |       jint x, | 
 |       jint y, | 
 |       jint width, | 
 |       jint height); | 
 |  | 
 |   void RequestAccessibilitySnapshot( | 
 |       JNIEnv* env, | 
 |       const base::android::JavaParamRef<jobject>& view_structure_root, | 
 |       const base::android::JavaParamRef<jobject>& view_structure_builder, | 
 |       const base::android::JavaParamRef<jobject>& callback); | 
 |  | 
 |   base::android::ScopedJavaLocalRef<jstring> GetEncoding(JNIEnv* env) const; | 
 |  | 
 |   void SetOverscrollRefreshHandler( | 
 |       JNIEnv* env, | 
 |       const base::android::JavaParamRef<jobject>& overscroll_refresh_handler); | 
 |  | 
 |   void SetSpatialNavigationDisabled(JNIEnv* env, bool disabled); | 
 |  | 
 |   void SetStylusHandwritingEnabled(JNIEnv* env, bool enabled); | 
 |  | 
 |   int DownloadImage(JNIEnv* env, | 
 |                     const base::android::JavaParamRef<jobject>& url, | 
 |                     jboolean is_fav_icon, | 
 |                     jint max_bitmap_size, | 
 |                     jboolean bypass_cache, | 
 |                     const base::android::JavaParamRef<jobject>& jcallback); | 
 |   void SetHasPersistentVideo(JNIEnv* env, jboolean value); | 
 |   bool HasActiveEffectivelyFullscreenVideo(JNIEnv* env); | 
 |   bool IsPictureInPictureAllowedForFullscreenVideo(JNIEnv* env); | 
 |  | 
 |   base::android::ScopedJavaLocalRef<jobject> GetFullscreenVideoSize( | 
 |       JNIEnv* env); | 
 |   void SetSize(JNIEnv* env, jint width, jint height); | 
 |   int GetWidth(JNIEnv* env); | 
 |   int GetHeight(JNIEnv* env); | 
 |  | 
 |   base::android::ScopedJavaLocalRef<jobject> GetOrCreateEventForwarder( | 
 |       JNIEnv* env); | 
 |  | 
 |   void SendOrientationChangeEvent(JNIEnv* env, jint orientation); | 
 |  | 
 |   void OnScaleFactorChanged(JNIEnv* env); | 
 |   void SetFocus(JNIEnv* env, jboolean focused); | 
 |   bool IsBeingDestroyed(JNIEnv* env); | 
 |  | 
 |   void SetDisplayCutoutSafeArea(JNIEnv* env, | 
 |                                 int top, | 
 |                                 int left, | 
 |                                 int bottom, | 
 |                                 int right); | 
 |  | 
 |   void ShowInterestInElement(JNIEnv* env, int nodeID); | 
 |  | 
 |   void NotifyRendererPreferenceUpdate(JNIEnv* env); | 
 |  | 
 |   void NotifyBrowserControlsHeightChanged(JNIEnv* env); | 
 |  | 
 |   bool NeedToFireBeforeUnloadOrUnloadEvents(JNIEnv* env); | 
 |  | 
 |   base::android::ScopedJavaLocalRef<jobject> GetRenderWidgetHostView( | 
 |       JNIEnv* env); | 
 |  | 
 |   jint GetVisibility(JNIEnv* env); | 
 |  | 
 |   void UpdateWebContentsVisibility(JNIEnv* env, jint visibility); | 
 |  | 
 |   void UpdateOffsetTagDefinitions( | 
 |       JNIEnv* env, | 
 |       const base::android::JavaParamRef<jobject>& joffset_tag_definitions); | 
 |  | 
 |   RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid(); | 
 |  | 
 |   class DestructionObserver : public base::CheckedObserver { | 
 |    public: | 
 |     // Invoked when the Java reference to the WebContents is being destroyed. | 
 |     virtual void WebContentsAndroidDestroyed( | 
 |         WebContentsAndroid* web_contents_android) = 0; | 
 |   }; | 
 |  | 
 |   void AddDestructionObserver(DestructionObserver* observer); | 
 |   void RemoveDestructionObserver(DestructionObserver* observer); | 
 |  | 
 |   void OnContentForNavigationEntryShown(JNIEnv* env); | 
 |   jint GetCurrentBackForwardTransitionStage(JNIEnv* env); | 
 |  | 
 |   void CaptureContentAsBitmapForTesting( | 
 |       JNIEnv* env, | 
 |       const base::android::JavaParamRef<jobject>& jcallback); | 
 |   void OnFinishGetContentBitmapForTesting( | 
 |       const base::android::JavaRef<jobject>& callback, | 
 |       gfx::Image snapshot); | 
 |  | 
 |   void SetLongPressLinkSelectText(JNIEnv* env, jboolean enabled); | 
 |  | 
 |   void SetCanAcceptLoadDrops(JNIEnv* env, jboolean enabled); | 
 |  | 
 |   bool GetCanAcceptLoadDropsForTesting(JNIEnv* env); | 
 |  | 
 |   void SetSupportsForwardTransitionAnimation(JNIEnv* env, jboolean enabled); | 
 |  | 
 |   jboolean HasOpener(JNIEnv* env); | 
 |  | 
 |   jint GetOriginalWindowOpenDisposition(JNIEnv* env); | 
 |  | 
 |   void UpdateWindowControlsOverlay(JNIEnv* env, | 
 |                                    jint left, | 
 |                                    jint top, | 
 |                                    jint right, | 
 |                                    jint bottom); | 
 |  | 
 |   // Adds a crash report, like DumpWithoutCrashing(), including the Java stack | 
 |   // trace from which `web_contents` was created. This is meant to help debug | 
 |   // cases where BrowserContext is destroyed before its WebContents. | 
 |   static void ReportDanglingPtrToBrowserContext(JNIEnv* env, | 
 |                                                 WebContents* web_contents); | 
 |  | 
 |  private: | 
 |   void OnFinishDownloadImage(const base::android::JavaRef<jobject>& obj, | 
 |                              const base::android::JavaRef<jobject>& callback, | 
 |                              int id, | 
 |                              int http_status_code, | 
 |                              const GURL& url, | 
 |                              const std::vector<SkBitmap>& bitmaps, | 
 |                              const std::vector<gfx::Size>& sizes); | 
 |   void SelectAroundCaretAck(int startOffset, | 
 |                             int endOffset, | 
 |                             int surroundingTextLength, | 
 |                             blink::mojom::SelectAroundCaretResultPtr result); | 
 |   // Walks over the AXTreeUpdate and creates a light weight snapshot. | 
 |   void AXTreeSnapshotCallback( | 
 |       const base::android::JavaRef<jobject>& view_structure_root, | 
 |       const base::android::JavaRef<jobject>& view_structure_builder, | 
 |       const base::android::JavaRef<jobject>& callback, | 
 |       ui::AXTreeUpdate& result); | 
 |  | 
 |   raw_ptr<WebContentsImpl> web_contents_; | 
 |  | 
 |   NavigationControllerAndroid navigation_controller_; | 
 |   base::android::ScopedJavaGlobalRef<jobject> obj_; | 
 |  | 
 |   base::ObserverList<DestructionObserver> destruction_observers_; | 
 |  | 
 |   class BrowserControlsOffsetTagMediator : public RenderWidgetHostConnector { | 
 |    public: | 
 |     explicit BrowserControlsOffsetTagMediator(WebContents* web_contents); | 
 |     ~BrowserControlsOffsetTagMediator() override; | 
 |  | 
 |     void SetOffsetTagDefinitions(const ui::BrowserControlsOffsetTagDefinitions& | 
 |                                      new_offset_tag_definitions); | 
 |  | 
 |     void UpdateRenderProcessConnection( | 
 |         RenderWidgetHostViewAndroid* old_rwhva, | 
 |         RenderWidgetHostViewAndroid* new_rhwva) override; | 
 |  | 
 |    private: | 
 |     raw_ptr<RenderWidgetHostViewAndroid> rwhva_ = nullptr; | 
 |     ui::BrowserControlsOffsetTagDefinitions offset_tag_definitions_; | 
 |   }; | 
 |  | 
 |   raw_ptr<BrowserControlsOffsetTagMediator> offset_tag_mediator_ = nullptr; | 
 |  | 
 |   base::WeakPtrFactory<WebContentsAndroid> weak_factory_{this}; | 
 | }; | 
 |  | 
 | }  // namespace content | 
 |  | 
 | #endif  // CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_ANDROID_H_ |