Firefox-Extensions

BartTheDevil89

Devilution Media
ID: 87739
L
2 Mai 2006
3.960
103
Hallo,

habe mich jetzt mal bisschen ans Thema Firefox Extensions rangewagt und auch schon das Grundsystem mittlerweile verstanden und erste Erfolge verbucht:

Meine .js:

PHP:
////////////////////////////////////////////////////////////////////////////////
// Ein Buttonklick für verschiedene Extras.
////////////////////////////////////////////////////////////////////////////////
function ex_Link(type)
{

    var URL = "";

    switch(type)
    {
    case "type1":
        URL = "https://www.domain.de";
    default:
        URL = "https://www.domain.com";
        break;
    }
    
    //Link laden
    ex_LoadURL(URL);
}

////////////////////////////////////////////////////////////////////////////////
// Lädt eine URL und setzt die Anzeige auf den Tab.
////////////////////////////////////////////////////////////////////////////////
function ex_LoadURL(url)
{
    gBrowser.selectedTab = gBrowser.addTab(url);
    
}
Meine XUL:

HTML:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://ex/skin/ex.css" type="text/css"?>
<overlay id="ex-Overlay" xmlns="https://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onload="test()">
         
    <script type="application/x-javascript" src="chrome://ex/content/ex.js" />
         
    <toolbox id="navigator-toolbox">
    
        <toolbar id="ex-Toolbar" toolbarname="ex.com Toolbar" accesskey="Z"
                 class="chromeclass-toolbar" context="toolbar-context-menu" 
                 hidden="false" persist="hidden">

            
            <toolbaritem id="ex-Extras">
                <toolbarbutton id="ex-type1" tooltiptext="Zeig ihn mir..." label="Aufschrift" oncommand="ex_Link('type1')" />
            </toolbaritem>
            
            <toolbarspring />

        </toolbar>
    </toolbox>
</overlay>
Und natürlich noch die passende CSS,...was halt noch im Grundkonzept ist.

Damit hab ich es jetzt auch geschafft das schonmal zum Laufen zu bringen. Also ich habe jetzt einen Button, wenn man draufklickt, dann öffnet sich ein neuer Tab mit www.domain.de!

Aber jetzt steh ich an ner Stelle und komm nicht so ganz weiter.
Denn ich möchte jetzt, dass die Toolbar immer weiß welche URL der aktuelle Tab hat. Also um das mal zu vereinfachen könnte man sagen, dass ich erstmal folgendes erreichen möchte:

Wenn ich auf Tab1 klicke und www.domain.com aufrufe, dann trägt der Button die Aufschrift domain.com! Wen ich dort auf www.domain2.com welchsel (egal ob über Link, neue Eingabe oder sowas) trägt die Domain domain2.com. Wenn ich nen neuen Tab aufmache und dort noch www.domain3.com wähle, dann steht auf dem Button domain3.com! Wenn ich jetzt wieder auf Tab1 klicke kommt wieder domain2.com

Also es soll immer so sein, dass da die aktuelle URL drinsteht. Aber genau hier hänge ich jetzt. Denn es gibt ja ne Funktion um die aktuelle URL zu bekommen:

Code:
var url = doc.location.href;
Kann da vielleicht jemand weiterhelfen, der sich besser mit auskennt und mir Newbie in dem Bereich da bisschen auf die Sprünge helfen? :roll:

Danke;)
 
Zuletzt bearbeitet von einem Moderator:
Probier doch einfach einen EventHandler im Javascript, der Dir immer die aktuelle URL gibt. Gut, kenne mich jetzt da auch nicht aus, war aber so ein Gedanke, den ich gerne hier einwerfen wollte...

Vielleicht geht's ja so!

PS: Die Adresszeile macht das ja genauso, also gehen muss das!
Du kannst garantiert auch im Quellcode von FF nachgucken, wo die Adresszeile geupdatet wird. Und das dann nach Deinen Wünschen verarbeiten

Edit2:
Schau mal da: Moz Dev
Mit nem EventListener kriegste das denke ich hin
 
Zuletzt bearbeitet:
Hi,

danke für die Tipps. Ich hab jetzt was gefunden, was recht hilfreich ist:

PHP:
window.addEventListener("load", function() { myExtension.init(); }, false);  
   
var myExtension = {  
  init: function() {  
   var appcontent = document.getElementById("appcontent");  
    if(appcontent)  
      appcontent.addEventListener("DOMContentLoaded", myExtension.onPageLoad, true);  
  },  
  
  onPageLoad: function(aEvent) {  
    var doc = aEvent.originalTarget; // doc is document that triggered "onload" event  

    alert(doc.location.href);    
   }  
}
Also damit schaff ich es bei jedem Klick, bei jedem öffnen eines neuen Tabs, etc. immer die URL zu bekommen und mir mittels alert auszugeben.
Allerdings paar Probleme gibts noch:

1. Wenn ich zwischen Tabs wechsele, dann funktioniert es nicht. Also das Ding erkennt keinen Klick auf einen anderen Tab.

2. Habe ich auf einer Seite beispielsweise 2x ne Ausgabe bekommen. Einmal tatsächlich die richtige URL, aber dann noch eine von nem widget, das auf dieser Seite geladen wurde. Ich vermute mal über nen Iframe oder sowas.

Vielen Dank für eure Tipps...
 
PHP:
function exampleTabSelected(event) {
  var browser = gBrowser.selectedBrowser;
  // browser is the XUL element of the browser that's just been selected
}

// During initialisation
var container = gBrowser.tabContainer;
container.addEventListener("TabSelect", exampleTabSelected, false);

// When no longer needed
container.removeEventListener("TabSelect", exampleTabSelected, false);
Versuch es doch damit
 
ich habe es selber noch nciht gemacht, aber würde sagen du brauchst ja nur die ersten beiden Sachen.

PHP:
function meineFuntkion(event) {
  //Hier was passieren soll wenn ein tab gewählt wurde.
}

var container = gBrowser.tabContainer;
container.addEventListener("TabSelect", meineFuntkion, false);
Dann müßte deine Funktion immer aufgerufen werden wenn ein Tab gewählt wurde. Für neue tabs mußt du denke einen weiteren hinzufügen

PHP:
var container = gBrowser.tabContainer;
container.addEventListener("TabOpen", meineFuntkion, false);
 
Hi,

mein Versuch war jetzt folgender:

PHP:
window.addEventListener("load", function() { myExtension.init(); }, false);  
   
var myExtension = {  
  init: function() {  
    var appcontent = document.getElementById("appcontent");
    if(appcontent){  
      appcontent.addEventListener("DOMContentLoaded", myExtension.onPageLoad, true); 
    }
    
    var container = gBrowser.tabContainer;
    if(container){
        container.addEventListener("TabSelect", myExtension.changetab(), false);
    }
    
  },  
  
   onPageLoad: function(aEvent) {  
        var doc = aEvent.originalTarget;
        alert(doc.location.href);    
   } 
  
    function changetab(aEvent){
        var doc = aEvent.originalTarget; 
        alert(doc.location.href);
    }
}
Aber damit damit zerlegts mir leider alles, also das läuft so leider nicht.
 
container.addEventListener("TabSelect", myExtension.changetab(), false);
->
container.addEventListener("TabSelect", myExtension.changetab, false);

Das ein Fehler den ich auf anhieb sehe

*edit*
Glaube deine Syntax ist falsch. Müßte nciht nach dem onload auch ncoh ein , ?? also vor function changetab? Die Syntax kann ich mir nie merken.

Unter Extras Fehlerkonsole findest vielleicht mehr Infos!
 
habe noch nen edit hinzugefügt.


PHP:
window.addEventListener("load", function() { myExtension.init(); }, false);  
   
var myExtension = {  
  init: function() {  
    var appcontent = document.getElementById("appcontent");
    if(appcontent){  
      appcontent.addEventListener("DOMContentLoaded", myExtension.onPageLoad, true); 
    }
    
    var container = gBrowser.tabContainer;
    if(container){
        container.addEventListener("TabSelect", myExtension.changetab, false);
    }
    
  },  
  
   onPageLoad: function(aEvent) {  
        var doc = aEvent.originalTarget;
        alert(doc.location.href);    
   },
    
  
    changetab:function(aEvent){
        var doc = aEvent.originalTarget; 
        alert(doc.location.href);
    }
}
So meine ich? Ist schon spät
 
HI,

danke...also damit läuft zwar wieder die Extension an sich. Aber habe immernoch die beiden Probleme:

1. Wenn ich auf nen anderen Tab klicke realisiert das Ding es nicht. Also es gibt keine Augabe.

2. Wenn ich beispielsweise auf web.de gehe, bekomm ich 4 meldungen. Eine ist wirklich die richtige URL, eine aber ist irgendein adproxy....also 3x noch nen Werbebanner. Ich möchte aber eigentlich immer nur die URL der aktuellen Browserzeile haben.
 
(Anmerkung: Ihr könnt/sollt für JS-Code ruhig das
PHP:
-Tag benutzen ;))
 
Muß leider ins Bett, wenn keine Lösung findest müßtest mal das Addon hochladen und posten wo, dann kann ich das ja mal morgen anschauen...

Gn8
 
Hi,

hab ne "Fast-Lösung" gefunden. Und zwar hab ich beide Probleme lösen können:

1. Iframes wurden ebenfalls angezeigt:
Das ganze wurde jetzt so gelöst, dass wirklich nurnoch die richtige URL geladen wird. Denn Iframes werden einfach blockiert.

2. Tabwechsel erkennen:
Das funktioniert jetzt auch. Aber nur fast. Denn ich erkenne zwar nen Tabwechsel, aber bekomm den Aufruf nicht hin. Hier meine Lösung:

PHP:
////////////////////////////////////////////////////////////////////////////////
// Eventlistener starten.
////////////////////////////////////////////////////////////////////////////////
window.addEventListener("load", function () {
  gBrowser.addEventListener("load", PageLoad, true);
  gBrowser.tabContainer.addEventListener("TabSelect", TabSelected, false);
}, false);

////////////////////////////////////////////////////////////////////////////////
// Lädt die aktuelle URL des Tabs.
////////////////////////////////////////////////////////////////////////////////
function PageLoad(event) {
    var win = event.originalTarget.defaultView;
    if (!win.frameElement) {
      DomainLoad(win.location.href);
    }
}

////////////////////////////////////////////////////////////////////////////////
// Tab-Wechsel wurde erkannt.
////////////////////////////////////////////////////////////////////////////////
function TabSelected(event) {
	alert("neuer Tab"); //ABER WIE BEKOMM ICH HIER DEN AUFRUF VON PageLoad hin?
}

////////////////////////////////////////////////////////////////////////////////
// Domain wird ausgegeben.
////////////////////////////////////////////////////////////////////////////////
function DomainLoad(url){
	alert("Domain erkannt:" + url);
}
Hab aber noch 2 Probleme:

1. Wie bekomm ich jetzt beim Tabselected den Aufruf der PageLoad() hin, sodass also auch hier die Domain erkannt wird?

2. Wenn ich nen neuen Tab öffne lädt er mir natürlich die URL des Tabs, was ja richtig ist. Also er bringt mir dann je nachdem ob eine Standardseite ist oder nicht dann eben blank oder ne spezielle URL. Gleichzeitig reagiert aber auch der Tabselecter. Kann man den noch irgendwie so ändern, dass der nicht bei neu erstelltem Tab reagiert?

Danke für eure Hilfe:roll:
 
Du kannst in deinem tabselect docha uch die Funktion aufrufen, das sollte problemlos gehen.

Wenn du es im tabselect nicht unterscheiden kannst (falls es nicht im Event drin steht), dann setz doch ein Flag, wenns geöffnet wurde, denn du beim Select wieder am ende ausstellst.

Das geht sofern das open vor dem Select ausgeführt wird, wovon ich mal ausgehe;)
 
Hi,

ja danke...hab das mit dem Aufruf hinbekommen. Allerdings hab ich immernoch das Problem mit dem doppelten Aufruf bei öffnen eines Tabs. Darf ich nochmal fragen wie du das meinst?:roll:
 
ganz banal:

PHP:
geoffnet=false;

function geoeffnet(){
geoffnet=true;
mach irgendwas
}

function selected(){

if(geoffnet)
nichtsmachen;
else
mach irgendwas;

geoffnet=false;
}
 
Hi,

das Problem ist, dass er erst den Wechsel erkennt. Und genau diese URL will ich ja nicht. Aber wenn ich bei jedem Wechsel mir diesen Tab öffne, bekomm ich nach dem richtigen Wechsel ja keine Ausgabe mehr beim ersten Aufruf.
Also ich muss irgendwie erkennen können, das dieser Tabwechsel ein Öffnen von einem Tab war.

Und wenn ich grad dabei bin, kennt zufällig jemand ne Funktion oder was, das mir von einer URL nur den Host gibt also bei www.google.de/asdfasdf/ASdf einfach google.de bzw. bei sub.domain.de/asfasdf/asdfkasdf einfach domain.de? Oder muss ich mir das selbst zerlegen?