console.logの履歴にアクセスしたいのですがどうすればよいでしょうか？


chromeのconsole上において(iframeで読み込まれ勝手に)consoleに出力されたものを
文字列として変数に入れてhtmlに出力したいのですが どのような方法がありますでしょうか？

よろしくお願いいたします。




ライブラリを使わない方法(のヒント)を提示しておきます。

# オリジンが同じ場合

iframe の DOM ノードには `contentWindow` というオブジェクトが存在します。 これは iframe 内の `window`
と同じものです。 **幾つかの条件を満たす時には** 、外側のフレームから この `contentWindow` の内部を書き換えることができます

このことを利用して `contentWindow.console.log` やその他を別の関数に差し替えてしまえば、 iframe 内から
`console.log` への出力(全履歴)を、外側から知ることができます。 おおよそのコードはこんな感じですね。

[code]

    // 文章内の最初の iframe を取得する。必要に応じて取り方は変えるべし
    var firstFrame = document.getElementsByTagName('iframe')[0];
    
    firstFrame.contentWindow.console.log = function() {
      // TODO: arguments を履歴として記録する
    }
    
[/code]

なお **幾つかの条件** とはおおよそ以下のとおりで、全て満たしている場合にのみ書き換え可能なはずです。(動作確認はしていない)

  * iframe ノードが document の下にぶら下がっている
  * 外側と iframe 内のコンテンツの生成元(オリジン)が同一である
  * sandbox 制限がかかっていない

参考文献: [インラインフレームについて - JavaScriptプログラミング講座](http://hakuhin.jp/js/iframe.html)

# オリジンが異なる場合

仮に iframe 内側のコンテンツに任意のJavaScriptを入れられるようならば、 オリジンが異なる場合にも対応する方法があります。 それは
[`parent.postMessage`](https://developer.mozilla.org/ja/docs/DOM/window.postMessage)
を使う方法です。

説明は、簡単なコードを示すに留めますが以下のようになります。 なおコードには onload からの呼び出しなどは含まれていませんので、
必要に応じて適宜補ってください。

### iframe の内側の JavaScript

[code]

    console.log = function () {
      parent.postMessage(JSON.stringify(arguments), '*')
    }
    
[/code]

### 外側の JavaScript

[code]

    window.addEventListener("message", receiveMessage, false);
    
    function receiveMessage(ev) {
      // 期待した生成元(オリジン)からのメッセージであるかを確認する
      if (ev.origin === 'http://example.org/') {
        // 履歴に記録する
      }
    }
    
[/code]

