Plan de site Navigation
Blog & Blues Techniques et Standards de la Qualité Web

Accueil > weblog


- Lire le billet précédent - Lire le billet suivant -

Des scripts utilisateurs dans Opera 8.0 bêta 3

Par Laurent Denis, le 17 mars 2005.

Outre le support SVG, changelog Opera 8.0 bêta 3 comporte une autre nouveauté d'importance : le support des javascripts utilisateurs.

Cette nouvelle fonctionnalité n'est pas officiellement documentée (sans doute en raison des risques de sécurité qu'elle crée en cas de téléchargement par l'utilisateur d'un script malicieux), et a été annoncée par des membres du staff Opera sur leurs blogs :

Pour activer les javascripts utilisateurs, il est nécessaire de modifier le fichier Opera6.ini (Opera doit être fermé lors de l'édition de ce fichier) :

  • Localiser le fichier Opera6.ini en ouvrant le menu Help  > About : le chemin vers le fichier est indiqué par la ligne Preferences de la section Paths ;
  • Fermer Opera et éditer le fichier Opera6.ini ;
  • Ajouter à la section [User Prefs] les deux lignes suivantes :
    User JavaScript=1 
    User JavaScript File=c:\...\user.js

    (c:\...\user.js à modifier à votre convenance).

Ces scripts peuvent s'appliquer, au choix :

  • à une page Web précise ;
  • à toutes les pages d'un domaine ;
  • à toutes les pages consultées ;

Voici l'atanomie d'un user.js type (d'après l'exemple donné par Rijk van Geijtenbeek), qui permet de supprimer les annonces Google adSense, d'activer un lien à partir de l'attribut cite des citations blockquote, et d'éviter la redirection erronée de GMail vers la version "HTML pour vieux navigateurs" de celui-ci (ce dernier script étant avantageusement remplacé par un simple gmail.google.com=4 ajouté au fichier profile/ua.ini) :

  • Un tableau est créé pour chacun des 3 types de script ci-dessus :
    var domainHandler = new Array();
    var pathHandler = new Array();
    var allHandler = new Array();
    
  • Les scripts hideAdSense et addCitationLinks s'appliqueront à toutes les pages consultées :
    allHandler=[
      hideAdSense,
      addCitationLinks]

    Le script redirectGmail ne concerne que le site de Google Mail :

    domainHandler['gmail.google.com'] = redirectGmail;

    Le script serait associé uniquement à la page example.org/example.html :

    pathHandler["example.org/example.html"] = exampleScript;
  • Gestion et exécution des handlers :
    // Activation:
    document.addEventListener("load",loadHandler,false)
    function loadHandler() {
    
    // Variable récupérant le chemin  de la page en cours:
      var fullpath = "";
      with (window.location) {
        fullpath = (port == "") ? hostname + pathname : hostname + ":" + port + pathname;
      }
    
    // Un handler est-il défini pour la page en cours ? Si oui, on exécute la fonction correspondante:
      if ((window == window.top) && (pathHandler[fullpath])) {
        pathHandler[fullpath]();
      }
     
    // Un handler est-il défini pour le domaine de la page en cours ? Si oui, on exécute la fonction correspondante:
      if ((window == window.top) && (domainHandler[document.domain])) {
        domainHandler[document.domain]();
      }
    
    // Exécution des fonctions associées à toutes les pages consultées:
      if (window == window.top)
        while(allHandler.length>0)
          allHandler.shift()();
    
    }
  • Il ne reste plus qu'à ajouter les différentes fonctions correspondant aux handlers:
    // ==UserScript==
    /*
        Hide Google Adsense Ads
        (c) Carlo Zottmann, carlo@g-blog.net
        http://G-Spotting.net/
    
        Copy, use, modify, spread as you see fit.
    */
    // @name            Hide Google Adsense Ads (2005-01-12)
    // @namespace       http://docs.g-blog.net/code/greasemonkey
    // @description     Hides Google Adsense Ads iframes anywhere.
    // @include         http://*
    // @include         https://*
    // ==/UserScript==
    function hideAdSense() {
      var RemoveGoogleAds =
      {
        checkPage: function() {
          if (document.getElementsByTagName("body")[0].innerHTML.match(/google_ads_frame/i)) {
            this.injectCSS("iframe[name='google_ads_frame'] { display: none; }");
          }
        },
        injectCSS: function(css) {
          head = document.getElementsByTagName("head")[0];
          style = document.createElement("style");
          style.setAttribute("type", 'text/css');
          style.innerHTML = css;
          head.appendChild(style);
        }
      }
      RemoveGoogleAds.checkPage();
    }
    
    
    // ==UserScript==
    // Dunstan Orchard http://www.1976design.com/blog/
    //
    // Altered from original idea by Simon Willison at:
    // http://simon.incutio.com/archive/2002/12/20/blockquoteCitations
    
    function addCitationLinks() {
       quotes = document.getElementsByTagName('blockquote');
       for (var i = 0; i < quotes.length; i++) {
         cite = quotes[i].getAttribute('cite');
         if ((cite) && (cite != "")) {
          if ( (cite.match('http://', 'i')) || (cite.match('ftp://', 'i')) ){
            newlink = document.createElement('a');
            newlink.setAttribute('href', cite);
            newlink.setAttribute('title', ('Go to ' + cite));
            if (cite.length > 32) {
              cite = cite.substring(0,32) + '...';
            }
            newlink.appendChild(document.createTextNode(cite));
            newdiv = document.createElement('div');
            newdiv.className = 'source';
            newdiv.appendChild(document.createTextNode('\u2014 '));
            newdiv.appendChild(newlink);
            quotes[i].appendChild(newdiv);
          } else if (cite.match('urn:quote:', 'i')) {
            newdiv = document.createElement('div');
            newdiv.className = 'source';
            // Strip leading path.
            exp = new RegExp('urn:quote:','g');
            cite = cite.replace(exp, '');
            // Convert spaces to _.
            var exp = new RegExp(' ','g');
            url = cite.replace(exp, '_');
            // Append url.
            url = 'http://www.quotationspage.com/quotes/' + url;
            var link = document.createElement('a');
            link.href = url;
            link.innerHTML = cite;
            newdiv.appendChild(document.createTextNode('\u2014 '));
            newdiv.appendChild(link);
            quotes[i].appendChild(newdiv);
          }  else if (cite.match('urn:author:', 'i')) {
            newdiv = document.createElement('div');
            newdiv.className = 'source';
            var exp = new RegExp('%20','g');
            cite = cite.replace(exp, ' ');
            exp = new RegExp('urn:author:','g');
            cite = cite.replace(exp, '');
            newdiv.appendChild(document.createTextNode('\u2014 ' + cite));
            quotes[i].appendChild(newdiv);
          } else {
            newdiv = document.createElement('div');
            newdiv.className = 'source';
            var exp = new RegExp('%20','g');
            cite = cite.replace(exp, ' ');
            newdiv.appendChild(document.createTextNode('\u2014 ' + cite));
            quotes[i].appendChild(newdiv);
          }
        }
      }
    }
    
    
    // ==UserScript==
    function redirectGmail() { 
      if(document.getElementById('bm')) window.location='http://gmail.google.com/gmail/?nocheckbrowser'; 
    }
    
    // ==UserScript==
    function exampleScript() {
    // ...
    }

Les javascripts utilisateur Opera rappellent évidemment l'extension Greasemonkey de Firefox. Pour reprendre un commentaire de Rijk van Geijtenbeek, Greasemonkey et les scripts utilisateurs actuels d'Opera peuvent tous deux être considérés comme des "bookmarklets permanent". Les scripts de Greasemonkey sont effectivement plus faciles à partager, tandis que le user.js d'Opera est plus flexible.. Voilà en tous cas une nouveauté bienvenue, dont l'évolution future nous réserve quelques surprises...

[Mise à jour 2005-03-2] Ressources à signaler :

Trackbacks

Les trackbacks pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.

Commentaires

Aucun commentaire pour le moment.

Les commentaires pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.