Всем привет,

Как в версии 1.8 получить доступ к innerHTML-ю?
У меня на руках в обработчике OnStateChange есть aWebProgress, от туда я могу добраться к nsIDOMHTMLDocument. А дальше?

Спасибо.

Есть такой nsIDOMSerializer. Он принимает nsIDOMNode и возвращает в виде текста html-содержимое элемента. Попробуйте nsIDOMHTMLDocument привести к nsIDOMNode, ну или получить DocumentElement через nsIDOMDocument.

Да, видел такой. Но к сожалению данного интерфейса нету в версии 1.8

PS Вообще задача не просто прочитать HTML, а ещё и модифицировать...
В ИЕ в этом смысле проще, взял и дёрнул get_body/put_body у IHTMLElement-а.

Вот, если интерестно, реализация InsertAdjacentHTML для Firefox. Правда на Delphi. Но вы, я думаю, разберетесь.

Выделить код

Код:

procedure InsertAdjacentHTML(Element: IsokHtmlElement; Where: TsokWhereInsert; Html: sokWideString);
var
  doc: nsIDOMDocument;
  docRange: nsIDOMDocumentRange;
  range: nsIDOMRange;
  nsRange: nsIDOMNSRange;
  fragment: nsIDOMDocumentFragment;
  node, parent, child, retval: nsIDOMNode;
  rv: nsResult;
begin
try
  if not Assigned(Element) then
    Exit;

  Element.QueryInterface(IID_nsIDOMNode, node);
  if not Assigned(node) then
    Exit;

  NS_ERROR(node.GetOwnerDocument(doc));

  if not Assigned(doc) then
    Exit;

  doc.QueryInterface(NS_IDOMDOCUMENTRANGE_IID, docRange);
  if not Assigned(docRange) then
    Exit;

  range := docRange.CreateRange;
  if not Assigned(range) then
    Exit;

  rv := range.SelectNode(node);
  if NS_FAILED(rv) then
    begin
    NS_ERROR(node.GetParentNode(parent));
    NS_ERROR(rv);
    end;

  if range.QueryInterface(IID_nsIDOMNSRange_190, nsRange) <> 0 then
    if range.QueryInterface(IID_nsIDOMNSRange_181, nsRange) <> 0 then
      Exit;

  if NS_FAILED(nsRange.CreateContextualFragment(NewString(Html).AString, fragment)) then
    Exit;

  if not Assigned(fragment) then
    Exit; // якщо фрагмент не вдалось створити (наприклад в XUL-документі) далі буде NS_ERROR_INVALID_POINTER

  NS_ERROR(node.GetParentNode(parent));
  if not Assigned(parent) then
    Exit;

  case Where of
    beforeBegin:
      NS_ERROR(parent.InsertBefore(fragment, node, retval));
    afterBegin:
      begin
      NS_ERROR(node.GetFirstChild(child));
      NS_ERROR(node.InsertBefore(fragment, child, retval));
      end;
    beforeEnd:
      NS_ERROR(node.AppendChild(fragment, retval));
    afterEnd:
      begin
      NS_ERROR(node.GetNextSibling(child));
      if (Assigned(child)) then
        NS_ERROR(parent.insertBefore(fragment, child, retval))
      else
        NS_ERROR(parent.appendChild(fragment, retval));
      end;
  end;
except
  on E: Exception do
    LogException('InsertAdjacentHTML:  ' + Html, E);
end;
end;
Elexander пишет

Вот, если интерестно, реализация InsertAdjacentHTML для Firefox. Правда на Delphi. Но вы, я думаю, разберетесь.

подскажи пожалуйста  интерфейс nsIDOMNSRange  где взять SDK под делфи с описанием даного интерфейса?

очень нужно, спасибо

Я при использовании Gecko за основу брал http://d-gecko.svn.sourceforge.net/viewvc/d-gecko/trunk/?pathrev=17.
Все интерфейсы, которые в нем не были описаны генерировал с idl файлов с помощью xpidl2pas  компилятора. Его можно было когда-то найти в проекте Dino, который сейчас мертв. Если вам нужен только этот интерфейс, то вот:

Выделить код

Код:

nsIDOMNSRange = interface(nsISupports)
  ['{59188642-23B4-41D6-BDE1-302C3906D1F0}']
    function CreateContextualFragment(const fragment: nsAString; var _retval: nsIDOMDocumentFragment): nsResult; stdcall;
    function IsPointInRange(parent: nsIDOMNode; offset: Integer; var _retval: LongBool): nsResult; stdcall;
    function ComparePoint(parent: nsIDOMNode; offset: Integer; var _retval: Smallint): nsResult; stdcall;
  end;

Если нужен компилятор xpidl2pas, могу выслать на почту.

Elexander пишет

Если нужен компилятор xpidl2pas, могу выслать на почту.

спасибо если можно на email

можете прокомметнировать где взять: 

IID_nsIDOMNode
IID_nsIDOMNSRange_190
IID_nsIDOMNSRange_181
NS_ERROR()


и это откуда берется?
Element: IsokHtmlElement;
это nsIDOMHTMLElement или я ошибаюсь?

еще, если можно показать пример доступа к фреймовой структуре документа, буду очень благодарен.

Спасибо

IsokHtmlElement - это синоним IInterface. По сути это объект документной модели который поддерживает nsIDOMNode. В коде дальше у него просится этот интерфейс и работа ведется уже с ним.

IID_nsIDOMNSRange_190, IID_nsIDOMNSRange_181 - это TGUID-ы для соответствующих интерфейсов для разных версий Gecko (1.9.0 и 1.8.1). Mozilla делает одну странность: они в разных версиях меняют guid-ы своих интерфейсов, хотя сами интерфейсы оставляют без изменений. Иными словами, если вам нужно получить интерфейс у объекта по глобальному идентификатору, то нужно  знать в какой версии gecko вы работаете (какая версия firefox). Если хотите, чтобы компонент работал в разных версиях gecko нужно делать вот такие некрасивые проверки, как в той функции.

NS_ERROR() - это функция которая проверяет NS_FAILED() и если результат положительный (nsResult <> 0) генерирует исключение.

К фреймовой структуре доступ получается приблизительно так:
 

Выделить код

Код:

element = document.getElementsByTagName('iframe')[0]
  doc = element.contentDocument;

В doc будет объект поддерживающий nsIDOMDocument.

Я в Delphi с браузером работал так: сначала писал минимально возможный  код на javascript, проверял работоспособность с консоли и потом искал соответствующие методы в интерфейсах SDK.

P.S. И напишите адрес почты, куда выслать компилятор, можно в приват.

привет Elexander,  вопрос такой, у меня 1.7.12 gecko SDK портированный на Делфи, но встретился с такой проблемой, при отображении некоторых сайтов, мигает текст на странице,  как будто стоит атрибут у текста blink, но его там нет.  в новых версиях gecko такого нет.  незнаеш как побороть глюк? может есть где скачать более свежую SDK ?  никто не переводил 1.9.х ? незнаеш?

спасибо

digital пишет

привет Elexander,  вопрос такой, у меня 1.7.12 gecko SDK портированный на Делфи, но встретился с такой проблемой, при отображении некоторых сайтов, мигает текст на странице,  как будто стоит атрибут у текста blink, но его там нет.  в новых версиях gecko такого нет.  незнаеш как побороть глюк? может есть где скачать более свежую SDK ?  никто не переводил 1.9.х ? незнаеш?

спасибо

Не понял вопрос. Если мигает текст, при чем здесь SDK?
Интерфейсы для новых версий Geckо генерируются с idl файлов. Компилятор я вам выслал.

Elexander пишет

Не понял вопрос. Если мигает текст, при чем здесь SDK?
Интерфейсы для новых версий Geckо генерируются с idl файлов. Компилятор я вам выслал.

я предполагаю что проблема с миганием в версии Gecko, т.к. он неправильно отображает страницу.
потому хотел найти новую версию, может где есть уже более новый TGeckoBrowser под версию 1.9.х

самому перелопатить nsXPCOM.pas  и все остальное ненаделав ошибок сложновато.  насколько я понимаю дело заменой GUIDов необойдется,
скорее всего структура интерфейсов и работа с ними тоже поменяется.  надо быть профи в этом деле чтобы правильно сделать.

Компилятор я получил, спасибо, несколько нужных мне интерфейсов на нем сгенерировал.

как правильно изменить путь к папке GRE\xpcom.dll? 
пробовал вставочку сделать '\browser', но появляются побочные глюки, пропадают скролбары и поля ввода на страницах

unit nsXPCOMGlue;
...

function GetGREDirectoryPath: String;
var
  cpd: String;
  xpcomLibPath: String;
...
begin
...
cpd := GetCurrentProccessDirectory; //+'\browser';
  if Length(cpd)>0 then
  begin
    xpcomLibPath := cpd + '\xpcom.dll';
    if FileExists(xpcomLibPath) {and CheckoGeckoVersion(xpcomLibPath)} then
    begin
      Result := cpd;
      Exit;
    end;
  end;

...

digital пишет

как правильно изменить путь к папке GRE\xpcom.dll? 
пробовал вставочку сделать '\browser', но появляются побочные глюки, пропадают скролбары и поля ввода на страницах

Я не использовал встроенный Gecko в своих приложениях. При разработке XPCOM-компонентов для расширений не нужно ничего вручную инициализировать. Все уже приготовлено броузером, поэтому тут ничем помочь не могу.

Если стоит задача использовать в приложении на Delphi движок рендеринга HTML отличный от IE-шного, то советую посмотреть на WebKit.

http://code.google.com/p/delphichromiumembedded/
http://code.google.com/p/chromiumembedded/

Elexander, подскажи пожалуйста,  как  заставить правильно работать диалоговые окна  TGeckoBrowser  под делфей.

использую компоненты отсюда

http://www.lazarus.freepascal.org/index.php?action=printpage;topic=7854.0

с движкол xulrunner 1.9

все нормально, за исключением того что если браузеру требуется вывести диалог, например прокси авторизации или еще какойто диалог,
то вместо нужного диалога  открывается пустое окно с 2мя кнопками ок и отмена.

может нужно какойто интерфес обьявить и подключить?   как это делается?

в какую сторону копать?

тут вопрос подымался но без ответа
http://forum.mozilla-russia.org/viewtopic.php?pid=454112

наставь на правильный путь, спасибо...

digital пишет

Elexander, подскажи пожалуйста,  как  заставить правильно работать диалоговые окна  TGeckoBrowser  под делфей.
...
в какую сторону копать?

Хотел бы помочь, но не знаю как. TGeckoBrowser, к сожалению, никогда не использовал.