Ссылки в iframe не запускают decidePolicyForNewWindowAction

#macos #iframe #webview

#macos #iframe #webview

Вопрос:

У меня есть iframe проигрывателя youtube в моем приложении webview macos, и большинство ссылок ( <a> элементов) внутри iframe не запускают decidePolicyForNewWindowAction делегат.

Единственным рабочим <a> элементом является ссылка на канал, другие, такие как заголовок видео, значок youtube, все молчат, и я не могу определить различия между ними <a> .

Итак, почему некоторые ссылки не могут запускаться decidePolicyForNewWindowAction ?

Документация делегата: https://developer.apple.com/documentation/webkit/webpolicydelegate/1536381-webview ?язык = objc

Документация проигрывателя iframe youtube: https://developers.google.com/youtube/iframe_api_reference

Ответ №1:

Для кого-то, может быть, интересно:

Оказывается, это не iframe проблема, это потому, что некоторые <a> не меняют URL напрямую, он вызывает некоторый javascript для выполнения этой работы. Это было проверено из стека вызовов.

В таком случае первым делом необходимо подключить еще одного делегата, createWebViewWithRequest . Этот делегат возвращается nil по умолчанию. Поэтому измените его следующим образом:

 - (WebView*)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request
{
    return sender;
}
  

Ничего особенного, но пусть следующие коды продолжаются.

Во-вторых, вместо этого отправляется запрос URL-адреса javascript decidePolicyForNavigationAction . Так что все еще не срабатывает decidePolicyForNewWindowAction , но, по крайней мере, есть шанс узнать это.

В моем случае я добавляю некоторое условие внутри decidePolicyForNavigationAction , чтобы различать мой запрос и запрос iframe, например:

 - (void) webView: (WebView*) sender decidePolicyForNavigationAction: (NSDictionary*) actionInformation
                                                            request: (NSURLRequest*) request
                                                              frame: (WebFrame*) frame
                                                   decisionListener: (id <WebPolicyDecisionListener>) listener
{
    NSString* mainDocumentURL = [[request mainDocumentURL] absoluteString];
    NSString* fromYT = @"https://www.youtube.com";
    if ([mainDocumentURL hasPrefix:fromYT]) {
        [[NSWorkspace sharedWorkspace] openURL:url]; // fires Safari
        [listener ignore];
        return;
    }

    // normal flow here, you could open it inside the webview or something
}