Предотвратить Flash в Какао WebView - PullRequest
6 голосов
/ 03 февраля 2011

В моем приложении Какао я хочу запретить загрузку Flash в WebView и позволить пользователю решить, должен ли Flash отображаться для каждой страницы.(Это то же самое поведение, уже доступное через плагин ClickToFlash или расширение Safari. Возможно, объединение любого из этих расширений не вариант из-за проблем с лицензированием.)

К сожалению, генерируется большая часть Flash, которую я пытаюсь избежатьиз встроенного JavaScript, специально разработанного для предотвращения простой блокировки Flash, поэтому я не могу отфильтровать необработанный HTML для включения объектов Flash.

Кроме того, я не могу отключить JavaScript для своего WebView, поскольку страница, которую я хочу отобразить, выглядит совершенно иначекогда JavaScript отключен.

Есть ли уведомление / хук, который я могу использовать для изменения DOM страницы после выполнения JavaScript, но до загрузки плагина Flash?

Или мне следует продолжитьдругое направление?

Спасибо, Илья

Ответы [ 3 ]

6 голосов
/ 03 февраля 2011

В идеале вы должны просто определить свой собственный плагин WebKit, который обрабатывает тип application/shockwave-flash MIME, и заставить ваш плагин ничего не делать.

Однако, к сожалению, нет способа контролировать приоритетнесколько плагинов WebKit, которые все регистрируются для одного и того же типа MIME.Порядок загрузки плагинов WebKit абсолютно случайный и произвольный, поэтому вы не можете гарантировать, что ваш плагин будет обрабатывать объект Flash вместо плагина Flash.

Единственный способ обойти этомы обнаружили, что это подкласс WebView и переопределение приватного метода -_pluginForMIMEType: следующим образом:

@class WebBasePluginPackage;

@interface WebView ( MyFlashPluginHack )
- (WebBasePluginPackage *)_pluginForMIMEType:(NSString *)MIMEType;
@end

@implementation MyWebView

- (WebBasePluginPackage *)_pluginForMIMEType:(NSString *)MIMEType
{
    if ( [MIMEType isEqualToString:@"application/x-shockwave-flash"] )
    {
        return [super _pluginForMIMEType:@"application/my-plugin-type"];
    }
        else
    {
        return [super _pluginForMIMEType:MIMEType];
    }
}

@end

Затем вам просто нужно создать собственный плагин WebKit для обработки "application / my-plugin-type" изаставить этот плагин вообще ничего не делать.

2 голосов
/ 03 февраля 2011

Вот похожий вопрос, который может помочь:

Подавить загрузку плагина в WebKit

1 голос
/ 10 февраля 2011

Хорошо, мы в значительной степени это выяснили.

Поскольку нет официального API, который позволял бы хост-приложению знать, когда JavaScript завершил работу, или контролировать, какой плагин должен загружаться, мы теперь используем настраиваемый JavaScript, который вставляетсяв полученный HTML-код, который мы хотим отобразить.

Расширение ClickToFlash Safari (а не плагин для Интернета, на котором оно основано) послужило хорошим вдохновением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...