1 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
2  * Any copyright is dedicated to the Public Domain.
3    http://creativecommons.org/publicdomain/zero/1.0/ */
4 
5 package org.mozilla.geckoview.test
6 
7 import androidx.test.filters.MediumTest
8 import androidx.test.ext.junit.runners.AndroidJUnit4
9 import org.hamcrest.Matchers
10 import org.junit.Test
11 import org.junit.runner.RunWith
12 import org.mozilla.geckoview.GeckoSessionSettings
13 
14 @RunWith(AndroidJUnit4::class)
15 @MediumTest
16 class PrivateModeTest : BaseSessionTest() {
17     @Test
privateDataNotSharednull18     fun privateDataNotShared() {
19         mainSession.loadUri("https://example.com")
20         mainSession.waitForPageStop()
21 
22         mainSession.evaluateJS("""
23             localStorage.setItem('ctx', 'regular');
24         """)
25 
26         val privateSession = sessionRule.createOpenSession(
27                 GeckoSessionSettings.Builder(mainSession.settings)
28                         .usePrivateMode(true)
29                         .build())
30         privateSession.loadUri("https://example.com")
31         privateSession.waitForPageStop()
32         var localStorage = privateSession.evaluateJS("""
33             localStorage.getItem('ctx') || 'null'
34         """) as String
35 
36         // Ensure that the regular session's data hasn't leaked into the private session.
37         assertThat("Private mode local storage value should be empty",
38                 localStorage,
39                 Matchers.equalTo("null"))
40 
41         privateSession.evaluateJS("""
42             localStorage.setItem('ctx', 'private');
43         """)
44 
45         localStorage = mainSession.evaluateJS("""
46             localStorage.getItem('ctx') || 'null'
47         """) as String
48 
49         // Conversely, ensure private data hasn't leaked into the regular session.
50         assertThat("Regular mode storage value should be unchanged",
51                 localStorage,
52                 Matchers.equalTo("regular"))
53     }
54 
55     @Test
privateModeStorageSharednull56     fun privateModeStorageShared() {
57         // Two private mode sessions should share the same storage (bug 1533406).
58         val privateSession1 = sessionRule.createOpenSession(
59                 GeckoSessionSettings.Builder(mainSession.settings)
60                         .usePrivateMode(true)
61                         .build())
62         privateSession1.loadUri("https://example.com")
63         privateSession1.waitForPageStop()
64 
65         privateSession1.evaluateJS("""
66             localStorage.setItem('ctx', 'private');
67         """)
68 
69         val privateSession2 = sessionRule.createOpenSession(
70                 GeckoSessionSettings.Builder(mainSession.settings)
71                         .usePrivateMode(true)
72                         .build())
73         privateSession2.loadUri("https://example.com")
74         privateSession2.waitForPageStop()
75 
76         val localStorage = privateSession2.evaluateJS("""
77             localStorage.getItem('ctx') || 'null'
78         """) as String
79 
80         assertThat("Private mode storage value still set",
81                 localStorage,
82                 Matchers.equalTo("private"))
83     }
84 }
85