Le composant JS côté client de Orbited (un serveur Comet), requiert que si le serveur s'exécute sur un domaine ou un port différent du JS lui-même, vous devez exécuter
document.domain = document.domain;
avant tout autre JS est chargé. (Voir la documentation .)
Qu'est-ce que cela fait? Il ressemble à un NOOP! (J'ai vérifié et c'est en fait nécessaire.)
J'ai en fait écrit ce code.
Lorsque vous essayez de faire une comète inter-sous-domaine/port, l'iframe doit avoir le même document.domain
valeur comme cadre parent. Malheureusement, le navigateur stocke le nom de domaine ET le port en interne pour l'original document.domain
valeur. Mais le getter et le setter en javascript ne savent rien du port. Le problème est donc le suivant: si le cadre supérieur document.domain
est ('example.com', 80)
, et le cadre inférieur est ('comet.example.com', 80)
, comment faire pour que le cadre inférieur soit ('example.com', 80)
ainsi que?
Vous ne pouvez pas, car la modification de la partie du nom d'hôte entraînera nécessairement la définition du port sur null
, donc le mieux que vous puissiez faire est ('example.com', null)
dans le cadre inférieur. Le cadre supérieur doit donc également être défini sur cette valeur et définir document.domain=document.domain
fait exactement cela. Il change la représentation interne dans le navigateur de ('example.com', 80)
à ('example.com', null)
puis tout concorde et la communication entre les trames entre ports/sous-domaines fonctionne.
Les navigateurs distinguent (a) document.domain lorsqu'il n'est pas défini explicitement et (b) document.domain lorsqu'il est défini explicitement ... même s'ils retournent la même valeur.
La définition explicite de la valeur indique l'intention de "coopérer" avec un script sur un autre sous-domaine (sous le même domaine parent).
Si la page parente ET le script externe définissent explicitement document.domain sur la même valeur, la restriction de politique de même origine peut être contournée et chaque script peut accéder à tous les objets et propriétés (autrement restreints) des contextes des autres.
J'ai trouvé les informations suivantes sur ce site: devgur . Plus concrètement, voici la citation:
Cette propriété définit ou retourne le nom de domaine du serveur dont le document est issu. Il s'agit par défaut du nom de domaine du serveur à partir duquel le document a été récupéré, mais peut être remplacé par un suffixe (et uniquement un suffixe) de ce nom. Cela permet le partage des propriétés de script, la sécurité le permettant, entre les documents fournis par différents serveurs à condition qu'ils partagent le même suffixe de domaine.
Il me semble qu'il autorise les scripts intersites pour le même domaine (même si le sous-domaine est différent).
Je suppose que si vous ne touchez pas document.domain, le moteur js n'autorise que d'autres javascripts du même domaine. Avec cette propriété, vous pourrez déployer sur d'autres sous-domaines comme l'état des documents orbités.
Le document.domain
extrait une valeur par défaut de l'URL réelle si elle n'est pas explicitement définie. Les navigateurs enregistreront si document.domain
est venu par défaut de l'URL ou s'il a été explicitement défini. Les deux doivent être par défaut pour le même domaine ou les deux doivent être explicitement définis sur le même domaine pour que cela fonctionne. Si l'une est par défaut et l'autre est explicitement définie, les deux correspondant si lues, les deux pages seront toujours interdites de parler entre elles.
Voir: https://developer.mozilla.org/en-US/docs/DOM/document.domain