2009-03-13 8 views
0

Je suis aux prises avec un problème depuis quelques heures maintenant, et j'apprécierais soit de l'aide pour atteindre mon objectif, soit une confirmation que ce que j'essaie de faire est en fait impossible .Obtention d'un texte sélectionné avec script inter-image

J'ai une webapp qui prend le texte sélectionné (document.getSelection()) en entrée, à partir d'une page Web arbitraire. Alors qu'il serait possible d'utiliser un bookmarklet pour faire un tel script assez facilement, il est préférable pour l'utilisateur final si je peux accomplir cela avec un iframe.

Le cadre parent est mon site avec ce script:

$('#frame').load(function() 
{ 
    // this event won't be triggered 
    $(window).mouseup(function(){ 
     doStuff(window.getSelection()); 
    }); 

    // this will throw a security error 
    $(window.frames[0].document).mouseup(function(){ 
     doStuff(window.frames[0].document.getSelection()); 
    });     
}); 

Un site arbitraire est dans le cadre de l'enfant. Sauf si le document enfant provient de mon domaine, l'accès est interdit pour des raisons de sécurité XSS. J'ai essayé plusieurs variantes et tentatives de hacks, y compris la définition de l'iframe src sur mon domaine avec l'URL tierce en tant qu'argument, puis la redirection vers l'URL tierce. Dans un sens, je suis content que cela n'ait pas fonctionné (parce que si c'était le cas, la sécurité XSS aurait encore un long chemin à parcourir ...)

Une autre option serait de télécharger la page tierce et de servir de mon domaine comme un serveur proxy, mais j'ai déjà rencontré un tas de problèmes avec des chemins relatifs aux fichiers, qui sont parfois faciles à rendre absolus, mais parfois une course de fou (comme lorsque les fichiers sont accessibles via un script) . Je suis arrivé à la conclusion que je n'aurais peut-être pas de chance. Peut-être une distinction importante pour mon cas est que je veux seulement accéder à la méthode .getSelection() pour l'enfant. Pas besoin d'être en mesure d'accéder à des cookies ou des frappes au clavier ou d'interagir avec le DOM. Peut-être que cela ne fait pas de différence, mais peut-être que c'est le cas.

Répondre

0

Vous pouvez essayer la méthode proxy mais insérer une balise base pointant vers le domaine d'origine. Les chemins doivent être pris en charge alors. Je ne compterais pas sur les hacks XSS même si vous pouviez les trouver - ils seraient probablement corrigés et probablement pas crossbrowser.

0

une possibilité est d'écrire le document de votre iframe avec du texte provenant d'un XHR, ou d'utiliser la fonction load() de jQuery, cela ne fonctionne que s'il n'y a pas de navigation dans l'iframe.

0

Je n'ai pas complètement lu votre réponse :-) mais peut-être que j'ai une solution, cela implique de passer des données entre les cadres parent et enfant, dans les deux sens.

Vous pouvez écrire (et non lire) le hachage (hash est le http://url#HASH_PART) de parent de l'enfant. Donc, sur l'iframe parent, il suffit de définir l'intervalle pour vérifier la valeur, dites toutes les 50ms.

function checkHash() { 
    if (window.location.hash == "#something") { 
     // my child frame set this value using: 
     //parent.window.location.hash = "something"; 
     doSomething(); 
    } 
} 

Pour plus de détails, et peut-être faire des parents aux communications de l'enfant, puis l'article complet expliquant ce (a également lien de démonstration) se trouve here.