mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Add CefSetCookiePath() and CefSetStoragePath() functions for changing cookie and localStorage locations while CEF is running (issue #347).
git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@353 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
@@ -2,10 +2,12 @@
|
||||
// reserved. Use of this source code is governed by a BSD-style license that
|
||||
// can be found in the LICENSE file.
|
||||
|
||||
#include "base/scoped_temp_dir.h"
|
||||
#include "base/synchronization/waitable_event.h"
|
||||
#include "include/cef.h"
|
||||
#include "include/cef_runnable.h"
|
||||
#include "base/synchronization/waitable_event.h"
|
||||
#include "testing/gtest/include/gtest/gtest.h"
|
||||
#include "test_suite.h"
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
@@ -61,125 +63,123 @@ public:
|
||||
IMPLEMENT_REFCOUNTING(TestVisitor);
|
||||
};
|
||||
|
||||
// Create a test cookie. If |withDomain| is true a domain cookie will be
|
||||
// created, otherwise a host cookie will be created.
|
||||
void CreateCookie(CefCookie& cookie, bool withDomain,
|
||||
base::WaitableEvent& event)
|
||||
{
|
||||
CefString(&cookie.name).FromASCII("my_cookie");
|
||||
CefString(&cookie.value).FromASCII("My Value");
|
||||
if (withDomain)
|
||||
CefString(&cookie.domain).FromASCII(kTestDomain);
|
||||
CefString(&cookie.path).FromASCII(kTestPath);
|
||||
cookie.has_expires = true;
|
||||
cookie.expires.year = 2200;
|
||||
cookie.expires.month = 4;
|
||||
cookie.expires.day_of_week = 5;
|
||||
cookie.expires.day_of_month = 11;
|
||||
|
||||
CookieVector cookies;
|
||||
cookies.push_back(cookie);
|
||||
|
||||
// Set the cookie.
|
||||
CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Set, kTestUrl, &cookies,
|
||||
&event));
|
||||
event.Wait();
|
||||
}
|
||||
|
||||
// Retrieve the test cookie. If |withDomain| is true check that the cookie
|
||||
// is a domain cookie, otherwise a host cookie. if |deleteCookies| is true
|
||||
// the cookie will be deleted when it's retrieved.
|
||||
void GetCookie(const CefCookie& cookie, bool withDomain,
|
||||
base::WaitableEvent& event, bool deleteCookies)
|
||||
{
|
||||
CookieVector cookies;
|
||||
|
||||
// Get the cookie and delete it.
|
||||
EXPECT_TRUE(CefVisitUrlCookies(kTestUrl, false,
|
||||
new TestVisitor(&cookies, deleteCookies, &event)));
|
||||
event.Wait();
|
||||
|
||||
EXPECT_EQ((CookieVector::size_type)1, cookies.size());
|
||||
|
||||
const CefCookie& cookie_read = cookies[0];
|
||||
EXPECT_EQ(CefString(&cookie_read.name), "my_cookie");
|
||||
EXPECT_EQ(CefString(&cookie_read.value), "My Value");
|
||||
if (withDomain)
|
||||
EXPECT_EQ(CefString(&cookie_read.domain), ".www.test.com");
|
||||
else
|
||||
EXPECT_EQ(CefString(&cookie_read.domain), kTestDomain);
|
||||
EXPECT_EQ(CefString(&cookie_read.path), kTestPath);
|
||||
EXPECT_TRUE(cookie_read.has_expires);
|
||||
EXPECT_EQ(cookie.expires.year, cookie_read.expires.year);
|
||||
EXPECT_EQ(cookie.expires.month, cookie_read.expires.month);
|
||||
EXPECT_EQ(cookie.expires.day_of_week, cookie_read.expires.day_of_week);
|
||||
EXPECT_EQ(cookie.expires.day_of_month, cookie_read.expires.day_of_month);
|
||||
EXPECT_EQ(cookie.expires.hour, cookie_read.expires.hour);
|
||||
EXPECT_EQ(cookie.expires.minute, cookie_read.expires.minute);
|
||||
EXPECT_EQ(cookie.expires.second, cookie_read.expires.second);
|
||||
EXPECT_EQ(cookie.expires.millisecond, cookie_read.expires.millisecond);
|
||||
}
|
||||
|
||||
// Verify that no cookies exist. If |withUrl| is true it will only check for
|
||||
// cookies matching the URL.
|
||||
void VerifyNoCookies(base::WaitableEvent& event, bool withUrl)
|
||||
{
|
||||
CookieVector cookies;
|
||||
|
||||
// Verify that the cookie has been deleted.
|
||||
if (withUrl) {
|
||||
EXPECT_TRUE(CefVisitUrlCookies(kTestUrl, false,
|
||||
new TestVisitor(&cookies, false, &event)));
|
||||
} else {
|
||||
EXPECT_TRUE(CefVisitAllCookies(new TestVisitor(&cookies, false, &event)));
|
||||
}
|
||||
event.Wait();
|
||||
|
||||
EXPECT_EQ((CookieVector::size_type)0, cookies.size());
|
||||
}
|
||||
|
||||
// Delete all system cookies.
|
||||
void DeleteAllCookies(base::WaitableEvent& event)
|
||||
{
|
||||
CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Delete, CefString(),
|
||||
CefString(), &event));
|
||||
event.Wait();
|
||||
}
|
||||
|
||||
} // anonymous
|
||||
|
||||
// Test creation of a domain cookie.
|
||||
TEST(CookieTest, DomainCookie)
|
||||
{
|
||||
base::WaitableEvent event(false, false);
|
||||
|
||||
CefCookie cookie;
|
||||
CefString(&cookie.name).FromASCII("my_cookie");
|
||||
CefString(&cookie.value).FromASCII("My Value");
|
||||
CefString(&cookie.domain).FromASCII(kTestDomain);
|
||||
CefString(&cookie.path).FromASCII(kTestPath);
|
||||
cookie.has_expires = true;
|
||||
cookie.expires.year = 2200;
|
||||
cookie.expires.month = 4;
|
||||
cookie.expires.day_of_week = 5;
|
||||
cookie.expires.day_of_month = 11;
|
||||
|
||||
CookieVector cookies;
|
||||
cookies.push_back(cookie);
|
||||
|
||||
// Set the cookie.
|
||||
CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Set, kTestUrl, &cookies,
|
||||
&event));
|
||||
event.Wait();
|
||||
cookies.clear();
|
||||
|
||||
// Get the cookie and delete it.
|
||||
EXPECT_TRUE(CefVisitUrlCookies(kTestUrl, false,
|
||||
new TestVisitor(&cookies, true, &event)));
|
||||
event.Wait();
|
||||
// Create a domain cookie.
|
||||
CreateCookie(cookie, true, event);
|
||||
|
||||
EXPECT_EQ((CookieVector::size_type)1, cookies.size());
|
||||
|
||||
const CefCookie& cookie_read = cookies[0];
|
||||
EXPECT_EQ(CefString(&cookie_read.name), "my_cookie");
|
||||
EXPECT_EQ(CefString(&cookie_read.value), "My Value");
|
||||
EXPECT_EQ(CefString(&cookie_read.domain), ".www.test.com");
|
||||
EXPECT_EQ(CefString(&cookie_read.path), kTestPath);
|
||||
EXPECT_TRUE(cookie_read.has_expires);
|
||||
EXPECT_EQ(cookie.expires.year, cookie_read.expires.year);
|
||||
EXPECT_EQ(cookie.expires.month, cookie_read.expires.month);
|
||||
EXPECT_EQ(cookie.expires.day_of_week, cookie_read.expires.day_of_week);
|
||||
EXPECT_EQ(cookie.expires.day_of_month, cookie_read.expires.day_of_month);
|
||||
EXPECT_EQ(cookie.expires.hour, cookie_read.expires.hour);
|
||||
EXPECT_EQ(cookie.expires.minute, cookie_read.expires.minute);
|
||||
EXPECT_EQ(cookie.expires.second, cookie_read.expires.second);
|
||||
EXPECT_EQ(cookie.expires.millisecond, cookie_read.expires.millisecond);
|
||||
// Retrieve, verify and delete the domain cookie.
|
||||
GetCookie(cookie, true, event, true);
|
||||
|
||||
cookies.clear();
|
||||
|
||||
// Verify that the cookie has been deleted.
|
||||
EXPECT_TRUE(CefVisitUrlCookies(kTestUrl, false,
|
||||
new TestVisitor(&cookies, false, &event)));
|
||||
event.Wait();
|
||||
|
||||
EXPECT_EQ((CookieVector::size_type)0, cookies.size());
|
||||
// Verify that the cookie was deleted.
|
||||
VerifyNoCookies(event, true);
|
||||
}
|
||||
|
||||
// Test creation of a host cookie.
|
||||
TEST(CookieTest, HostCookie)
|
||||
{
|
||||
base::WaitableEvent event(false, false);
|
||||
CefCookie cookie;
|
||||
|
||||
// Create a host cookie.
|
||||
CefCookie cookie;
|
||||
CefString(&cookie.name).FromASCII("my_cookie");
|
||||
CefString(&cookie.value).FromASCII("My Value");
|
||||
CefString(&cookie.path).FromASCII(kTestPath);
|
||||
cookie.has_expires = true;
|
||||
cookie.expires.year = 2200;
|
||||
cookie.expires.month = 4;
|
||||
cookie.expires.day_of_week = 5;
|
||||
cookie.expires.day_of_month = 11;
|
||||
CreateCookie(cookie, false, event);
|
||||
|
||||
CookieVector cookies;
|
||||
cookies.push_back(cookie);
|
||||
|
||||
// Set the cookie.
|
||||
CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Set, kTestUrl, &cookies,
|
||||
&event));
|
||||
event.Wait();
|
||||
cookies.clear();
|
||||
|
||||
// Get the cookie.
|
||||
EXPECT_TRUE(CefVisitUrlCookies(kTestUrl, false,
|
||||
new TestVisitor(&cookies, false, &event)));
|
||||
event.Wait();
|
||||
// Retrieve, verify and delete the host cookie.
|
||||
GetCookie(cookie, false, event, true);
|
||||
|
||||
EXPECT_EQ((CookieVector::size_type)1, cookies.size());
|
||||
|
||||
const CefCookie& cookie_read = cookies[0];
|
||||
EXPECT_EQ(CefString(&cookie_read.name), "my_cookie");
|
||||
EXPECT_EQ(CefString(&cookie_read.value), "My Value");
|
||||
EXPECT_EQ(CefString(&cookie_read.domain), kTestDomain);
|
||||
EXPECT_EQ(CefString(&cookie_read.path), kTestPath);
|
||||
EXPECT_TRUE(cookie_read.has_expires);
|
||||
EXPECT_EQ(cookie.expires.year, cookie_read.expires.year);
|
||||
EXPECT_EQ(cookie.expires.month, cookie_read.expires.month);
|
||||
EXPECT_EQ(cookie.expires.day_of_week, cookie_read.expires.day_of_week);
|
||||
EXPECT_EQ(cookie.expires.day_of_month, cookie_read.expires.day_of_month);
|
||||
EXPECT_EQ(cookie.expires.hour, cookie_read.expires.hour);
|
||||
EXPECT_EQ(cookie.expires.minute, cookie_read.expires.minute);
|
||||
EXPECT_EQ(cookie.expires.second, cookie_read.expires.second);
|
||||
EXPECT_EQ(cookie.expires.millisecond, cookie_read.expires.millisecond);
|
||||
|
||||
cookies.clear();
|
||||
|
||||
// Delete the cookie.
|
||||
CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Delete, kTestUrl,
|
||||
CefString("my_cookie"), &event));
|
||||
event.Wait();
|
||||
|
||||
// Verify that the cookie has been deleted.
|
||||
EXPECT_TRUE(CefVisitUrlCookies(kTestUrl, false,
|
||||
new TestVisitor(&cookies, false, &event)));
|
||||
event.Wait();
|
||||
|
||||
EXPECT_EQ((CookieVector::size_type)0, cookies.size());
|
||||
// Verify that the cookie was deleted.
|
||||
VerifyNoCookies(event, true);
|
||||
}
|
||||
|
||||
// Test creation of multiple cookies.
|
||||
@@ -365,13 +365,52 @@ TEST(CookieTest, AllCookies)
|
||||
cookies.clear();
|
||||
|
||||
// Delete all of the system cookies.
|
||||
CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Delete, CefString(),
|
||||
CefString(), &event));
|
||||
event.Wait();
|
||||
DeleteAllCookies(event);
|
||||
|
||||
// Verify that all system cookies have been deleted.
|
||||
EXPECT_TRUE(CefVisitAllCookies(new TestVisitor(&cookies, false, &event)));
|
||||
event.Wait();
|
||||
|
||||
EXPECT_EQ((CookieVector::size_type)0, cookies.size());
|
||||
VerifyNoCookies(event, false);
|
||||
}
|
||||
|
||||
TEST(CookieTest, ChangeDirectory)
|
||||
{
|
||||
base::WaitableEvent event(false, false);
|
||||
CefCookie cookie;
|
||||
|
||||
std::string cache_path;
|
||||
CefTestSuite::GetCachePath(cache_path);
|
||||
|
||||
ScopedTempDir temp_dir;
|
||||
|
||||
// Create a new temporary directory.
|
||||
EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
|
||||
|
||||
// Delete all of the system cookies.
|
||||
DeleteAllCookies(event);
|
||||
|
||||
// Set the new temporary directory as the storage location.
|
||||
EXPECT_TRUE(CefSetCookiePath(temp_dir.path().value()));
|
||||
|
||||
// Verify that no cookies exist.
|
||||
VerifyNoCookies(event, true);
|
||||
|
||||
// Create a domain cookie.
|
||||
CreateCookie(cookie, true, event);
|
||||
|
||||
// Retrieve and verify the domain cookie.
|
||||
GetCookie(cookie, true, event, false);
|
||||
|
||||
// Restore the original storage location.
|
||||
EXPECT_TRUE(CefSetCookiePath(cache_path));
|
||||
|
||||
// Verify that no cookies exist.
|
||||
VerifyNoCookies(event, true);
|
||||
|
||||
// Set the new temporary directory as the storage location.
|
||||
EXPECT_TRUE(CefSetCookiePath(temp_dir.path().value()));
|
||||
|
||||
// Retrieve and verify the domain cookie that was set previously.
|
||||
GetCookie(cookie, true, event, false);
|
||||
|
||||
// Restore the original storage location.
|
||||
EXPECT_TRUE(CefSetCookiePath(cache_path));
|
||||
}
|
||||
|
@@ -2,9 +2,11 @@
|
||||
// reserved. Use of this source code is governed by a BSD-style license that
|
||||
// can be found in the LICENSE file.
|
||||
|
||||
#include "base/scoped_temp_dir.h"
|
||||
#include "include/cef.h"
|
||||
#include "testing/gtest/include/gtest/gtest.h"
|
||||
#include "test_handler.h"
|
||||
#include "test_suite.h"
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -111,11 +113,22 @@ public:
|
||||
IMPLEMENT_REFCOUNTING(StorageVisitor);
|
||||
};
|
||||
|
||||
StorageTestHandler(CefStorageType type)
|
||||
: type_(type), nav_(0) {}
|
||||
StorageTestHandler(CefStorageType type, bool expectKeysSet, bool leaveKeysSet)
|
||||
: type_(type),
|
||||
expect_keys_set_(expectKeysSet),
|
||||
leave_keys_set_(leaveKeysSet),
|
||||
nav_(0) {}
|
||||
|
||||
virtual void RunTest() OVERRIDE
|
||||
{
|
||||
// Verify the key status.
|
||||
CefVisitStorage(type_, kOrigin, "",
|
||||
new StorageVisitor(this, "startupvisit",
|
||||
StorageVisitor::VisitKey,
|
||||
&got_cpp_startupvisit_fail_,
|
||||
&got_cpp_startupvisit_fail_,
|
||||
expect_keys_set_?2:0));
|
||||
|
||||
std::stringstream ss;
|
||||
|
||||
std::string func = (type_==ST_LOCALSTORAGE?"localStorage":"sessionStorage");
|
||||
@@ -293,6 +306,19 @@ public:
|
||||
// Verify JS read after navigation.
|
||||
frame->LoadURL(kNav2);
|
||||
} else {
|
||||
if (!leave_keys_set_) {
|
||||
// Delete all values by origin.
|
||||
CefDeleteStorage(type_, kOrigin, "");
|
||||
}
|
||||
|
||||
// Verify the key status.
|
||||
CefVisitStorage(type_, kOrigin, "",
|
||||
new StorageVisitor(this, "shutdownvisit",
|
||||
StorageVisitor::VisitKey,
|
||||
&got_cpp_shutdownvisit_fail_,
|
||||
&got_cpp_shutdownvisit_fail_,
|
||||
leave_keys_set_?2:0));
|
||||
|
||||
DestroyTest();
|
||||
}
|
||||
}
|
||||
@@ -308,8 +334,11 @@ public:
|
||||
}
|
||||
|
||||
CefStorageType type_;
|
||||
bool expect_keys_set_;
|
||||
bool leave_keys_set_;
|
||||
int nav_;
|
||||
|
||||
TrackCallback got_cpp_startupvisit_fail_;
|
||||
TrackCallback got_cpp_all_read1_;
|
||||
TrackCallback got_cpp_all_read2_;
|
||||
TrackCallback got_cpp_origin_read1_;
|
||||
@@ -340,13 +369,20 @@ public:
|
||||
TrackCallback got_cpp_all_reset2d_;
|
||||
TrackCallback got_js_read1_;
|
||||
TrackCallback got_js_read2_;
|
||||
TrackCallback got_cpp_shutdownvisit_fail_;
|
||||
};
|
||||
|
||||
void StorageTest(CefStorageType type)
|
||||
void StorageTest(CefStorageType type, bool expectKeysSet, bool leaveKeysSet)
|
||||
{
|
||||
CefRefPtr<StorageTestHandler> handler = new StorageTestHandler(type);
|
||||
CefRefPtr<StorageTestHandler> handler =
|
||||
new StorageTestHandler(type, expectKeysSet, leaveKeysSet);
|
||||
handler->ExecuteTest();
|
||||
|
||||
if (expectKeysSet)
|
||||
EXPECT_TRUE(handler->got_cpp_startupvisit_fail_);
|
||||
else
|
||||
EXPECT_FALSE(handler->got_cpp_startupvisit_fail_);
|
||||
|
||||
EXPECT_TRUE(handler->got_cpp_all_read1_);
|
||||
EXPECT_TRUE(handler->got_cpp_all_read2_);
|
||||
EXPECT_TRUE(handler->got_cpp_origin_read1_);
|
||||
@@ -377,6 +413,11 @@ void StorageTest(CefStorageType type)
|
||||
EXPECT_TRUE(handler->got_cpp_all_reset2d_);
|
||||
EXPECT_TRUE(handler->got_js_read1_);
|
||||
EXPECT_TRUE(handler->got_js_read2_);
|
||||
|
||||
if (leaveKeysSet)
|
||||
EXPECT_TRUE(handler->got_cpp_shutdownvisit_fail_);
|
||||
else
|
||||
EXPECT_FALSE(handler->got_cpp_shutdownvisit_fail_);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -384,11 +425,46 @@ void StorageTest(CefStorageType type)
|
||||
// Test localStorage.
|
||||
TEST(StorageTest, Local)
|
||||
{
|
||||
StorageTest(ST_LOCALSTORAGE);
|
||||
StorageTest(ST_LOCALSTORAGE, false, false);
|
||||
}
|
||||
|
||||
// Test sessionStorage.
|
||||
TEST(StorageTest, Session)
|
||||
{
|
||||
StorageTest(ST_SESSIONSTORAGE);
|
||||
StorageTest(ST_SESSIONSTORAGE, false, false);
|
||||
}
|
||||
|
||||
// Test changing the localStorage directory.
|
||||
TEST(StorageTest, LocalChangeDirectory)
|
||||
{
|
||||
std::string cache_path;
|
||||
CefTestSuite::GetCachePath(cache_path);
|
||||
|
||||
ScopedTempDir temp_dir;
|
||||
|
||||
// Create a new temporary directory.
|
||||
EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
|
||||
|
||||
// Set the new temporary directory as the storage location.
|
||||
EXPECT_TRUE(CefSetStoragePath(ST_LOCALSTORAGE, temp_dir.path().value()));
|
||||
|
||||
// Run the test leaving behind the set keys.
|
||||
StorageTest(ST_LOCALSTORAGE, false, true);
|
||||
|
||||
// Restore the original storage location.
|
||||
EXPECT_TRUE(CefSetStoragePath(ST_LOCALSTORAGE, cache_path));
|
||||
|
||||
// Run the test. It will fail if the set keys exist in the original storage
|
||||
// location.
|
||||
StorageTest(ST_LOCALSTORAGE, false, false);
|
||||
|
||||
// Set the new temporary directory as the storage location.
|
||||
EXPECT_TRUE(CefSetStoragePath(ST_LOCALSTORAGE, temp_dir.path().value()));
|
||||
|
||||
// Run the test verifying that the keys set previously still exist in the
|
||||
// temporary directory.
|
||||
StorageTest(ST_LOCALSTORAGE, true, false);
|
||||
|
||||
// Restore the original storage directory.
|
||||
EXPECT_TRUE(CefSetStoragePath(ST_LOCALSTORAGE, cache_path));
|
||||
}
|
||||
|
@@ -20,9 +20,9 @@ void CefTestSuite::Initialize() {
|
||||
|
||||
CommandLine* command_line = CommandLine::ForCurrentProcess();
|
||||
|
||||
if (command_line->HasSwitch("cache_path")) {
|
||||
std::string cache_path;
|
||||
if (GetCachePath(cache_path)) {
|
||||
// Set the cache_path value.
|
||||
std::string cache_path = command_line->GetSwitchValueASCII("cache_path");
|
||||
CefString(&settings.cache_path).FromASCII(cache_path.c_str());
|
||||
}
|
||||
|
||||
@@ -37,3 +37,16 @@ void CefTestSuite::Shutdown() {
|
||||
CefShutdown();
|
||||
TestSuite::Shutdown();
|
||||
}
|
||||
|
||||
// static
|
||||
bool CefTestSuite::GetCachePath(std::string& path) {
|
||||
CommandLine* command_line = CommandLine::ForCurrentProcess();
|
||||
|
||||
if (command_line->HasSwitch("cache_path")) {
|
||||
// Set the cache_path value.
|
||||
path = command_line->GetSwitchValueASCII("cache_path");
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@@ -11,6 +11,8 @@ class CefTestSuite : public TestSuite {
|
||||
public:
|
||||
CefTestSuite(int argc, char** argv);
|
||||
|
||||
static bool GetCachePath(std::string& path);
|
||||
|
||||
protected:
|
||||
virtual void Initialize();
|
||||
virtual void Shutdown();
|
||||
|
Reference in New Issue
Block a user