Commit c3fdfcff authored by Jeremy Roman's avatar Jeremy Roman Committed by Commit Bot

Extract Portals browser test utilities.

I intend to reuse them to test a navigation throttle, but it's a little
crowded to put them in the same .cc file.

Bug: 1013389
Change-Id: Ie67cbff281ee7ca753b01d06743036a74764fa8b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1854219
Auto-Submit: Jeremy Roman <jbroman@chromium.org>
Commit-Queue: Lucas Gadani <lfg@chromium.org>
Reviewed-by: default avatarAlex Moshchuk <alexmos@chromium.org>
Reviewed-by: default avatarLucas Gadani <lfg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#705183}
parent f08ac5f8
...@@ -12,12 +12,13 @@ ...@@ -12,12 +12,13 @@
#include "content/browser/frame_host/render_frame_host_manager.h" #include "content/browser/frame_host/render_frame_host_manager.h"
#include "content/browser/frame_host/render_frame_proxy_host.h" #include "content/browser/frame_host/render_frame_proxy_host.h"
#include "content/browser/portal/portal.h" #include "content/browser/portal/portal.h"
#include "content/browser/portal/portal_created_observer.h"
#include "content/browser/portal/portal_interceptor_for_testing.h"
#include "content/browser/renderer_host/input/synthetic_smooth_scroll_gesture.h" #include "content/browser/renderer_host/input/synthetic_smooth_scroll_gesture.h"
#include "content/browser/renderer_host/input/synthetic_tap_gesture.h" #include "content/browser/renderer_host/input/synthetic_tap_gesture.h"
#include "content/browser/renderer_host/render_widget_host_input_event_router.h" #include "content/browser/renderer_host/render_widget_host_input_event_router.h"
#include "content/browser/renderer_host/render_widget_host_view_child_frame.h" #include "content/browser/renderer_host/render_widget_host_view_child_frame.h"
#include "content/browser/web_contents/web_contents_impl.h" #include "content/browser/web_contents/web_contents_impl.h"
#include "content/common/frame.mojom-test-utils.h"
#include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_delegate.h"
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "content/public/test/browser_test_utils.h" #include "content/public/test/browser_test_utils.h"
...@@ -33,7 +34,6 @@ ...@@ -33,7 +34,6 @@
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/mojom/portal/portal.mojom-test-utils.h"
#include "third_party/blink/public/mojom/portal/portal.mojom.h" #include "third_party/blink/public/mojom/portal/portal.mojom.h"
#include "url/url_constants.h" #include "url/url_constants.h"
...@@ -41,203 +41,6 @@ using testing::_; ...@@ -41,203 +41,6 @@ using testing::_;
namespace content { namespace content {
// The PortalInterceptorForTesting can be used in tests to inspect Portal IPCs.
class PortalInterceptorForTesting final
: public blink::mojom::PortalInterceptorForTesting {
public:
static PortalInterceptorForTesting* Create(
RenderFrameHostImpl* render_frame_host_impl,
mojo::PendingAssociatedReceiver<blink::mojom::Portal> receiver,
mojo::AssociatedRemote<blink::mojom::PortalClient> client);
static PortalInterceptorForTesting* Create(
RenderFrameHostImpl* render_frame_host_impl,
content::Portal* portal);
static PortalInterceptorForTesting* From(content::Portal* portal);
void Activate(blink::TransferableMessage data,
ActivateCallback callback) override {
portal_activated_ = true;
if (run_loop_) {
run_loop_->Quit();
run_loop_ = nullptr;
}
// |this| can be destroyed after Activate() is called.
portal_->Activate(std::move(data), std::move(callback));
}
void Navigate(const GURL& url,
blink::mojom::ReferrerPtr referrer,
NavigateCallback callback) override {
if (navigate_callback_) {
navigate_callback_.Run(url, std::move(referrer), std::move(callback));
return;
}
portal_->Navigate(url, std::move(referrer), std::move(callback));
}
void WaitForActivate() {
if (portal_activated_)
return;
base::RunLoop run_loop;
run_loop_ = &run_loop;
run_loop.Run();
}
// Test getters.
content::Portal* GetPortal() { return portal_.get(); }
WebContents* GetPortalContents() { return portal_->GetPortalContents(); }
// IPC callbacks
base::RepeatingCallback<
void(const GURL&, blink::mojom::ReferrerPtr, NavigateCallback)>
navigate_callback_;
private:
explicit PortalInterceptorForTesting(
RenderFrameHostImpl* render_frame_host_impl)
: portal_(content::Portal::CreateForTesting(render_frame_host_impl)) {}
PortalInterceptorForTesting(RenderFrameHostImpl* render_frame_host_impl,
std::unique_ptr<content::Portal> portal)
: portal_(std::move(portal)) {}
blink::mojom::Portal* GetForwardingInterface() override {
return portal_.get();
}
std::unique_ptr<content::Portal> portal_;
bool portal_activated_ = false;
base::RunLoop* run_loop_ = nullptr;
};
// static
PortalInterceptorForTesting* PortalInterceptorForTesting::Create(
RenderFrameHostImpl* render_frame_host_impl,
mojo::PendingAssociatedReceiver<blink::mojom::Portal> receiver,
mojo::AssociatedRemote<blink::mojom::PortalClient> client) {
auto test_portal_ptr =
base::WrapUnique(new PortalInterceptorForTesting(render_frame_host_impl));
PortalInterceptorForTesting* test_portal = test_portal_ptr.get();
test_portal->GetPortal()->SetBindingForTesting(
mojo::MakeStrongAssociatedBinding<blink::mojom::Portal>(
std::move(test_portal_ptr), std::move(receiver)));
test_portal->GetPortal()->SetClientForTesting(std::move(client));
return test_portal;
}
PortalInterceptorForTesting* PortalInterceptorForTesting::Create(
RenderFrameHostImpl* render_frame_host_impl,
content::Portal* portal) {
// Take ownership of the portal.
std::unique_ptr<blink::mojom::Portal> mojom_portal_ptr =
portal->GetBindingForTesting()->SwapImplForTesting(nullptr);
std::unique_ptr<content::Portal> portal_ptr = base::WrapUnique(
static_cast<content::Portal*>(mojom_portal_ptr.release()));
// Create PortalInterceptorForTesting.
auto test_portal_ptr = base::WrapUnique(new PortalInterceptorForTesting(
render_frame_host_impl, std::move(portal_ptr)));
PortalInterceptorForTesting* test_portal = test_portal_ptr.get();
// Set the binding for the PortalInterceptorForTesting.
portal->GetBindingForTesting()->SwapImplForTesting(
std::move(test_portal_ptr));
return test_portal;
}
// static
PortalInterceptorForTesting* PortalInterceptorForTesting::From(
content::Portal* portal) {
blink::mojom::Portal* impl = portal->GetBindingForTesting()->impl();
auto* interceptor = static_cast<PortalInterceptorForTesting*>(impl);
CHECK_NE(static_cast<blink::mojom::Portal*>(portal), impl);
CHECK_EQ(interceptor->GetPortal(), portal);
return interceptor;
}
// The PortalCreatedObserver observes portal creations on
// |render_frame_host_impl|. This observer can be used to monitor for multiple
// Portal creations on the same RenderFrameHost, by repeatedly calling
// WaitUntilPortalCreated().
class PortalCreatedObserver : public mojom::FrameHostInterceptorForTesting {
public:
explicit PortalCreatedObserver(RenderFrameHostImpl* render_frame_host_impl)
: render_frame_host_impl_(render_frame_host_impl) {
old_impl_ = render_frame_host_impl_->frame_host_receiver_for_testing()
.SwapImplForTesting(this);
}
~PortalCreatedObserver() override {
render_frame_host_impl_->frame_host_receiver_for_testing()
.SwapImplForTesting(old_impl_);
}
FrameHost* GetForwardingInterface() override {
return render_frame_host_impl_;
}
void CreatePortal(
mojo::PendingAssociatedReceiver<blink::mojom::Portal> portal,
mojo::PendingAssociatedRemote<blink::mojom::PortalClient> client,
CreatePortalCallback callback) override {
PortalInterceptorForTesting* portal_interceptor =
PortalInterceptorForTesting::Create(
render_frame_host_impl_, std::move(portal),
mojo::AssociatedRemote<blink::mojom::PortalClient>(
std::move(client)));
portal_ = portal_interceptor->GetPortal();
RenderFrameProxyHost* proxy_host = portal_->CreateProxyAndAttachPortal();
std::move(callback).Run(proxy_host->GetRoutingID(), portal_->portal_token(),
portal_->GetDevToolsFrameToken());
if (run_loop_)
run_loop_->Quit();
}
void AdoptPortal(const base::UnguessableToken& portal_token,
AdoptPortalCallback callback) override {
Portal* portal = Portal::FromToken(portal_token);
PortalInterceptorForTesting* portal_interceptor =
PortalInterceptorForTesting::Create(render_frame_host_impl_, portal);
portal_ = portal_interceptor->GetPortal();
RenderFrameProxyHost* proxy_host = portal_->CreateProxyAndAttachPortal();
std::move(callback).Run(
proxy_host->GetRoutingID(),
proxy_host->frame_tree_node()->current_replication_state(),
portal->GetDevToolsFrameToken());
if (run_loop_)
run_loop_->Quit();
}
Portal* WaitUntilPortalCreated() {
Portal* portal = portal_;
if (portal) {
portal_ = nullptr;
return portal;
}
base::RunLoop run_loop;
run_loop_ = &run_loop;
run_loop.Run();
run_loop_ = nullptr;
portal = portal_;
portal_ = nullptr;
return portal;
}
private:
RenderFrameHostImpl* render_frame_host_impl_;
mojom::FrameHost* old_impl_;
base::RunLoop* run_loop_ = nullptr;
Portal* portal_ = nullptr;
};
class PortalBrowserTest : public ContentBrowserTest { class PortalBrowserTest : public ContentBrowserTest {
protected: protected:
PortalBrowserTest() {} PortalBrowserTest() {}
...@@ -760,13 +563,13 @@ IN_PROC_BROWSER_TEST_F(PortalBrowserTest, NavigateToChrome) { ...@@ -760,13 +563,13 @@ IN_PROC_BROWSER_TEST_F(PortalBrowserTest, NavigateToChrome) {
PortalInterceptorForTesting::From(portal); PortalInterceptorForTesting::From(portal);
// Try to navigate to chrome://settings and wait for the process to die. // Try to navigate to chrome://settings and wait for the process to die.
portal_interceptor->navigate_callback_ = base::BindRepeating( portal_interceptor->SetNavigateCallback(base::BindRepeating(
[](Portal* portal, const GURL& url, blink::mojom::ReferrerPtr referrer, [](Portal* portal, const GURL& url, blink::mojom::ReferrerPtr referrer,
blink::mojom::Portal::NavigateCallback callback) { blink::mojom::Portal::NavigateCallback callback) {
GURL chrome_url("chrome://settings"); GURL chrome_url("chrome://settings");
portal->Navigate(chrome_url, std::move(referrer), std::move(callback)); portal->Navigate(chrome_url, std::move(referrer), std::move(callback));
}, },
portal); portal));
RenderProcessHostKillWaiter kill_waiter(main_frame->GetProcess()); RenderProcessHostKillWaiter kill_waiter(main_frame->GetProcess());
GURL a_url(embedded_test_server()->GetURL("a.com", "/title1.html")); GURL a_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
ignore_result(ExecJs(main_frame, JsReplace("portal.src = $1;", a_url))); ignore_result(ExecJs(main_frame, JsReplace("portal.src = $1;", a_url)));
......
// 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.
#include "content/browser/portal/portal_created_observer.h"
#include <utility>
#include "base/run_loop.h"
#include "content/browser/frame_host/frame_tree_node.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/browser/frame_host/render_frame_proxy_host.h"
#include "content/browser/portal/portal.h"
#include "content/browser/portal/portal_interceptor_for_testing.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
namespace content {
PortalCreatedObserver::PortalCreatedObserver(
RenderFrameHostImpl* render_frame_host_impl)
: render_frame_host_impl_(render_frame_host_impl) {
old_impl_ = render_frame_host_impl_->frame_host_receiver_for_testing()
.SwapImplForTesting(this);
}
PortalCreatedObserver::~PortalCreatedObserver() {
render_frame_host_impl_->frame_host_receiver_for_testing().SwapImplForTesting(
old_impl_);
}
mojom::FrameHost* PortalCreatedObserver::GetForwardingInterface() {
return render_frame_host_impl_;
}
void PortalCreatedObserver::CreatePortal(
mojo::PendingAssociatedReceiver<blink::mojom::Portal> portal,
mojo::PendingAssociatedRemote<blink::mojom::PortalClient> client,
CreatePortalCallback callback) {
PortalInterceptorForTesting* portal_interceptor =
PortalInterceptorForTesting::Create(
render_frame_host_impl_, std::move(portal),
mojo::AssociatedRemote<blink::mojom::PortalClient>(
std::move(client)));
portal_ = portal_interceptor->GetPortal();
RenderFrameProxyHost* proxy_host = portal_->CreateProxyAndAttachPortal();
std::move(callback).Run(proxy_host->GetRoutingID(), portal_->portal_token(),
portal_->GetDevToolsFrameToken());
if (run_loop_)
run_loop_->Quit();
}
void PortalCreatedObserver::AdoptPortal(
const base::UnguessableToken& portal_token,
AdoptPortalCallback callback) {
Portal* portal = Portal::FromToken(portal_token);
PortalInterceptorForTesting* portal_interceptor =
PortalInterceptorForTesting::Create(render_frame_host_impl_, portal);
portal_ = portal_interceptor->GetPortal();
RenderFrameProxyHost* proxy_host = portal_->CreateProxyAndAttachPortal();
std::move(callback).Run(
proxy_host->GetRoutingID(),
proxy_host->frame_tree_node()->current_replication_state(),
portal->GetDevToolsFrameToken());
if (run_loop_)
run_loop_->Quit();
}
Portal* PortalCreatedObserver::WaitUntilPortalCreated() {
Portal* portal = portal_;
if (portal) {
portal_ = nullptr;
return portal;
}
base::RunLoop run_loop;
run_loop_ = &run_loop;
run_loop.Run();
run_loop_ = nullptr;
portal = portal_;
portal_ = nullptr;
return portal;
}
} // namespace content
// 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.
#ifndef CONTENT_BROWSER_PORTAL_PORTAL_CREATED_OBSERVER_H_
#define CONTENT_BROWSER_PORTAL_PORTAL_CREATED_OBSERVER_H_
#include "content/common/frame.mojom-test-utils.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_associated_remote.h"
#include "third_party/blink/public/mojom/portal/portal.mojom.h"
namespace base {
class RunLoop;
} // namespace base
namespace content {
class Portal;
class RenderFrameHostImpl;
// The PortalCreatedObserver observes portal creations on
// |render_frame_host_impl|. This observer can be used to monitor for multiple
// Portal creations on the same RenderFrameHost, by repeatedly calling
// WaitUntilPortalCreated().
class PortalCreatedObserver : public mojom::FrameHostInterceptorForTesting {
public:
explicit PortalCreatedObserver(RenderFrameHostImpl* render_frame_host_impl);
~PortalCreatedObserver() override;
// mojom::FrameHostInterceptorForTesting
mojom::FrameHost* GetForwardingInterface() override;
void CreatePortal(
mojo::PendingAssociatedReceiver<blink::mojom::Portal> portal,
mojo::PendingAssociatedRemote<blink::mojom::PortalClient> client,
CreatePortalCallback callback) override;
void AdoptPortal(const base::UnguessableToken& portal_token,
AdoptPortalCallback callback) override;
Portal* WaitUntilPortalCreated();
private:
RenderFrameHostImpl* render_frame_host_impl_;
mojom::FrameHost* old_impl_;
base::RunLoop* run_loop_ = nullptr;
Portal* portal_ = nullptr;
};
} // namespace content
#endif // CONTENT_BROWSER_PORTAL_PORTAL_CREATED_OBSERVER_H_
// 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.
#include "content/browser/portal/portal_interceptor_for_testing.h"
#include <utility>
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
#include "mojo/public/cpp/bindings/strong_associated_binding.h"
namespace content {
// static
PortalInterceptorForTesting* PortalInterceptorForTesting::Create(
RenderFrameHostImpl* render_frame_host_impl,
mojo::PendingAssociatedReceiver<blink::mojom::Portal> receiver,
mojo::AssociatedRemote<blink::mojom::PortalClient> client) {
auto test_portal_ptr =
base::WrapUnique(new PortalInterceptorForTesting(render_frame_host_impl));
PortalInterceptorForTesting* test_portal = test_portal_ptr.get();
test_portal->GetPortal()->SetBindingForTesting(
mojo::MakeStrongAssociatedBinding<blink::mojom::Portal>(
std::move(test_portal_ptr), std::move(receiver)));
test_portal->GetPortal()->SetClientForTesting(std::move(client));
return test_portal;
}
PortalInterceptorForTesting* PortalInterceptorForTesting::Create(
RenderFrameHostImpl* render_frame_host_impl,
content::Portal* portal) {
// Take ownership of the portal.
std::unique_ptr<blink::mojom::Portal> mojom_portal_ptr =
portal->GetBindingForTesting()->SwapImplForTesting(nullptr);
std::unique_ptr<content::Portal> portal_ptr = base::WrapUnique(
static_cast<content::Portal*>(mojom_portal_ptr.release()));
// Create PortalInterceptorForTesting.
auto test_portal_ptr = base::WrapUnique(new PortalInterceptorForTesting(
render_frame_host_impl, std::move(portal_ptr)));
PortalInterceptorForTesting* test_portal = test_portal_ptr.get();
// Set the binding for the PortalInterceptorForTesting.
portal->GetBindingForTesting()->SwapImplForTesting(
std::move(test_portal_ptr));
return test_portal;
}
// static
PortalInterceptorForTesting* PortalInterceptorForTesting::From(
content::Portal* portal) {
blink::mojom::Portal* impl = portal->GetBindingForTesting()->impl();
auto* interceptor = static_cast<PortalInterceptorForTesting*>(impl);
CHECK_NE(static_cast<blink::mojom::Portal*>(portal), impl);
CHECK_EQ(interceptor->GetPortal(), portal);
return interceptor;
}
PortalInterceptorForTesting::PortalInterceptorForTesting(
RenderFrameHostImpl* render_frame_host_impl)
: portal_(content::Portal::CreateForTesting(render_frame_host_impl)) {}
PortalInterceptorForTesting::PortalInterceptorForTesting(
RenderFrameHostImpl* render_frame_host_impl,
std::unique_ptr<content::Portal> portal)
: portal_(std::move(portal)) {}
PortalInterceptorForTesting::~PortalInterceptorForTesting() = default;
blink::mojom::Portal* PortalInterceptorForTesting::GetForwardingInterface() {
return portal_.get();
}
void PortalInterceptorForTesting::Activate(blink::TransferableMessage data,
ActivateCallback callback) {
portal_activated_ = true;
if (run_loop_) {
run_loop_->Quit();
run_loop_ = nullptr;
}
// |this| can be destroyed after Activate() is called.
portal_->Activate(std::move(data), std::move(callback));
}
void PortalInterceptorForTesting::Navigate(
const GURL& url,
blink::mojom::ReferrerPtr referrer,
blink::mojom::Portal::NavigateCallback callback) {
if (navigate_callback_) {
navigate_callback_.Run(url, std::move(referrer), std::move(callback));
return;
}
portal_->Navigate(url, std::move(referrer), std::move(callback));
}
void PortalInterceptorForTesting::WaitForActivate() {
if (portal_activated_)
return;
base::RunLoop run_loop;
run_loop_ = &run_loop;
run_loop.Run();
}
} // namespace content
// 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.
#ifndef CONTENT_BROWSER_PORTAL_PORTAL_INTERCEPTOR_FOR_TESTING_H_
#define CONTENT_BROWSER_PORTAL_PORTAL_INTERCEPTOR_FOR_TESTING_H_
#include <memory>
#include "base/callback.h"
#include "content/browser/portal/portal.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "third_party/blink/public/mojom/portal/portal.mojom-test-utils.h"
#include "third_party/blink/public/mojom/portal/portal.mojom.h"
namespace base {
class RunLoop;
} // namespace base
namespace content {
class RenderFrameHostImpl;
// The PortalInterceptorForTesting can be used in tests to inspect Portal IPCs.
class PortalInterceptorForTesting final
: public blink::mojom::PortalInterceptorForTesting {
public:
static PortalInterceptorForTesting* Create(
RenderFrameHostImpl* render_frame_host_impl,
mojo::PendingAssociatedReceiver<blink::mojom::Portal> receiver,
mojo::AssociatedRemote<blink::mojom::PortalClient> client);
static PortalInterceptorForTesting* Create(
RenderFrameHostImpl* render_frame_host_impl,
content::Portal* portal);
static PortalInterceptorForTesting* From(content::Portal* portal);
~PortalInterceptorForTesting() override;
// blink::mojom::PortalInterceptorForTesting
blink::mojom::Portal* GetForwardingInterface() override;
void Activate(blink::TransferableMessage data,
ActivateCallback callback) override;
void Navigate(const GURL& url,
blink::mojom::ReferrerPtr referrer,
blink::mojom::Portal::NavigateCallback callback) override;
// If set, will be used to replace the implementation of Navigate.
using NavigateCallback =
base::RepeatingCallback<void(const GURL&,
blink::mojom::ReferrerPtr,
blink::mojom::Portal::NavigateCallback)>;
void SetNavigateCallback(NavigateCallback callback) {
navigate_callback_ = std::move(callback);
}
void WaitForActivate();
// Test getters.
content::Portal* GetPortal() { return portal_.get(); }
WebContentsImpl* GetPortalContents() { return portal_->GetPortalContents(); }
private:
explicit PortalInterceptorForTesting(
RenderFrameHostImpl* render_frame_host_impl);
PortalInterceptorForTesting(RenderFrameHostImpl* render_frame_host_impl,
std::unique_ptr<content::Portal> portal);
std::unique_ptr<content::Portal> portal_;
NavigateCallback navigate_callback_;
bool portal_activated_ = false;
base::RunLoop* run_loop_ = nullptr;
};
} // namespace content
#endif // CONTENT_BROWSER_PORTAL_PORTAL_INTERCEPTOR_FOR_TESTING_H_
...@@ -67,6 +67,10 @@ jumbo_static_library("test_support") { ...@@ -67,6 +67,10 @@ jumbo_static_library("test_support") {
"../browser/native_file_system/mock_native_file_system_permission_context.h", "../browser/native_file_system/mock_native_file_system_permission_context.h",
"../browser/native_file_system/mock_native_file_system_permission_grant.cc", "../browser/native_file_system/mock_native_file_system_permission_grant.cc",
"../browser/native_file_system/mock_native_file_system_permission_grant.h", "../browser/native_file_system/mock_native_file_system_permission_grant.h",
"../browser/portal/portal_created_observer.cc",
"../browser/portal/portal_created_observer.h",
"../browser/portal/portal_interceptor_for_testing.cc",
"../browser/portal/portal_interceptor_for_testing.h",
"../browser/renderer_host/input/mock_input_router.cc", "../browser/renderer_host/input/mock_input_router.cc",
"../browser/renderer_host/input/mock_input_router.h", "../browser/renderer_host/input/mock_input_router.h",
"../browser/renderer_host/mock_render_widget_host.cc", "../browser/renderer_host/mock_render_widget_host.cc",
......
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