2017-03-15 2 views
0

Ich erstelle eine Chrome-Erweiterung, die mit draw.io interagiert. Draw.io erstellt eine Instanz von EditorUI, die alle Informationen über das aktuell geöffnete Diagramm enthält (einschließlich eines SVG-Bildes des Diagramms). Ist es möglich, mit JavaScript auf diesen Kontext zuzugreifen? Die Fenstervariablen (auf die durch Codeeinfügung zugegriffen werden kann) enthalten nur eine Funktion zum Erstellen einer Instanz von EditorUI, jedoch nicht die Instanz selbst. Ich kann den staatlichen/lokalen Geltungsbereich nicht erreichen.Draw.io: Instanz von EditorUI abrufen

+0

Mögliches Duplikat [Insert-Code in den Seitenkontext einen Content-Skript] (http://stackoverflow.com/questions/9515704/insert-code-into-the-page-context-using-a- content-script) – Makyen

Antwort

0

Hier ist, wie ich es gelöst habe: Das Einfügen einer Funktion war der richtige Ansatz. Zuerst hatte ich gehofft, einfach Draw.io-Funktionen wie getCurrentFile(); aufzurufen, um die gewünschten Informationen zu erhalten. Während es möglich ist, sie anzurufen, bekommst du nichts als null raus. Ich beschloss daher, die Funktion zu überschreiben, den ursprünglichen Inhalt beizubehalten und das, was ich brauche, an einen benutzerdefinierten Ereignis-Listener zu senden.

var svg = null; 

/** 
* Function to be inserted into Draw.io. Contains a function that overrides getCurrentFile(). Original functionality 
* of getter function is kept, file data is saved to a variable. 
*/ 
var hijackFileGetter = '(' + function() { 
     window.EditorUi.prototype.getCurrentFile = function() { 
      if(this.currentFile !== null) { 
       var svg = this.currentFile.data; 
       var event = document.createEvent("CustomEvent"); 
       event.initCustomEvent("listenToChanges", true, true, svg); 
       document.dispatchEvent(event); 
      } 
      return this.currentFile; 
     }; 
    } + ')();'; 

/** 
* Injection of Javascript code into Draw.io 
*/ 
var script = document.createElement('script'); 
script.textContent = hijackFileGetter; 
(document.head||document.documentElement).appendChild(script); 
script.remove(); 

/** 
* EventListener for communication from our injected script to this content script 
* Receives a new SVG every time changes are made 
*/ 
document.addEventListener('listenToChanges', function (data) { 
    svg = data.detail; 
}); 

/** 
* Message passing from content script to popup (and the other way around) 
*/ 
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 
    if(request.popup) { 
     chrome.runtime.sendMessage({svg: svg}); 
     sendResponse({svgSearch: true}); 
    } 
}); 
1

App.main has a callback, die die ui-Instanz zurückgibt.

+0

Ich bin ziemlich neu in Javascript und der minimierte Quellcode macht mich verrückt (gibt es nicht-minimierten Quellcode verfügbar?). Können Sie mir sagen, wie genau ich diesen Rückruf verwenden würde? – Felix

+0

https://github.com/jgraph/draw.io/tree/v6.3.4/war/js/diagramly – David

+0

Danke, das sieht aus wie ich brauche. Ich verstehe es immer noch nicht ganz: Draw.io ruft App.main ohne Rückruf auf. Wenn ich es selbst anrufe, kann ich das nur in einem anderen Kontext tun. Wie bekomme ich meinen Rückruf in die Website? – Felix

Verwandte Themen