2011-02-03 20 views
6

Nella mia app Cocoa, voglio impedire il caricamento di Flash in una WebView e consentire all'utente di decidere se il Flash deve essere mostrato per ogni pagina. (Questo è lo stesso comportamento già disponibile tramite il plug-in ClickToFlash o l'estensione Safari. L'abbinamento di una di queste estensioni non è probabilmente un'opzione a causa di problemi di licenza.)Prevenzione di Flash in Cocoa WebView

Sfortunatamente la maggior parte del Flash che sto cercando di evitare viene generata da embedded JavaScript appositamente progettato per impedire il blocco flash facile, quindi non posso filtrare il codice HTML non elaborato per l'inclusione di oggetti Flash.

Inoltre, non è possibile disabilitare JavaScript per la mia WebView, poiché la pagina che voglio visualizzare appare completamente diversa quando JavaScript è disattivato.

C'è un avviso/hook che posso usare per modificare il DOM della pagina dopo che JavaScript è stato eseguito, ma prima che il plugin Flash sia caricato?

Oppure devo seguire una direzione diversa?

Grazie, Ilja

risposta

2

Ecco una domanda simile che può aiutare:

Suppress plugin loading in WebKit

+0

Mi dispiace, ho dimenticato un punto importante nella mia domanda iniziale: "Nella mia app Cocoa, voglio impedire a Flash di caricarsi in una WebView, ** e lasciare che l'utente decida se mostrare Flash per ogni pagina **. " – iljawascoding

+0

L'unico problema è che la soluzione pubblicata come risposta a quella domanda non funziona per i tipi MIME gestiti dai plugin. –

+0

Oh, mi dispiace. Avrebbe dovuto fare un commento piuttosto che una risposta. –

6

Idealmente, si sarebbe solo definire il proprio plug-in WebKit che gestisce il tipo MIME application/shockwave-flash e fare il tuo plug-in non fa nulla.

Tuttavia, non c'è purtroppo alcun modo per controllare la priorità di più plug-in WebKit che si registrano tutti per lo stesso tipo MIME. L'ordine di caricamento dei plug-in WebKit è totalmente casuale e arbitrario, pertanto non è possibile garantire che il plug-in gestirà l'oggetto Flash anziché il plug-in Flash.

L'unico modo per aggirare questo che ho trovato è quello di sottoclasse WebView e sovrascrivere il metodo privato -_pluginForMIMEType: in questo modo:

@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 

Poi basta per creare un plugin WebKit personalizzato per gestire "application/mia -plugin-type "e avere quel plug-in non fare nulla.

+0

Grazie per il suggerimento. Lo seguirei, ma dubito che la mia app possa essere approvata nel Mac App Store, _pluginForMIMEType è probabilmente sulla lista nera di Apple. – iljawascoding

+0

È possibile, anche se mi aspetto che i revisori siano un po 'più indulgenti con WebKit poiché è completamente open source.So che mi è stato specificamente detto di utilizzare determinati metodi non pubblicati/privati ​​dei dipendenti Apple sulla mailing list WebKit-SDK-Dev di Apple. È interessante notare che [questo questionario] (http://stackoverflow.com/questions/4527905/how-do-i-enable-local-storage-in-my-webkit-based-application) afferma di aver utilizzato un metodo WebKit privato e ha approvato un'app. –

+0

Ho usato questo approccio da solo, ed è stato approvato più volte da Apple. Sembrano utilizzare uno standard diverso per progetti open source come WebKit. – starkos

1

Ok, abbiamo praticamente capito.

Poiché non vi è alcuna API ufficiale che consenta all'app host di sapere quando JavaScript è terminato o di controllare quale plugin caricare, stiamo utilizzando il codice JavaScript personalizzato che viene inserito nell'HTML che si desidera visualizzare.

L'estensione ClickToFlash Safari (non il plug-in Internet su cui è basata) è stata una buona fonte d'ispirazione.