1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/memory/raw_ptr.h"
#include "base/run_loop.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/common/chrome_features.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/content_settings/core/common/pref_names.h"
#include "components/infobars/content/content_infobar_manager.h"
#include "components/permissions/permission_request_manager.h"
#include "components/permissions/request_type.h"
#include "components/permissions/test/mock_permission_request.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/web_contents.h"
class PermissionPromptAndroidTest : public ChromeRenderViewHostTestHarness {
public:
permissions::PermissionRequestManager* permission_request_manager() {
return permission_request_manager_;
}
private:
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
// Ensure that the test uses the mini-infobar variant.
scoped_feature_list_.InitAndEnableFeature(
features::kQuietNotificationPrompts);
profile()->GetPrefs()->SetBoolean(
prefs::kEnableQuietNotificationPermissionUi, true);
NavigateAndCommit(GURL("http://example.com"));
infobars::ContentInfoBarManager::CreateForWebContents(web_contents());
permissions::PermissionRequestManager::CreateForWebContents(web_contents());
permission_request_manager_ =
permissions::PermissionRequestManager::FromWebContents(web_contents());
permission_request_manager_
->set_enabled_app_level_notification_permission_for_testing(true);
}
base::test::ScopedFeatureList scoped_feature_list_;
raw_ptr<permissions::PermissionRequestManager> permission_request_manager_;
};
// Tests the situation in crbug.com/1016233
TEST_F(PermissionPromptAndroidTest, TabCloseMiniInfoBarClosesCleanly) {
// Create a notification request. This causes an infobar to appear.
permissions::MockPermissionRequest::MockPermissionRequestState state;
auto request = std::make_unique<permissions::MockPermissionRequest>(
permissions::RequestType::kNotifications, state.GetWeakPtr());
permission_request_manager()->AddRequest(
web_contents()->GetPrimaryMainFrame(), std::move(request));
base::RunLoop().RunUntilIdle();
// Now remove the infobar from the infobar manager.
infobars::ContentInfoBarManager::FromWebContents(web_contents())
->RemoveAllInfoBars(false);
// At this point close the permission prompt (after the infobar has been
// removed already).
permission_request_manager()->Deny();
// If no DCHECK has been hit, and the infobar has been closed, the test
// passes.
EXPECT_TRUE(state.finished);
}
// Tests the situation in crbug.com/1016233
TEST_F(PermissionPromptAndroidTest, RemoveAllInfoBarsWithOtherObservers) {
// Create a notification request. This causes an infobar to appear.
auto request = std::make_unique<permissions::MockPermissionRequest>(
permissions::RequestType::kNotifications);
permission_request_manager()->AddRequest(
web_contents()->GetPrimaryMainFrame(), std::move(request));
base::RunLoop().RunUntilIdle();
// Destroy web contents. This triggered the situation in crbug.com/1016233, as
// it causes the destruction of the permission prompt after the destruction of
// the infobar manager.
DeleteContents();
// Wait for all the WebContentsObserver's to handle the fact that the
// WebContents has been destroyed.
base::RunLoop().RunUntilIdle();
// If no crash occurs, the test passes.
}
|