2010-01-04 3 views
4

Est-il possible de manipuler des données CSS avant qu'elles ne soient analysées dans WebKit?Manipulation des données CSS WebKit avant le chargement?

J'ai essayé d'utiliser la méthode déléguée

- (NSURLRequest *)webView:(WebView *)sender 
       resource:(id)identifier 
      willSendRequest:(NSURLRequest *)request 
     redirectResponse:(NSURLResponse *)redirectResponse 
      fromDataSource:(WebDataSource *)dataSource 

que je peux faire le travail en écrivant mon CSS manipulé, puis renvoyer une NSURLRequest alternative qui pointe vers elle. Cela fonctionne très bien, à part l'arbre DOM, il contient le chemin d'accès au fichier URLRequest manipulé, pas l'original, ce qui est une mauvaise nouvelle pour mon application. Puis-je manipuler les données en mémoire avant qu'elles soient analysées?

+0

Est-ce que vous chargez/créez votre propre CSS ou cela doit-il fonctionner pour n'importe quelle URL? –

+0

Tout fichier CSS arbitraire, généralement chargé à partir du disque (je ne veux pas modifier le fichier CSS d'origine) –

Répondre

2

Il suffit de charger une feuille de style utilisateur pour remplacer ce que CSS que vous voulez (c'est la partie « en cascade » de CSS). Ceci est une caractéristique de base de WebKit.

WebPreferences setUserStyleSheetEnabled:

Pour un exemple dans la pratique, vous pouvez regarder PlayerController de PandoraBoy qui a des crochets pour elle (bien que je liquidée ne pas avoir besoin de les utiliser effectivement). Regardez dans -awakeFromNib.

EDIT: Si vous avez vraiment besoin de substituer votre propre fichier CSS pour l'original d'une manière totalement transparente pour WebKit, c'est possible mais c'est un peu plus de travail, plus déroutant, et ne devrait généralement pas être nécessaire. Cela dit, PandoraBoy a rencontré ce problème et il existe une solution. Regardez ResourceURLProtocol.

+0

Cela semble intéressant, pas tout à fait sûr où je l'utiliserais, à travers le délégué ? –

+0

NSURLProtocols sont sous la couche de WebKit. Avant d'accéder à votre site Web make, vous appelez [NSURLProtocol registerClass: [classe ResourceURLProtocol]], puis ResourceURLProtocol sera inséré dans la chaîne pour chaque requête basée sur une URL (c'est-à-dire WebKit). Vous devrez étudier les documents sur NSURLProtocol. C'est un outil puissant; Je ne le recommande pas pour les problèmes occasionnels comme le remplacement de CSS, qui sont plus facilement fait avec une feuille de style utilisateur. Mais si vous avez vraiment besoin de contrôler le processus d'extraction d'URL de bas niveau, cela vaut la peine d'apprendre. –

+0

ah gotcha! Je vais essayer, merci beaucoup! –

0

Tant que vous pouvez le garder sous la limite de 10 Mo, il y a toujours stringByEvaluatingJavaScriptFromString puis terminez loading of the CSS dynamically.

+0

J'ai besoin de manipuler les CSS existants, ne pas ajouter le mien, c'est un problème très particulier! –

+0

faites ce que Rob Napier dit - le "C" dans "CSS" signifie que tout peut être remplacé, vous ne devriez pas avoir à réécrire quoi que ce soit – slf