LoginSignup
1
1

More than 3 years have passed since last update.

CookieManagerの実装について

Last updated at Posted at 2019-01-12

はじめに

とある事情で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の仕様に準拠しているようですね。

canonical_cookie.cc

追記

Chromeが標準で入っていない古いAndroidだと独自の実装をしているかもしれません。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1