2017-07-07 87 views
-1

我正在嘗試創建一個大型頁面的屏幕截圖的Chrome擴展。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); 
} 

的問題是,拍攝[],imageuris陣列,包含一些相同imageuris,如果capturevisibletab捕獲同一地區的幾個像倍。

在firefox中,完全相同的代碼工作得很好,除了在firefox capturevisibletab中返回promise和callback不是強制性的。

+0

請編輯問題爲主題:包括一個重複問題的[mcve]。對於Chrome擴展程序或Firefox WebExtensions,這通常意味着包含您的* manifest.json *以及一些背景,內容和/或彈出式腳本/ HTML。尋求調試幫助的問題(「爲什麼代碼不按我想要的方式工作?」)必須包括:(1)期望的行爲,(2)特定問題或錯誤,以及(3)重現它所需的最短代碼*在問題本身*。另請參閱:[我可以在這裏詢問什麼主題?](http://stackoverflow.com/help/on-topic)和[問]。 – Makyen

回答

0

您的scroll()函數假定該選項卡在調用callback()之前滾動。
因爲API是異步的,所以沒有這樣的保證。
我想現在只適用於你,因爲你的FF仍然在單進程模式下運行。

在executeScript中指定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