Przykłady XPCOM

Wystąpiły błędy skryptów na tej stronie. Mimo, że są one kierowane do redaktorów serwisu, można je częściowo przeglądać poniżej.

{{ Aktualizuj }} Ten artykuł dostarczy kilku przykładów użycia XPCOM wraz z dodatkowymi interfejsami.

Zarządzanie oknem

This example contains RDF datasource that will be seen in the later section. You might skip this example for the time being, except when you have already had that knowledge.

Tworzenie menu okna

Lista aktualnie otwartych okien w przeglądarce Mozilli, może być użyta jako źródło danych RDF. Pozwala ci to stworzyć menu okna razem z listą aktualnie otwartych okien w aplikacji. Źródłem danych do tego jest rdf:window-mediator. Możemy użyć tego jak w poniższym przykładzie:

var el = env.locale; Przykład 1 : Źródła

<toolbox>
 <menubar id="windowlist-menubar">
  <menu label="Window">
   <menupopup id="window-menu" datasources="rdf:window-mediator" ref="NC:WindowMediatorRoot">
    <template>
     <rule>
      <menuitem uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#Name"/>
     </rule>
    </template>
   </menupopup>
  </menu>          
 </menubar>
</toolbox>

W oknie menu zostanie stworzone z listy wszystkich otwartych okien. Wypróbuj ten przykład przez otwarcie kilku okien przeglądarki a zobaczysz, że są one jako lista w menu.

Komponent Window mediator

Jest to dobre dla wyświetlania listy otwartych okien, ale chcielibyśmy poprawić to, aby klikając na pozycję w menu przełączyć się do tego okna. Jest to osiągnięte przez zastosowanie komponentu, window mediator. Implementuje on interfejs nsiWindowDataSource. Poniższy kod pokazuje jak stworzyć komponent, który go implementuje:

var wmdata = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService();
wmdata.QueryInterface(Components.interfaces.nsIWindowDataSource);

Kod ten wyszukuje komponent źródła danych window mediator. Komponent używany tu jest taki sam jak ten obsługujący źródło danych bazy RDF window-mediator. Możesz również uzyskać ten komponent przez serwis RDF, który jest kolejnym serwisem, który zarządza źródłami danych RDF.

Interfejs nsIWindowDataSource ma funkcję getWindowForResource, która może być użyta do pobrania zasobu danego okna. We wcześniejszym przykładzie wygenerowaliśmy listę okien i dodaliśmy ją do menu przez szablon. Szablon generuje atrybut id każdego elementu z pozycji menuitem. Wartość tego atrybutu może być użyta jako zasób. Oznacza to,że aby przełączyć się do aktywnego okna musimy wykonać następujące czynności:

  1. Określić element, jaki kliknie użytkownik.
  2. Uzyskać wartość atrybutu id z tego elementu.
  3. Przekazać tą wartość do getWindowForResource() uzyskanego obiektu okna.
  4. Przełączyć się na aktywność tego okna.

Przykład poniżej pokazuje jak możemy to zrobić:

<toolbox>
 <menubar id="windowlist-menubar">
  <menu label="Window" oncommand="switchFocus(event.target);">
   <menupopup id="window-menu" datasources="rdf:window-mediator" ref="NC:WindowMediatorRoot">
    <template>
     <rule>
      <menuitem uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#Name"/>
     </rule>
    </template>
   </menupopup>
  </menu>          
 </menubar>
</toolbox>

<script>
function switchFocus(elem)
{
  var mediator = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService();
  mediator.QueryInterface(Components.interfaces.nsIWindowDataSource);

  var resource = elem.getAttribute('id');
  switchwindow = mediator.getWindowForResource(resource);

  if (switchwindow){
    switchwindow.focus();
  }
}
</script>

Do elementu menu zostało dodane polecenie obsługi programu, które wywołuje funkcję switchFocus() z parametrem elementu, jaki został wybrany z menu. Funkcja switchFocus():

  • Najpierw pobiera referencję do komponentu implementującego interfejs window mediator.
  • Następnie pobieramy atrybut id dla elementu. Możemy użyć tej wartości atrybutu id jako zasobu.
  • Funkcja getWindowForResource() pobiera zasób i zwraca okno dopasowane do niego.
  • Okno to, przechowywane w zmiennej switchwindow jest takie samo jak obiekt okna, JavaScript.
  • Oznacza to,że możesz wywołać dowolną z funkcji dostarczoną przez nie, z których jedną jest funkcja focus().

Ciasteczka

Następnie pobierzemy listę ciasteczek, zapisanych w przeglądarce. Usługa cookies może być użyta do tego celu. Implementuje interfejs nsICookieManager, który może być używany do wyliczania wszystkich ciasteczek. Tutaj mamy przykład, który zapełnia listę menu nazwami wszystkich ciasteczek zebranych z MozillaZine.

<script>

function getCookies()
{
  var menu = document.getElementById("cookieMenu");
  menu.removeAllItems();

  var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
                        .getService(Components.interfaces.nsICookieManager);

  var iter = cookieManager.enumerator;
  while (iter.hasMoreElements()){
    var cookie = iter.getNext();
    if (cookie instanceof Components.interfaces.nsICookie){
      if (cookie.host == "www.mozillazine.org")
        menu.appendItem(cookie.name,cookie.value);
    }
  }
}
</script>

<hbox>
  <menulist id="cookieMenu" onpopupshowing="getCookies();"/>
</hbox>

Funkcja getCookies() będzie wywoływana, gdy tylko otwarto menu jak wskazuje atrybut onpopupshowing w menulist. Pierwsze dwie linie getCookies() pobierają menulist (listę menu) i usuwają wszystkie istniejące pozycje w menu. Jest to wykonywane, ponieważ getCookies() jest wywoływana za każdym razem, kiedy otwarto menu a nie chcemy pozostawić tam starych pozycji za każdym razem.

Następnie jest wyszukiwany menadżer ciasteczek. Menadżer cookie ma metodę, enumerator, która zwraca obiekt implementujący nsISimpleEnumerator. Może być to używane do przechodzenia przez wszystkie cookies. Numerator ma metodę hasMoreElements() zwracającą prawdę dopóki nie pobierzemy ostatniego cookie. Metoda getNext() pobiera cookie i przesuwa indeks numeratora na następne cookie. Ponieważ numerator właściwie zwraca obiekt ogólny, musimy go QueryInterface() do nsICookie zanim możemy go zastosujemy. W tym przypadku użyjemy operatora instanceof aby to osiągnąć.

W końcu, dla ciastek, dodajemy pozycję w menu. Do tego używamy właściwości ciastek – nazwy hosta i wartości. Menu mają funkcję appendItem(), której możemy używać do dodawania pozycji w menu, daną etykietkę i wartość.

Zobacz także

Więcej przykładów jest dostępnych:

Następnie, zobaczymy jak utworzyć drzewa.


Autorzy i etykiety dokumentu

Autorzy tej strony: Ptak82, Mgjbot
Ostatnia aktualizacja: Mgjbot,