Skip to content

Commit c05d7ce

Browse files
mgurgelgithub-actions[bot]
authored andcommitted
Release build 8.4.0 [ci release]
1 parent 099f7ed commit c05d7ce

File tree

9 files changed

+102
-12
lines changed

9 files changed

+102
-12
lines changed

CHANGELOG.txt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1 @@
1-
- Workflow actions update (#325)
2-
- Malicious site protection - Copy review (#319)
3-
- Updated to actions/upload-artifact@v4 (#324)
4-
- Revert "Updated to actions/upload-artifact@v4"
5-
- Updated to actions/upload-artifact@v4
1+
- Malicious website protection - Android support (#300)

build/app/public/js/base.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14009,7 +14009,7 @@
1400914009
tab: Object.assign(
1401014010
{},
1401114011
trackerBlockingData || {},
14012-
{ maliciousSiteStatus: maliciousSiteStatus ?? false },
14012+
{ maliciousSiteStatus: maliciousSiteStatus === void 0 ? null : maliciousSiteStatus },
1401314013
{
1401414014
isPendingUpdates,
1401514015
parentEntity,
@@ -14322,6 +14322,7 @@
1432214322
onChangeConsentManaged: () => onChangeConsentManaged2,
1432314323
onChangeFeatureSettings: () => onChangeFeatureSettings,
1432414324
onChangeLocale: () => onChangeLocale2,
14325+
onChangeMaliciousSiteStatus: () => onChangeMaliciousSiteStatus2,
1432514326
onChangeProtectionStatus: () => onChangeProtectionStatus2,
1432614327
onChangeRequestData: () => onChangeRequestData2,
1432714328
setup: () => setup4
@@ -14340,12 +14341,14 @@
1434014341
var isPendingUpdates2;
1434114342
var parentEntity2;
1434214343
var cookiePromptManagementStatus2 = {};
14344+
var maliciousSiteStatus2;
1434314345
var locale2;
1434414346
var featureSettings;
1434514347
var combineSources2 = () => ({
1434614348
tab: Object.assign(
1434714349
{},
1434814350
trackerBlockingData2 || {},
14351+
{ maliciousSiteStatus: maliciousSiteStatus2 === void 0 ? null : maliciousSiteStatus2 },
1434914352
{
1435014353
isPendingUpdates: isPendingUpdates2,
1435114354
parentEntity: parentEntity2,
@@ -14362,7 +14365,8 @@
1436214365
const isIsProtectedSet = typeof protections2 !== "undefined";
1436314366
const isTrackerBlockingDataSet = typeof trackerBlockingData2 === "object";
1436414367
const isLocaleSet = typeof locale2 === "string";
14365-
if (!isLocaleSet || !isUpgradedHttpsSet || !isIsProtectedSet || !isTrackerBlockingDataSet) {
14368+
const isMaliciousSiteSet = maliciousSiteStatus2 && maliciousSiteStatus2.kind !== void 0;
14369+
if (!isLocaleSet || !isUpgradedHttpsSet || !isIsProtectedSet || !isTrackerBlockingDataSet || !isMaliciousSiteSet) {
1436614370
return;
1436714371
}
1436814372
getBackgroundTabDataPromises2.forEach((resolve) => resolve(combineSources2()));
@@ -14402,6 +14406,16 @@
1440214406
locale2 = parsed.data.locale;
1440314407
channel3?.send("updateTabData", { via: "onChangeLocale" });
1440414408
}
14409+
function onChangeMaliciousSiteStatus2(payload) {
14410+
const parsed = maliciousSiteStatusSchema.safeParse(payload);
14411+
if (!parsed.success) {
14412+
console.error("could not parse incoming data from onChangeMaliciousSiteStatus");
14413+
console.error(parsed.error);
14414+
return;
14415+
}
14416+
maliciousSiteStatus2 = parsed.data;
14417+
resolveInitialRender2();
14418+
}
1440514419
function onChangeFeatureSettings(payload) {
1440614420
const parsed = remoteFeatureSettingsSchema.safeParse(payload);
1440714421
if (!parsed.success) {
@@ -14633,6 +14647,7 @@
1463314647
};
1463414648
window.onChangeProtectionStatus = onChangeProtectionStatus2;
1463514649
window.onChangeLocale = onChangeLocale2;
14650+
window.onChangeMaliciousSiteStatus = onChangeMaliciousSiteStatus2;
1463614651
window.onChangeRequestData = onChangeRequestData2;
1463714652
window.onChangeConsentManaged = onChangeConsentManaged2;
1463814653
window.onChangeFeatureSettings = onChangeFeatureSettings;
@@ -15031,7 +15046,7 @@
1503115046
initialScreen: screen,
1503215047
opener,
1503315048
supportsInvalidCertsImplicitly: platform2.name !== "browser" && platform2.name !== "windows",
15034-
supportsMaliciousSiteWarning: platform2.name === "macos" || platform2.name === "ios",
15049+
supportsMaliciousSiteWarning: platform2.name === "macos" || platform2.name === "ios" || platform2.name === "android",
1503515050
includeToggleOnBreakageForm,
1503615051
randomisedCategories
1503715052
});

integration-tests/android.spec-int.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,56 @@ test.describe('Protections toggle', () => {
5353
toggleFlows((page) => DashboardPage.android(page));
5454
});
5555

56+
test.describe('phishing & malware protection', () => {
57+
test('phishing warning', { tag: '@screenshots' }, async ({ page }) => {
58+
/** @type {DashboardPage} */
59+
const dash = await DashboardPage.android(page);
60+
await dash.addState([testDataStates.phishing]);
61+
await dash.screenshot('phishing-warning.png');
62+
await dash.hasPhishingIcon();
63+
await dash.hasPhishingHeadingText();
64+
await dash.hasPhishingWarningText();
65+
await dash.hasPhishingStatusText();
66+
await dash.connectionLinkDoesntShow();
67+
});
68+
69+
test('malware warning', { tag: '@screenshots' }, async ({ page }) => {
70+
/** @type {DashboardPage} */
71+
const dash = await DashboardPage.android(page);
72+
await dash.addState([testDataStates.malware]);
73+
await dash.screenshot('malware-warning.png');
74+
await dash.hasMalwareIcon();
75+
await dash.hasMalwareHeadingText();
76+
await dash.hasMalwareWarningText();
77+
await dash.hasMalwareStatusText();
78+
await dash.connectionLinkDoesntShow();
79+
});
80+
81+
test('shows report as safe link', async ({ page }) => {
82+
/** @type {DashboardPage} */
83+
const dash = await DashboardPage.android(page);
84+
await dash.addState([testDataStates.malware]);
85+
await dash.clickReportAsSafeLink();
86+
await dash.mocks.calledForReportAsSafeLink('https://privacy-test-pages.site/security/badware/malware.html');
87+
});
88+
89+
test('shows malware help page link', async ({ page }) => {
90+
/** @type {DashboardPage} */
91+
const dash = await DashboardPage.android(page);
92+
await dash.addState([testDataStates.malware]);
93+
await dash.clickMalwareHelpPageLink();
94+
await dash.mocks.calledForHelpPagesLink();
95+
});
96+
97+
test('shows phishing help page link', async ({ page }) => {
98+
/** @type {DashboardPage} */
99+
const dash = await DashboardPage.android(page);
100+
await dash.addState([testDataStates.phishing]);
101+
await dash.clickPhishingHelpPageLink();
102+
await dash.mocks.calledForHelpPagesLink();
103+
});
104+
});
105+
56106
test.describe('breakage form', () => {
57107
test('sends message when breakage form is triggered from primary screen', async ({ page }) => {
58108
/** @type {DashboardPage} */
Loading
Loading

shared/js/browser/android-communication.js

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import {
1111
cookiePromptManagementStatusSchema,
1212
localeSettingsSchema,
13+
maliciousSiteStatusSchema,
1314
protectionsStatusSchema,
1415
remoteFeatureSettingsSchema,
1516
requestDataSchema,
@@ -48,6 +49,9 @@ let isPendingUpdates;
4849
let parentEntity;
4950
const cookiePromptManagementStatus = {};
5051

52+
/** @type {import('../../../schema/__generated__/schema.types').MaliciousSiteStatus} */
53+
let maliciousSiteStatus;
54+
5155
/** @type {string | undefined} */
5256
let locale;
5357

@@ -58,6 +62,7 @@ const combineSources = () => ({
5862
tab: Object.assign(
5963
{},
6064
trackerBlockingData || {},
65+
{ maliciousSiteStatus: maliciousSiteStatus === undefined ? null : maliciousSiteStatus },
6166
{
6267
isPendingUpdates,
6368
parentEntity,
@@ -75,7 +80,8 @@ const resolveInitialRender = function () {
7580
const isIsProtectedSet = typeof protections !== 'undefined';
7681
const isTrackerBlockingDataSet = typeof trackerBlockingData === 'object';
7782
const isLocaleSet = typeof locale === 'string';
78-
if (!isLocaleSet || !isUpgradedHttpsSet || !isIsProtectedSet || !isTrackerBlockingDataSet) {
83+
const isMaliciousSiteSet = maliciousSiteStatus && maliciousSiteStatus.kind !== undefined;
84+
if (!isLocaleSet || !isUpgradedHttpsSet || !isIsProtectedSet || !isTrackerBlockingDataSet || !isMaliciousSiteSet) {
7985
return;
8086
}
8187

@@ -179,6 +185,28 @@ export function onChangeLocale(payload) {
179185
channel?.send('updateTabData', { via: 'onChangeLocale' });
180186
}
181187

188+
/**
189+
* {@inheritDoc common.onChangeMaliciousSiteStatus}
190+
* @type {import("./common.js").onChangeMaliciousSiteStatus}
191+
* @group macOS -> JavaScript Interface
192+
* @example
193+
*
194+
* ```kotlin
195+
* // kotlin
196+
* webView.evaluateJavascript("javascript:onChangeMaliciousSiteStatus(${maliciousSiteStatusJsonString});", null)
197+
* ```
198+
*/
199+
export function onChangeMaliciousSiteStatus(payload) {
200+
const parsed = maliciousSiteStatusSchema.safeParse(payload);
201+
if (!parsed.success) {
202+
console.error('could not parse incoming data from onChangeMaliciousSiteStatus');
203+
console.error(parsed.error);
204+
return;
205+
}
206+
maliciousSiteStatus = parsed.data;
207+
resolveInitialRender();
208+
}
209+
182210
/**
183211
* {@inheritDoc common.onChangeFeatureSettings}
184212
* @type {import("./common.js").onChangeFeatureSettings}
@@ -493,6 +521,7 @@ export function setup(debug) {
493521
};
494522
window.onChangeProtectionStatus = onChangeProtectionStatus;
495523
window.onChangeLocale = onChangeLocale;
524+
window.onChangeMaliciousSiteStatus = onChangeMaliciousSiteStatus;
496525
window.onChangeRequestData = onChangeRequestData;
497526
window.onChangeConsentManaged = onChangeConsentManaged;
498527
window.onChangeFeatureSettings = onChangeFeatureSettings;

shared/js/browser/macos-communication.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ const combineSources = () => ({
7373
tab: Object.assign(
7474
{},
7575
trackerBlockingData || {},
76-
{ maliciousSiteStatus: maliciousSiteStatus ?? false },
76+
{ maliciousSiteStatus: maliciousSiteStatus === undefined ? null : maliciousSiteStatus },
7777
{
7878
isPendingUpdates,
7979
parentEntity,

shared/js/browser/utils/communication-mocks.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export async function mockDataProvider(params) {
5050
window.onChangeLocale?.(state.localeSettings);
5151
window.onChangeRequestData(state.url, { requests: state.requests || [] });
5252

53-
if (platform?.name === 'macos' || platform?.name === 'ios') {
53+
if (platform?.name === 'macos' || platform?.name === 'ios' || platform?.name === 'android') {
5454
window.onChangeMaliciousSiteStatus?.(state.maliciousSiteStatus);
5555
}
5656
}

shared/js/ui/platform-features.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export function createPlatformFeatures(platform) {
5656
initialScreen: screen,
5757
opener,
5858
supportsInvalidCertsImplicitly: platform.name !== 'browser' && platform.name !== 'windows',
59-
supportsMaliciousSiteWarning: platform.name === 'macos' || platform.name === 'ios',
59+
supportsMaliciousSiteWarning: platform.name === 'macos' || platform.name === 'ios' || platform.name === 'android',
6060
includeToggleOnBreakageForm,
6161
randomisedCategories,
6262
});

0 commit comments

Comments
 (0)