#include "ChromiumIncludes.h"
#include "JNIUtility.h"
+#include "WebCoreJni.h"
#include "WebUrlLoaderClient.h"
#include "jni.h"
Lock userAgentLock;
Lock acceptLanguageLock;
+
+WTF::Mutex databaseDirectoryMutex;
+WTF::Mutex cacheDirectoryMutex;
}
using namespace WTF;
static const std::string& getDatabaseDirectory()
{
+ // This method may be called on any thread, as the Java method is
+ // synchronized.
+ MutexLocker lock(databaseDirectoryMutex);
static std::string databaseDirectory;
if (databaseDirectory.empty()) {
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jclass bridgeClass = env->FindClass("android/webkit/BrowserFrame");
+ jclass bridgeClass = env->FindClass("android/webkit/CookieSyncManager");
jmethodID method = env->GetStaticMethodID(bridgeClass, "getDatabaseDirectory", "()Ljava/lang/String;");
-
- jstring str = (jstring)env->CallStaticObjectMethod(bridgeClass, method);
- jboolean isCopy;
- const char* nativeString = env->GetStringUTFChars(str, &isCopy);
- databaseDirectory = std::string(nativeString);
- if (isCopy == JNI_TRUE)
- env->ReleaseStringUTFChars(str, nativeString);
+ databaseDirectory = jstringToStdString(env, static_cast<jstring>(env->CallStaticObjectMethod(bridgeClass, method)));
+ env->DeleteLocalRef(bridgeClass);
}
-
return databaseDirectory;
}
static const std::string& getCacheDirectory()
{
+ // This method may be called on any thread, as the Java method is
+ // synchronized.
+ MutexLocker lock(cacheDirectoryMutex);
static std::string cacheDirectory;
if (cacheDirectory.empty()) {
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jclass bridgeClass = env->FindClass("android/webkit/BrowserFrame");
+ jclass bridgeClass = env->FindClass("android/webkit/CookieSyncManager");
jmethodID method = env->GetStaticMethodID(bridgeClass, "getCacheDirectory", "()Ljava/lang/String;");
-
- jstring str = (jstring)env->CallStaticObjectMethod(bridgeClass, method);
- jboolean isCopy;
- const char* nativeString = env->GetStringUTFChars(str, &isCopy);
- cacheDirectory = std::string(nativeString);
- if (isCopy == JNI_TRUE)
- env->ReleaseStringUTFChars(str, nativeString);
+ cacheDirectory = jstringToStdString(env, static_cast<jstring>(env->CallStaticObjectMethod(bridgeClass, method)));
+ env->DeleteLocalRef(bridgeClass);
}
-
return cacheDirectory;
}
// getter just returns a pointer which is only set when the context is first
// constructed. The CookieMonster is threadsafe, so the call below is safe
// overall.
- //
- // TODO: It's possible that this call is made before the WebKit thread has
- // started up and the settings have been synced to the BrowserFrame. This
- // will cause creation of the context to fail.
WebRequestContext::get(false)->cookie_store()->GetCookieMonster()->DeleteAllCreatedAfter(Time(), true);
// This will lazily create a new private browsing context. However, if the
// context doesn't already exist, there's no need to create it, as cookies