抜本的な形で設計を整理した

1.ICookieGetterの機能をシンプルにした。互換性関係でICookieImporterに改名
標準ライブラリ側で片付ければいいものは消した。SnkLib.App.CookieGetterとしてコア部分を分離し、コア部分からは直接関係のないWindows.Forms等を参照から外した。

2.IBrowserManager周りのコードの重複を省いた。互換性関係でICookieImporterFactoryに改名
マルチプロファイル系が腐ってたので重複コードを消した。ついでにBlinkCookieGetterのCookie復号化のコード分岐を目立たなくしてシーケンスが分かりやすいようにした。あとfirefoxのプロファイル読み込みも。

3.CookieStatusをイミュータブル化、BrowserConfigに改名
CookieStatusはICookieGetter向けの引数としての役割と外からの状態チェックの役割の2つを兼ねていて見通しが悪い。そのため、引数としての役割に特化させ、外向けの情報はICookieGetterに持たせた。イミュータブル化してるため、設定の変更はCookieStatus.Generate(), ICookieGetter.Generate()を組み合わせて必要なICookieGetterを再生成させる。

4.BrowserConfigに等価演算子を定義した。
ついでにCookieGetter.CreateInstance(config)の仕組みを調整した。設定復元がやりやすくなる。

5.いくつかのクラスの名前を役割が端的に表現されるように改名した。
ICookieGetterの実装クラスはレンダリングエンジン名をクラス名にするよう徹底した。

6.単体テストでいくつかのブラウザを一括チェックできるようにした

7.独自エンジン時代のOpera用のCookieGetterを削除
オワコン。中身がゴリ押し気味で危ないので削除。

8.名前空間を我流に変更
本家CookieGetterSharpとの互換性の無さをはっきりさせるために名前空間を変更。互換性対策としてHal.CookieGetterSharpにはラッパークラスを作成した。

9.余分なファイルが有ったので削除
IE9向けの残骸っぽいのを削除

10.Releaseビルド時にxmlコメントを生成するようにした。
全てのメンバにxmlコメントを記述しているわけではないため、警告が大量に出る。

11.BlinkのCookie復号化のコード分岐を目立たなくしてシーケンスが分かりやすいようにした。
ついでにfirefoxのプロファイル読み込みも。

12.余分なファイルが有ったので削除
IE9向けの残骸っぽいのを削除
フォルダ構成を整理した。

1.Sample, NwhoisLoginSystem の2つのみを持ったソリューションを作成
配布時に放り込む用。
IEの拡張保護モードへ再び対応させた

1.キャッシュファイルを探索するAIECookieGetterをIEFindCacheCookieGetterとして復活させた
拡張保護モードで上手くapiからcookieを取得する方法が分からんのでファイルを漁る。

2.IEBrowserManagerを修正
モード別のcookie取得メソッドを上手く使いこなせてなかったので修正。保護モードIEのcookieパスが間違っていたのでIEFindCacheCookieGetterの存在も考えて修正。BrowserNameも長すぎたので短縮。
機能を非同期化。設定保存周り強化。エラー処理見直し

1.GetCookiesAsync(), CreateInstanceAsync()を作成。
古い同期版は削除。

2.BrowserConfigのシリアル化まわりを強化した。
DataContract, XmlSerializer, ApplicationSettingsBase で使える。設定保存用を想定。

3.エラー処理の方針を変更
CookieImportExceptionはできるだけ外へ投げないようにした。読み込み対象の形式が変わる事は十分あり得る。そのため、読み込みエラーもライブラリの正常な出力として扱う。GetCookiesAsync()の戻り値で取得成功か失敗を判別する。GetCookiesAsync()はエラーの種類を判別できるように戻り値の表現力を向上させた。そのために新たにImportResultを定義した。

4.動作追跡用の要素を仕込んだ。
今までDebug.WriteLine()が使われていたが、異常チェックはDebug.Assert()、エラー処理や処理追跡周りはTrace.Failを使うようにした。
UI向けの機能をSnkLib.App.CookieGetterにも追加した

1.ブラウザ選択コンボボックスを簡単に作れるようにした。
ViewModelを作成した。Formsを必要とするものはSnkLib.App.CookieGetter.Formsに隔離。

BrowserSelector: ブラウザ選択UIが持つ基本的な状態を保持するViewModel。Formsにも使っているがWPFを念頭に置いている。
NicoSessionComboBox: ニコ動向けのブラウザ選択コンボボックス。
細部を調整した

1.細部を修正
webkit関係が今はblink関係になっているのでその辺のクラスを改名。
非同期メソッドの名前の最後をAsyncにするのを徹底。
xmlコメントを充実させた。

2.CookieGetters.Create～()をGet～()に改名。
使い手に意図しない思い込みを作りたくないので、生成の文脈を除去して余計な情報を与えないようにした。
NuGetパッケージ化できるようにしてみる

1.付属のSQLiteをNuGet経由に変更した
本家との互換性でSQLiteが競合してしまうのが気に食わない。しかし、NuGet Installはビルド前に導入するものなのであまり問題にならないと考えた。それよりも導入の楽さを優先する。

2.ライセンスをこのバージョンから変更
本家のライセンスは改造した際のソース公開を要求しているが、公開されたソースの再改造時にソース公開を強いるライセンスの設定を強いていない。気持ち悪いのでLGPLとしてはっきりさせる。
NicoSessionComboBoxのブラウザ一覧の表示速度を向上させた

1.BrowserItem.InitializeAsync()を同期型に戻した
あの場所で時間を食うのは応答性の面で良くない。そのため、同期型に戻してNicoAccountSelectorItemのアカウント名の読み込みの結果反映は後からDisplayTextの更新で行えるようにした。

2.xmlコメントを充実させた
忘れていたものを幾つか書き足した。
SnkLib.App.CookieGetter.Formsのxml出力がされていなかったので出力を有効にした。
Chrome, Firefox の派生ブラウザをまとめて対応させた

1.SmartBrowserManagerを作成
フォルダ構造に本家との違いが少ない派生ブラウザは未知のブラウザであっても対応できるようにした。

* 本家は専用クラスを定義。(Chrome, Firefox, IE)
* 本家との違いが大きいものは今までどおり専用クラスを定義。(Lunascape, Tungsten)
* 立ち位置的に中身が変わりそうなのは専用クラスを定義。(Opera, Sleipnir)
* 本家と大差ないものは専用クラスを削除。Smart型に任せる。(ComodoDragon, PaleMoon)

2.BrowserConfig.Equals()を変更
SmartBrowserManagerの追加で、BrowserNameが違うが同一CookiePathを参照するICookieImporterが存在し得る事になった。そのため、CookiePathを同一性判定の条件としつつ、null時には他の要素でも判定を行うようにする事で列挙時に重複除去できるようにした。

3.BlinkBrowserManager, GeckoBrowserManagerのコンストラクタを変更
決め打ちでBlinkCookieGetterなどを生成しても問題ないと考えた。

4.マルチプロファイルの表示に対応
ついで。
CookieStatusがSerializableになっていなかったので修正

ついでにパッケージの説明文を微修正。対象プラットフォームをはっきりさせた。
BrowserSelector, BrowserItem の名前空間を変更

1.ViewModel類の名前空間を*.Applicationから*.Windows.ViewModels へ変更
IntelliSenseのノイズになっている。CookieGettersとBrowserSelectorは同一名前空間に置くとネーミング的に機能の推論がしにくい。また、ViewModelは他のライブラリ類と同一名前空間にする方がxamlから参照する際に楽。これらの点で破壊的変更を行った。

2.バージョン番号の付け方を変更
破壊的変更を加えたので1.1.0.0へ上げた。番号の自動インクリメントは依存バージョンの記述が面倒なのでやめた。それも込みで1.0 to 1.1
CookieGetter.Sharpの方も未知の派生ブラウザへ対応できるようにした

1.ラッパーの方のCookieGetterを強化
新クラスと同じように、未知の派生ブラウザに対応できるようにした。

2.ラッパの方を微修正。
BrowserManagerが要らないので削除。CookieGetterのコンストラクタが公開されていたので非公開に変更。本家とコンストラクタで非互換である事に加えて、本家はコンストラクタを公開していないので非公開。

3.BrowserConfigを微修正。
等価演算周りに余分な処理があったので修正。
ターゲットフレームワークを.net4.5へ変更

今まで.net4.5.1になっていた。無駄に高くする必要はない。
BrowserSelectorの出力で並べ替えがなされるようにした。

BrowserSelector.Itemsをブラウザの名前で並べ替える。マイナーなブラウザが追加される事でブラウザをリストから探しにくく、また、新たに追加された時にリスト項目の位置が上下してしまって面倒。そのため、OSにプリインストールされたものや、有名なブラウザはリスト上位に配置されるようにしつつ、ブラウザ名でソートした。
BrowserComboBoxが過剰にCookieGetterを呼び出さないようにした

ついでにBrowserComboBox.IsAllBrowserModeを消した。無駄。ViewModelを直接いじるべき。
.nuspecファイルのライセンスURL部分を埋めた
README.mdの説明を書き足した

対応ブラウザなども書き足した。ライセンス周りをより分かりやすく、かつ著作権表示をコピペし易いように形式的な書き方にした。
ブラウザのバージョン毎のファイルの分散を抑えられるようにした

1.ブラウザのバージョン毎のBrowserManagerを削除
各ブラウザ毎に1クラスを徹底。ブラウザのバージョン毎にファイルが分散するとサポートを辞める時にファイルを消し忘れたりする。そのため、1つのブラウザのサポート終了と同時に1つのファイルが消えるようにした。

分散していたファイルの代わりに以下のファイルを作成した。
SleipnirBrowserManager.cs
LunascapeBrowserManager.cs

2.Sleipnir4BlinkBrowserManagerを削除
Sleipnir3WebkitBrowserManagerと変わらない。

3.CookieGettersへSleipnir3関係を追加
忘れていた。
CoolNovoを対応ブラウザから外した。

オワコン。更新停止してる。
同時にCoolNovoのせいでprivateメンバー化できていなかったものをprivate化した。
BrowserManagerのprimaryLevel指定を省略可能にした