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 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/passwords/password_manager_navigation_throttle.h"
#include "base/metrics/histogram_macros.h"
#include "base/task/sequenced_task_runner.h"
#include "components/password_manager/core/browser/manage_passwords_referrer.h"
#include "components/password_manager/core/browser/password_manager_constants.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/page_navigator.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_user_data.h"
#include "ui/base/page_transition_types.h"
#include "url/gurl.h"
#include "url/origin.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/password_manager/android/password_manager_launcher_android.h"
#else
#include "chrome/browser/password_manager/chrome_password_manager_client.h"
#endif
namespace {
using content::NavigationHandle;
using content::NavigationThrottle;
using content::NavigationThrottleRegistry;
using content::WebContents;
bool IsTriggeredOnGoogleOwnedUI(NavigationHandle* handle) {
// Only cover cases when the user clicked on a link.
if (!ui::PageTransitionCoreTypeIs(handle->GetPageTransition(),
ui::PAGE_TRANSITION_LINK)) {
return false;
}
// Referrer origin and target URL must match.
if (handle->GetURL() != GURL(password_manager::kManageMyPasswordsURL)) {
return false;
}
url::Origin origin = handle->GetInitiatorOrigin().value_or(url::Origin());
if (origin != url::Origin::Create(GURL(password_manager::kReferrerURL)) &&
origin !=
url::Origin::Create(GURL(password_manager::kManageMyPasswordsURL))) {
return false;
}
return true;
}
} // namespace
PasswordManagerNavigationThrottle::PasswordManagerNavigationThrottle(
NavigationThrottleRegistry& registry)
: NavigationThrottle(registry) {}
PasswordManagerNavigationThrottle::~PasswordManagerNavigationThrottle() =
default;
// static
void PasswordManagerNavigationThrottle::MaybeCreateAndAdd(
NavigationThrottleRegistry& registry) {
// Don't handle navigations in subframes or main frames that are in a nested
// frame tree (e.g. fenced frames)
auto& handle = registry.GetNavigationHandle();
if (!handle.GetParentFrameOrOuterDocument() &&
IsTriggeredOnGoogleOwnedUI(&handle)) {
registry.AddThrottle(
std::make_unique<PasswordManagerNavigationThrottle>(registry));
}
}
NavigationThrottle::ThrottleCheckResult
PasswordManagerNavigationThrottle::WillStartRequest() {
WebContents* web_contents = navigation_handle()->GetWebContents();
if (!web_contents) {
return NavigationThrottle::PROCEED;
}
#if BUILDFLAG(IS_ANDROID)
password_manager_launcher::ShowPasswordSettings(
web_contents,
password_manager::ManagePasswordsReferrer::kPasswordsGoogleWebsite,
/*manage_passkeys=*/false);
#else
ChromePasswordManagerClient::FromWebContents(web_contents)
->NavigateToManagePasswordsPage(
password_manager::ManagePasswordsReferrer::kPasswordsGoogleWebsite);
#endif
// Schedule a task to close current tab since on Android Password Manager is
// shown in the Native UI, and on desktop NavigateToManagePasswordsPage()
// handles creation or redirection to Passwords Manager tab.
base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE,
base::BindOnce(&content::WebContents::Close, web_contents->GetWeakPtr()));
return NavigationThrottle::CANCEL_AND_IGNORE;
}
const char* PasswordManagerNavigationThrottle::GetNameForLogging() {
return "PasswordManagerNavigationThrottle";
}
|