| // 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. |
| |
| #ifndef CHROME_BROWSER_COMPOSE_COMPOSE_ENABLING_H_ |
| #define CHROME_BROWSER_COMPOSE_COMPOSE_ENABLING_H_ |
| |
| #include <memory> |
| |
| #include "base/functional/callback_helpers.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/types/expected.h" |
| #include "chrome/browser/compose/proto/compose_optimization_guide.pb.h" |
| #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" |
| #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "components/autofill/core/common/aliases.h" |
| #include "components/compose/core/browser/compose_metrics.h" |
| #include "components/optimization_guide/core/model_execution/settings_enabled_observer.h" |
| #include "components/signin/public/identity_manager/identity_manager.h" |
| #include "components/translate/core/browser/translate_manager.h" |
| #include "content/public/browser/context_menu_params.h" |
| #include "content/public/browser/render_frame_host.h" |
| |
| namespace compose { |
| |
| enum class ComposeNudgeDenyReason { |
| kSavedStateNotificationDisabled = 0, |
| kSavedStateNudgeDisabled = 1, |
| // The proactive nudge could have shown but was disabled by preference or |
| // config values. |
| kProactiveNudgeDisabled = 2, |
| // The proactive nudge can not be shown for this user, page, or field. |
| kProactiveNudgeBlocked = 3, |
| }; |
| |
| } // namespace compose |
| |
| class ComposeEnabling { |
| public: |
| using ScopedOverride = std::unique_ptr<base::ScopedClosureRunner>; |
| |
| explicit ComposeEnabling( |
| Profile* profile, |
| signin::IdentityManager* identity_manager, |
| OptimizationGuideKeyedService* opt_guide); |
| ~ComposeEnabling(); |
| |
| ComposeEnabling(const ComposeEnabling&) = delete; |
| ComposeEnabling& operator=(const ComposeEnabling&) = delete; |
| |
| // Static method that verifies that the feature can be enabled on the given |
| // profile. Doesn't take advantage of test opt_guide or identity_manager, |
| // use member function version if you need to mock them out. |
| static bool IsEnabledForProfile(Profile* profile); |
| |
| // Static method that verifies that the feature can be visible in settings for |
| // the given profile even if the feature is disabled by policy. Doesn't take |
| // advantage of test opt_guide or identity_manager, use member function |
| // version if you need to mock them out. |
| static bool IsSettingVisible(Profile* profile); |
| |
| // Instance method that verifies that the feature can be enabled for the |
| // profile associated with this instance upon construction. |
| base::expected<void, compose::ComposeShowStatus> IsEnabled(); |
| |
| // The following methods allow overriding is-enabled checks to facilitate |
| // testing. The returned instances must be kept in scope while the override |
| // is required. When they go out of scope, the override is reverted. If |
| // multiple overrides are created, the override is reverted only when all |
| // instances are destroyed. These implementations are not multi-thread safe. |
| static ScopedOverride ScopedEnableComposeForTesting(); |
| static ScopedOverride ScopedSkipUserCheckForTesting(); |
| // VariationsService is not available for unit tests, hence the need for this |
| // override method. Browser tests are recommended to use |
| // VariationsService::OverrideStoredPermanentCountry because it exercises a |
| // code path closer to the runtime one. |
| static ScopedOverride OverrideCountryForTesting(std::string country_code); |
| |
| base::expected<void, compose::ComposeShowStatus> ShouldTriggerNoStatePopup( |
| std::string_view autocomplete_attribute, |
| bool writingsuggestions_attribute, |
| Profile* profile, |
| PrefService* prefs, |
| translate::TranslateManager* translate_manager, |
| const url::Origin& top_level_frame_origin, |
| const url::Origin& element_frame_origin, |
| GURL url, |
| bool is_msbb_enabled); |
| |
| bool ShouldTriggerSavedStatePopup( |
| autofill::AutofillSuggestionTriggerSource trigger_source); |
| |
| bool ShouldTriggerContextMenu(Profile* profile, |
| translate::TranslateManager* translate_manager, |
| content::RenderFrameHost* rfh, |
| content::ContextMenuParams& params); |
| |
| compose::ComposeHintDecision GetOptimizationGuidanceForUrl(const GURL& url, |
| Profile* profile); |
| |
| // Checks if the page assessed language is supported by Compose. |
| bool IsPageLanguageSupported(translate::TranslateManager* translate_manager); |
| |
| private: |
| base::expected<void, compose::ComposeShowStatus> PageLevelChecks( |
| translate::TranslateManager* translate_manager, |
| GURL url, |
| const url::Origin& top_level_frame_origin, |
| const url::Origin& element_frame_origin, |
| bool is_newsted_within_fenced_frame); |
| |
| static base::expected<void, compose::ComposeShowStatus> CheckEnabling( |
| OptimizationGuideKeyedService* opt_guide, |
| signin::IdentityManager* identity_manager); |
| |
| raw_ptr<Profile> profile_; |
| raw_ptr<OptimizationGuideKeyedService> opt_guide_; |
| raw_ptr<signin::IdentityManager> identity_manager_; |
| |
| static int enabled_for_testing_; |
| static int skip_user_check_for_testing_; |
| }; |
| |
| #endif // CHROME_BROWSER_COMPOSE_COMPOSE_ENABLING_H_ |