Ходить через nsIDOMNodeList - PullRequest
       25

Ходить через nsIDOMNodeList

0 голосов
/ 16 октября 2011

Я работаю над компонентом C ++ для Firefox и пытаюсь сосредоточиться на XPCOM и всех его частях. Это действительно сбивает с толку, поэтому я пытаюсь разобраться с этим, но я пытаюсь пройтись по странице и получить все ее ссылки. Я пытаюсь выяснить, что делают все объекты. Так что, если у меня есть этот интерфейс:

interface nsIPageSummary : nsISupports {
    boolean saveSummary(in nsIDOMDocument document, 
                        out unsigned long numLinks,
                        out unsigned long numImages);
};

определенный в IDL, метод в моем коде C ++ будет выглядеть так:

SaveSummary(nsIDOMDocument* inDoc, PRBool* outSuccess)
{
    *outSuccess = PR_FALSE;
    nsCOMPtr<nsIDOMNodeList> nodeList;
    inDoc->GetElementsByTagName(NS_LITERAL_STRING("A"), getter_AddRefs(nodeList));
}

Я знаю, что методу C ++ нужно больше параметров, чтобы соответствовать тому, который определен в интерфейсе, но я пока не понимаю, как работает все типизирование. С точки зрения фактического списка, я правильно понимаю, что

inDoc->GetElementsByTagName(NS_LITERAL_STRING("A"), getter_AddRefs(nodeList));

строка помещает все теги "A" из inDoc в nodeList? И мне просто нужно пройти через нодлист, чтобы получить их все?

1 Ответ

0 голосов
/ 17 октября 2011

Вы компилируете определение интерфейса, используя xpidl, чтобы получить файл заголовка C ++ - вы можете проверить этот файл, чтобы увидеть, как переводятся определения интерфейса.Ваше определение метода должно выглядеть следующим образом:

nsresult SaveSummary(nsIDOMDocument* inDoc, PRUint32* outNumLinks, PRUint32* outNumImages, PRBool* outSuccess)

Я бы предложил использовать тип PRUint32 вместо неоднозначного unsigned long в определении интерфейса.Я также предложил бы избавиться от возвращаемого значения: методы XPCOM всегда возвращают nsresult, который является либо NS_OK, либо кодом ошибки, этого достаточно, чтобы указать на успех или неудачу.Код ошибки автоматически преобразуется в исключение при вызове из JavaScript.И наконец, я бы рекомендовал использовать имена тегов в нижнем регистре: хотя это не имеет значения в HTML (без учета регистра), в документе XHTML допускаются только имена тегов в нижнем регистре.Таким образом, определение вашего интерфейса должно выглядеть так:

interface nsIPageSummary : nsISupports {
    void saveSummary(in nsIDOMDocument document, 
                     out PRUint32 numLinks,
                     out PRUint32 numImages);
};

И соответствующая реализация:

nsresult
SaveSummary(nsIDOMDocument* inDoc, PRUint32* outNumLinks, PRUint32* outNumImages)
{
  nsresult rv;

  nsCOMPtr<nsIDOMNodeList> nodeList;
  rv = inDoc->GetElementsByTagName(NS_LITERAL_STRING("a"), getter_AddRefs(nodeList));
  if (NS_FAILED(rv))
    return rv;

  rv = nodeList->GetLength(outNumLinks);
  if (NS_FAILED(rv))
    return rv;

  rv = inDoc->GetElementsByTagName(NS_LITERAL_STRING("img"), getter_AddRefs(nodeList));
  if (NS_FAILED(rv))
    return rv;

  rv = nodeList->GetLength(outNumImages);
  if (NS_FAILED(rv))
    return rv;

  return NS_OK;
}
...