-
Notifications
You must be signed in to change notification settings - Fork 6.6k
/
https_only_mode_controller_client.cc
65 lines (58 loc) · 2.74 KB
/
https_only_mode_controller_client.cc
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
// Copyright 2021 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/ssl/https_only_mode_controller_client.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/interstitials/chrome_settings_page_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ssl/https_only_mode_tab_helper.h"
#include "chrome/browser/ssl/stateful_ssl_host_state_delegate_factory.h"
#include "chrome/common/webui_url_constants.h"
#include "components/security_interstitials/content/settings_page_helper.h"
#include "components/security_interstitials/content/stateful_ssl_host_state_delegate.h"
#include "content/public/browser/web_contents.h"
// static
std::unique_ptr<security_interstitials::MetricsHelper>
HttpsOnlyModeControllerClient::GetMetricsHelper(const GURL& url) {
security_interstitials::MetricsHelper::ReportDetails settings;
settings.metric_prefix = "https_first_mode";
return std::make_unique<security_interstitials::MetricsHelper>(url, settings,
nullptr);
}
HttpsOnlyModeControllerClient::HttpsOnlyModeControllerClient(
content::WebContents* web_contents,
const GURL& request_url)
: SecurityInterstitialControllerClient(
web_contents,
GetMetricsHelper(request_url),
Profile::FromBrowserContext(web_contents->GetBrowserContext())
->GetPrefs(),
g_browser_process->GetApplicationLocale(),
GURL(chrome::kChromeUINewTabURL),
/*settings_page_helper=*/nullptr),
web_contents_(web_contents),
request_url_(request_url) {}
HttpsOnlyModeControllerClient::~HttpsOnlyModeControllerClient() = default;
void HttpsOnlyModeControllerClient::GoBack() {
SecurityInterstitialControllerClient::GoBackAfterNavigationCommitted();
}
void HttpsOnlyModeControllerClient::Proceed() {
Profile* profile =
Profile::FromBrowserContext(web_contents_->GetBrowserContext());
StatefulSSLHostStateDelegate* state =
static_cast<StatefulSSLHostStateDelegate*>(
profile->GetSSLHostStateDelegate());
// StatefulSSLHostStateDelegate can be null during tests.
if (state) {
state->AllowHttpForHost(
request_url_.host(),
web_contents_->GetPrimaryMainFrame()->GetStoragePartition());
}
auto* tab_helper = HttpsOnlyModeTabHelper::FromWebContents(web_contents_);
tab_helper->set_is_navigation_upgraded(false);
tab_helper->set_is_navigation_fallback(true);
web_contents_->GetController().Reload(content::ReloadType::NORMAL, false);
// The failed https navigation will remain as a forward entry, so it needs to
// be removed.
web_contents_->GetController().PruneForwardEntries();
}