Apr
Cocoa WebView: via JavaScript erzeugte Links im Browser öffnen
Ich schreibe momentan an einer Cocoa App in Objective-C die einen WebView verwendet und bin dabei auf das bereits bei stackoverflow diskutierte Problem gestoßen, dass für Links die via JavaScript generiert werden die decidePolicyForNewWindowAction Delegate nicht greift.
Ob es sich dabei wirklich um einen Bug handelt kann ich nicht beurteilen. Der oben genannte Beitrag zum Thema ist auch schon etwas älter, die Problematik scheint allerdings auch in Mac OS X 10.6 Snow Leopard noch zu bestehen.
Worum geht es?
Ich möchte innerhalb eines WebView’s alle Links die ein target=”_blank” besitzen bzw. irgendwie anders in einem neuen Fenster aufgehen würden im Standard-Browser des Benutzers öffnen.
Folgendes zur Verdeutlichung:
<!-- Wird im WebView angezeigt --> <a href="foobar.html">foobar</a> <!-- Wird via decidePolicyForNewWindowAction im Browser angezeigt --> <a href="http://www.google.com/" target="_blank">foobar</a> <!-- Soll auch im Browser angezeigt werden --> <a href="javascript:window.open('http://www.google.com/');">foobar</a>
Das Problem:
Der letzte Link sollte ja eigentlich auch im Browser geöffnet werden, decidePolicyForNewWindowAction greift hier allerdings nicht.
Die Lösung:
Zunächst werden folgende WebView Delegates definiert:
[webView setPolicyDelegate:self]; [webView setUIDelegate:self];
Nun wird das Problem mit einem temporären WebView umgangen:
- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request { WebView *tempWebView = [[WebView alloc] init]; [tempWebView setPolicyDelegate:self]; [tempWebView setUIDelegate:self]; return tempWebView; } - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener { if ([sender isEqual:webView]) { [listener use]; } else { [listener ignore]; [[NSWorkspace sharedWorkspace] openURL:[request URL]]; [sender release]; } }
Der Rest läuft wie gewohnt:
- (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id <WebPolicyDecisionListener>)listener { [[NSWorkspace sharedWorkspace] openURL:[request URL]]; }
Nun lassen sich auch alle über JavaScript generierten Links im Browser öffnen. Ich habe bisher keine elegantere Lösung gefunden, wer also zufällig eine parat haben sollte kann diese gerne als Kommentar hinterlassen!


Kommentare
Zu diesem Beitrag wurden noch keine Kommentare verfasst.