Skip to content

Commit

Permalink
Separate ambient badge logic from app_banner_manager_android
Browse files Browse the repository at this point in the history
Most of them are isolated from other part of the banner logic, so move
to its own class to make it easier to understand.

Test: AppBannerManagerTest.java

Bug: 1425546

Change-Id: I2da4257256dfe6273700b631608e0d171efc7d71
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4298232
Reviewed-by: Rayan Kanso <rayankans@chromium.org>
Commit-Queue: Ella Ge <eirage@chromium.org>
Reviewed-by: Glenn Hartmann <hartmanng@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1120611}
  • Loading branch information
EiraGe authored and Chromium LUCI CQ committed Mar 22, 2023
1 parent 0ccd76b commit 0442a16
Show file tree
Hide file tree
Showing 13 changed files with 566 additions and 225 deletions.
160 changes: 160 additions & 0 deletions chrome/browser/banners/android/ambient_badge_manager_browsetest.cc
@@ -0,0 +1,160 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <string>

#include "base/functional/callback_forward.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/test/base/android/android_browser_test.h"
#include "chrome/test/base/chrome_test_utils.h"
#include "components/site_engagement/content/site_engagement_score.h"
#include "components/site_engagement/content/site_engagement_service.h"
#include "components/webapps/browser/android/ambient_badge_manager.h"
#include "components/webapps/browser/android/app_banner_manager_android.h"
#include "components/webapps/browser/banners/app_banner_settings_helper.h"
#include "components/webapps/browser/installable/installable_data.h"
#include "content/public/test/browser_test.h"
#include "net/base/url_util.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "url/gurl.h"

namespace webapps {

class TestAmbientBadgeManager : public AmbientBadgeManager {
public:
explicit TestAmbientBadgeManager(
content::WebContents* web_contents,
base::WeakPtr<AppBannerManagerAndroid> app_banner_manager)
: AmbientBadgeManager(web_contents, app_banner_manager) {}

TestAmbientBadgeManager(const TestAmbientBadgeManager&) = delete;
TestAmbientBadgeManager& operator=(const TestAmbientBadgeManager&) = delete;

~TestAmbientBadgeManager() override = default;

void WaitForState(State target, base::OnceClosure on_done) {
target_state_ = target;
on_done_ = std::move(on_done);
}

protected:
void UpdateState(State state) override {
AmbientBadgeManager::UpdateState(state);
if (state == target_state_ && on_done_) {
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, std::move(on_done_));
}
}

private:
State target_state_;
base::OnceClosure on_done_;
};

class TestAppBannerManager : public AppBannerManagerAndroid {
public:
explicit TestAppBannerManager(content::WebContents* web_contents)
: AppBannerManagerAndroid(web_contents) {}

TestAppBannerManager(const TestAppBannerManager&) = delete;
TestAppBannerManager& operator=(const TestAppBannerManager&) = delete;

~TestAppBannerManager() override = default;

void WaitForAmbientBadgeState(AmbientBadgeManager::State target,
base::OnceClosure on_done) {
target_badge_state_ = target;
on_badge_done_ = std::move(on_done);
}

TestAmbientBadgeManager* GetBadgeManagerForTest() {
return ambient_badge_test_.get();
}

protected:
void MaybeShowAmbientBadge() override {
ambient_badge_test_ = std::make_unique<TestAmbientBadgeManager>(
web_contents(), GetAndroidWeakPtr());

ambient_badge_test_->WaitForState(target_badge_state_,
std::move(on_badge_done_));
ambient_badge_test_->MaybeShow(
validated_url_, GetAppName(),
CreateAddToHomescreenParams(InstallableMetrics::GetInstallSource(
web_contents(), InstallTrigger::AMBIENT_BADGE)),
base::BindOnce(&AppBannerManagerAndroid::ShowBannerFromBadge,
AppBannerManagerAndroid::GetAndroidWeakPtr()));
}

void OnDidPerformWorkerCheckForAmbientBadge(
const InstallableData& data) override {
if (ambient_badge_test_) {
ambient_badge_test_->OnWorkerCheckResult(data);
}
}

private:
std::unique_ptr<TestAmbientBadgeManager> ambient_badge_test_;
AmbientBadgeManager::State target_badge_state_;
base::OnceClosure on_badge_done_;
};

class AmbientBadgeManagerBrowserTest : public AndroidBrowserTest {
public:
AmbientBadgeManagerBrowserTest() = default;

AmbientBadgeManagerBrowserTest(const AmbientBadgeManagerBrowserTest&) =
delete;
AmbientBadgeManagerBrowserTest& operator=(
const AmbientBadgeManagerBrowserTest&) = delete;

~AmbientBadgeManagerBrowserTest() override = default;

void SetUpOnMainThread() override {
ASSERT_TRUE(embedded_test_server()->Start());
site_engagement::SiteEngagementScore::SetParamValuesForTesting();

AndroidBrowserTest::SetUpOnMainThread();
}

protected:
content::WebContents* web_contents() {
return chrome_test_utils::GetActiveWebContents(this);
}

Profile* profile() {
return Profile::FromBrowserContext(web_contents()->GetBrowserContext());
}

void RunTest(const GURL& url, AmbientBadgeManager::State expected_state) {
site_engagement::SiteEngagementService* service =
site_engagement::SiteEngagementService::Get(
Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
service->ResetBaseScoreForURL(url, 10);

auto app_banner_manager =
std::make_unique<TestAppBannerManager>(web_contents());
base::RunLoop waiter;

app_banner_manager->WaitForAmbientBadgeState(expected_state,
waiter.QuitClosure());
ASSERT_TRUE(content::NavigateToURL(web_contents(), url));

waiter.Run();
}
};

IN_PROC_BROWSER_TEST_F(AmbientBadgeManagerBrowserTest, ShowAmbientBadge) {
RunTest(embedded_test_server()->GetURL("/banners/manifest_test_page.html"),
AmbientBadgeManager::State::SHOWING);
}

IN_PROC_BROWSER_TEST_F(AmbientBadgeManagerBrowserTest, NoServiceWorker) {
RunTest(embedded_test_server()->GetURL(
"/banners/manifest_no_service_worker.html"),
AmbientBadgeManager::State::PENDING_WORKER);
}

} // namespace webapps
2 changes: 2 additions & 0 deletions chrome/test/BUILD.gn
Expand Up @@ -971,6 +971,7 @@ if (is_android) {
"../browser/android/customtabs/tab_interaction_recorder_browsertest.cc",
"../browser/android/historical_tab_saver_browsertest.cc",
"../browser/android/webapk/webapk_icon_hasher_browsertest.cc",
"../browser/banners/android/ambient_badge_manager_browsetest.cc",
"../browser/browsing_data/access_context_audit_browsertest.cc",
"../browser/browsing_data/browsing_data_remover_browsertest_base.cc",
"../browser/browsing_data/browsing_data_remover_browsertest_base.h",
Expand Down Expand Up @@ -1045,6 +1046,7 @@ if (is_android) {
"//components/safe_browsing/content/renderer/phishing_classifier:phishing_classifier",
"//components/safe_browsing/core/common/fbs:client_model",
"//components/safe_browsing/core/common/proto:client_model_proto",
"//components/site_engagement/content:content",
"//components/spellcheck:buildflags",
"//components/spellcheck/renderer:renderer",
"//components/user_manager:user_manager",
Expand Down
2 changes: 2 additions & 0 deletions components/webapps/browser/BUILD.gn
Expand Up @@ -78,6 +78,8 @@ source_set("browser") {
"android/add_to_homescreen_mediator.h",
"android/add_to_homescreen_params.cc",
"android/add_to_homescreen_params.h",
"android/ambient_badge_manager.cc",
"android/ambient_badge_manager.h",
"android/ambient_badge_metrics.cc",
"android/ambient_badge_metrics.h",
"android/app_banner_manager_android.cc",
Expand Down
2 changes: 1 addition & 1 deletion components/webapps/browser/android/BUILD.gn
Expand Up @@ -69,7 +69,7 @@ generate_jni("webapps_jni_headers") {

java_cpp_enum("webapps_java_enums_srcjar") {
sources = [
"//components/webapps/browser/android/app_banner_manager_android.h",
"//components/webapps/browser/android/ambient_badge_manager.h",
"//components/webapps/browser/banners/app_banner_manager.h",
"//components/webapps/browser/banners/app_banner_settings_helper.h",
"//components/webapps/browser/installable/installable_metrics.h",
Expand Down
Expand Up @@ -11,4 +11,9 @@ namespace webapps {
AddToHomescreenParams::AddToHomescreenParams() = default;
AddToHomescreenParams::~AddToHomescreenParams() = default;

std::string AddToHomescreenParams::GetAppIdentifier() {
return native_app_data.is_null() ? shortcut_info->url.spec()
: native_app_package_name;
}

} // namespace webapps
2 changes: 2 additions & 0 deletions components/webapps/browser/android/add_to_homescreen_params.h
Expand Up @@ -40,6 +40,8 @@ struct AddToHomescreenParams {

AddToHomescreenParams();
~AddToHomescreenParams();

std::string GetAppIdentifier();
};

} // namespace webapps
Expand Down

0 comments on commit 0442a16

Please sign in to comment.