PDA

Просмотр полной версии : QtWebKit и ExternalInterface


ZicoRio
16.01.2013, 23:55
Всем привет.
Очень надеюсь, что кто-нибудь что-то подскажет (а вдруг).
Задавал этот вопрос на форуме по Qt - не повезло...

И так.
Написал свой браузер на Qt для своего же приложения с использованием Flash player-а.
Так вот при вызове JavaScript функции (ExternalInterface.call) из базового (первым загружен)
ролика - все в порядке, а вот если вызывать (к примеру вывод на печать html страницы)
из вложенного ролика (подгруженного в основной) приложение валится с предложением
отправить данные в MS.

Если кто-нибудь что-то по теме знает большая просьба поделиться.

Добавлено через 25 минут
Небольшое дополнение:
после нескольких удачных попыток из базового ролика
тоже валится.

alexcon314
17.01.2013, 01:04
Сложно указать причину, не рассмотрев код приложения. В таком "компоте", как Qt+WebKit+MS можно огрести и не такое.
Я бы проверил версии модулей Qt, FlashPlayer и т.д., опции компиляции на предмет: "а не используем ли мы что-то 32-битное в 64-битном окружении, или наоборот".

ZicoRio
17.01.2013, 01:57
Ось: Windows XP x32 Pro SP3.
Qt: 4.8.4
MinGW: 4.4
Пишу в NetBeans 7.2.1.
FlashPlayer: 11.5.502.110 (debug version)

Попробовал - скомпилировал из под VS 2010 (уже под Win7 x32) - походил по yandex-у,
тоже падает в какой-то момент с bbadbeef.
Проблема - не может обратить по адресу в памяти, но вот почему...

Самый-то прикол в том что есть такой браузер QupZilla тоже на Qt.
В нем не падает - все гуд. Исходники его открыты, но я не могу разобраться
что они там такого делают что не падает (слаб еще в C++ видимо).

Попозже соберу упрощенный вариант с данной проблемой - покажу исходники.
Закину на свой сайт странички для теста - может тогда кто-то поможет разобраться.

Но если есть какие мысли, не дожидайтесь - пишите.

Добавлено через 14 часов 11 минут
Со второго, третьего раза вывода на печать падает приложение.

main.cpp


#include <QApplication>
#include <QLocale>
#include <QTextCodec>
#include <QWebSettings>

#include "TestBrowser.h"

int main(int argc,char *argv[]){
QApplication a(argc,argv);
QWebSettings *ws=QWebSettings::globalSettings();
ws->setAttribute(QWebSettings::PluginsEnabled,true);
ws->setAttribute(QWebSettings::JavascriptEnabled,true);
ws->setAttribute(QWebSettings::JavaEnabled,true);
ws->setAttribute(QWebSettings::JavascriptCanOpenWindows,true);
ws->setAttribute(QWebSettings::JavascriptCanCloseWindows,true);
ws->setAttribute(QWebSettings::JavascriptCanAccessClipboard,true);
ws->setAttribute(QWebSettings::SpatialNavigationEnabled,true);
ws->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled,true);
ws->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled,true);
ws->setAttribute(QWebSettings::LocalStorageEnabled,true);
ws->setAttribute(QWebSettings::PrintElementBackgrounds,false);
ws->setAttribute(QWebSettings::DeveloperExtrasEnabled,true);
QLocale::setDefault(QLocale(QLocale::Russian,QLocale::RussianFederation));
QTextCodec *utfcodec=QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(utfcodec);
QTextCodec::setCodecForCStrings(utfcodec);

TestBrowser *mw = new TestBrowser();
mw->setWindowIcon(QIcon("favicon.ico"));
mw->resize(1060,800);
mw->move(40,0);
mw->show();

return a.exec();
}


TestBrowser.cpp


#include "TestBrowser.h"

TestBrowser::TestBrowser(){
tp="http://ifinterface.com/techtest/testprint.html";
view=new QWebView(this);
view->page()->setForwardUnsupportedContent(true);
view->page()->createStandardContextMenu();

locationEdit=new QLineEdit(this);
locationEdit->setSizePolicy(QSizePolicy::Expanding,locationEdit->sizePolicy().verticalPolicy());

QToolBar *toolBar=addToolBar("Navigation");
toolBar->addAction(view->pageAction(QWebPage::Back));
toolBar->addAction(view->pageAction(QWebPage::Forward));
toolBar->addAction(view->pageAction(QWebPage::Reload));
toolBar->addAction(view->pageAction(QWebPage::Stop));
QPushButton *b1=new QPushButton("to TestPage",this);
toolBar->addWidget(b1);
toolBar->addWidget(locationEdit);
QPushButton *b2=new QPushButton("=>",this);
toolBar->addWidget(b2);

connect(view->page(),SIGNAL(printRequested(QWebFrame *)),this,SLOT(doPrint(QWebFrame *)));
connect(b1,SIGNAL(clicked()),this,SLOT(toTestPage()));
connect(b2,SIGNAL(clicked()),SLOT(changeLocation()));
connect(locationEdit,SIGNAL(returnPressed()),SLOT(changeLocation()));

locationEdit->setText(tp);
view->load(QUrl(tp));

setCentralWidget(view);
}

void TestBrowser::doAlertPan(QString me){
QMessageBox msgBox;
msgBox.setWindowIcon(QIcon("favicon.ico"));
msgBox.setIcon(QMessageBox::Information);
msgBox.setWindowTitle(tr("WebPage :: Сообщение"));
msgBox.setText(me);
msgBox.exec();
}

void TestBrowser::toTestPage(){
locationEdit->setText(tp);
view->load(QUrl(tp));
view->setFocus();
}

void TestBrowser::doPrint(QWebFrame * fr){
QPrintPreviewDialog* dialog=new QPrintPreviewDialog(this);
dialog->resize(800, 750);
connect(dialog,SIGNAL(paintRequested(QPrinter*)),fr,SLOT(print(QPrinter*)));
dialog->exec();
dialog->deleteLater();
}

void TestBrowser::changeLocation(){
QUrl url=QUrl(locationEdit->text());
view->load(url);
view->setFocus();
}


TestBrowser.h


#ifndef TESTBROWSER_H
#define TESTBROWSER_H

#include <QApplication>
#include <QMainWindow>
#include <QObject>
#include <QLineEdit>
#include <QToolBar>
#include <QPushButton>
#include <QMessageBox>
#include <QPrintPreviewDialog>
#include <QPrinter>
#include <QWebView>
#include <QWebFrame>
#include <QUrl>

class TestBrowser : public QMainWindow{
Q_OBJECT
public:
TestBrowser();
QString tp;
QWebView *view;
QLineEdit *locationEdit;
void doAlertPan(QString me);

public slots:
void changeLocation();
void toTestPage();
void doPrint(QWebFrame * fr);

};

#endif


Базовый ролик

package{
import flash.net.URLRequest;
import MakeButton;
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.display.Loader;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.IOErrorEvent;
import flash.external.ExternalInterface;
import flash.net.URLRequest;
public class TestPrint extends Sprite{
public var b1:SimpleButton;
public var b2:SimpleButton;
public var b3:SimpleButton;
public var ob_sys:Object=new Object;
public var ldr:Loader=new Loader();
public var pocket:Sprite;
public function TestPrint():void{
if (stage){
init();
}else{
addEventListener(Event.ADDED_TO_STAGE,init);
}
}
private function init(e:Event=null):void{
removeEventListener(Event.ADDED_TO_STAGE,init);
ob_sys.OSID=2;
b1=MakeButton.Made(this,1,"Base clip: Print 7");
b1.x=10;
b1.y=10;
addChild(b1);
b1.addEventListener(MouseEvent.CLICK,onClick1);
b2=MakeButton.Made(this,1,"Base clip: Print 12");
b2.x=10;
b2.y=33;
addChild(b2);
b2.addEventListener(MouseEvent.CLICK,onClick2);
genStart();
}
public function onClick1(e:MouseEvent):void{
ExternalInterface.call("top.mpath.doPrint",7);
}
public function onClick2(e:MouseEvent):void{
ExternalInterface.call("top.mpath.doPrint",12);
}
private function genStart():void{
pocket=new Sprite;
pocket.y=60;
addChild(pocket);
//ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,loadErr);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,onLdrComplete);
var req:URLRequest=new URLRequest("http://ifinterface.com/techtest/testprintsubclip.swf");
ldr.load(req);
}
private function onLdrComplete(e:Event):void{
var co:*=ldr.content;
co.mroot=this;
co.y=65;
pocket.addChild(co);
}
}
}


Подгружаемый ролик

package{
import MakeButton;
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.events.MouseEvent;
public class TestPrintSubclip extends Sprite{
public var b1:SimpleButton;
public var b2:SimpleButton;
public var ob_sys:Object=new Object;
public var mroot:Object;
public function TestPrintSubclip():void{
ob_sys.OSID=2;
b1=MakeButton.Made(this,1,"Subclip: Print 7");
b1.x=10;
b1.y=10;
addChild(b1);
b1.addEventListener(MouseEvent.CLICK,onClick1);
b2=MakeButton.Made(this,1,"Subclip: Print 12");
b2.x=10;
b2.y=33;
addChild(b2);
b2.addEventListener(MouseEvent.CLICK,onClick2);
}
private function onClick1(e:MouseEvent):void{
mroot.onClick1(e);
}
private function onClick2(e:MouseEvent):void{
mroot.onClick2(e);
}
}

}


Впринципе код довольно простой, но проблему пока не решил.
Большая просьба ткнуть носом где ступил.

ZicoRio
24.01.2013, 17:44
Короче сам добыл информацию путем экспериментов.
К сожалению QtWebKit плохо оттестирован для компиляции MinGW.
Оптимальным вариантом оказалась только версия Qt4.8 (Qt4.7-не проверял, Qt5.0-тоже проблемы)
при компиляции в VS2010 SP1 - все другие варианты fail.

Для теста можете использовать страничку (http://ifinterface.com/techtest/testprint.html)
Приложение крешится обычно на 3-6 вывод на печать.

Всем успешных трудов.