#ifndef CONTENT_TEST_TEST_RENDER_VIEW_HOST_H_
#define CONTENT_TEST_TEST_RENDER_VIEW_HOST_H_
#include <stdint.h>
#include <string>
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "components/viz/host/host_frame_sink_client.h"
#include "content/browser/renderer_host/cursor_manager.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_view_base.h"
#include "content/browser/renderer_host/render_widget_host_view_child_frame.h"
#include "content/public/common/page_visibility_state.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/test_renderer_host.h"
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/ime/dummy_text_input_client.h"
#include "ui/base/layout.h"
#include "ui/base/page_transition_types.h"
#include "ui/gfx/geometry/vector2d_f.h"
#if defined(USE_AURA)
#include "ui/aura/window.h"
#endif
#if BUILDFLAG(IS_MAC)
#include "third_party/blink/public/mojom/webshare/webshare.mojom.h"
#endif
namespace gfx {
class Rect;
}
namespace content {
class FrameTree;
class TestRenderFrameHost;
class TestPageBroadcast;
class TestWebContents;
class TestRenderWidgetHostView : public RenderWidgetHostViewBase,
public viz::HostFrameSinkClient {
public:
explicit TestRenderWidgetHostView(RenderWidgetHost* rwh);
~TestRenderWidgetHostView() override;
void InitAsChild(gfx::NativeView parent_view) override {}
void SetSize(const gfx::Size& size) override {}
void SetBounds(const gfx::Rect& rect) override {}
gfx::NativeView GetNativeView() override;
gfx::NativeViewAccessible GetNativeViewAccessible() override;
ui::TextInputClient* GetTextInputClient() override;
bool HasFocus() override;
void Hide() override;
bool IsShowing() override;
void WasUnOccluded() override;
void WasOccluded() override;
gfx::Rect GetViewBounds() override;
#if BUILDFLAG(IS_MAC)
void SetActive(bool active) override;
void ShowDefinitionForSelection() override {}
void SpeakSelection() override;
void SetWindowFrameInScreen(const gfx::Rect& rect) override;
void ShowSharePicker(
const std::string& title,
const std::string& text,
const std::string& url,
const std::vector<std::string>& file_paths,
blink::mojom::ShareService::ShareCallback callback) override;
#endif
void ClearFallbackSurfaceForCommitPending() override;
void ResetFallbackToFirstNavigationSurface() override {}
void TakeFallbackContentFrom(RenderWidgetHostView* view) override;
void EnsureSurfaceSynchronizedForWebTest() override;
#if defined(OHOS_UNITTESTS)
void EvictFrameBackBuffers(bool invisible) override {}
bool GetScrollable() override {
return true;
}
void SetDoubleTapSupportEnabled(bool enabled) override {}
void SetMultiTouchZoomSupportEnabled(bool enabled) override {}
#endif
uint32_t GetCaptureSequenceNumber() const override;
void InitAsPopup(RenderWidgetHostView* parent_host_view,
const gfx::Rect& bounds,
const gfx::Rect& anchor_rect) override {}
void Focus() override {}
void SetIsLoading(bool is_loading) override {}
void UpdateCursor(const ui::Cursor& cursor) override;
void RenderProcessGone() override;
void ShowWithVisibility(PageVisibilityState page_visibility) override;
void Destroy() override;
void UpdateTooltipUnderCursor(const std::u16string& tooltip_text) override {}
void UpdateTooltipFromKeyboard(const std::u16string& tooltip_text,
const gfx::Rect& bounds) override {}
void ClearKeyboardTriggeredTooltip() override {}
gfx::Rect GetBoundsInRootWindow() override;
blink::mojom::PointerLockResult LockMouse(bool) override;
blink::mojom::PointerLockResult ChangeMouseLock(bool) override;
void UnlockMouse() override;
const viz::FrameSinkId& GetFrameSinkId() const override;
const viz::LocalSurfaceId& GetLocalSurfaceId() const override;
viz::SurfaceId GetCurrentSurfaceId() const override;
std::unique_ptr<SyntheticGestureTarget> CreateSyntheticGestureTarget()
override;
ui::Compositor* GetCompositor() override;
CursorManager* GetCursorManager() override;
bool is_showing() const { return is_showing_; }
bool is_occluded() const { return is_occluded_; }
void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
void OnFrameTokenChanged(uint32_t frame_token,
base::TimeTicks activation_time) override;
const ui::Cursor& last_cursor() const { return last_cursor_; }
void SetCompositor(ui::Compositor* compositor) { compositor_ = compositor; }
void ClearFallbackSurfaceCalled();
bool clear_fallback_surface_for_commit_pending_called() const {
return clear_fallback_surface_for_commit_pending_called_;
}
bool take_fallback_content_from_called() const {
return take_fallback_content_from_called_;
}
protected:
void UpdateBackgroundColor() override;
absl::optional<DisplayFeature> GetDisplayFeature() override;
void SetDisplayFeatureForTesting(
const DisplayFeature* display_feature) override;
void NotifyHostAndDelegateOnWasShown(
blink::mojom::RecordContentToVisibleTimeRequestPtr) override;
void RequestSuccessfulPresentationTimeFromHostOrDelegate(
blink::mojom::RecordContentToVisibleTimeRequestPtr) override;
void CancelSuccessfulPresentationTimeRequestForHostAndDelegate() override;
viz::FrameSinkId frame_sink_id_;
private:
bool is_showing_;
bool is_occluded_;
PageVisibilityState page_visibility_ = PageVisibilityState::kHidden;
#if !BUILDFLAG(IS_IOS)
ui::DummyTextInputClient text_input_client_;
#endif
ui::Cursor last_cursor_;
uint32_t latest_capture_sequence_number_ = 0u;
bool clear_fallback_surface_for_commit_pending_called_ = false;
bool take_fallback_content_from_called_ = false;
#if defined(USE_AURA)
std::unique_ptr<aura::Window> window_;
#endif
absl::optional<DisplayFeature> display_feature_;
raw_ptr<ui::Compositor> compositor_ = nullptr;
CursorManager cursor_manager_;
};
class TestRenderWidgetHostViewChildFrame
: public RenderWidgetHostViewChildFrame {
public:
explicit TestRenderWidgetHostViewChildFrame(RenderWidgetHost* rwh);
~TestRenderWidgetHostViewChildFrame() override = default;
blink::WebInputEvent::Type last_gesture_seen() { return last_gesture_seen_; }
void Reset();
void SetCompositor(ui::Compositor* compositor);
ui::Compositor* GetCompositor() override;
private:
void SetBounds(const gfx::Rect& rect) override {}
void Hide() override {}
void SetInsets(const gfx::Insets& insets) override {}
void SendInitialPropertiesIfNeeded() override {}
void ShowWithVisibility(PageVisibilityState) override {}
void DidNavigate() override {}
void ProcessGestureEvent(const blink::WebGestureEvent& event,
const ui::LatencyInfo&) override;
blink::WebInputEvent::Type last_gesture_seen_ =
blink::WebInputEvent::Type::kUndefined;
raw_ptr<ui::Compositor> compositor_;
};
class TestRenderViewHost : public RenderViewHostImpl,
public RenderViewHostTester {
public:
TestRenderViewHost(
FrameTree* frame_tree,
SiteInstanceGroup* group,
const StoragePartitionConfig& storage_partition_config,
std::unique_ptr<RenderWidgetHostImpl> widget,
RenderViewHostDelegate* delegate,
int32_t routing_id,
int32_t main_frame_routing_id,
scoped_refptr<BrowsingContextState> main_browsing_context_state,
CreateRenderViewHostCase create_case);
TestRenderViewHost(const TestRenderViewHost&) = delete;
TestRenderViewHost& operator=(const TestRenderViewHost&) = delete;
MockRenderProcessHost* GetProcess() const override;
bool CreateRenderView(
const absl::optional<blink::FrameToken>& opener_frame_token,
int proxy_route_id,
bool window_was_created_with_opener) override;
bool IsTestRenderViewHost() const override;
void SimulateWasHidden() override;
void SimulateWasShown() override;
blink::web_pref::WebPreferences TestComputeWebPreferences() override;
bool CreateTestRenderView() override;
void TestOnUpdateStateWithFile(const base::FilePath& file_path);
void TestStartDragging(const DropData& drop_data, SkBitmap bitmap = {});
void set_delete_counter(int* delete_counter) {
delete_counter_ = delete_counter;
}
const absl::optional<blink::FrameToken>& opener_frame_token() const {
return opener_frame_token_;
}
private:
FRIEND_TEST_ALL_PREFIXES(RenderViewHostTest, FilterNavigate);
~TestRenderViewHost() override;
void SendNavigateWithTransitionAndResponseCode(const GURL& url,
ui::PageTransition transition,
int response_code);
void SendNavigateWithParameters(
const GURL& url,
ui::PageTransition transition,
const GURL& original_request_url,
int response_code,
const base::FilePath* file_path_for_history_item);
raw_ptr<int> delete_counter_;
absl::optional<blink::FrameToken> opener_frame_token_;
std::unique_ptr<TestPageBroadcast> page_broadcast_;
};
class RenderViewHostImplTestHarness : public RenderViewHostTestHarness {
public:
RenderViewHostImplTestHarness();
RenderViewHostImplTestHarness(const RenderViewHostImplTestHarness&) = delete;
RenderViewHostImplTestHarness& operator=(
const RenderViewHostImplTestHarness&) = delete;
~RenderViewHostImplTestHarness() override;
TestWebContents* contents();
TestRenderViewHost* test_rvh();
TestRenderFrameHost* main_test_rfh();
private:
typedef std::unique_ptr<ui::test::ScopedSetSupportedResourceScaleFactors>
ScopedSetSupportedScaleFactors;
ScopedSetSupportedScaleFactors scoped_set_supported_scale_factors_;
};
}
#endif