Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TWebBrower перехват JavaScript, перехват window.close 
:(
    Опции темы
Ищущий!
Дата 10.5.2005, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.4.2005

Репутация: нет
Всего: нет



Есть такая страничка.. Загружается в TWebBrower

Код

<script>
window.close();
</script>


Проблема такая, что выскакивает сообщение, мол хотите закрыть страницу?... Нужно перехватить... или как-нить предотвратить это... можно посредством отключения JavaScript'а, но только для одного конкретного WebBrowera

...

Мож кто поможет smile
PM MAIL   Вверх
Fantasist
Дата 11.5.2005, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



По идее, JavaScript интерпритатор грузиться как COM объект, и соответсвенно ты можешь достать его как минимум через GetActiveObject. Так что для начала я бы поискал инфу об интерпритаторе.

А так вообще проблема интересная. Тут можно подумать. Можно попытаться отлавливать и создание окна. Можно ли отключить на время выполнения JavaScript'a не знаю, тоже можно поискать.




--------------------
Волны гасят ветер...
PM MAIL   Вверх
Ищущий!
Дата 11.5.2005, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.4.2005

Репутация: нет
Всего: нет



Вот бы кто поискал smile
PM MAIL   Вверх
December
Дата 11.5.2005, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 12
Всего: 57



Можно... Только ещё не знаю, как smile Это у меня заплаировано на через 2 недели - будет тот ещё геморрой.
Ищущий!
Можешь посмотреть на реализацию TEmbeddedWB - там есть такая или почти такая фишка, кажется.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Guest
Дата 12.5.2005, 18:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как в TWebBrowser определить на какой инпут был произведён клик и как выташить его содержимоё?
  Вверх
December
Дата 13.5.2005, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 12
Всего: 57



Модератор: один топик - один вопрос!


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Girder
Дата 13.5.2005, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 6
Всего: 155



Попробуй... например вот так smile :
Код
var
  Form1: TForm1;
  bRes:DWord=0;

implementation

{$R *.dfm}

//...

function ChangeFunc(sDWord:DWord):DWord;
var DLL:DWord;
    fH:Pointer;
    OP:DWord;
    t:DWord;
begin
 Result:=0;
 DLL:=LoadLibrary('user32.dll');
 if DLL<>0 then
  begin
   fH:=GetProcAddress(DLL,'MessageBoxIndirectW');
   if fH<>nil then
    begin
     OP:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID);
     if OP<>0 then
      begin
       ReadProcessMemory(OP,fH,@Result,4,t);
       WriteProcessMemory(OP,fH,@sDWord,4,t);
       CloseHandle(OP);
      end;
    end;
   FreeLibrary(DLL);
  end;
end;

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
 bRes:=ChangeFunc($c3c031); //ставим заглушку
end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var i,j,n:integer;
    s,sb,se:string;
begin
 if bRes<>0 then ChangeFunc(bRes); //первые скрипты обработаны и такая заглушка в принципе больше не нужна
 bRes:=0;
 //дальше: пытаемся вырезать из скриптов на странице windows.close();
 if (Webbrowser1.Document<>nil) then
  if IDispatch(Variant(Webbrowser1.Document).scripts)<>nil then
   begin
    i:=Variant(Webbrowser1.Document).scripts.length;
    for j:=0 to i-1 do
     begin
      try
       s:=lowercase(trim(WideString(Variant(Webbrowser1.Document).scripts.item(j).outerHTML)));
       n:=Pos('window.close();',s); //На самом деле может записанна вот так: windows. close () ; и так windows      . close () ; - Мне лень делать на все случаи жизни... :)
       if n<>0 then
        begin
         sb:=Copy(s,1,n-1);
         se:=Copy(s,n+15,Length(s));
         s:=sb+se;
         Variant(Webbrowser1.Document).scripts.item(j).outerHTML:=WideString(s);
        end;
      except
      end;
     end;
   end;
end;
//...


PS: Можно просто засунуть в OnCreate формы только вот енто ChangeFunc($c3c031), а весь остальной код выкинуть(кроме самой конечно функции ChangeFunc)... smile если ты конечно уверен что MessageBoxIndirectW - тебе не нужен.

Это сообщение отредактировал(а) Girder - 13.5.2005, 15:59


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Fantasist
Дата 13.5.2005, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Girder

Ай-ай-ай, нехорошо таким хаком заниматься. smile Хотя иногда, конечно, не остается выхода...




--------------------
Волны гасят ветер...
PM MAIL   Вверх
December
Дата 14.5.2005, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 12
Всего: 57



Girder
Круто. А поделись секретом, какую литературу надо прочитать, чтобы додуматься до этого метода?


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Girder
Дата 14.5.2005, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 6
Всего: 155



December smile 


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Fantasist
Дата 14.5.2005, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



December Ну в принципе, перехват API - метод достадочно известный... Только не очень приветсвуемый. smile


Girder, да похоже ты прав. smile То что у меня получилось поискать ни к чему более хорошему не привело. Правда библиотека к этим объектом такая офигительно здаровая, что не уверен, что везде посмотрел. smile

Единственно, что похоже вторая часть (где затираются "windows.close()") не очень нужна - ему вроде не убить скрипт надо, а предотвратить окно. Если ты перехватил функцию создания мессадж бокса, то этого должно быть достадочно. Разве что неплохо бы вместо заглушки написать свою функцию, которая бы анализировала входящие параметры и вызывала бы стандартную (сохраненную) функцию, если этот бокс создает не WebBrowser.




--------------------
Волны гасят ветер...
PM MAIL   Вверх
Girder
Дата 17.5.2005, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 6
Всего: 155



Цитата(Fantasist @ 14.5.2005, 23:27)
Girder, да похоже ты прав.
Не... не прав smile. Вот еще... решение накатал smile :
Код
procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var s:string;
    p:IDispatch;  
begin
 s:='<><script DEFER> window.close=closex; function closex(){}</script>';
 try
  p:=Variant(Webbrowser1.Document).body;
  Variant(p).insertAdjacentHTML(WideString('afterBegin'),WideString(s));
 except
  try
   p:=IDispatch(Variant(Webbrowser1.Document).all.item(0));
   Variant(p).insertAdjacentHTML(WideString('afterBegin'),WideString(s));
  except
  end;
 end;
end;


Срезает: window.close(); ... self.close();

PS: символы: <> перед <script DEFER> удалять не надо... можете например заменить их на <BR> или например так: s:=#255+'<script DEFER> window.close=closex; function closex(){}</script>'; хоть любой HTML элемент - но только не заменяйте на пробельных символы!... так как в ентом случаи скрипт не выполнится - как следствие работать код не будет.

Удачи.

Это сообщение отредактировал(а) Girder - 17.5.2005, 02:00


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Fantasist
Дата 17.5.2005, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(Girder @ 16.5.2005, 22:57)
Не... не прав


Ты же говорил, что NavigateComplete2 выполняется после исполнения скриптов в global scope.

Цитата(Girder @ 16.5.2005, 22:57)
Срезает: window.close(); ... self.close();



Так постановка задачи была все-таки подавить окно с сообщением, а не саму функцию. smile


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Girder
Дата 17.5.2005, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 6
Всего: 155



Цитата(Fantasist @ 17.5.2005, 11:20)
Ты же говорил, что NavigateComplete2 выполняется после исполнения скриптов в global scope.
Не-а... сразу после(наверное... мы друг-друга не поняли smile ) - Но! до любого другого события, которое мы можем использовать от TWebBrowser. А предотвратить их исполнение(в NavigateComplete2)... без вот ентого кода(тот что выше... ни как неполучалось) - так как если просто даже на данном этапе считатать из outerHTML и без изменения записать в outerHTML - то на данной страницы выполнение всех скриптов - слетало! А "первичные скрипты"... все равно могли быть выполнены - если они "разбиты", т.е. "<script...></script>...<script...></script>" - т.к. в данном событии может быть доступен только самый первый скрипт(т.е. "<script...></script>") на странице!

Цитата(Fantasist @ 17.5.2005, 11:20)
Так постановка задачи была все-таки подавить окно с сообщением, а не саму функцию.
А мы её... переопределили smile. Как следствии попытка выполнения window.close() - перебросит в нашу функцию closex... а она ни чего не делает smile PS: Короче подавили... в зародыше smile (для javascript smile )

Это сообщение отредактировал(а) Girder - 17.5.2005, 12:31


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Fantasist
Дата 17.5.2005, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(Girder @ 17.5.2005, 07:36)
А мы её... переопределили smile. Как следствии попытка выполнения window.close() - перебросит в нашу функцию closex... а она ни чего не делает


Так я про это и говорю. Мне просто показалось, что требовалось подавить сообщение, но сама функциональность должна была остаться (то есть окно должно было закрыться), однако перечитав первое сообщение, понял, что был не прав.


Цитата(Girder @ 16.5.2005, 22:57)
Не... не прав smile. Вот еще... решение накатал smile :


Ну так, я же говорил, что в этом браузере такая куча интерфейсов, что что-нибудь должно помочь. smile Молодец.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.