Russian Qt Forum
Ноябрь 05, 2024, 13:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Пересобрал WebKit, а изменений нет...  (Прочитано 6777 раз)
Remyxxl
Гость
« : Апрель 26, 2009, 22:51 »

Привет всем!

Сделал несколько изменений в WebCore, пересобрал пакет, перекомпилил прогу. Все вроде ок - прошло без ошибок, но изменений я не вижу. Может я что то не до конца доделал?
Вот послед. моих действий:
  Внес изменения в WebCore исходники
  Запустил: configure -release -platform win32-g++ -no-vcproj -webkit -nomake demos -nomake examples -fast
  Запустил make (mingw32-make)

Дождался пока все прокомпилится - 5 часов ждал!

Потом после каждого нового внесения изменений в исходники WebCore, запускал ТОЛЬКО make. Make находил изменения и пересобирал только то что нужно, так что последующие пересборки занимали времени минут 10...

По идеи все проходит правильно, только вот изменений я ни вижу ;( Я уже копировал  QtWebKit4.dll из lib в bin - результата - 0!

Подскажите плизз, что я делаю не верно или чего не доделываю!!!
Записан
Remyxxl
Гость
« Ответ #1 : Апрель 27, 2009, 11:03 »

Все - получилось!

Что я делал не так, не пойму. Только, что пресобрал еще раз модуль make-ом, запустил свое приложение с webkit-ом и все заработало! Все изменения работают!


Походу, что б не создавать новый топик, такой вопрос - хочу дополнить WebKit API несколькими своими классами, но не знаю как ;( Может кто встречал какие доки - кинте плиз ссылочку
Записан
ритт
Гость
« Ответ #2 : Апрель 27, 2009, 18:53 »

а что за АПИ? может быть, имеет смысл обсудить это с троллями?
Записан
Remyxxl
Гость
« Ответ #3 : Апрель 27, 2009, 19:50 »

а что за АПИ? может быть, имеет смысл обсудить это с троллями?

Это методы и классы доступа к DOM хтмл документа! Не через яваскрипт. Вообщем то они уже реализуют этот АПИ в qt4.6, однако то что нужно мне, вряд ли будет реализовано официально, так как это изменение, точнее возможность ставит под сомнение безопасность WebKit-а как браузера Грустный

короче, подробности ниже.....
Записан
Remyxxl
Гость
« Ответ #4 : Апрель 27, 2009, 20:00 »

И так рассказываю, что я менял в WebKit-е, и что у меня получилось (надеюсь может кому-то пригодится).
Пишу я софтину, которая должна автоматом заполнять эл. хтмл форм, в том числе и поле <input type=file>(эл. FileUpload). Как известно доступ к value этого тега только ReadOnly! А так как webkit предоставляет доступ к хтмл эл. только через яваскрипт, то и шансов как либо изменить значение этого атрибута нет!
Сутки я потратил на поиски в гугле хоть каких либо солюшинов, позволяющих мне решить эту проблему, но увы ни чего не нашел... Решил я сам раскопать исходники.  Программист я еще тот Строит глазки - 2 мес. как работаю с С++ и Qt, поэтому в успехе уверен не был. Но все оказалось не так страшно, и в течении суток, после нескольких экспериментов, путем проб и ошибок, а так же кропотливого изучения кода (для меня кропотливого  Улыбающийся), решения был найдены! Может не самые оптимальные и элегантные - но все же работоспособные и позволяющее изменять значения value для <input type="file"..> из Qt приложения.

Судя по выдачам гугла я не первый кто сталкивается с такой проблемой, и как вариант там предлагают использовать IE приложениях. IE позволяет забивать нужные данные через буфер... Но как быть если софт должен быть кроссплатформенным?
Поэтому я решил добить WebKit и заставить его работать так как надо мне! Чем и хочу поделится с вами...

НО перед тем как я выложу код этого хака, хочу сделать ВАЖНОЕ замечание (хоть и так очевидно, что безопасность WebKit нарушена!) - Не используйте хак в приложениях полноценных веб браузеров! Используйте этот хак только в тех случаях, когда известны адресса загружаемых ресурсов.

В самом конце рекомендация, как можно немного обезопасить клиента использующего приложение с таким WebKit-ом.

Ну и собственно, что и как нужно менять:
Вариант 1:
(объясняю оч подробно, что таким новичкам как я было понятно Улыбающийся)
1. Идем в: cd %QTDIR%\src\3rdparty\webkit\WebCore\html
2. Скачиваем приложенный файл - HTMLInputElement.cpp
3. Заменяем оригинальный HTMLInputElement.cpp на наш, скаченный.
4. Теперь нужно перекомпилить WebKit, для этого:
    - заходим в %QTDIR%
    - выполняем команду: configure -release -platform win32-g++ -no-vcproj -webkit -nomake demos -nomake examples -fast
   - Ждем пока выполнится configure, после чего выполняем make (или mingw32-make )
   - Ждем 2~5 часов пока все пересобирется (хочу заметить, что последующие вызовы make будут пересобирать WebKit быстрее - за 10 мин., пока вы не перекофиг. qt снова)

Если кому нужен уже скомпиленный QtWebKit4.dll, могу скинуть на мыло, его вес в архиве 4 метра.

Все! Запускаем прогу с WebKit и проверяем -
создаем файлик - test.html c кодом:
Код:
<html><head><title>Changing input file</title></head>
<body><form>
<div>fileField: <input type="file" name="fileField" id="fileField"></div>
<div><input type="button" value="Setup new fileField value" onClick="document.getElementById('fileField').value='c:/image/smale.gif'">(c:/image/smale.gif)</div>
<div><input type="button" value="View fileField value" onClick="document.getElementById('info').value=document.getElementById('fileField').value"></div>
<div>Info:<input id="info"></div><div>If it works good u can see in Info just file name - smale.gif.</div></form></body></html>


Теперь можем проверить правильно ли WebKit отправляет файл на сервер:
Создаем файлик - test.php с таким кодом:
Код:
<html><head><title>Test UploadFile</title></head>
<body>

<?
$fotos_dir = "fotos/";
$foto_name = $fotos_dir.basename($_FILES['myfile']['name']);
$foto_light_name = basename($_FILES['myfile']['name']);
$foto_tag_preview = "<img src=\"$foto_name\" border=\"1\">";

if(isset($_FILES["myfile"])) {
$myfile = $_FILES["myfile"]["tmp_name"];
$myfile_name = $_FILES["myfile"]["name"];
$myfile_size = $_FILES["myfile"]["size"];
$myfile_type = $_FILES["myfile"]["type"];
$error_flag = $_FILES["myfile"]["error"];
echo "<pre>";
print_r($_FILES["myfile"]);
echo "</pre><br>";
if($error_flag == 0) {
$DOCUMENT_ROOT = $_SERVER['DOCMENT_ROOT'];
$upfile = getcwd()."/fotos/".basename($_FILES["myfile"]["name"]);
if (!move_uploaded_file($_FILES['myfile']['tmp_name'], $upfile)){echo "Error".$error_by_file; exit;}
echo "<b>:</b> ".$fotos_dir." <br /><b>:</b> ".$foto_light_name."<br />";
echo "<br /><small>:</small> <br />$foto_tag_preview<br /><br />";}}
?>

<form action="test.php" method="post" enctype="multipart/form-data" name="form1" id="form1">
 <p>fileUpload:<input type="file" name="myfile" id="myfile" />(dont touch it!)</p>
  <p>Path to local file: <small>(c:/images/smale.gif)</small><br />
<input type="text" name="fs" id="fs" /><input type="button" value="Setup fileUpload" onClick="document.getElementById

('myfile').value=document.getElementById('fs').value"/></p>
<p><input type="submit" name="button" id="button" value="Submit" /></p>
</form>
</body>
</html>
заливаем его на сервак и открываем в нашем вебките, ищем на компе файл изображения и указываем в Path to local file: полный путь к файлу. Жмем SetUp fileUpload и Submit. Вуаля - файлик закачен на сервак, и нам показан. Значит все ОК!

Важные замечания:
Обратите внимание, что после изменения значения value, WebKit все еще отображается текст No file selected. Я сейчас ищу способы и это исправить и как только найду выложу здесь. Но несмотря на это все работает.

Что б снизить риск, того что файлы могут быть стырины с компа клиента, использующего софт с "подчиканым" WebKit-ом, можно применить такой прием:

1. Придумать строку ключ, типа  YZxeFOWk4XTDRsHDWhy и передовать ее вместе с нужными данными, разделив их напрмер "@". Например:

YZxeFOWk4XTDRsHDWhy@c:/images/smile.gif
2. в файле HTMLInputElement добавить проверку на присудствие ключа в переданной строке:
 
Код:
//my://////////////////////////////////////////////////////////

      if (inputType() == FILE){
        m_fileList->clear();
//////////////////add key checker://////////////////////
String skey="YZxeFOWk4XTDRsHDWhy";
size_t found;
found = value.find(skey);
if(found!=string::npos){

m_fileList->append(File::create(myKeyRemover(value))); //вырезает кей
m_value = constrainValue(value);
if (inputType() == FILE && inDocument())
                document()->updateRendering();
setValueMatchesRenderer();
  }
///////////// end key checker ////////////////////////////////
      }
        else {
            m_value = constrainValue(value);
           if (isTextField() && inDocument())
                document()->updateRendering();
        }

//my end///////////////////////////////////////////////

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

... вот такой мой первый топик на этом форуме Смеющийся,
... а вообще  оч хороший форум, я столько всего полезного тут узнал!!! Подмигивающий
« Последнее редактирование: Апрель 27, 2009, 20:04 от Remyxxl » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Апрель 27, 2009, 20:06 »

Очень интересно! Можно оформить как статью и выложить в ВИКИ
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #6 : Апрель 28, 2009, 02:21 »

мдя...патч был бы полезнее и нагляднее.

> document.getElementById('fileField').value='c:/image/smale.gif'
насколько я понимаю, модификация производится именно посредством жс. это недопустимо по стандарту.

не понял как связаны фраза "Не через яваскрипт" и код выше...
Записан
Remyxxl
Гость
« Ответ #7 : Апрель 28, 2009, 03:12 »

мдя...патч был бы полезнее и нагляднее.

> document.getElementById('fileField').value='c:/image/smale.gif'
насколько я понимаю, модификация производится именно посредством жс. это недопустимо по стандарту.

не понял как связаны фраза "Не через яваскрипт" и код выше...

Я имел ввиду, что в qt4.6 будут методы, позволяющее обращаться к хтмл ел. не посредственно, ну вот к примеру будет новый класс QtWebElement.
И конечно же хотелось бы иметь возможность изменять значения всех элементов, в том числе и fileupload.
Поэтому я и хочу разобраться как самому добавить такие возможности, а пока хак Грустный

Для мой софтины именно эти fileupload теги и надо уметь заполнять автоматом!

(я сегодня качнул архив с qt4.6, но увы в webkit-e почему то не нашел новых классов  Обеспокоенный(те что у них в доках указаны))

.. кроется во мне надежда, что возможно новый метод void QWebElement::setAttribute ( const QString & name, const QString & value ) как раз на то и сделан и сможет изменять значения файлаплоада....
Записан
Tonal
Гость
« Ответ #8 : Апрель 28, 2009, 07:14 »

...Пишу я софтину, которая должна автоматом заполнять эл. хтмл форм, в том числе и поле <input type=file>(эл. FileUpload).
А зачем для этого вообще браузер нужен?
Что мешает сформировать правильный HTTP запрос как все для этого и делают?
Смотри например mechanize
Записан
Remyxxl
Гость
« Ответ #9 : Апрель 28, 2009, 10:54 »

...Пишу я софтину, которая должна автоматом заполнять эл. хтмл форм, в том числе и поле <input type=file>(эл. FileUpload).
А зачем для этого вообще браузер нужен?
Что мешает сформировать правильный HTTP запрос как все для этого и делают?
Смотри например mechanize


Спасибо за ссылочку, очень интересно! буду разбираться.
Записан
Remyxxl
Гость
« Ответ #10 : Апрель 28, 2009, 11:28 »

...
А зачем для этого вообще браузер нужен?
Что мешает сформировать правильный HTTP запрос как все для этого и делают?
.....
Мне без браузера ни как не обойтись...
Дело в том, что нужно предоставить возможность пользователю определять какой элемент формы к чему относиться, и в подобных приложениях это реализовано через контекст. меню браузера - кликаешь в поле эл. формы, выпадает меню в котором выбираешь, что это за поле - например мыло, урл сайта, логин, пасс и т.д. .... Мало того необходимо предоставить визуалиный контроль правильность автозаполнения форм. Пользователь, врядли согласиться работать в слепую (по крайтей мере пока не будет на 100% уверен, что в авто режиме эта форма заполняется правильно), ведь если его сайт будет отправлен моей софтиной, в тот или иной каталог, неверно (не та категория выбрана, не той длинны или формата описание и в конце концов не все данные заполнены), то из-за этого пользователя могут занести в блеклист и он больше несможет сабмитеть свои ресурсы в данный каталог.

Вот, так то...

Одним словом я должен сделать софт не уступающий уже существующим, иниче им небудут пользоваться!

Я наверное, чудной человек, но я очень хочу вытащить вебмастеров из плена винды и дать им возможность работать в линуксе, но для этого мне надо предложить им спец. софт! На данный момент подобных прог под винду около десяти, а под линукс - 0!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.12 секунд. Запросов: 23.