コードのコメントをそのまま載せておく形式で書きます。
この処理の部分は、initDataの中のb.pcが担当なんだけど、(bとかpcは、compile化された後の変数なのでsourceで名前は不明)
* ga.jsのversionは、4.5.9
initDataの前提として、
- そのinitDataが呼ばれるのは、
- trackePageview, GASO, trackEvent, CustomVar関連, link, setAutoTrackBound(使われてない)、、などなど
- 処理の中身は、3つに分けられる。
- 新規・既存セッションの判別・処理(b.pc)
- utmv(CustomVar)に関する処理(n.tc)
- utmz(Campaign)に関する処理(c.mm)
となっているのですが、
この記事では、1番の新規・既存セッションの判別・処理部分(b.pc)を見ていきます。
やっていることは、(コードの流れとはずれますが)
- pageTracker._linkなどのurl渡しのcookieデータが来た時の処理
- ドメインハッシュが一致しているか?(不一致で、新規セッション)
- urlからcookieへの値の設定
- utmb, utmcでの新規・既存check
- 新規なら、utmaをset, 既存ならutmbをsetする(utmbのpageview部分がcountされるのは、送信直前処理)
- 実際にcookieに書き込み
では、コードと、僕が付けたコメント
(変数名、関数名は、僕が勝手につけたので、他人が読む意味ないかもしれないけど、他に良い方法が見あたらない)
bがpageTracker変数が参照するオブジェクトになります。
//セッションに関する処理を行う
b.pc = function () {
var timenow = b.r, //現在時間がb.rに入っている
cookiemanager = b.cookiemanager, //CookiManagerオブジェクト d
cookievalue = cookiemanager.getCookieStr(), //cookieの値を取得 l
domainhash = b.domainhash + "", //t=b.domainhash ドメインハッシュ "none"なら1
o = dfvls.e, //dfvlsは初期値格納オブジェ、.eはwindowsオブジェになっている
u = o ? o.gaGlobal : undefined, //たぶん、そのままwindowsオブジェクト
y, //アンカーで"#"を指定した場合に、アンカー以下のURIが入ってくる
B = GaIndexOf(cookievalue, "__utma=" + domainhash + "."), //_utmaある?
O = GaIndexOf(cookievalue, "__utmb=" + domainhash), //_utmbある?
ma = GaIndexOf(cookievalue, "__utmc=" + domainhash), // _utmcある?
G, //_utmaの値を格納
J = [], //_utmbの値を配列で格納
S = "", //y+"&"
ha = false; //gaGlobalの判別flag(ドメインハッシュが一致しない場合はtrue)
//b.pcの内部変数宣言終わり
//"-"とかを""にする
cookievalue = NoVl(cookievalue) ? "" : cookievalue;
//c.allowLinkerはsetAllowLinker(true)で1
//urlから値を取得、この時に、utmkがハッシュでの改ざんcheckになる
if (dfvls.allowLinker) {
y = dfvls.a["location"] && dfvls.a["location"].hash ? dfvls.a["location"].href.substring(dfvls.a["location"].href.indexOf("#")) : "";
//b.setAllowAnchorで設定, anchorでの文字列があれば、Sに代入
if (dfvls.allowAnchor && !NoVl(y)) S = y + "&";
//search部分も引っ付ける
S += dfvls.a["location"].search;
//Sに_utmaが含まれれば
if (!NoVl(S) && GaIndexOf(S, "__utma=")) {
debugger;
cookiemanager.setValuesAndG(S); //Sの値をcookieに入れて、utmk値をGにSet
//verifyで、gが未設定か、urlの値がきちんとcookieに入ったかをHashでcheck
//失敗なら、gはundefinedに、utmA..Z設定用変数の中身もclear
cookiemanager.verify() || cookiemanager.Sb();
G = cookiemanager.ja(); //_utma設定用変数から値をGに Sb()を実行した場合には、G="-"となる
}
//utmxのsetter, getter, cookiewriter, true(Decodeする)
//utmx をcookieに書き込み
n(cookiemanager.ma, cookiemanager.vb, cookiemanager.Eb, true);
//utmv をcookieに書き込み
n(cookiemanager.la, cookiemanager.Aa, cookiemanager.Fa);
}
//以上でAllowLinkerがtrueの時の作業終わり
//通常(linkでない)の場合と、上記でutmaがなかった場合
if (NoVl(G)){
//Bは、domainHashに対応したutmaのcheck-flag
if (B){
//utmb, utmcが無い場合、新規セッション
if (!O || !ma) {
//utmaの値を現在時間で更新して代入
G = setUtmaArray(cookievalue, ";", timenow);
//b.Fは、キャンペーン処理での新規セッション判定に使われる
b.F = true;
//継続セッションの場合
} else {
//utmaの値を取得
G = Q(cookievalue, "__utma=" + domainhash + ".", ";");
//utmbをset, 配列にいれておく
J = GaSplit(Q(cookievalue, "__utmb=" + domainhash, ";"), ".");
}
//utmaのドメインハッシュが一致しない
}else {
//新規にutma用の配列を作る
G = GaJoin([domainhash, b.jc(), timenow, timenow, timenow, 1], ".");
//新規セッションflag
ha = b.F = true; //haはGaGlobalで使う
}
//utmaがあるけど、utmb or utmcがない=>新規セッション
}else if (NoVl(cookiemanager.C()) || NoVl(cookiemanager.ka())) { //utmb, utmcのどちらかが、"-"だったとき
//値を現在時間で更新してGに入れる
G = setUtmaArray(S, "&", timenow);
//新規セッションflagをtrueに
b.F = true;
//utma, utmb, utmcあり
} else {
//utmbをset
J = GaSplit(cookiemanager.C(), ".");
//utmbの先頭要素がドメインハッシュに?
domainhash = J[0];
}
//G(utma), J(utmb)の設定終わり
G = G.split(".");
//gaGlobalがある時
if (o && u && u.dh == domainhash && !dfvls.namespace) {
G[4] = u.sid ? u.sid : G[4];
if (ha) {
G[3] = u.sid ? u.sid : G[4];
if (u.vid) {
timenow = u.vid.split("."); //from string to array
G[1] = timenow[0];
G[2] = timenow[1];
}
}
}
//utmaの値を、クッキーマネージャーオブジェクトにset
cookiemanager.tb(G.join("."));
//utmbをsetしていく
J[0] = domainhash;
J[1] = J[1] ? J[1] : 0;
J[2] = undefined != J[2] ? J[2] : dfvls.Jc; //dfvls.Jc = 10
J[3] = J[3] ? J[3] : G[4]; //session開始時間
//utmbをset
cookiemanager.ya(J.join("."));
//utmcをset
cookiemanager.ub(domainhash);
//クッキーマネージャーオブジェクトの変数gがなければ、
//cookiemanager.setG(cookiemanager.getAllStr())でutmkの値を入れる
NoVl(cookiemanager.lc()) || cookiemanager.setG(cookiemanager.getAllStrToHash());
//utmaをcookieに書き込み
cookiemanager.Cb();
//utmbをcookieに書き込み
cookiemanager.Ea();
//utmcをcookieに書き込み
cookiemanager.Db();
};
//End of b.pc()
こちらもあわせてどうぞ