2011-02-03 21 views
6

En mi aplicación Cocoa, quiero evitar que Flash se cargue en un WebView, y dejar que el usuario decida si se debe mostrar Flash para cada página. (Ese es el mismo comportamiento ya disponible a través del complemento ClickToFlash o la extensión Safari. Agrupar cualquiera de esas extensiones probablemente no sea una opción debido a problemas de licencia.)Prevenir el flash en Cocoa WebView

Desafortunadamente, la mayoría del Flash que intento evitar se genera a partir de incrustado JavaScript específicamente diseñado para evitar el bloqueo de flash fácil, por lo que no puedo filtrar el HTML sin formato para la inclusión de objetos Flash.

Además, no puedo deshabilitar JavaScript para mi WebView, ya que la página que quiero mostrar se ve completamente diferente cuando JavaScript está desactivado.

¿Existe un aviso/enlace que pueda usar para modificar el DOM de la página después de que se haya ejecutado JavaScript, pero antes de que se cargue el complemento Flash?

¿O debería seguir una dirección diferente?

Gracias, Ilja

Respuesta

2

Aquí hay una pregunta similar que puede ayudar:

Suppress plugin loading in WebKit

+0

Lo siento, olvidé un punto importante en mi pregunta inicial: "En mi aplicación Cocoa, quiero evitar que Flash se cargue en una WebView, ** y dejar que el usuario decida si debe mostrarse Flash para cada página **. " – iljawascoding

+0

El único problema es que la solución publicada como respuesta a esa pregunta no funciona para los tipos MIME manejados por complementos. –

+0

Oh, lo siento. Debería haber hecho un comentario en lugar de una respuesta. –

6

Idealmente, usted acaba de definir su propio plug-in de WebKit que maneja el tipo MIME application/shockwave-flash y hacer su complemento no hace nada.

Sin embargo, desafortunadamente no hay forma de controlar la prioridad de múltiples complementos de WebKit que se registran para el mismo tipo MIME. El orden de carga de los complementos de WebKit es totalmente aleatorio y arbitrario, por lo que no puede garantizar que su complemento maneje el objeto de Flash en lugar del complemento de Flash.

La única forma de evitar esto que he encontrado es una subclase WebView y anular el método privado -_pluginForMIMEType: así:

@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 

Entonces sólo tiene que crear un plugin WebKit personalizada para controlar "application/mi -plugin-type "y hacer que el complemento no haga nada en absoluto.

+0

Gracias por la pista. Lo seguiría, pero tengo dudas de que mi aplicación esté aprobada en Mac App Store, _pluginForMIMEType probablemente esté en la lista negra de Apple. – iljawascoding

+0

Es posible, aunque espero que los revisores sean un poco más indulgentes con WebKit ya que es completamente de código abierto.Sé que los empleados de Apple me han indicado específicamente que use ciertos métodos no publicados/privados en la lista de correo de WebKit-SDK-Dev de Apple. Curiosamente, [este interrogador] (http://stackoverflow.com/questions/4527905/how-doi-i-enable-local-storage-in-my-webkit-based-application) afirma haber usado un método WebKit privado y tenía una aplicación aprobada. –

+0

He usado este enfoque yo mismo, y Apple lo ha aprobado varias veces. Parece que usan un estándar diferente para proyectos de código abierto como WebKit. – starkos

1

De acuerdo, casi nos damos cuenta de esto.

Dado que no existe una API oficial que le permita a la aplicación de host saber cuándo ha finalizado JavaScript o controlar qué complemento debe cargar, ahora estamos utilizando JavaScript personalizado que se inserta en el HTML recibido que queremos mostrar.

La extensión ClickToFlash Safari (no el complemento de Internet, en el que se basa) fue una buena inspiración.

Cuestiones relacionadas