Je développe actuellement une extension chrome pour Gmail. Je souhaite déclencher certaines actions lorsque l'utilisateur ouvre un e-mail et expédie l'adresse e-mail de l'expéditeur à partir de là. Donc, l'idée que je suis venu avec est d'intercepter XMLHttpRequest.send
via le prototype et si cette demande contient des données e-mail, puis déclencher mes événements à partir de là. Mais gmail n'envoie aucune demande de repos et obtient le corps de l'e-mail en utilisant the dark force. Je suis vraiment coincé dans la question comment googles obtient le corps de l'e-mail et d'autres données à la page. Je veux dire la seule façon dont les nouvelles données peuvent apparaître dans la page est via rest
:Comment Gmail récupère les données dans la page
- soumission de formulaire
- XMLHttpRequest
- de WebSockets
Tous ceux-ci peuvent être inspectés par dev-tools
. J'ai donc créé un extrait qui ajoute un écouteur DOMSubtreeModified
au top
du document
. Et à l'intérieur de l'écouteur, j'interroge le corps avec xpath pour les données d'email que j'ouvre.
E.g. Je veux trouver comment Gmail récupéré des données pour l'email A
. Je sais que cet e-mail contient un texte spécifique comme random text r2d2
. Donc, je vérifie juste dans mon auditeur si le document contient maintenant des nœuds avec innerText random text r2d2
. Et après je viens de vérifier Network
onglet pour la demande qui ont été envoyés entre le clic sur le bouton e-mail ouvert et l'apparition de nouveau texte dans la page. Here's the video to understand what I'm talking about.
function findEleWithText(text) {
let parent = document.body;
let results = [];
let query = document.evaluate("//*[contains(text()," + text + "')]",
parent || document,
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (let i=0, length=query.snapshotLength; i<length; ++i) {
results.push(query.snapshotItem(i));
}
return results;
}
document.addEventListener('DOMSubtreeModified', e => {
var e2 = findEleWithText("2:09 p.m.", document.body)
if (e2.length > 0) {
console.log('e');
}
})
Mais voici la question, les données pour le courrier électronique apparaît dans la page mais Network
onglet montre qu'aucune demande a été faite. Comment est-il même possible que les données voyagent dans la page? Je veux dire que même si la requête était faite à partir de iframe, elle serait affichée dans le Networks
de toute façon. J'ai également vérifié si google ouvre un websocket (les données de ws ne sont pas montrées à Networks
) - mais pas!
Des idées? Existe-t-il des moyens d'extraire des données sans REST?