2017-07-07 3 views
-1

Ich versuche eine Chrome-Erweiterung zu erstellen, die einen Screenshot von einer großen Seite erstellt.chrome.tabs.captureVisibleTab fängt den falschen Bereich ein

Hier ist eine meiner einfachen Erweiterung, die zu einigen Teilen einer Seite scrollen und erfassen sollte.

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); 
} 

Das Problem ist, dass Schüsse [], die Anordnung von imageuris, einige identischen imageuris enthalten, wie wenn capturevisibletab die gleiche Fläche mehr einfängt mal.

In Firefox funktioniert genau der gleiche Code ganz gut, mit der Ausnahme, dass in Firefox capturevisibletab Versprechen und Rückruf ist kein Muss.

+0

Bitte bearbeiten Sie die Frage zum Thema: Fügen Sie ein [mcve] ein, das das Problem dupliziert. Bei Chrome-Erweiterungen oder Firefox-WebExtensions bedeutet dies fast immer, dass Sie * manifest.json * und einige der Hintergrund-, Inhalts- und/oder Popup-Skripts/HTML einfügen. Fragen, die Debugging-Hilfe suchen ("Warum funktioniert dieser Code nicht so, wie ich will?") ​​Muss Folgendes enthalten: (1) das gewünschte Verhalten, (2) ein spezifisches Problem oder einen Fehler und (3) den kürzesten Code, der für die Reproduktion erforderlich ist * in der Frage selbst *. Bitte beachten Sie auch: [Was kann ich hier fragen?] (Http://stackoverflow.com/help/on-topic) und [fragen]. – Makyen

Antwort

0

Die Funktion scroll() setzt voraus, dass die Registerkarte gescrollt wird, bevor callback() aufgerufen wird.
Es gibt keine solche Garantie, da die API asynchron ist.
Ich denke, es funktioniert jetzt nur für Sie, weil Ihr FF noch im Single-Process-Modus läuft.

Geben Sie die callback in executeScript an, so dass sie zurückgerufen wird, nachdem das Skript tatsächlich ausgeführt wurde.

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

Ja, das Problem ist, dass API asynchron ist, aber Ihre Lösung funktioniert auch nicht. Ich habe es geschafft, dies mit setTimeout zu lösen, aber ich glaube, das ist nicht so, wie es sein sollte, und nach einer besseren Lösung für synchrone Anrufe zu suchen. –

+0

Tatsächlich scheint die Verwendung von setTimeout hacky zu sein, und es könnte eine Einschränkung oder ein Fehler von chrome.tabs.captureVisibleTab sein: Es ist möglich, dass es einfach das letzte Paint-Ergebnis wiederverwendet, das nicht sofort vom Renderer aktualisiert wird, wenn window.scrollTo schließt ab. – wOxxOm

Verwandte Themen