Entwicklung einer Browser-Toolbar: Zusammenfassung (5/5)

Diese Artikelserie ist die deutsche Übersetzung meines Artikels “Developing a Browser Toolbar”, der in den ASPects (Englisch) im Januar 2010 (Jahrgang 23, Ausgabe 1), ein Magazin der Association of Shareware Professionals (ASP; Englisch), veröffentlicht wurde.

Wie Sie gesehen haben, ist die Entwicklung einer Browser-Toolbar ein gutes Stück Arbeit, aber obwohl ich nicht jeden Schritt im Detail beschreiben konnte, so sollte das Erstellen einer eigener Toolbar nach dem Lesen dieser Artikelserie und besonders der verlinkten Tutorials doch zumindest schneller gehen.

Wenn Sie testen möchten, wie diese Toolbar auf Ihrem System funktioniert, können Sie ein entsprechendes Installationsprogramm von meiner Webseite downloaden.

Zum Schluss möchte ich Sie noch dazu ermuntern jeden kleine Quelltext-Änderung in der Internet-Explorer-Toolbar auf sämtlichen, wichtigen Betriebssystemen (zumindest Windows XP, Vista und 7) und Browser-Versionen zu testen, da die Ergebnisse wirklich unterschiedlich ausfallen können – deutlich unterschiedlicher als bei der Entwicklung “normaler” Windows-Anwendungen.

Wie sind Ihre Erfahrungen mit dem Erstellen von Browser-Toolbars?

Inhalt der Artikelserie “Entwicklung einer Browser-Toolbar”:

Entwicklung einer Browser-Toolbar: Installationssystem (4/5)

Diese Artikelserie ist die deutsche Übersetzung meines Artikels “Developing a Browser Toolbar”, der in den ASPects (Englisch) im Januar 2010 (Jahrgang 23, Ausgabe 1), ein Magazin der Association of Shareware Professionals (ASP; Englisch), veröffentlicht wurde.

Jetzt haben wir eine Toolbar für Internet Explorer und Firefox, aber wie bekommen wir diese installiert? Es gibt nur ein Installationstool, das ich auch für sämtliche meiner anderen Produkte verwende und dass so ziemlich alles kann: Inno Setup (Englisch). Im Folgenden lesen Sie, was Sie für die Installation der beiden Toolbar-Versionen benötigen.

Toolbar-Installation im Mozilla Firefox

Wieder ist es sehr viel einfacher eine neue Toolbar im Firefox-Browser zu installieren. Sie müssen Ihre XPI-Datei lediglich in das Firefox-Erweiterungsverzeichnis kopieren. Die Toolbar wird dann beim nächsten Browser-Start installiert. Somit benötigen wir lediglich eine Pascal-Funktion in unserem Inno-Setup-Quelltext, die uns das Erweiterungsverzeichnis des Firefox‘ zurückgibt:

function GetFirefoxExtensionsPath(Param: String): String;
var
    FirefoxVersion, FirefoxInstallPath: string;
begin
    if (RegQueryStringValue(HKLM, 'SOFTWARE\Mozilla\Mozilla Firefox',
            'CurrentVersion', FirefoxVersion)) then begin
        if (RegQueryStringValue(HKLM, 'SOFTWARE\Mozilla\Mozilla Firefox\' + FirefoxVersion +
                '\Main', 'Install Directory', FirefoxInstallPath)) then begin
            if (not DirExists(FirefoxInstallPath +
                   '\extensions\toolbarebay@ab-tools.com')) then begin
                Result := FirefoxInstallPath + '\extensions';
            end;
        end;
    end;
end;

Toolbar-Installation im Microsoft Internet Explorer

Um die Toolbar im Internet Explorer zu installieren, müssten wir zunächst die strongly-named Assembly im Global Assembly Cache (GAC) mittels des gacinstall-Kennzeichens, verfügbar in der aktuellen Inno-Setup-Version, im file-Bereich registrieren. Zusätzlich müssen wir einige Registry-Änderungen durchführen. Sie können den folgenden Quelltext in den registry-Bereich Ihres Inno-Setup-Skriptes kopieren und sämtliche Variablen durch Ihre eigenen ersetzen (ich habe den Inno-Setup-Syntax ein wenig verkürzt, um es etwas kompakter zu bekommen):

HKCR: CLSID\{{%GUID%}; Flags: uninsdeletekey
HKCR: CLSID\{{%GUID%}; ValueType: string; ValueName: ; ValueData: %LONG_NAME%
HKCR: CLSID\{{%GUID%}; ValueType: string; ValueName: MenuText; ValueData: %LONG_NAME%
HKCR: CLSID\{{%GUID%}; ValueType: string; ValueName: HelpText; ValueData: %DESCRIPTION%
HKCR: CLSID\{{%GUID%}\Implemented Categories\{{00021494-0000-0000-C000-000000000046}
HKCR: CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: ; ValueData: mscoree.dll
HKCR: CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: ThreadingModel; ValueData: Both
HKCR: CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: Class; ValueData: %CLASS%
HKCR: CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: Assembly; ValueData: %NAMESPACE%, Version=%VERSION%, Culture=neutral, PublicKeyToken=%PUBLIC_KEY%
HKCR: CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: RuntimeVersion; ValueData: v2.0.50727
HKLM: Software\Classes\CLSID\{{%GUID%}; Flags: uninsdeletekey
HKLM: Software\Classes\CLSID\{{%GUID%}; ValueType: string; ValueName: ; ValueData: %LONG_NAME%
HKLM: Software\Classes\CLSID\{{%GUID%}; ValueType: string; ValueName: MenuText; ValueData: %LONG_NAME%
HKLM: Software\Classes\CLSID\{{%GUID%}; ValueType: string; ValueName: HelpText; ValueData: %DESCRIPTION%
HKLM: Software\Classes\CLSID\{{%GUID%}\Implemented Categories\{{00021494-0000-0000-C000-000000000046}
HKLM: Software\Classes\CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: ; ValueData: mscoree.dll
HKLM: Software\Classes\CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: ThreadingModel; ValueData: Both
HKLM: Software\Classes\CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: Class; ValueData: %CLASS%
HKLM: Software\Classes\CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: Assembly; ValueData: %NAMESPACE%, Version=%VERSION%, Culture=neutral, PublicKeyToken=%PUBLIC_KEY%
HKLM: Software\Classes\CLSID\{{%GUID%}\InprocServer32; ValueType: string; ValueName: RuntimeVersion; ValueData: v2.0.50727
HKLM: SOFTWARE\Microsoft\Internet Explorer\Toolbar; ValueType: string; ValueName: {{%GUID%}; ValueData: %LONG_NAME%
HKLM: SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{{%GUID%}; Flags: uninsdeletekey
HKLM: SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{{%GUID%}; ValueType: dword; ValueName: NoExplorer; ValueData: 1

Um keinen unnötigen Müll auf den Computer des Benutzers zu schreiben, sollten die Registry-Änderungen nur durchgeführt und die Dateien nur kopiert werden, wenn das .NET-Framework 2.0 (oder neuer) auf dem System installiert ist, da dieses – wie bereits weiter oben geschrieben – für die Internet-Explorer-Toolbar benötigt wird. Sie können die Verfügbarkeit des .NET-Framework 2.0 relativ einfach mit folgender Pascal-Funktion überprüfen:

function CheckForDotNet(): Boolean;
begin
    Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727');
end;

Dies waren die Schritte, um ein Inno-Setup-Installationsprogramm für beide Toolbar-Versionen zu erstellen. Natürlich können Sie diese in einer einzigen Setup-Datei, welche die Internet-Explorer- sowie die Firefox-Version – je nachdem welcher Browser auf dem System vorhanden ist – installiert, zusammenfassen.

Der letzte Artikel wird eine kurze Zusammenfassung sein.

Inhalt der Artikelserie “Entwicklung einer Browser-Toolbar”:

Entwicklung einer Browser-Toolbar: Microsoft Internet Explorer (3/5)

Diese Artikelserie ist die deutsche Übersetzung meines Artikels “Developing a Browser Toolbar”, der in den ASPects (Englisch) im Januar 2010 (Jahrgang 23, Ausgabe 1), ein Magazin der Association of Shareware Professionals (ASP; Englisch), veröffentlicht wurde.

Die erste zu treffende Entscheidung ist die Programmiersprache, welche Sie für die Entwiclung der Internet-Explorer-Toolbar verwenden möchten. Bei meinen Recherchen im Internet fand ich Beispiele für C++, Visual Basic 6 und .NET. Es scheint einige Visual-Style-Probleme zu geben, wodurch die Toolbar bei System mit Windows Vista und Windows 7 nicht sonderlich gut aussieht, wenn C++ verwendet wird. Und nachdem ich wirklich keine Lust hatte noch in Visual Basic 6 zu entwickeln, entschied ich mich für .NET. Der einzige Nachteil dieser Entscheidung war, dass der Benutzer das .NET Framework 2.0 (oder neuer) auf seinem System installiert haben muss. Damit kann ich jedoch leben, da es bereits sehr verbreitet ist.

Aufgrund dessen, dass fast alle meine Produkte in .NET entwickelt sind, hatte ich bereits Visual Studio 2008 auf meinem Computer installiert. Falls Sie das nicht haben, benötigen Sie zumindest die Express Edition (Version 2005 sollte auch ausreichen) für die nächsten Schritte. Ich entschied die Toolbar in C# zu entwickeln, aber mit Visual Basic .NET ginge das selbstverständlich auch.

Als ein guter Ausgangspunkt fand ich diesen (Englisch) und diesen (Englisch) Artikel auf der Code-Project-Webseite. Falls Sie mehr über die COM-Komponente wissen möchten, können Sie auch das C++-Tutorial (Englisch) lesen, aber das ist nicht unbedingt erforderlich. Unter Verwendung der Beispiel-Quelltexte dieser beiden Artikel, sollten Sie eine funktionierende Toolbar erhalten – zumindest auf einem Windows-XP-System. Jedoch stieß ich auf einige Probleme, die behoben werden mussten und die ich daher im Folgenden näher beschreiben werde:

Sicherstellen, dass die Toolbar auf sämtlichen Betriebssystemen korrekt angezeigt wird

Mit dem Demo-Quelltext der oben erwähnten Artikel habe ich die Toolbar ziemlich schnell auf meinem Windows-XP-Testrechner zum Laufen bekommen. Naiverweise ging ich davon aus, dass die Toolbar, die auf Windows XP mit Internet Explorer 8 korrekt funktioniert, auch auf Windows Vista und Windows 7 mit derselben Internet-Explorer-Version funktionieren würde. Aber tatsächlich musste ich lernen, dass dies absolut nicht der Fall ist! Sie wurde entweder überhaupt nicht dargestellt oder soweit auf der rechten Seite, dass man sie nur mit einer horizontalen Auflösung von mindestens 2.000 Pixel sehen konnte. Somit musste ich nach einer Lösung suchen, jedoch die meisten Quelltextänderungen führten nur dazu, dass die Toolbar entweder auf dem einen oder dem anderen Betriebssystem beziehungsweise der einen oder anderen Browserversion funktionierte. Nach einigen Stunden frustrierendem Testen, habe ich die GetBandInfo-Funktion der BandObjectsLib-Klasse wie folgt geändert. Obwohl ich nach wie vor nicht ganz sicher bin weswegen, so funktioniert es nun auf allen Betriebssysteme problemlos:

public virtual void GetBandInfo(UInt32 dwBandID, UInt32 dwViewMode, ref DESKBANDINFO dbi)
{
    if ((dbi.dwMask & DBIM.MINSIZE) != 0)
    {
        dbi.ptMinSize.X = this.MinimumSize.Width;
        dbi.ptMinSize.Y = this.MinimumSize.Height;
    }

    if ((dbi.dwMask & DBIM.MAXSIZE) != 0)
    {
        dbi.ptMaxSize.X = this.MaximumSize.Width;
        dbi.ptMaxSize.Y = this.MaximumSize.Height;
    }

    if ((dbi.dwMask & DBIM.ACTUAL) != 0)
    {
        dbi.ptActual.X = this.Size.Width;
        dbi.ptActual.Y = this.Size.Height;
    }

    if ((dbi.dwMask & DBIM.BKCOLOR) != 0)
    {
        dbi.dwMask &= ~DBIM.BKCOLOR;
    }

    dbi.dwModeFlags = DBIMF.BREAK;
}

Hübschere Darstellung auf Windows XP und neuer

Wenn Sie den folgenden Ereignis-Handler in der BandObjectsLib-Klasse nicht hinzufügen, wird Ihre Toolbar zwar dennoch funktionieren, aber einfach nicht sonderlich schön auf Windows XP und neuer aussehen. Die if-Anweisung in der Ereignisfunktion stellt dabei sicher, dass die Toolbar auch auf älteren Betriebssystemen wie Windows 98, 2000 und ME nach wie vor funktioniert. Ansonsten würde es zu einer Ausnahme auf diesen Betriebssystemen kommen. Hier ist der Quelltext, den ich verwendet habe, um es auf sämtliche Betriebssystem korrekt zum Laufen zu bringen:

[DllImport("uxtheme", ExactSpelling = true)]
public extern static Int32 DrawThemeParentBackground(IntPtr hWnd, IntPtr hdc,
                                                     ref Rectangle pRect);

protected override void OnPaintBackground(PaintEventArgs e)
{
    if (System.Environment.OSVersion.Platform >= PlatformID.Win32NT &&
           (Environment.OSVersion.Version.Major == 5 &&
            Environment.OSVersion.Version.Minor >= 1 ||
            Environment.OSVersion.Version.Major >= 6) &&
           this.BackColor == Color.Transparent)
    {
        // Only if operating system is Windows XP or higher
        IntPtr hdc = e.Graphics.GetHdc();
        Rectangle rec = new Rectangle(e.ClipRectangle.Left,
            e.ClipRectangle.Top, e.ClipRectangle.Width, e.ClipRectangle.Height);
        DrawThemeParentBackground(this.Handle, hdc, ref rec);
        e.Graphics.ReleaseHdc(hdc);
    }
    else
    {
        base.OnPaintBackground(e);
    }
}

Keine Serialisierung erlaubt

Bei der Entwicklung einer Firefox-Toolbar können Sie den Mozilla-Preferences-Dienst verwenden, um benutzerdefinierte Werte direkt innerhalb Firefox abzuspeichern und zu laden. Da es im Internet Explorer kein Gegenstück dazu gibt und ich XML-Serialisierung in vielen anderen .NET-Produkten verwende, wollte ich diese in dem Toolbar-Projekt ebenfalls verwenden. Auf den ersten Blick funktionierte das auch einwandfrei, aber wenn im Internet Explorer 8 der Protected Mode aktiviert ist (und das ist er standardmäßig, zumindest seit Windows Vista), bekommt der Benutzer ein hässliches Warnungsfenster jedes Mal angezeigt, wenn die Toolbar initialisiert wird. Den Grund dafür werde ich nun nicht im Detail erläutern; verwenden Sie einfach keine Serialisierung in Internet-Explorer-Toolbars. Sie können benutzerdefinierte Werte entweder ohne Serialisierung im Dateisystem unterhalb des lokalen Anwendungsdatenverzeichnisses abspeichern oder einfach die Registry verwenden.

Automatisches Online-Update

Wie in der Firefox-Version, wollte ich auch, dass die Internet-Explorer-Toolbar eine automatische Update-Funktion beinhaltet. Da es jedoch kein Update-System für Toolbars wie im Firefox gibt, musste ich ein eigenes implementieren. Dies ist jedoch relativ einfach, zumal man – wie auch in anderen .NET-Anwendungen – einfach die WebClient-Klasse verwenden kann, um zunächst eine HTTP-Anfrage zu machen, ob ein Update verfügbar ist, und um danach die Update-Datei herunterzuladen, falls erforderlich. Auf der Serverseite nutze ich eine kleines PHP-Skript, das sich um die Update-Anfrage kümmert. Die Update-Datei, die heruntergeladen wird, ist die normale Setup-Datei, welche einfach sämtliche Dateien mit neuen überschreibt. Das Einzige, auf was Sie achten müssen, ist die Art und Weise, wie Sie die ausführbare Setup-Datei nach dem Download aufrufen, da ansonsten ein Dialog der Benutzerkontensteuerung (UAC) angezeigt wird. Ich habe folgende Prozedur geschrieben, die Sie verwenden können, um eine Datei aus der Toolbar heraus auszuführen, ohne dass irgendeine Warnung dem Benutzer angezeigt wird:

private void startProcess(string fileName, string arguments)
{
    System.Diagnostics.ProcessStartInfo startInfo =
        new System.Diagnostics.ProcessStartInfo();
    startInfo.UseShellExecute = true;
    startInfo.WorkingDirectory = Environment.CurrentDirectory;
    startInfo.FileName = fileName;
    if (Environment.OSVersion.Platform >= PlatformID.Win32NT &&
            Environment.OSVersion.Version.Major >= 6)
        // Only if operating system is Windows Vista or higher
        startInfo.Verb = "runas";
    else
        startInfo.Verb = "open";
    startInfo.Arguments = arguments;
    startInfo.ErrorDialog = true;
    try
    {
        System.Diagnostics.Process process = System.Diagnostics.Process.Start(startInfo);
        process.WaitForExit();

        MessageBox.Show(objToolbarData["msg.restartBrowserText"],
                        objToolbarData["msg.restartBrowserTitle"],
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        if (debugMode) MessageBox.Show(ex.ToString());
    }
}

Deinstallationsschaltfläche innerhalb der Toolbar

Das war das Einzige, was im Internet Explorer einfacher zu implementieren war als im Firefox; es muss lediglich das Deinstallationsprogramm (wieder mit der startProcess-Prozedur von oben) des Installationssystems (siehe nächster Post###) ausgeführt werden, um die Toolbar wieder zu deinstallieren. Nach einem Browser-Neustart wird sie dann nicht mehr angezeigt (wie auch beim Firefox).

Geschafft; die Internet-Explorer-Version von unserer Toolbar ist nun auch fertig! Sie wird mit Internet Explorer 6 oder neuer auf Windows 98 oder neuer mit installiertem .NET Framework 2.0 funktionieren.

Im nächsten Artikel werde ich erklären, wie die Toolbars installiert werden.

Inhalt der Artikelserie “Entwicklung einer Browser-Toolbar”:

Entwicklung einer Browser-Toolbar: Mozilla Firefox (2/5)

Diese Artikelserie ist die deutsche Übersetzung meines Artikels “Developing a Browser Toolbar”, der in den ASPects (Englisch) im Januar 2010 (Jahrgang 23, Ausgabe 1), ein Magazin der Association of Shareware Professionals (ASP; Englisch), veröffentlicht wurde.

Die Entwicklung einer Toolbar für Firefox ist relative einfach: Alles geschieht mit XML, einem bisschen CSS und besonders JavaScript. Das Letzte ist auch der einzige Knackpunkt an der Sache, da ich die Entwicklung in JavaSkript schlicht und ergreifend nicht mag. Aber wie auch immer, es ist in diesem Fall ziemlich unkompliziert.

Ich habe eine sehr gute Seite im Internet gefunden (Englisch). Dieses Tutorial erklärt die Entwicklung einer Firefox-Toolbar im Detail und ersparte mir eine Menge an Recherche-Arbeit. Nachdem Sie das Online-Tutorial durchgegangen sind, sollten Sie bereits eine voll funktionsfähige Firefox-Toolbar haben. Danach sind nur zwei Dinge übrig:

Automatisches Online-Update

Ich wollte, dass meine Toolbar mit automatischen Updates von meinem Webserver versorgt wird. Das ist jedoch ziemlich einfach, wenn man das integrierte Update-System des Firefox’ verwendet. Auf derselben Seite gibt es auch ein gutes Tutorial über das Hinzufügen einer automatischen Update-Funktion (Englisch).

Deinstallationsschaltfläche innerhalb der Toolbar

Das schlechte Image von Toolbars basiert sicherlich nicht zuletzt auf der Tatsache, dass die meisten wirklich schwierig zu deinstallieren sind. Obwohl Firefox bereits eine Deinstallationsunterstützung mit dem Add-On-Manager für den Benutzer anbietet, wollte ich eine Deinstallationsschaltfläche direkt in die Toolbar selbst integrieren. Nachdem ich im Internet und im Mozilla Developer Center etwas recherchiert habe, entwickelte ich folgendes Stück Quelltext, das zunächst die Toolbar erfolgreich deinstalliert, danach dem Benutzer eine Webseite (irgendetwas wie “Schade, dass Sie die Toolbar deinstalliert haben…”) anzeigt und zum Schluss dem Benutzer mitteilt, dass ein Browser-Neustart zum Abschluss der Deinstallation nötig ist:

try {
    var tb = document.getElementById('ABTools-Toolbar');
    var text = ABTools_ToolbarData["msg.uninstallToolbarText"].replace("%name%",
                                   ABTools_ToolbarData["toolbar.name"]);
    if (!window.confirm(text))
        return;

    var gExtensionManager = Components.classes["@mozilla.org/extensions/manager;1"]
                            .getService(Components.interfaces.nsIExtensionManager);
    var rds = gExtensionManager.datasource;
    if (gExtensionManager.uninstallItem) gExtensionManager.uninstallItem(ABTools_id);
    if (gExtensionManager.uninstallExtension)
        gExtensionManager.uninstallExtension(ABTools_id);

    ABTools_guid = "";
    ABTools_saveSettings();

    ABTools_LoadURL(getABToolsHomepageLink(9));

    alert(ABTools_ToolbarData["msg.restartBrowserText"]);
} catch(e) {
    if (ABTools_DebugMode) alert(e);
}

Nach diesen Schritten ist Ihre Firefox-Toolbar fertig für die Installation! Sie funktioniert auf Firefox Version 1.5 oder neuer, unabhängig vom Betriebssystem.

Im nächsten Artikel kommen wir zum komplizierteren Browser.

Inhalt der Artikelserie “Entwicklung einer Browser-Toolbar”:

Entwicklung einer Browser-Toolbar: Einführung (1/5)

Diese Artikelserie ist die deutsche Übersetzung meines Artikels “Developing a Browser Toolbar”, der in den ASPects (Englisch) im Januar 2010 (Jahrgang 23, Ausgabe 1), ein Magazin der Association of Shareware Professionals (ASP; Englisch), veröffentlicht wurde.

Neben kommerziellen Produkten, die ich direkt an Kunden verkaufe, habe ich in den vergangenen Jahren auch einige Freeware-Produkte erstellt. Dies ist nicht der richtige Platz, um die Vor- und Nachteile von Toolbars zu diskutieren, aber ich habe entschieden, dass die Integration einer Toolbar in die Installationsprogramme meiner Produkte ein guter Weg wäre, um mit meinen Freeware-Produkten Geld zu verdienen.

Daher habe ich mit einem deutschen Werbeunternehmen zusammengearbeitet, die mich mit einer einsatzbereiten Toolbar versorgt haben. Da es jedoch vor einiger Zeit zu erheblichen Problemen mit deren Toolbar kam, entschied ich eine eigene Toolbar zu entwickeln.

Ich werde die einzelnen Schritte zur Entwicklung einer Browser-Toolbar nicht im Detail beschreiben können, sonst geht uns hier der Platz aus. Möchten Sie jedoch in der Zukunft eine eigene Toolbar erstellen, kann ich Ihnen einige Tipps und Links zu guten Ressourcen mitgeben, welche diese Herausforderung zumindest deutlich leichter machen werden – und falls Sie Hilfe benötigen, fragen Sie in der .technical Newsgroup der ASP (oder schreiben Sie unten einfach einen Kommentar).

Zunächst musste ich festlegen, auf welchen Browsern die Toolbar funktionieren sollte. Selbstverständlich habe ich sofort zwei Browser in Betracht gezogen: Internet Explorer und Firefox. Auch auf Opera und Chrome habe ich einen Blick geworfen, aber beide Browser hatten keine richtige Add-On-Unterstützung und daher habe ich mich zunächst auf Internet Explorer und Firefox – die am meisten verbreiteten Browser – konzentriert.

Nachdem ich mich in das Thema eingelesen hatte, stellte ich fest, dass der Internet Explorer dem Entwickler auch in diesem Bereich das Leben schwer macht. Daher fange ich im nächsten Artikel mit dem einfacherer von beiden an.

Inhalt der Artikelserie “Entwicklung einer Browser-Toolbar”: