From 93272ab9ec84b4dd90a93fb2aab8ddd94f250d63 Mon Sep 17 00:00:00 2001 From: estark Date: Wed, 25 Mar 2015 16:54:01 -0700 Subject: [PATCH] Add checkbox for reporting invalid TLS/SSL cert chains This is a stub for now; eventually it will report invalid certificate chains on SSL interstitials to a server endpoint. Right now it logs the report but doesn't actually send it anywhere. The checkbox is tied in with Safe Browsing Extended Reporting. BUG=461588 Review URL: https://codereview.chromium.org/935663004 Cr-Commit-Position: refs/heads/master@{#322265} --- chrome/app/generated_resources.grd | 6 + chrome/browser/about_flags.cc | 9 +- chrome/browser/chrome_content_browser_client.cc | 8 +- .../security_interstitial_metrics_helper.cc | 3 + .../security_interstitial_metrics_helper.h | 3 + .../interstitials/security_interstitial_page.cc | 58 ++++++ .../interstitials/security_interstitial_page.h | 24 +++ chrome/browser/net/certificate_error_reporter.cc | 18 +- chrome/browser/net/certificate_error_reporter.h | 14 +- .../net/certificate_error_reporter_unittest.cc | 10 +- .../net/chrome_fraudulent_certificate_reporter.cc | 3 +- ...ome_fraudulent_certificate_reporter_unittest.cc | 5 +- .../security_warnings/extended_reporting.js | 40 +++++ .../security_warnings/interstitial_v2.css | 46 +++-- .../security_warnings/interstitial_v2.html | 4 +- .../resources/security_warnings/interstitial_v2.js | 2 +- .../resources/security_warnings/safe_browsing.js | 25 --- chrome/browser/safe_browsing/ping_manager.cc | 33 +++- chrome/browser/safe_browsing/ping_manager.h | 17 ++ .../safe_browsing/safe_browsing_blocking_page.cc | 81 +++------ .../safe_browsing/safe_browsing_blocking_page.h | 8 +- .../safe_browsing_blocking_page_test.cc | 4 +- chrome/browser/safe_browsing/ui_manager.cc | 29 ++- chrome/browser/safe_browsing/ui_manager.h | 16 +- chrome/browser/ssl/ssl_blocking_page.cc | 130 +++++++++++--- chrome/browser/ssl/ssl_blocking_page.h | 24 ++- chrome/browser/ssl/ssl_browser_tests.cc | 198 ++++++++++++++++++++- chrome/browser/ssl/ssl_error_handler.cc | 29 +-- chrome/browser/ssl/ssl_error_handler.h | 6 + chrome/browser/ssl/ssl_error_handler_unittest.cc | 4 +- .../ui/webui/interstitials/interstitial_ui.cc | 10 +- chrome/common/chrome_switches.cc | 3 + chrome/common/chrome_switches.h | 1 + tools/metrics/histograms/histograms.xml | 12 ++ 34 files changed, 707 insertions(+), 176 deletions(-) create mode 100644 chrome/browser/resources/security_warnings/extended_reporting.js delete mode 100644 chrome/browser/resources/security_warnings/safe_browsing.js diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 880876f77040..2893fc744112 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -15826,6 +15826,12 @@ Do you accept? $3Event Description + + Enable opt-in for reporting invalid TLS/SSL certificate chains + + + Allows users to opt in to the collection of invalid TLS/SSL certificate chains. + diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 00e63375d1c9..e3dd1db7debd 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -2269,7 +2269,14 @@ const Experiment kExperiments[] = { IDS_FLAGS_ENABLE_MEDIA_ROUTER_DESCRIPTION, kOsAll, SINGLE_VALUE_TYPE(switches::kEnableMediaRouter) - } + }, + { + "enable-cert-collection", + IDS_ENABLE_INVALID_CERT_COLLECTION, + IDS_ENABLE_INVALID_CERT_COLLECTION_DESCRIPTION, + kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableInvalidCertCollection) + }, // NOTE: Adding new command-line switches requires adding corresponding // entries to enum "LoginCustomFlags" in histograms.xml. See note in diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index c1869b95dda6..12671618756e 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -60,6 +60,7 @@ #include "chrome/browser/push_messaging/push_messaging_permission_context_factory.h" #include "chrome/browser/renderer_host/chrome_render_message_filter.h" #include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" +#include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/instant_service_factory.h" #include "chrome/browser/search/search.h" @@ -1803,8 +1804,13 @@ void ChromeContentBrowserClient::AllowCertificateError( if (expired_previous_decision) options_mask |= SSLBlockingPage::EXPIRED_BUT_PREVIOUSLY_ALLOWED; + SafeBrowsingService* safe_browsing_service = + g_browser_process->safe_browsing_service(); SSLErrorHandler::HandleSSLError( - tab, cert_error, ssl_info, request_url, options_mask, callback); + tab, cert_error, ssl_info, request_url, options_mask, + safe_browsing_service ? safe_browsing_service->ui_manager().get() + : nullptr, + callback); } void ChromeContentBrowserClient::SelectClientCertificate( diff --git a/chrome/browser/interstitials/security_interstitial_metrics_helper.cc b/chrome/browser/interstitials/security_interstitial_metrics_helper.cc index ab2a143492af..433fcab3201f 100644 --- a/chrome/browser/interstitials/security_interstitial_metrics_helper.cc +++ b/chrome/browser/interstitials/security_interstitial_metrics_helper.cc @@ -151,6 +151,9 @@ void SecurityInterstitialMetricsHelper::RecordUserInteraction( case RELOAD: case OPEN_TIME_SETTINGS: case TOTAL_VISITS: + case SET_EXTENDED_REPORTING_ENABLED: + case SET_EXTENDED_REPORTING_DISABLED: + case EXTENDED_REPORTING_IS_ENABLED: case MAX_INTERACTION: break; } diff --git a/chrome/browser/interstitials/security_interstitial_metrics_helper.h b/chrome/browser/interstitials/security_interstitial_metrics_helper.h index 1808852bc987..0224bc9bc62d 100644 --- a/chrome/browser/interstitials/security_interstitial_metrics_helper.h +++ b/chrome/browser/interstitials/security_interstitial_metrics_helper.h @@ -42,6 +42,9 @@ class SecurityInterstitialMetricsHelper { SHOW_LEARN_MORE, RELOAD, OPEN_TIME_SETTINGS, + SET_EXTENDED_REPORTING_ENABLED, + SET_EXTENDED_REPORTING_DISABLED, + EXTENDED_REPORTING_IS_ENABLED, MAX_INTERACTION }; diff --git a/chrome/browser/interstitials/security_interstitial_page.cc b/chrome/browser/interstitials/security_interstitial_page.cc index 1370f1cb811d..3551d1215936 100644 --- a/chrome/browser/interstitials/security_interstitial_page.cc +++ b/chrome/browser/interstitials/security_interstitial_page.cc @@ -5,20 +5,40 @@ #include "chrome/browser/interstitials/security_interstitial_page.h" #include "base/i18n/rtl.h" + +#include "base/metrics/histogram.h" #include "base/prefs/pref_service.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/interstitials/security_interstitial_metrics_helper.h" +#include "chrome/browser/net/referrer.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" #include "chrome/grit/browser_resources.h" +#include "chrome/grit/generated_resources.h" +#include "components/google/core/browser/google_util.h" #include "content/public/browser/interstitial_page.h" +#include "content/public/browser/page_navigator.h" #include "content/public/browser/web_contents.h" #include "net/base/net_util.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/webui/jstemplate_builder.h" #include "ui/base/webui/web_ui_util.h" +namespace interstitials { +const char kBoxChecked[] = "boxchecked"; +const char kDisplayCheckBox[] = "displaycheckbox"; +const char kOptInLink[] = "optInLink"; +const char kPrivacyLinkHtml[] = + "%s"; +} + +using content::OpenURLParams; +using content::Referrer; + SecurityInterstitialPage::SecurityInterstitialPage( content::WebContents* web_contents, const GURL& request_url) @@ -58,6 +78,44 @@ void SecurityInterstitialPage::Show() { interstitial_page_->Show(); } +void SecurityInterstitialPage::SetReportingPreference(bool report) { + Profile* profile = + Profile::FromBrowserContext(web_contents()->GetBrowserContext()); + PrefService* pref = profile->GetPrefs(); + pref->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled, report); + metrics_helper()->RecordUserInteraction( + report + ? SecurityInterstitialMetricsHelper::SET_EXTENDED_REPORTING_ENABLED + : SecurityInterstitialMetricsHelper::SET_EXTENDED_REPORTING_DISABLED); +} + +bool SecurityInterstitialPage::IsPrefEnabled(const char* pref) { + Profile* profile = + Profile::FromBrowserContext(web_contents()->GetBrowserContext()); + return profile->GetPrefs()->GetBoolean(pref); +} + +void SecurityInterstitialPage::OpenExtendedReportingPrivacyPolicy() { + metrics_helper()->RecordUserInteraction( + SecurityInterstitialMetricsHelper::SHOW_PRIVACY_POLICY); + GURL privacy_url( + l10n_util::GetStringUTF8(IDS_SAFE_BROWSING_PRIVACY_POLICY_URL)); + privacy_url = google_util::AppendGoogleLocaleParam( + privacy_url, g_browser_process->GetApplicationLocale()); + OpenURLParams params(privacy_url, Referrer(), CURRENT_TAB, + ui::PAGE_TRANSITION_LINK, false); + web_contents()->OpenURL(params); +} + +SecurityInterstitialMetricsHelper* SecurityInterstitialPage::metrics_helper() { + return metrics_helper_.get(); +} + +void SecurityInterstitialPage::set_metrics_helper( + SecurityInterstitialMetricsHelper* metrics_helper) { + metrics_helper_.reset(metrics_helper); +} + base::string16 SecurityInterstitialPage::GetFormattedHostName() const { std::string languages; Profile* profile = diff --git a/chrome/browser/interstitials/security_interstitial_page.h b/chrome/browser/interstitials/security_interstitial_page.h index d3bf1e22a233..2f1520ed3a9e 100644 --- a/chrome/browser/interstitials/security_interstitial_page.h +++ b/chrome/browser/interstitials/security_interstitial_page.h @@ -18,6 +18,16 @@ class InterstitialPage; class WebContents; } +namespace interstitials { +// Constants used to communicate with the JavaScript. +extern const char kBoxChecked[]; +extern const char kDisplayCheckBox[]; +extern const char kOptInLink[]; +extern const char kPrivacyLinkHtml[]; +} + +class SecurityInterstitialMetricsHelper; + class SecurityInterstitialPage : public content::InterstitialPageDelegate { public: // These represent the commands sent from the interstitial JavaScript. @@ -72,7 +82,21 @@ class SecurityInterstitialPage : public content::InterstitialPageDelegate { content::WebContents* web_contents() const; GURL request_url() const; + // Record the user's preference for reporting information about + // malware and SSL errors. + void SetReportingPreference(bool report); + + // Returns the boolean value of the given |pref| from the PrefService of the + // Profile associated with |web_contents_|. + bool IsPrefEnabled(const char* pref); + + void OpenExtendedReportingPrivacyPolicy(); + + SecurityInterstitialMetricsHelper* metrics_helper(); + void set_metrics_helper(SecurityInterstitialMetricsHelper* metrics_helper); + private: + scoped_ptr metrics_helper_; content::WebContents* web_contents_; const GURL request_url_; // Once shown, |interstitial_page| takes ownership of this diff --git a/chrome/browser/net/certificate_error_reporter.cc b/chrome/browser/net/certificate_error_reporter.cc index 02672068dd7b..65c1e054b4d3 100644 --- a/chrome/browser/net/certificate_error_reporter.cc +++ b/chrome/browser/net/certificate_error_reporter.cc @@ -22,9 +22,11 @@ namespace chrome_browser_net { CertificateErrorReporter::CertificateErrorReporter( net::URLRequestContext* request_context, - const GURL& upload_url) - : request_context_(request_context), upload_url_(upload_url) { - DCHECK(!upload_url.is_empty()); + const GURL& upload_url, + CookiesPreference cookies_preference) + : request_context_(request_context), + upload_url_(upload_url), + cookies_preference_(cookies_preference) { } CertificateErrorReporter::~CertificateErrorReporter() { @@ -34,6 +36,7 @@ CertificateErrorReporter::~CertificateErrorReporter() { void CertificateErrorReporter::SendReport(ReportType type, const std::string& hostname, const net::SSLInfo& ssl_info) { + DCHECK(!upload_url_.is_empty()); CertLoggerRequest request; std::string out; @@ -47,8 +50,7 @@ void CertificateErrorReporter::SendReport(ReportType type, // TODO(estark): Double-check that the user is opted in. // TODO(estark): Temporarily, since this is no upload endpoint, just // log the information. - request.SerializeToString(&out); - DVLOG(3) << "SSL report for " << hostname << ":\n" << out << "\n\n"; + DVLOG(1) << "Would send certificate report for " << hostname; break; default: NOTREACHED(); @@ -76,8 +78,10 @@ scoped_ptr CertificateErrorReporter::CreateURLRequest( net::URLRequestContext* context) { scoped_ptr request = context->CreateRequest(upload_url_, net::DEFAULT_PRIORITY, this); - request->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | - net::LOAD_DO_NOT_SAVE_COOKIES); + if (cookies_preference_ != SEND_COOKIES) { + request->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | + net::LOAD_DO_NOT_SAVE_COOKIES); + } return request.Pass(); } diff --git a/chrome/browser/net/certificate_error_reporter.h b/chrome/browser/net/certificate_error_reporter.h index 5463d5a74bd6..e14f7659eab5 100644 --- a/chrome/browser/net/certificate_error_reporter.h +++ b/chrome/browser/net/certificate_error_reporter.h @@ -36,15 +36,21 @@ class CertificateErrorReporter : public net::URLRequest::Delegate { REPORT_TYPE_EXTENDED_REPORTING }; + // Represents whether or not to send cookies along with reports sent + // to the server. + enum CookiesPreference { SEND_COOKIES, DO_NOT_SEND_COOKIES }; + // Create a certificate error reporter that will send certificate // error reports to |upload_url|, using |request_context| as the - // context for the reports. + // context for the reports. |cookies_preference| controls whether + // cookies will be sent along with the reports. CertificateErrorReporter(net::URLRequestContext* request_context, - const GURL& upload_url); + const GURL& upload_url, + CookiesPreference cookies_preference); ~CertificateErrorReporter() override; - // Construct, serialize, and send a certificate reporter to the report + // Construct, serialize, and send a certificate report to the report // collection server containing the |ssl_info| associated with a // connection to |hostname|. virtual void SendReport(ReportType type, @@ -79,6 +85,8 @@ class CertificateErrorReporter : public net::URLRequest::Delegate { // Owns the contained requests. std::set inflight_requests_; + CookiesPreference cookies_preference_; + DISALLOW_COPY_AND_ASSIGN(CertificateErrorReporter); }; diff --git a/chrome/browser/net/certificate_error_reporter_unittest.cc b/chrome/browser/net/certificate_error_reporter_unittest.cc index 1647776df9ec..843050d19349 100644 --- a/chrome/browser/net/certificate_error_reporter_unittest.cc +++ b/chrome/browser/net/certificate_error_reporter_unittest.cc @@ -201,7 +201,8 @@ void SendReport(TestCertificateErrorReporterNetworkDelegate* network_delegate, network_delegate->set_expected_url(url); network_delegate->ExpectHostname(report_hostname); - CertificateErrorReporter reporter(context, url); + CertificateErrorReporter reporter( + context, url, CertificateErrorReporter::DO_NOT_SEND_COOKIES); EXPECT_EQ(request_sequence_number, network_delegate->num_requests()); @@ -235,7 +236,8 @@ TEST_F(CertificateErrorReporterTest, SendMultipleReportsSimultaneously) { network_delegate()->ExpectHostname(kHostname); network_delegate()->ExpectHostname(kSecondRequestHostname); - CertificateErrorReporter reporter(context(), url); + CertificateErrorReporter reporter( + context(), url, CertificateErrorReporter::DO_NOT_SEND_COOKIES); EXPECT_EQ(0, network_delegate()->num_requests()); @@ -264,8 +266,8 @@ TEST_F(CertificateErrorReporterTest, PendingRequestGetsDeleted) { EXPECT_EQ(0, network_delegate()->num_requests()); - scoped_ptr reporter( - new CertificateErrorReporter(context(), url)); + scoped_ptr reporter(new CertificateErrorReporter( + context(), url, CertificateErrorReporter::DO_NOT_SEND_COOKIES)); reporter->SendReport(CertificateErrorReporter::REPORT_TYPE_PINNING_VIOLATION, kHostname, GetTestSSLInfo()); reporter.reset(); diff --git a/chrome/browser/net/chrome_fraudulent_certificate_reporter.cc b/chrome/browser/net/chrome_fraudulent_certificate_reporter.cc index 2759a97b5374..1c6dd486a5bc 100644 --- a/chrome/browser/net/chrome_fraudulent_certificate_reporter.cc +++ b/chrome/browser/net/chrome_fraudulent_certificate_reporter.cc @@ -25,7 +25,8 @@ ChromeFraudulentCertificateReporter::ChromeFraudulentCertificateReporter( net::URLRequestContext* request_context) : certificate_reporter_(new CertificateErrorReporter( request_context, - GURL(kFraudulentCertificateUploadEndpoint))) { + GURL(kFraudulentCertificateUploadEndpoint), + CertificateErrorReporter::DO_NOT_SEND_COOKIES)) { } ChromeFraudulentCertificateReporter::ChromeFraudulentCertificateReporter( diff --git a/chrome/browser/net/chrome_fraudulent_certificate_reporter_unittest.cc b/chrome/browser/net/chrome_fraudulent_certificate_reporter_unittest.cc index 13aa5ef59ce1..f3ecf4812197 100644 --- a/chrome/browser/net/chrome_fraudulent_certificate_reporter_unittest.cc +++ b/chrome/browser/net/chrome_fraudulent_certificate_reporter_unittest.cc @@ -118,7 +118,10 @@ class NotSendingTestReporter : public TestReporter { class MockReporter : public CertificateErrorReporter { public: explicit MockReporter(net::URLRequestContext* request_context) - : CertificateErrorReporter(request_context, GURL("http://example.com")) {} + : CertificateErrorReporter( + request_context, + GURL("http://example.com"), + CertificateErrorReporter::DO_NOT_SEND_COOKIES) {} void SendReport(ReportType type, const std::string& hostname, diff --git a/chrome/browser/resources/security_warnings/extended_reporting.js b/chrome/browser/resources/security_warnings/extended_reporting.js new file mode 100644 index 000000000000..51b4b21c4f9d --- /dev/null +++ b/chrome/browser/resources/security_warnings/extended_reporting.js @@ -0,0 +1,40 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +// Other constants defined in security_interstitial_page.h. +var SB_BOX_CHECKED = 'boxchecked'; +var SB_DISPLAY_CHECK_BOX = 'displaycheckbox'; + +// This sets up the Extended Safe Browsing Reporting opt-in, either for +// reporting malware or invalid certificate chains. Does nothing if the +// interstitial type is not SAFEBROWSING or SSL. +function setupExtendedReportingCheckbox() { + var interstitialType = loadTimeData.getString('type'); + if (interstitialType != 'SAFEBROWSING' && interstitialType != 'SSL') { + return; + } + + if (!loadTimeData.getBoolean(SB_DISPLAY_CHECK_BOX)) { + return; + } + + $('opt-in-label').innerHTML = loadTimeData.getString('optInLink'); + $('opt-in-checkbox').checked = loadTimeData.getBoolean(SB_BOX_CHECKED); + $('extended-reporting-opt-in').classList.remove('hidden'); + + var className = interstitialType == 'SAFEBROWSING' ? + 'safe-browsing-opt-in' : + 'ssl-opt-in'; + $('extended-reporting-opt-in').classList.add(className); + + $('body').classList.add('extended-reporting-has-checkbox'); + + $('opt-in-checkbox').addEventListener('click', function() { + sendCommand($('opt-in-checkbox').checked ? + CMD_DO_REPORT : + CMD_DONT_REPORT); + }); +} diff --git a/chrome/browser/resources/security_warnings/interstitial_v2.css b/chrome/browser/resources/security_warnings/interstitial_v2.css index ee9a19f33774..ca6750b0bcc2 100644 --- a/chrome/browser/resources/security_warnings/interstitial_v2.css +++ b/chrome/browser/resources/security_warnings/interstitial_v2.css @@ -146,7 +146,7 @@ input[type=checkbox] { display: inline; } -#malware-opt-in { +#extended-reporting-opt-in { font-size: .875em; margin-top: 39px; } @@ -224,7 +224,6 @@ input[type=checkbox] { .styled-checkbox label { background: transparent; - border: white solid 1px; border-radius: 2px; height: 14px; left: 0; @@ -236,9 +235,6 @@ input[type=checkbox] { .styled-checkbox .checkbox-tick { background: transparent; - border: 2px solid white; - border-right-width: 0; - border-top-width: 0; content: ''; height: 4px; left: 2px; @@ -249,6 +245,26 @@ input[type=checkbox] { width: 9px; } +.safe-browsing-opt-in .styled-checkbox label { + border: white solid 1px; +} + +.safe-browsing-opt-in .styled-checkbox .checkbox-tick { + border: white solid 1px; + border-right-width: 0; + border-top-width: 0; +} + +.ssl-opt-in .styled-checkbox label { + border: #696969 solid 1px; +} + +.ssl-opt-in .styled-checkbox .checkbox-tick { + border: #696969 solid 1px; + border-right-width: 0; + border-top-width: 0; +} + .styled-checkbox input[type=checkbox]:checked ~ .checkbox-tick { opacity: 1; } @@ -304,7 +320,7 @@ input[type=checkbox] { padding: 0 5%; } - #malware-opt-in { + #extended-reporting-opt-in { margin-top: 24px; } @@ -442,7 +458,7 @@ input[type=checkbox] { } @media (min-height: 400px) and (orientation:portrait) { - body:not(.safe-browsing-has-checkbox) .interstitial-wrapper { + body:not(.extended-reporting-has-checkbox) .interstitial-wrapper { margin-bottom: 145px; } } @@ -476,7 +492,7 @@ input[type=checkbox] { } @media (min-height: 500px) and (max-width: 414px) and (orientation: portrait) { - :not(.safe-browsing-has-checkbox) .interstitial-wrapper { + :not(.extended-reporting-has-checkbox) .interstitial-wrapper { margin-top: 96px; } } @@ -558,7 +574,7 @@ input[type=checkbox] { margin-top: 0; } - #malware-opt-in { + #extended-reporting-opt-in { margin-top: 0; } } @@ -618,30 +634,30 @@ input[type=checkbox] { } } -/* Malware opt-in. No fixed nav. */ +/* Extended reporting opt-in. No fixed nav. */ @media (max-height: 600px) and (orientation: portrait), (max-height: 360px) and (max-width: 680px) and (orientation: landscape) { - .safe-browsing-has-checkbox .interstitial-wrapper { + .extended-reporting-has-checkbox .interstitial-wrapper { display: flex; flex-direction: column; margin-bottom: 0; } - .safe-browsing-has-checkbox #details { + .extended-reporting-has-checkbox #details { flex: 1 1 auto; order: 0; } - .safe-browsing-has-checkbox #main-content { + .extended-reporting-has-checkbox #main-content { flex: 1 1 auto; order: 0; } - .safe-browsing-has-checkbox #malware-opt-in { + .extended-reporting-has-checkbox #extended-reporting-opt-in { margin-bottom: 8px; } - body.safe-browsing-has-checkbox .nav-wrapper { + body.extended-reporting-has-checkbox .nav-wrapper { flex: 0 1 auto; margin-top: 0; order: 1; diff --git a/chrome/browser/resources/security_warnings/interstitial_v2.html b/chrome/browser/resources/security_warnings/interstitial_v2.html index b06fe1fb7699..a4b7ca9de7e6 100644 --- a/chrome/browser/resources/security_warnings/interstitial_v2.html +++ b/chrome/browser/resources/security_warnings/interstitial_v2.html @@ -9,7 +9,7 @@ - + @@ -25,7 +25,7 @@ -