近江在住

2010-05-27 AutoPagerize for Chromeの動作不具合とその修正

先日mixiのほうに気付いた事柄だけまとめた日記をあげたのだが、何とか動作自体を修正できたのではてなにも書く。

AutoPagerize for Chromeの動作に関して。

発生した環境はVista businessのGoogle Chrome+AutoPagerize for Chrome。Windows 7のChrome+AutoPagerizeでも確認。いずれもリリース版。

発生した対象は、ものとして褒められたサイトではないのだが、以下のsiteinfoからたどって欲しい。

http://wedata.net/items/32076


動作例として、http://doma.in/page.php内のリンクを考える。

<a href="?query=arg&offset=10">next</a>

のようなリンクの場合、単純にリンクをクリックしてページ遷移した場合、Fx、Chrome共にpage.php?query=arg&offset=10を表示する。Fxでの先読みでも同様に動作する。

しかし、Chromeの先読みでは

page: <a href="http://doma.in/?query=arg&offset=10">2</a>

が読み込まれてしまう。

先述の通り対象リンクを直接クリックした場合はリンクの意図通りのページを読み込む一方、AutoPagerize による先読みではアンカーを直接に解釈したリンク先を読み込もうとする。普通ならこのような先読みが起こっても、読み込み先のページがsiteinfoに合致しない。そのため不適合を起こして先読みが中断される。問題は表面化しない。

今回のケースでは先読み対象のページも同様の記述ポリシー(特にpageElementに合致する部分)で製作されていたことが影響している。

対策は以下。

resolvePathに、pathが ? から始まる場合の処理を追加した。

function resolvePath(path, base) {
  if (path.match(/^https?:\/\//)) {
      return path
  }
  if (path.match(/^\?/)) {
      return base.replace(/\?[^\?]+$/, '') + path
  }
  else if (path.match(/^[^\/]/)) {
  //if (path.match(/^[^\/]/)) {
      return base.replace(/[^/]+$/, '') + path
  }
  else {
      return base.replace(/([^/]+:\/\/[^/]+)\/.*/, '\$1') + path
  }
}