2011-02-03 2 views
6

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

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

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

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

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

Спасибо, Ilja

ответ

2

Вот аналогичный вопрос, который может помочь:

Suppress plugin loading in WebKit

+0

Извините, но забыл важный момент в моем первоначальном вопросе: «В моем приложении Cocoa я хочу, чтобы Flash не загружался в WebView ** и позволял пользователю решить, должна ли отображаться Flash для каждой страницы **. " – iljawascoding

+0

Единственная проблема заключается в том, что решение, отправленное как ответ на этот вопрос, не работает для типов MIME, обрабатываемых плагинами. –

+0

О, извините. Должен был сделать комментарий, а не отвечать. –

6

В идеале, вы бы просто определить свой собственный 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 для обработки «приложение/мой -plugin-type ", и этот плагин ничего не делает.

+0

Спасибо за подсказку. Я буду следовать за ним, но у меня есть сомнения в том, что я получаю одобренное приложение в Mac App Store, _pluginForMIMEType, вероятно, находится в черном списке Apple. – iljawascoding

+0

Возможно, хотя я ожидаю, что рецензенты будут немного более снисходительны к WebKit, так как это полностью открытый исходный код.Я знаю, что мне специально сказали использовать некоторые неопубликованные/частные методы сотрудниками Apple в списке рассылки Apple WebKit-SDK-Dev. Интересно, что [этот вопросник] (http://stackoverflow.com/questions/4527905/how-do-inable-local-storage-in-my-webkit-based-application) утверждает, что использовал частный метод WebKit и было одобрено приложение. –

+0

Я сам использовал этот подход, и он несколько раз одобрялся Apple. Похоже, что они используют другой стандарт для проектов с открытым исходным кодом, таких как WebKit. – starkos

1

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

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

Расширение Safari ClickToFlash Safari (а не интернет-плагин, на котором оно основано) было хорошим вдохновением.

Смежные вопросы