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