はじめに
とある事情でAndroidのCookieManagerクラス以下の実装がどうなっているか調べました。
特に見たかったのは以下の2つです。
・CookieManagerって、そもそもスレッドセーフ?
・WebViewでのCookieのパースってどうなっているの?
コード
まずは
CookieManager
↓
詳細は不明ですがデバッガで調べるとCookieManagerは抽象クラスで、実際の実装はChromiumにAwCookieManagerというクラスとして存在します
↓
AwCookieManager
↓
AwCookieManagerはネイティブの実装がありC++で実装されています。
↓
cookie_manager
ととここまで来て、CookieManagerがスレッドセーフかどうか調べました。
クッキーの保存
static void JNI_AwCookieManager_SetCookieSync(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jstring>& url,
const JavaParamRef<jstring>& value) {
GURL host(ConvertJavaStringToUTF16(env, url));
std::string cookie_value(ConvertJavaStringToUTF8(env, value));
CookieManager::GetInstance()->SetCookieSync(host, cookie_value);
}
次に最後に呼び出されているSetCookieSyncメソッドの実装
void CookieManager::SetCookieSync(const GURL& host,
const std::string& cookie_value) {
ExecCookieTaskSync(base::BindOnce(&CookieManager::SetCookieHelper, base::Unretained(this), host, cookie_value));
}
とこんな感じでCookieManagerはスレッドセーフ(多分IPC)であることがわかりました。
いろんなスレッドから同時に呼び出しても安心ですね。
捕捉:WebViewでのCookieのパース
WebView(Chrome)でCookieがどう扱われているか調べました。以下の通り、CanonicalCookieというクラスがCookieを扱っているようです。RFC2965の仕様に準拠しているようですね。
追記
Chromeが標準で入っていない古いAndroidだと独自の実装をしているかもしれません。