blob: 2eddd335c65a4c523d51c727fb7a474b840faf0d [file] [log] [blame]
<html>
<script src="media_license.js"></script>
<script>
function isHttps_() {
return location.protocol === 'https:';
}
function setCookie(data = 'foo=bar') {
const samesite_none_secure = '; SameSite=None; Secure';
document.cookie = `${data}; Max-Age=1000` + (isHttps_() ? samesite_none_secure : '');
return true;
}
function setCookieAsync() {
// Provided for Java.
domAutomationController.send(setCookie());
}
function hasCookie() {
return document.cookie.indexOf('foo=bar') != -1;
}
function hasCookieAsync() {
// Provided for Java.
domAutomationController.send(hasCookie());
}
function setSessionCookie() {
const samesite_none_secure = '; SameSite=None; Secure';
document.cookie = 'bar=session' + (isHttps_() ? samesite_none_secure : '');
return true;
}
function hasSessionCookie() {
return document.cookie == 'bar=session';
}
function setCookieStore() {
return cookieStore.set({
name: 'cookie-name', value: 'cookie-value', sameSite: 'none'
})
.then(() => true)
.catch(() => false);
}
function hasCookieStore() {
return cookieStore.get('cookie-name')
.then((cookie) => cookie.value == 'cookie-value')
.catch(() => false);
}
function setLocalStorage() {
try{
localStorage.setItem('foo', 'bar');
return true;
} catch(e){
// Expect false for storage access denied.
if(e.code == DOMException.SECURITY_ERR){
return false;
}
throw e;
}
}
function setLocalStorageAsync() {
// Provided for Java.
domAutomationController.send(setLocalStorage());
}
function hasLocalStorage() {
try {
return localStorage.getItem('foo') == 'bar';
} catch (e) {
return false;
}
}
function hasLocalStorageAsync() {
// Provided for Java.
domAutomationController.send(hasLocalStorage());
}
function setSessionStorage() {
try {
sessionStorage.setItem('foo', 'bar');
return true;
} catch (e) {
// Expect false for storage access denied.
if(e.code == DOMException.SECURITY_ERR){
return false;
}
throw e;
}
}
function hasSessionStorage() {
try {
return sessionStorage.getItem('foo') == 'bar';
} catch (e) {
return false;
}
}
function setServiceWorker() {
return navigator.serviceWorker.register('empty_worker.js')
.then(() => navigator.serviceWorker.ready)
.then(() => true)
.catch(() => false);
}
async function setServiceWorkerAsync() {
// Provided for Java.
domAutomationController.send(await setServiceWorker());
}
function hasServiceWorker() {
return navigator.serviceWorker.getRegistrations()
.then((registrations) => registrations.length > 0)
.catch(() => false);
}
async function hasServiceWorkerAsync() {
// Provided for Java.
domAutomationController.send(await hasServiceWorker());
}
function setCacheStorage() {
return caches.open("cache")
.then((cache) => cache.put("/foo", new Response("bar")))
.then(() => true)
.catch(() => false);
}
async function setCacheStorageAsync() {
// Provided for Java.
domAutomationController.send(await setCacheStorage());
}
function hasCacheStorage() {
return caches.open("cache")
.then((cache) => cache.keys())
.then((keys) => keys.length > 0)
.catch(() => false);
}
async function hasCacheStorageAsync() {
// Provided for Java.
domAutomationController.send(await hasCacheStorage());
}
async function openFile_(name, options, callback, error) {
const fs = await new Promise((resolve, reject) => {
window.webkitRequestFileSystem(TEMPORARY, 1024, resolve, reject);
});
return new Promise((resolve, reject) => {
fs.root.getFile(name, options, resolve, reject);
});
}
function setFileSystem() {
return openFile_('foo.txt', { create: true, exclusive: true })
.then(() => true)
.catch(() => false);
}
async function setFileSystemAsync() {
// Provided for Java.
domAutomationController.send(await setFileSystem());
}
function hasFileSystem() {
return openFile_('foo.txt', { create: false })
.then(() => true)
.catch(() => false);
}
async function hasFileSystemAsync() {
// Provided for Java.
domAutomationController.send(await hasFileSystem());
}
async function setFileSystemAccess() {
try {
let dir = await navigator.storage.getDirectory();
await dir.getFileHandle('foo.txt', {create: true});
return true;
} catch (e) {
return false;
}
}
async function hasFileSystemAccess() {
try {
let dir = await navigator.storage.getDirectory();
await dir.getFileHandle('foo.txt', { create: false });
return true;
} catch (e) {
return false;
}
}
function setIndexedDb() {
var open = indexedDB.open('db', 2);
open.onupgradeneeded = function() {
open.result.createObjectStore('store');
}
return new Promise((resolve) => {
open.onsuccess = function () {
open.result.close();
resolve(true);
}
open.onerror = () => resolve(false);
});
}
async function setIndexedDbAsync() {
domAutomationController.send(await setIndexedDb());
}
function hasIndexedDb() {
var open = indexedDB.open('db');
return new Promise((resolve) => {
open.onsuccess = function() {
var hasStore = open.result.objectStoreNames.contains('store');
open.result.close();
resolve(hasStore);
}
open.onerror = () => resolve(false);
});
}
async function hasIndexedDbAsync() {
domAutomationController.send(await hasIndexedDb());
}
function worker_(command) {
let worker = new Worker("site_data_worker.js");
return new Promise((resolve) => {
worker.onmessage = e => {
resolve(e.data);
};
worker.postMessage(command);
});
}
function hasWorkerFileSystemAccess() {
return worker_("hasFileSystemAccess");
}
function setWorkerFileSystemAccess() {
return worker_("setFileSystemAccess");
}
function hasWorkerCacheStorage() {
return worker_("hasCacheStorage");
}
function setWorkerCacheStorage() {
return worker_("setCacheStorage");
}
function hasWorkerIndexedDb() {
return worker_("hasIndexedDb");
}
function setWorkerIndexedDb() {
return worker_("setIndexedDb");
}
function setHistory() {
history.pushState({}, "foo");
return true;
}
function hasHistory() {
return history.length > 1;
}
let sharedWorker; // Global variable to keep worker alive.
function connectSharedWorker() {
return new Promise((resolve, reject) => {
sharedWorker = new SharedWorker("shared_worker.js");
sharedWorker.onerror = reject;
sharedWorker.port.onmessage = resolve;
sharedWorker.port.start();
});
}
function setSharedWorker() {
return connectSharedWorker()
.then(() => {
sharedWorker.port.postMessage({ "value": "foo" });
return true;
})
.catch(() => false);
}
async function hasSharedWorker() {
return connectSharedWorker()
.then(() => {
return new Promise((resolve) => {
sharedWorker.port.onmessage = e => {
resolve(e.data.value === "foo");
};
sharedWorker.port.postMessage({});
});
})
.catch(() => false);
}
let lock;
function setWebLock() {
return new Promise((resolve) => {
navigator.locks.request("foo", () => {
lock = new Promise(() => { });
// Now lock will be held while |lock| exists.
resolve(true);
return lock;
})
})
.catch(() => false);
}
function hasWebLock() {
return navigator.locks.query()
.then(locks => !!locks.held.length && locks.held[0].name === "foo")
.catch(() => false);
}
async function setSharedDictionary() {
await (await fetch('../shared_dictionary/test.dict')).text();
// Need the polling because writing the dictionary to the storage and the
// database may take time.
while (!await hasSharedDictionary()) {
await new Promise((resolve) => setTimeout(resolve, 100));
}
return true;
}
async function hasSharedDictionary() {
const path = '../shared_dictionary/path/compressed.data';
const expectedResult =
'This is compressed test data using a test dictionary';
const result = await (await fetch(path)).text();
return result === expectedResult;
}
</script>
<body>
This page is used to test creation and deletion of various site data types.
The functions are called from BrowsingDataRemoverBrowserTest::HasDataForType
and BrowsingDataRemoverBrowserTest::SetDataForType.
</body>
</html>