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:

committed by
Chromium LUCI CQ

parent
eae0a9ba1a
commit
a0f34f2667
@ -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);
|
||||
};
|
||||
|
Reference in New Issue
Block a user