Firefox privacy notice and legal terms for ToS (Fixes #15872)

This commit is contained in:
Alex Gibson 2025-01-17 12:59:41 +00:00
Родитель f13a56dc7a
Коммит bb6dd6c44b
14 изменённых файлов: 411 добавлений и 18 удалений

Просмотреть файл

@ -0,0 +1,33 @@
{#
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at https://mozilla.org/MPL/2.0/.
#}
{% extends "legal/docs-base.html" %}
{% block page_title %}{{ ftl('legal-firefox-rights') }}{% endblock %}
{% block site_css %}
{% if switch('m24-website-refresh') %}
{{ css_bundle('m24-root') }}
{% endif %}
{{ css_bundle('protocol-firefox') }}
{% endblock %}
{% block page_css %}
{{ css_bundle('legal-terms-firefox-tos') }}
{% endblock %}
{% block site_header %}{% endblock %}
{% block side_nav %}{% endblock %}
{# disable GA on Fx Privacy Notice. Bug 1576673 #}
{% block google_analytics %}{% endblock %}
{% block glean %}{% endblock %}
{# Exclude stub attribution for in-product pages: issus 9620 #}
{% block stub_attribution %}{% endblock %}
{% block site_footer %}{% endblock %}

Просмотреть файл

@ -0,0 +1,32 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from unittest.mock import patch
from django.http import HttpResponse
from django.test.client import RequestFactory
from bedrock.legal import views
from bedrock.legal_docs import views as legal_docs_views
from bedrock.mozorg.tests import TestCase
@patch("bedrock.firefox.views.l10n_utils.render", return_value=HttpResponse())
@patch.object(legal_docs_views, "load_legal_doc")
class TestFirefoxTermsOfServiceDocView(TestCase):
def test_default_template(self, render_mock, lld_mock):
req = RequestFactory().get("/about/legal/terms/firefox/")
req.locale = "en-US"
view = views.FirefoxTermsOfServiceDocView.as_view()
view(req)
template = lld_mock.call_args[0][1]
assert template == "legal/terms/firefox.html"
def test_tos_template(self, render_mock, lld_mock):
req = RequestFactory().get("/about/legal/terms/firefox/?v=product")
req.locale = "en-US"
view = views.FirefoxTermsOfServiceDocView.as_view()
view(req)
template = lld_mock.call_args[0][1]
assert template == "legal/terms/firefox-tos.html"

Просмотреть файл

@ -28,7 +28,7 @@ urlpatterns = (
page("terms/builders-challenge/", "legal/terms/builders-challenge.html"),
path(
"terms/firefox/",
LegalDocView.as_view(template_name="legal/terms/firefox.html", legal_doc_name="firefox_about_rights"),
views.FirefoxTermsOfServiceDocView.as_view(legal_doc_name="firefox_about_rights"),
name="legal.terms.firefox",
),
path(

Просмотреть файл

@ -10,6 +10,7 @@ from django.views.decorators.csrf import csrf_protect
from bedrock.base.urlresolvers import reverse
from bedrock.legal.forms import FraudReportForm
from bedrock.legal_docs.views import LegalDocView
from lib import l10n_utils
FRAUD_REPORT_EMAIL_FROM = settings.DEFAULT_FROM_EMAIL
@ -17,6 +18,17 @@ FRAUD_REPORT_EMAIL_SUBJECT = "New trademark infringement report: %s; %s"
FRAUD_REPORT_EMAIL_TO = ["trademarks@mozilla.com"]
class FirefoxTermsOfServiceDocView(LegalDocView):
def get_template_names(self):
variant = self.request.GET.get("v", None)
template_name = "legal/terms/firefox.html"
if variant == "product":
template_name = "legal/terms/firefox-tos.html"
return [template_name]
def submit_form(request, form):
form_submitted = True

Просмотреть файл

@ -71,10 +71,12 @@
{% endif %}
{% endblock %}
</main>
<aside class="mzp-l-sidebar">
{{ sidemenu_lists([navigation_bar], body_id) }}
{% block side_extra %}{% endblock %}
</aside>
{% block sidemenu %}
<aside class="mzp-l-sidebar">
{{ sidemenu_lists([navigation_bar], body_id) }}
{% block side_extra %}{% endblock %}
</aside>
{% endblock %}
</div>
{% endblock %}

Просмотреть файл

@ -1,10 +0,0 @@
{#
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at https://mozilla.org/MPL/2.0/.
#}
{% extends "privacy/notices/base-notice-paragraphs.html" %}
{# disable GA on Fx Privacy Notice. Bug 1576673 #}
{% block google_analytics %}{% endblock %}

Просмотреть файл

@ -0,0 +1,40 @@
{#
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at https://mozilla.org/MPL/2.0/.
#}
{% extends "privacy/notices/base-notice-headings.html" %}
{% block site_css %}
{% if switch('m24-website-refresh') %}
{{ css_bundle('m24-root') }}
{% endif %}
{{ css_bundle('protocol-firefox') }}
{% endblock %}
{% block page_css %}
{{ css_bundle('privacy_firefox_tos') }}
{% endblock %}
{% set body_id = "privacy_tos" %}
{% block site_header %}{% endblock %}
{% block sidemenu %}{% endblock %}
{% block article_header_logo %}{% endblock %}
{% block js %}
{{ super() }}
{{ js_bundle('privacy_firefox') }}
{% endblock %}
{# disable GA on Fx Privacy Notice. Bug 1576673 #}
{% block google_analytics %}{% endblock %}
{% block glean %}{% endblock %}
{# Exclude stub attribution for in-product pages: issus 9620 #}
{% block stub_attribution %}{% endblock %}
{% block site_footer %}{% endblock %}

Просмотреть файл

@ -17,6 +17,7 @@
{# disable GA on Fx Privacy Notice. Bug 1576673 #}
{% block google_analytics %}{% endblock %}
{% block glean %}{% endblock %}
{# Exclude stub attribution for in-product pages: issus 9620 #}
{% block stub_attribution %}{% endblock %}

Просмотреть файл

@ -0,0 +1,3 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.

Просмотреть файл

@ -0,0 +1,31 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from unittest.mock import patch
from django.http import HttpResponse
from django.test.client import RequestFactory
from bedrock.mozorg.tests import TestCase
from bedrock.privacy import views
@patch("bedrock.firefox.views.l10n_utils.render", return_value=HttpResponse())
@patch.object(views.PrivacyDocView, "get_legal_doc")
class TestFirefoxTermsOfServiceDocView(TestCase):
def test_default_template(self, render_mock, lld_mock):
req = RequestFactory().get("/privacy/notices/firefox/")
req.locale = "en-US"
view = views.firefox_notices
view(req)
template = lld_mock.call_args[0][1]
assert template == "privacy/notices/firefox.html"
def test_tos_template(self, render_mock, lld_mock):
req = RequestFactory().get("/privacy/notices/firefox/?v=product")
req.locale = "en-US"
view = views.firefox_notices
view(req)
template = lld_mock.call_args[0][1]
assert template == "privacy/notices/firefox-tos.html"

Просмотреть файл

@ -40,10 +40,13 @@ class PrivacyDocView(LegalDocView):
class FirefoxPrivacyDocView(PrivacyDocView):
def get_legal_doc(self):
doc = super().get_legal_doc()
if len(doc["content"].select(".privacy-header-firefox")) > 0:
self.template_name = "privacy/notices/firefox.html"
variant = self.request.GET.get("v", None)
if variant == "product":
self.template_name = "privacy/notices/firefox-tos.html"
else:
self.template_name = "privacy/notices/firefox-old-style-notice.html"
self.template_name = "privacy/notices/firefox.html"
return doc

Просмотреть файл

@ -0,0 +1,48 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
@use '~@mozilla-protocol/core/protocol/css/includes/lib' as *;
// narrow top / bottom padding for modal display
#outer-wrapper > .mzp-l-content {
padding-bottom: $spacing-xl;
padding-top: $spacing-xl;
}
// narrow max-width for readability
@media #{$mq-lg} {
.mzp-l-main {
max-width: 640px;
margin: 0 auto;
}
}
// manual styling for markdown content.
.article-body {
h1 {
@include text-title-sm;
}
h2,
h3,
h4 {
@include text-title-xs;
}
blockquote {
@include text-body-lg;
}
ul {
list-style: disc;
}
ol {
list-style: decimal;
}
li {
margin: $spacing-sm $spacing-lg;
}
}

Просмотреть файл

@ -0,0 +1,186 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
@use '~@mozilla-protocol/core/protocol/css/includes/lib' as *;
@use '~@mozilla-protocol/core/protocol/css/includes/mixins/details';
$border: 2px solid $color-marketing-gray-20;
// narrow top / bottom padding for modal display
#outer-wrapper > .mzp-l-content {
padding-bottom: $spacing-xl;
padding-top: $spacing-xl;
}
// narrow max-width for readability
@media #{$mq-lg} {
.mzp-l-main {
max-width: 640px;
margin: 0 auto;
}
}
// * -------------------------------------------------------------------------- */
// Policy header
.privacy-title {
margin-bottom: $spacing-lg;
h1 {
@include text-title-xs;
font-weight: bold;
}
a {
color: inherit;
text-decoration: none;
}
}
// * -------------------------------------------------------------------------- */
// Policy header intro
.privacy-lead-in {
border-bottom: $border;
clear: both;
margin-bottom: $layout-sm;
padding-bottom: $layout-xs;
h2 {
@include text-title-xs;
margin-top: $spacing-2xl;
}
}
// * -------------------------------------------------------------------------- */
// Main policy content
.privacy-body {
> div > section > section {
border-bottom: $border;
}
h2 {
@include text-title-xs;
margin-bottom: $layout-sm;
}
h3 {
@include text-body-lg;
margin: $layout-sm 0;
}
h4 {
@include text-body-md;
margin: $layout-sm 0;
}
hr {
display: none;
}
}
// * -------------------------------------------------------------------------- */
// Privacy choices widget
.data-choices {
@include clearfix;
background-color: $color-marketing-gray-20;
border-radius: $border-radius-md;
margin-top: $spacing-xl;
padding: $spacing-sm;
position: relative;
text-align: center;
p {
@include text-body-md;
display: inline-block;
margin: 0;
padding: $spacing-sm 0;
}
.mzp-c-button {
display: block;
margin: $spacing-md auto 0;
}
@media #{$mq-md} {
@include grid-column-gap($spacing-lg);
display: grid;
grid-template-columns: 4fr 1fr;
@include bidi(((text-align, left, right),));
.mzp-c-button {
margin: 0;
}
}
}
// * -------------------------------------------------------------------------- */
// Policy footer
.privacy-footnote {
@include text-body-md;
border-top: $border;
margin-top: $spacing-2xl;
padding: $spacing-2xl 0;
h2 {
@include text-title-xs;
}
h3 {
@include visually-hidden;
}
}
// * -------------------------------------------------------------------------- */
// Summary and details widget
.format-headings .privacy-body {
@include details;
.is-summary {
button {
@include summary;
@include bidi(((padding-left, 0, padding-right, 0),));
}
button[aria-expanded='true']::before {
@include summary-open;
}
+ div {
margin-top: $spacing-sm * -1;
margin-bottom: $spacing-xl;
}
}
}
.format-paragraphs .privacy-body {
@include details;
.is-summary {
button {
padding: 0;
&::after {
color: $color-link;
content: attr(data-open);
margin-left: 0.5ex;
text-decoration: underline;
}
}
button[aria-expanded='true']::after {
content: attr(data-close);
}
+ div {
margin-top: $spacing-sm * -1;
margin-bottom: $spacing-xl;
}
}
}

Просмотреть файл

@ -267,6 +267,12 @@
],
"name": "legal"
},
{
"files": [
"css/legal/legal-terms-firefox-tos.scss"
],
"name": "legal-terms-firefox-tos"
},
{
"files": [
"css/legal/builders-challenge.scss"
@ -675,6 +681,12 @@
],
"name": "privacy_protocol"
},
{
"files": [
"css/privacy/privacy-firefox-tos.scss"
],
"name": "privacy_firefox_tos"
},
{
"files": [
"css/firefox/facebook-container.scss"