2017-07-07 15 views
-1

大きなページのスクリーンショットを撮るクロム拡張を作成しようとしています。chrome.tabs.captureVisibleTabが間違った領域をキャプチャします

私の単純な拡張機能は、ページの一部をスクロールしてキャプチャする必要があります。

manifest.jsonを

{ 

     "manifest_version": 2, 
     "name": "screenshot_test", 
     "version": "1.0", 

     "permissions": [ 
     "tabs", 
     "<all_urls>" 
     ], 

     "background": { 
     "scripts": ["background.js"] 
     }, 

     "browser_action": { 
     "default_icon": "icon.png" 
     } 

    } 

background.js

chrome.browserAction.onClicked.addListener(capture)  
function capture(){ 

    function scroll(point, callback){ 
     chrome.tabs.executeScript({ 
      code: 'window.scrollTo('+JSON.stringify((point.x))+','+JSON.stringify(point.y)+')', 
     }, callback) 
    } 

    function capturetab(){ 
     chrome.tabs.captureVisibleTab(function(imageUri){ 
      shots.push(imageUri); 
     }); 
    } 

    var shots=[]; 
    var points=[{x: 0, y: 0}, {x: 500, y: 500},{x: 1000, y: 1000}]; 

    for (var i=0; i<3; i++) scroll(points[i], capturetab);  
    console.log(shots); 
} 

capturevisibletabは、いくつかの同じ領域をキャプチャする場合のような問題は、ショットは[]、imageurisの配列は、いくつかの同じimageurisが含まれていることです回。

firefoxでは、まったく同じコードが正常に機能しますが、firefoxのcapturevisibletabでは約束を返し、コールバックは必須ではありません。

+0

問題が重複している[mcve]を含むトピックになるように質問してください。 Chrome拡張機能やFirefox WebExtensionsの場合は、* manifest.json *や背景/コンテンツ/ポップアップスクリプト/ HTMLの一部を含むことがほとんどです。 (1)望ましい動作、(2)特定の問題またはエラー、および(3)それを再現するために必要な最短のコードを含める必要があります。質問自体に*。また、[ここで私はどのような話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)、[ask]を参照してください。 – Makyen

答えて

0

scroll()関数は、callback()が呼び出される前にタブがスクロールされていることを前提としています。
APIが非同期であるため、そのような保証はありません。
あなたのFFはまだシングルプロセスモードで動作しているからです。

executeスクリプトでcallbackを指定すると、スクリプトが実際に実行された後に呼び出されるようになります。

function scroll(point, callback){ 
    chrome.tabs.executeScript({ 
     code: 'window.scrollTo('+JSON.stringify((point.x))+','+JSON.stringify(point.y)+')' 
    }, callback); 
    } 
+0

はい、問題はapiが非同期ですが、あなたの解決策も機能しないということです。私はsetTimeoutを使ってこれを解決することができましたが、これはどのようにして同期呼び出しのためのより良い解決策を探しているのではないと思います。 –

+0

確かに、setTimeoutを使用する必要はありません。chrome.tabs.captureVisibleTabの制限やバグかもしれません。最後のペイント結果を再利用するだけです。これは、レンダラーによってすぐに更新されない可能性があります。window.scrollTo完了する。 – wOxxOm

関連する問題