Cacao/WebKit, d'avoir “de la fenêtre.open()” JavaScript liens de l'ouverture d'une instance de Safari
Je suis la construction d'une base de Cacao application utilisant WebKit, pour afficher un Flash/Silverlight application. Très basique, pas l'intention pour que ce soit un navigateur lui-même.
Jusqu'à présent j'ai été en mesure de l'obtenir pour ouvrir la base de liens html (<a href="..." />
) dans une nouvelle instance de Safari à l'aide de
[[NSWorkspace sharedWorkspace] openURL:[request URL]];
Maintenant, ma difficulté est l'ouverture d'un lien dans une nouvelle instance de Safari lorsque window.open()
est utilisé en JavaScript. Je "pense" (et par là, j'ai été à bidouiller dans le code et ne suis pas sûr si je le fait ou pas) j'ai eu ce genre de travail par la définition de la WebView est policyDelegate
et la mise en œuvre de ses
-webView:decidePolicyForNavigationAction:request:frame:decisionListener:
délégué de la méthode. Cependant, cela conduit à un comportement erratique.
Donc de la simple question, que dois-je faire pour que lorsque window.open()
est appelé, le lien est ouvert dans une nouvelle instance de Safari.
Grâce
Gros point, je suis normalement un .NET développeur, et ont travaillé avec le Cacao/WebKit pour quelques jours.
webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener
n'est pas appelé.OriginalL'auteur FireWire | 2008-11-06
Vous devez vous connecter pour publier un commentaire.
J'ai fait du progrès de la nuit dernière et ont écrasé une partie de mon problème.
Je suis déjà à l'aide de
webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:
et j'ai eu à travailler avec des balises d'ancrage, cependant, la méthode ne semble jamais appelée lorsque JavaScript est invoquée.Toutefois, lorsque
window.open()
est appeléwebView:createWebViewWithRequest:request
est appelé, j'ai essayé de forcer la fenêtre pour l'ouvrir dans Safari ici, cependant, la demande est toujours null. Donc, je ne peux jamais lire l'URL.J'ai fait quelques recherches, et cela semble être connue "misfeature" cependant je n'ai pas été en mesure de trouver un moyen de le contourner.
De ce que je comprends
createWebViewWithRequest
vous donne la possibilité de créer la nouvelle webview, l'url demandée est alors envoyé à la nouvelle webView pour être chargé. C'est la meilleure explication que j'ai pu trouver jusqu'à présent.Ainsi, alors que de nombreuses personnes ont souligné ce problème, je n'ai pas encore vu toute solution qui correspond à mes besoins. Je vais essayer de creuser un peu plus profondément dans la
decidePolicyForNewWindowAction
de nouveau.Merci!
OriginalL'auteur FireWire
Bien, je suis à la manipulation par la création d'un mannequin webView, réglage c'est frameLoad délégué à une classe personnalisée qui gère
et ouvre une nouvelle fenêtre.
code :
et NewWindowHandler :
OriginalL'auteur Yoni Shalom
Il semble y avoir un bug avec
webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:
en ce que la demande est toujoursnil
, mais il y a une solution robuste qui fonctionne avec les deux normaltarget="_blank"
des liens ainsi que le javascript.Fondamentalement, je utiliser un autre éphémère WebView pour gérer le nouveau chargement de la page. Semblable à Yoni Shalom, mais avec un peu plus de sucre syntaxique.
De l'utiliser la première définition d'un délégué de l'objet pour votre WebView, dans ce cas, je suis moi-même en tant que délégué:
Puis il suffit de mettre en œuvre les
webView:createWebViewWithRequest:
délégué de la méthode et utiliser mon bloc de base de l'API de faire quelque chose quand une nouvelle page est chargée, dans ce cas, je suis de l'ouverture de la page dans un navigateur externe:C'est assez bien. Voici le code de ma classe. En-tête:
Mise en œuvre:
Sous licence Apache 2.
Encore une bonne correction.
OriginalL'auteur lms
Vous ne mentionnez pas ce genre de comportement erratique que vous voyez. Un rapide possibilité, c'est que lors de la mise en œuvre de la méthode du délégué, vous avez oublié de dire la webview vous êtes ignorant la cliquez par ignorer l'appel de la méthode de la WebPolicyDecisionListener qui a été transmis à votre délégué, qui peut avoir à mettre des choses dans un drôle d'état.
Si ce n'est pas la question, alors, quel contrôle avez-vous sur le contenu que vous affichez? La politique de délégué vous donne facile mécanismes pour filtrer toutes les ressources des charges (que vous avez découvert), et une nouvelle fenêtre s'ouvre via webView:decidePolicyForNewWindowAction:demande:newFrameName:decisionListener:. Toutes les fenêtres.ouvrir les appels devraient s'engouffrer dans que, comme toute autre chose qui déclenche une nouvelle fenêtre.
Si il y a une autre fenêtre qui s'ouvre, vous voulez garder à l'intérieur de votre application, vous aurez à faire un peu plus de travail. L'un des arguments passés dans le délégué est un dictionnaire contenant informations sur l'événement. Insie que le dictionnaire de l'WebActionElementKey aura un dictionnaire contenant un certain nombre de détails, y compris l'original dom contenu du lien. Si vous voulez fouiller dans là, vous pouvez saisir le réel de l'élément DOM, et vérifiez le texte de la href afin de voir si elle commence par la fenêtre.ouvert. C'est un peu lourd le poids, mais si vous voulez de contrôle de précision, il sera donner à vous.
OriginalL'auteur Louis Gerbarg
En lisant tous les posts, je viens avec ma solution simple, tous les funcs sont dans la même classe,c'est ici, ouvre un lien dans le navigateur.
OriginalL'auteur KeranMarinov
Explication:
Windows créées à partir de JavaScript par la fenêtre.ouvrez passer par createWebViewWithRequest.
Toutes les fenêtres.les appels d'ouverture de résultat dans un createWebViewWithRequest: avec une valeur null demande, puis plus tard un changement d'emplacement sur la WebView.
Pour de plus amples informations, voir ce vieux post sur le WebKit liste de diffusion.
OriginalL'auteur
Une alternative à retourner un nouveau WebView, et attend son
loadRequest:
méthode à appeler, j'ai fini par écraser lawindow.open
fonction dans la WebView est JSContext:D'abord, j'ai mis mon contrôleur de la WebFrameLoadDelegate de la WebView:
Ensuite, dans la méthode du délégué, je écrasait la
window.open
fonction, et je peux le processus de l'URL il y a la place.Ce permettez-moi de répondre à la demande toutefois je devais sans l'ennui, le besoin de créer des WebViews.
OriginalL'auteur adam.wulf