[ré-ouvert] Greasemonkey : remplacer une fonction d'un site

Vous vous penchez sur le développement d'applications ou d'extensions pour Mozilla ? C'est alors vers ce forum que se dirigeront naturellement vos requêtes...
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

[ré-ouvert] Greasemonkey : remplacer une fonction d'un site

Message par calimo »

Bonjour,

Soit la page http://resolver.rero.ch/unige?sid=Entre ... id:6823374
Il y a deux fonctions javascript très embêtantes dans http://resolver.rero.ch/unige/js/sfxmenu/main.js :

Code : Tout sélectionner

//---------------------------------------------------------
function openWin(obj) {
//---------------------------------------------------------
// Responds to a user clicking on a target-service
//---------------------------------------------------------
    var options = "toolbar=yes,location=yes,directories=yes,buttons=yes,status=no";
        options += ",menubar=yes,scrollbars=yes,resizable=yes,width=760,height=700";
    var newwin = window.open('',"newwin",options);
    if (navigator.appName.indexOf("xplorer")<0) newwin.focus();
}

//---------------------------------------------------------
function openWinSFXMenu(obj) {
//---------------------------------------------------------
// Responds to a user clicking on a target-service
//---------------------------------------------------------
    var options = "toolbar=yes,location=yes,directories=yes,buttons=yes,status=no";
        options += ",menubar=yes,scrollbars=yes,resizable=yes,width="+screen.width+",height="+screen.height;
    var newwin = window.open('',"newwin",options);
    if (navigator.appName.indexOf("xplorer")<0) newwin.focus();
}
En raison des options (et de mes réglages de firefox), elles ouvrent une nouvelle fenêtre redimentionnée, ce que je trouve très ennuyeux.

J'ai donc défini le script greasemonkey suivant :

Code : Tout sélectionner

// ==UserScript==
// @name           Pas de nouvelle fenêtre RERO
// @namespace      http://resolver.rero.ch/*
// @include        http://resolver.rero.ch/*
// ==/UserScript==


//---------------------------------------------------------
function openWin(obj) {
//---------------------------------------------------------
// Responds to a user clicking on a target-service
//---------------------------------------------------------
    var newwin = window.open('',"newwin");
    if (navigator.appName.indexOf("xplorer")<0) newwin.focus();
}

//---------------------------------------------------------
function openWinSFXMenu(obj) {
//---------------------------------------------------------
// Responds to a user clicking on a target-service
//---------------------------------------------------------
    var newwin = window.open('',"newwin");
    if (navigator.appName.indexOf("xplorer")<0) newwin.focus();
}
Malheureusement, il ne semble pas pris en compte (si je mets un alert dans la fonction, il n'est pas déclanché).

Je pense que c'est parce que ce script n'est pas exécuté au bon moment. Si je mets un alert dans le corps du script il est bien excéuté, mais probablement que les scripts du site sont exécutés plus tard et remplacent ma fonction.

Comment est-ce que je peux régler ça ? Soit en réglant le moment de l'exécution, soit en "bloquant" les fonctions...

Merci pour votre aide ;-)

Calimo
Dernière modification par calimo le 18 mars 2009, 16:50, modifié 2 fois.
arno.
Varan
Messages : 1347
Inscription : 19 août 2004, 12:26

Message par arno. »

je crois bien qu'on peut pas redéfinir les fonctions javascript de la page. (en tout cas, pas sans créer des pb de sécurité).

Est-ce que tu pourrais pas plutôt regarder les endroits d'où elles sont appelées, et modifier les attributs ou les event listeners qui vont bien ?


Message envoyé avec : Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009020407 Iceweasel/3.0.6 (Debian-3.0.6-1)
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Pas sûr d'avoir bien compris le problème, mais au niveau de la solution j'ai réussi à substituer ces fonctions openWin par un simple document.location.href qui a l'air de fonctionner :

Code : Tout sélectionner

(function() {
  // get all the links of the page
	var allLinks = document.links;
	// loop on all links
	for (var i in allLinks) {
		// take the href attribute
		var link = allLinks[i];
		var href = link.getAttribute("href");
		// subst by better values
		href = href.replace(/openWinSFXMenu\(this\)/, "document.location.href=this");
		href = href.replace(/openWin\(this\)/, "document.location.href=this");
		// apply new values
		link.setAttribute("href", href);
	}
})();
L'idéal serait de pouvoir récupérer les "window.document.basicX.submit();" pour les transformer en URL et avoir de vrais liens cliquables en clic-milieu, mais ce sera pour une prochaine fois !

Merci arno. ;-)
X.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Je reviens avec ce problème sur le même site. J'ai pu transformer les openWin en document.location.href=this qui fonctionnent à merveille et n'ouvrent pas de popup.

Sauf que les liens ressemblent à ça : "javascript:document.location.href=this;window.document.basic3.submit();"
Évidemment l'ouverture dans un nouvel onglet par clic milieu ne fonctionne pas terrible.
J'ai donc pensé à définir une fonction computeFormToHref() qui, au survol (onmouseover) dans un premier temps, irait récupérer le "action" du formulaire correspondant (ici "basic3"), et l'éventuel paramètre dans le champ texte.

Sur chaque lien je fais donc :

Code : Tout sélectionner

 link.setAttribute("onmouseover", "computeFormToHref(" + leNomDuFormulaire + ")")
Et je définis une fonction correspondante :

Code : Tout sélectionner

function computeFormToHref(form) {
		alert(form);
}
Pour l'instant elle ne doit qu'afficher une alerte.

Problème, la console d'erreur affiche :

Code : Tout sélectionner

Erreur : computeFormToHref is not defined
Fichier Source : http://resolver.rero.ch/unige?sid=Entrez:PubMed&id=pmid:5321916
Ligne : 1
Et l'alerte n'est évidemment pas exécutée.

J'ai essayé de définir la fonction avec

Code : Tout sélectionner

var computeFormToHref = function(form) {...
et ce en dehors ou en dedans du bloc d'exécution principal

Code : Tout sélectionner

(function() {
Mais toujours la même erreur.

Visiblement la réponse est triviale, à tel point que toutes les réponses que j'ai pu trouver se résument à "rtfm", ce qui ne m'avance malheureusement pas beaucoup... :-|

Voici le script complet :

Code : Tout sélectionner

// ==UserScript==
// @name           Pas de nouvelle fenêtre RERO
// @namespace      http://resolver.rero.ch/*
// @include        http://resolver.rero.ch/*
// ==/UserScript==

function computeFormToHref(form) {
		alert(form);
}

(function() {

  // get all the links of the page
	var allLinks = document.links;
	// loop on all links
	for (var i in allLinks) {
		// get href
		var link = allLinks[i];
		var href = link.getAttribute("href");
		// which form needs to be submitted?
		var regex = /javascript:openWin(SFXMenu)?\(this\);(window.document.[^\.]+).submit\(\);/;
		var match = regex.exec(href);
		if (match!=null) {
			// setup true link generation
			link.setAttribute("onmouseover", "computeFormToHref(" + match[2] + ")")
		}
		// update javascript link
		href = href.replace(/openWinSFXMenu\(this\)/, "document.location.href=this");
		href = href.replace(/openWin\(this\)/, "document.location.href=this");
		// apply new link
		link.setAttribute("href", href);
	}
})();
Merci encore :wink:
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

J'ai pu résoudre mon problème grâce à ça.

Je pense être à bout touchant, juste quelques problèmes de DOM, avec des INPUT qui ne sont pas inclus dans les FORM et m'obligent à ruser avec un getParent ou des nextSiblings qui ne fonctionnent pas encore (problèmes avec les noeuds texte probablement).

Je vous tiens au courant :wink:
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 11 invités