読者です 読者をやめる 読者になる 読者になる

gotin blog

Whatever gotin wanna write

GreasemonkeyスクリプトでPOSTするときにObjectに関数を加えてあると失敗するっぽい

GM_xmlhttpRequest()でPOSTする場合、

GM_xmlhttpRequest({
  url:... ,
  method:"POST",
  headers:{"Content-Type":"application/x-www-form-urlencoded"},
  data: ..., });

といった感じでリクエストヘッダでContent-Typeを指定することがよくあると思いますが、
このときの

  headers:{"Content-Type":"application/x-www-form-urlencoded"},

の、headersの値定義部分において、JSON記法で明示的に関数を値としてもつ属性は定義されていなくても、

Object.prototype.hogehoge = function(){ ...

といった感じでObjectに何か関数を値としてもつ属性が足されているとPOST処理に失敗するっぽいです。
GM_xmlhttpRequestの実装ではhasOwnPropertyとかでフィルタリングしたり、関数値の属性は無視する、なんてことはしておらずしかもPOST処理に失敗するようになっているのだと思われます。多分。

で、対策なんですが、Objectに関数を追加しないようにするか、POST処理する前に対象となる関数を一旦削除するっきゃないと思われます。
こんな感じで↓

var tmp = Object.prototype.hogehoge;
delete Object.prototype.hogehoge;

// GM_xmlhttpRequestを使ったPOST処理...

//↓onloadやonerrorなどに指定した関数の中で、
Object.prototype.hogehoge = tmp;