Commit 60c37f21 authored by Andrey Zaytsev's avatar Andrey Zaytsev Committed by Commit Bot

Safety check: fixed browser crash due to a WebUI update check callback after...

Safety check: fixed browser crash due to a WebUI update check callback after OnJavascriptDisallowed()

Bug: 1062566, 1015841
Change-Id: I8990125168e05ec9a04ee8b282a46214c48f7de8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2107548Reviewed-by: default avatarEsmael Elmoslimany <aee@chromium.org>
Commit-Queue: Andrey Zaytsev <andzaytsev@google.com>
Auto-Submit: Andrey Zaytsev <andzaytsev@google.com>
Cr-Commit-Position: refs/heads/master@{#751480}
parent b68b60e3
...@@ -527,6 +527,9 @@ void SafetyCheckHandler::OnJavascriptDisallowed() { ...@@ -527,6 +527,9 @@ void SafetyCheckHandler::OnJavascriptDisallowed() {
// another safety check is started. Otherwise |observed_leak_check_| // another safety check is started. Otherwise |observed_leak_check_|
// automatically calls RemoveAll() on destruction. // automatically calls RemoveAll() on destruction.
observed_leak_check_.RemoveAll(); observed_leak_check_.RemoveAll();
// Destroy the version updater to prevent getting a callback and firing a
// WebUI event, which would cause a crash.
version_updater_.reset();
} }
void SafetyCheckHandler::RegisterMessages() { void SafetyCheckHandler::RegisterMessages() {
......
...@@ -91,6 +91,11 @@ class SafetyCheckHandler ...@@ -91,6 +91,11 @@ class SafetyCheckHandler
extensions::ExtensionPrefs* extension_prefs, extensions::ExtensionPrefs* extension_prefs,
extensions::ExtensionServiceInterface* extension_service); extensions::ExtensionServiceInterface* extension_service);
void SetVersionUpdaterForTesting(
std::unique_ptr<VersionUpdater> version_updater) {
version_updater_ = std::move(version_updater);
}
private: private:
// These ensure integers are passed in the correct possitions in the extension // These ensure integers are passed in the correct possitions in the extension
// check methods. // check methods.
......
...@@ -52,6 +52,7 @@ class TestingSafetyCheckHandler : public SafetyCheckHandler { ...@@ -52,6 +52,7 @@ class TestingSafetyCheckHandler : public SafetyCheckHandler {
using SafetyCheckHandler::AllowJavascript; using SafetyCheckHandler::AllowJavascript;
using SafetyCheckHandler::DisallowJavascript; using SafetyCheckHandler::DisallowJavascript;
using SafetyCheckHandler::set_web_ui; using SafetyCheckHandler::set_web_ui;
using SafetyCheckHandler::SetVersionUpdaterForTesting;
TestingSafetyCheckHandler( TestingSafetyCheckHandler(
std::unique_ptr<VersionUpdater> version_updater, std::unique_ptr<VersionUpdater> version_updater,
...@@ -66,6 +67,21 @@ class TestingSafetyCheckHandler : public SafetyCheckHandler { ...@@ -66,6 +67,21 @@ class TestingSafetyCheckHandler : public SafetyCheckHandler {
extension_service) {} extension_service) {}
}; };
class TestDestructionVersionUpdater : public TestVersionUpdater {
public:
~TestDestructionVersionUpdater() override { destructor_invoked_ = true; }
void CheckForUpdate(const StatusCallback& callback,
const PromoteCallback&) override {}
static bool GetDestructorInvoked() { return destructor_invoked_; }
private:
static bool destructor_invoked_;
};
bool TestDestructionVersionUpdater::destructor_invoked_ = false;
class TestPasswordsDelegate : public extensions::TestPasswordsPrivateDelegate { class TestPasswordsDelegate : public extensions::TestPasswordsPrivateDelegate {
public: public:
void SetBulkLeakCheckService( void SetBulkLeakCheckService(
...@@ -408,6 +424,15 @@ TEST_F(SafetyCheckHandlerTest, CheckUpdates_Failed) { ...@@ -408,6 +424,15 @@ TEST_F(SafetyCheckHandlerTest, CheckUpdates_Failed) {
"Browser update problems and failed updates.</a>"); "Browser update problems and failed updates.</a>");
} }
TEST_F(SafetyCheckHandlerTest, CheckUpdates_DestroyedOnJavascriptDisallowed) {
EXPECT_FALSE(TestDestructionVersionUpdater::GetDestructorInvoked());
safety_check_->SetVersionUpdaterForTesting(
std::make_unique<TestDestructionVersionUpdater>());
safety_check_->PerformSafetyCheck();
safety_check_->DisallowJavascript();
EXPECT_TRUE(TestDestructionVersionUpdater::GetDestructorInvoked());
}
TEST_F(SafetyCheckHandlerTest, CheckSafeBrowsing_Enabled) { TEST_F(SafetyCheckHandlerTest, CheckSafeBrowsing_Enabled) {
Profile::FromWebUI(&test_web_ui_) Profile::FromWebUI(&test_web_ui_)
->GetPrefs() ->GetPrefs()
...@@ -520,6 +545,10 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_InterruptedAndRefreshed) { ...@@ -520,6 +545,10 @@ TEST_F(SafetyCheckHandlerTest, CheckPasswords_InterruptedAndRefreshed) {
// The check gets interrupted and the page is refreshed. // The check gets interrupted and the page is refreshed.
safety_check_->DisallowJavascript(); safety_check_->DisallowJavascript();
safety_check_->AllowJavascript(); safety_check_->AllowJavascript();
// Need to set the |TestVersionUpdater| instance again to prevent
// |PerformSafetyCheck()| from creating a real |VersionUpdater| instance.
safety_check_->SetVersionUpdaterForTesting(
std::make_unique<TestVersionUpdater>());
// Another run of the safety check. // Another run of the safety check.
safety_check_->PerformSafetyCheck(); safety_check_->PerformSafetyCheck();
test_leak_service_->set_state_and_notify( test_leak_service_->set_state_and_notify(
......
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