15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test.h" 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test_utils.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DatabaseTest : public ContentBrowserTest { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DatabaseTest() {} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunScriptAndCheckResult(Shell* shell, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& script, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& result) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ExecuteScriptAndExtractString( 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell->web_contents(), 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &data)); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(data, result); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Navigate(Shell* shell) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL(shell, GetTestUrl("", "simple_database.html")); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateTable(Shell* shell) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunScriptAndCheckResult(shell, "createTable()", "done"); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InsertRecord(Shell* shell, const std::string& data) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunScriptAndCheckResult(shell, "insertRecord('" + data + "')", "done"); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateRecord(Shell* shell, int index, const std::string& data) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunScriptAndCheckResult( 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "updateRecord(" + base::IntToString(index) + ", '" + data + "')", 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "done"); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteRecord(Shell* shell, int index) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunScriptAndCheckResult( 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell, "deleteRecord(" + base::IntToString(index) + ")", "done"); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CompareRecords(Shell* shell, const std::string& expected) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunScriptAndCheckResult(shell, "getRecords()", expected); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasTable(Shell* shell) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(ExecuteScriptAndExtractString( 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell->web_contents(), 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "getRecords()", 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &data)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data != "getRecords error: [object SQLError]"; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Insert records to the database. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, InsertRecord) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "text"); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "text"); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "text2"); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "text, text2"); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Update records in the database. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, UpdateRecord) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "text"); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateRecord(shell(), 0, "0"); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "0"); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "1"); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "2"); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateRecord(shell(), 1, "1000"); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "0, 1000, 2"); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delete records in the database. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, DeleteRecord) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "text"); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteRecord(shell(), 0); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CompareRecords(shell(), std::string()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "0"); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "1"); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "2"); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteRecord(shell(), 1); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "0, 2"); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Attempts to delete a nonexistent row in the table. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, DeleteNonexistentRow) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "text"); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunScriptAndCheckResult( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell(), "deleteRecord(1)", "could not find row with index: 1"); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "text"); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Insert, update, and delete records in the database. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, DatabaseOperations) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10; ++i) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string item = base::IntToString(i); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), item); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!expected.empty()) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected += ", "; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected += item; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), expected); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.clear(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10; ++i) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string item = base::IntToString(i * i); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateRecord(shell(), i, item); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!expected.empty()) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected += ", "; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected += item; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), expected); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10; ++i) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteRecord(shell(), 0); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CompareRecords(shell(), std::string()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunScriptAndCheckResult( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell(), "deleteRecord(1)", "could not find row with index: 1"); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CompareRecords(shell(), std::string()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create records in the database and verify they persist after reload. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, ReloadPage) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "text"); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowedNotificationObserver load_stop_observer( 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_STOP, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::AllSources()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell()->Reload(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_stop_observer.Wait(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "text"); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Attempt to read a database created in a regular browser from an off the 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// record browser. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, OffTheRecordCannotReadRegularDatabase) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "text"); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* otr = CreateOffTheRecordBrowser(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(otr); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(HasTable(otr)); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(otr); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CompareRecords(otr, std::string()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Attempt to read a database created in an off the record browser from a 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// regular browser. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, RegularCannotReadOffTheRecordDatabase) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* otr = CreateOffTheRecordBrowser(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(otr); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(otr); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(otr, "text"); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(HasTable(shell())); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CompareRecords(shell(), std::string()); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify DB changes within first window are present in the second window. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, ModificationPersistInSecondTab) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "text"); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* shell2 = CreateBrowser(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell2); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateRecord(shell2, 0, "0"); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "0"); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell2, "0"); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify database modifications persist after restarting browser. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, PRE_DatabasePersistsAfterRelaunch) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "text"); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, DatabasePersistsAfterRelaunch) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "text"); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify OTR database is removed after OTR window closes. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, PRE_OffTheRecordDatabaseNotPersistent) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* otr = CreateOffTheRecordBrowser(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(otr); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(otr); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(otr, "text"); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, OffTheRecordDatabaseNotPersistent) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* otr = CreateOffTheRecordBrowser(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(otr); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(HasTable(otr)); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify database modifications persist after crashing window. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, ModificationsPersistAfterRendererCrash) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(shell()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(shell(), "1"); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashTab(shell()->web_contents()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(shell()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(shell(), "1"); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to check if database modifications are persistent across windows in 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// off the record window. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DatabaseTest, OffTheRecordDBPersistentAcrossWindows) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* otr1 = CreateOffTheRecordBrowser(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(otr1); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTable(otr1); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertRecord(otr1, "text"); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* otr2 = CreateOffTheRecordBrowser(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Navigate(otr2); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompareRecords(otr2, "text"); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 270