0

Copy CastBrowserContext's destructor

ShutdownStoragePartitions needs to be called before destroying
the context sometimes due to a dcheck

Bug: b/179217534
Test: None
Change-Id: Id423bffdbe3147e20cd5bb578a3a67a05e1f9a25
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2673160
Reviewed-by: Daniel Nicoara <dnicoara@chromium.org>
Commit-Queue: Albert Chaulk <achaulk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#851192}
This commit is contained in:
Albert Chaulk
2021-02-05 17:54:16 +00:00
committed by Chromium LUCI CQ
parent eae0a9ba1a
commit a0f34f2667
6 changed files with 59 additions and 9 deletions

@ -4,6 +4,9 @@
#include "chromecast/browser/webview/webview_browser_context.h"
#include "base/files/file_path.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/resource_context.h"
namespace chromecast {
@ -21,7 +24,15 @@ WebviewBrowserContext::WebviewBrowserContext(
content::BrowserContext* main_browser_context)
: main_browser_context_(main_browser_context),
resource_context_(std::make_unique<ResourceContext>()) {}
WebviewBrowserContext::~WebviewBrowserContext() {}
WebviewBrowserContext::~WebviewBrowserContext() {
BrowserContext::NotifyWillBeDestroyed(this);
ShutdownStoragePartitions();
BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
this);
content::GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE,
resource_context_.release());
}
base::FilePath WebviewBrowserContext::GetPath() {
return base::FilePath();

@ -9,6 +9,7 @@
#include "chromecast/base/chromecast_switches.h"
#include "chromecast/browser/cast_browser_process.h"
#include "chromecast/browser/extensions/cast_extension_system_factory.h"
#include "chromecast/browser/webview/webview_browser_context.h"
#include "chromecast/browser/webview/webview_controller.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "content/public/browser/render_widget_host_view.h"
@ -134,6 +135,31 @@ IN_PROC_BROWSER_TEST_F(WebviewTest, Navigate) {
RunMessageLoop();
}
IN_PROC_BROWSER_TEST_F(WebviewTest, Incognito) {
auto check = [](const std::unique_ptr<webview::WebviewResponse>& response) {
return response->has_page_event() &&
response->page_event().current_page_state() ==
webview::AsyncPageEvent_State_LOADED;
};
EXPECT_CALL(client_, EnqueueSend(_)).Times(testing::AnyNumber());
EXPECT_CALL(client_, EnqueueSend(Truly(check)))
.Times(testing::AtLeast(1))
.WillOnce([this](std::unique_ptr<webview::WebviewResponse> response) {
Quit();
});
std::unique_ptr<content::BrowserContext> owned_context =
std::make_unique<WebviewBrowserContext>(context_.get());
WebviewController webview(std::move(owned_context), &client_, true);
GURL test_url = embedded_test_server()->GetURL("foo.com", "/test");
webview::WebviewRequest nav;
nav.mutable_navigate()->set_url(test_url.spec());
webview.ProcessRequest(nav);
RunMessageLoop();
}
IN_PROC_BROWSER_TEST_F(WebviewTest, SetInsets) {
// Webview creation sends messages to the client (eg: accessibility ID).
EXPECT_CALL(client_, EnqueueSend(_)).Times(testing::AnyNumber());

@ -60,6 +60,14 @@ void UpdateWebkitPreferences(content::WebContents* web_contents,
} // namespace
WebviewController::WebviewController(
std::unique_ptr<content::BrowserContext> browser_context,
Client* client,
bool enabled_for_dev)
: WebviewController(browser_context.get(), client, enabled_for_dev) {
owned_context_ = std::move(browser_context);
}
WebviewController::WebviewController(content::BrowserContext* browser_context,
Client* client,
bool enabled_for_dev)

@ -39,6 +39,9 @@ class WebviewController : public CastWebContents::Delegate,
WebviewController(content::BrowserContext* browser_context,
Client* client,
bool enabled_for_dev);
WebviewController(std::unique_ptr<content::BrowserContext> browser_context,
Client* client,
bool enabled_for_dev);
~WebviewController() override;
// Returns a navigation throttle for the current navigation request, if one is
@ -88,6 +91,10 @@ class WebviewController : public CastWebContents::Delegate,
// content::WebContentsObserver
void DidFirstVisuallyNonEmptyPaint() override;
// BrowserContext instances must outlive their WebContents, so destroy this
// last.
std::unique_ptr<content::BrowserContext> owned_context_;
const bool enabled_for_dev_;
std::unique_ptr<content::WebContents> contents_;
std::unique_ptr<CastWebContents> cast_web_contents_;

@ -65,12 +65,13 @@ void WebviewRpcInstance::CreateWebview(int app_id,
content::BrowserContext* browser_context =
shell::CastBrowserProcess::GetInstance()->browser_context();
if (incognito) {
incognito_context_ =
std::make_unique<WebviewBrowserContext>(browser_context);
browser_context = incognito_context_.get();
controller_ = std::make_unique<WebviewController>(
std::make_unique<WebviewBrowserContext>(browser_context), this,
enabled_for_dev_);
} else {
controller_ = std::make_unique<WebviewController>(browser_context, this,
enabled_for_dev_);
}
controller_ = std::make_unique<WebviewController>(browser_context, this,
enabled_for_dev_);
// Begin reading again.
io_.Read(request_.get(), &read_callback_);

@ -9,8 +9,6 @@
namespace chromecast {
class WebviewBrowserContext;
class WebviewRpcInstance : public PlatformViewsRpcInstance {
public:
WebviewRpcInstance(webview::PlatformViewsService::AsyncService* service,
@ -28,7 +26,6 @@ class WebviewRpcInstance : public PlatformViewsRpcInstance {
void CreateWebview(int app_id, int window_id, bool incognito);
webview::PlatformViewsService::AsyncService* platform_views_service_;
bool enabled_for_dev_ = false;
std::unique_ptr<WebviewBrowserContext> incognito_context_;
DISALLOW_COPY_AND_ASSIGN(WebviewRpcInstance);
};