00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "browserextension.h"
00021
00022
#include <qapplication.h>
00023
#include <qclipboard.h>
00024
#include <qtimer.h>
00025
#include <qobjectlist.h>
00026
#include <qmetaobject.h>
00027
#include <qregexp.h>
00028
#include <qstrlist.h>
00029
#include <qstylesheet.h>
00030
00031
#include <kdebug.h>
00032
#include <klocale.h>
00033
#include <kmessagebox.h>
00034
#include <kstaticdeleter.h>
00035
#include <kurifilter.h>
00036
#include <assert.h>
00037
00038
using namespace KParts;
00039
00040
const char *OpenURLEvent::s_strOpenURLEvent =
"KParts/BrowserExtension/OpenURLevent";
00041
00042
class OpenURLEvent::OpenURLEventPrivate
00043 {
00044
public:
00045 OpenURLEventPrivate()
00046 {
00047 }
00048 ~OpenURLEventPrivate()
00049 {
00050 }
00051 };
00052
00053 OpenURLEvent::OpenURLEvent(
ReadOnlyPart *part,
const KURL &url,
const URLArgs &args )
00054 :
Event( s_strOpenURLEvent ), m_part( part ), m_url( url ), m_args( args )
00055 {
00056
00057 }
00058
00059 OpenURLEvent::~OpenURLEvent()
00060 {
00061
00062 }
00063
00064
namespace KParts
00065 {
00066
00067
struct URLArgsPrivate
00068 {
00069 URLArgsPrivate() {
00070 doPost =
false;
00071 redirectedRequest =
false;
00072 lockHistory =
false;
00073 newTab =
false;
00074 }
00075
QString contentType;
00076
QMap<QString, QString> metaData;
00077
bool doPost;
00078
bool redirectedRequest;
00079
bool lockHistory;
00080
bool newTab;
00081 };
00082
00083 }
00084
00085 URLArgs::URLArgs()
00086 {
00087
reload =
false;
00088
xOffset = 0;
00089
yOffset = 0;
00090
trustedSource =
false;
00091 d = 0L;
00092 }
00093
00094
00095 URLArgs::URLArgs(
bool _reload,
int _xOffset,
int _yOffset,
const QString &_serviceType )
00096 {
00097
reload = _reload;
00098
xOffset = _xOffset;
00099
yOffset = _yOffset;
00100
serviceType = _serviceType;
00101 d = 0L;
00102 }
00103
00104 URLArgs::URLArgs(
const URLArgs &args )
00105 {
00106 d = 0L;
00107 (*this) = args;
00108 }
00109
00110
URLArgs &URLArgs::operator=(
const URLArgs &args)
00111 {
00112
if (
this == &args)
return *
this;
00113
00114
delete d; d= 0;
00115
00116
reload = args.
reload;
00117
xOffset = args.
xOffset;
00118
yOffset = args.
yOffset;
00119
serviceType = args.
serviceType;
00120
postData = args.
postData;
00121
frameName = args.
frameName;
00122
docState = args.
docState;
00123
trustedSource = args.
trustedSource;
00124
00125
if ( args.
d )
00126 d =
new URLArgsPrivate( * args.
d );
00127
00128
return *
this;
00129 }
00130
00131 URLArgs::~URLArgs()
00132 {
00133
delete d;
00134 d = 0;
00135 }
00136
00137 void URLArgs::setContentType(
const QString & contentType )
00138 {
00139
if (!d)
00140 d =
new URLArgsPrivate;
00141 d->contentType = contentType;
00142 }
00143
00144 void URLArgs::setRedirectedRequest(
bool redirected )
00145 {
00146
if (!d)
00147 d =
new URLArgsPrivate;
00148 d->redirectedRequest = redirected;
00149 }
00150
00151 bool URLArgs::redirectedRequest ()
const
00152
{
00153
return d ? d->redirectedRequest :
false;
00154 }
00155
00156 QString URLArgs::contentType()
const
00157
{
00158
return d ? d->contentType : QString::null;
00159 }
00160
00161 QMap<QString, QString> &
URLArgs::metaData()
00162 {
00163
if (!d)
00164 d =
new URLArgsPrivate;
00165
return d->metaData;
00166 }
00167
00168 void URLArgs::setDoPost(
bool enable )
00169 {
00170
if ( !d )
00171 d =
new URLArgsPrivate;
00172 d->doPost = enable;
00173 }
00174
00175 bool URLArgs::doPost()
const
00176
{
00177
return d ? d->doPost :
false;
00178 }
00179
00180 void URLArgs::setLockHistory(
bool lock )
00181 {
00182
if (!d)
00183 d =
new URLArgsPrivate;
00184 d->lockHistory = lock;
00185 }
00186
00187
bool URLArgs::lockHistory()
const
00188
{
00189
return d ? d->lockHistory :
false;
00190 }
00191
00192 void URLArgs::setNewTab(
bool newTab )
00193 {
00194
if (!d)
00195 d =
new URLArgsPrivate;
00196 d->newTab = newTab;
00197 }
00198
00199
bool URLArgs::newTab()
const
00200
{
00201
return d ? d->newTab :
false;
00202 }
00203
00204
00205
namespace KParts
00206 {
00207
00208
struct WindowArgsPrivate
00209 {
00210 };
00211
00212 }
00213
00214 WindowArgs::WindowArgs()
00215 {
00216 x = y = width = height = -1;
00217 fullscreen =
false;
00218 menuBarVisible =
true;
00219 toolBarsVisible =
true;
00220 statusBarVisible =
true;
00221 resizable =
true;
00222 lowerWindow =
false;
00223 d = 0;
00224 }
00225
00226 WindowArgs::WindowArgs(
const WindowArgs &args )
00227 {
00228 d = 0;
00229 (*this) = args;
00230 }
00231
00232
WindowArgs &WindowArgs::operator=(
const WindowArgs &args )
00233 {
00234
if (
this == &args )
return *
this;
00235
00236
delete d; d = 0;
00237
00238 x = args.
x;
00239 y = args.
y;
00240 width = args.
width;
00241 height = args.
height;
00242 fullscreen = args.
fullscreen;
00243 menuBarVisible = args.
menuBarVisible;
00244 toolBarsVisible = args.
toolBarsVisible;
00245 statusBarVisible = args.
statusBarVisible;
00246 resizable = args.
resizable;
00247 lowerWindow = args.
lowerWindow;
00248
00249
00250
00251
00252
00253
00254
00255
00256
return *
this;
00257 }
00258
00259 WindowArgs::WindowArgs(
const QRect &_geometry,
bool _fullscreen,
bool _menuBarVisible,
00260
bool _toolBarsVisible,
bool _statusBarVisible,
bool _resizable )
00261 {
00262 d = 0;
00263 x = _geometry.x();
00264 y = _geometry.y();
00265 width = _geometry.width();
00266 height = _geometry.height();
00267 fullscreen = _fullscreen;
00268 menuBarVisible = _menuBarVisible;
00269 toolBarsVisible = _toolBarsVisible;
00270 statusBarVisible = _statusBarVisible;
00271 resizable = _resizable;
00272 lowerWindow =
false;
00273 }
00274
00275 WindowArgs::WindowArgs(
int _x,
int _y,
int _width,
int _height,
bool _fullscreen,
00276
bool _menuBarVisible,
bool _toolBarsVisible,
00277
bool _statusBarVisible,
bool _resizable )
00278 {
00279 d = 0;
00280 x = _x;
00281 y = _y;
00282 width = _width;
00283 height = _height;
00284 fullscreen = _fullscreen;
00285 menuBarVisible = _menuBarVisible;
00286 toolBarsVisible = _toolBarsVisible;
00287 statusBarVisible = _statusBarVisible;
00288 resizable = _resizable;
00289 lowerWindow =
false;
00290 }
00291
00292
namespace KParts
00293 {
00294
00295
00296
class KBitArray
00297 {
00298
public:
00299
int val;
00300 KBitArray() { val = 0; }
00301
bool operator [](
int index) {
return (val & (1 << index)) ?
true :
false; }
00302
void setBit(
int index,
bool value) {
00303
if (value) val = val | (1 << index);
00304
else val = val & ~(1 << index);
00305 }
00306 };
00307
00308
class BrowserExtensionPrivate
00309 {
00310
public:
00311 BrowserExtensionPrivate()
00312 {
00313 m_browserInterface = 0;
00314 }
00315 ~BrowserExtensionPrivate()
00316 {
00317 }
00318
00319
struct DelayedRequest {
00320
KURL m_delayedURL;
00321
KParts::URLArgs m_delayedArgs;
00322 };
00323
QValueList<DelayedRequest> m_requests;
00324
bool m_urlDropHandlingEnabled;
00325 KBitArray m_actionStatus;
00326
BrowserInterface *m_browserInterface;
00327 };
00328
00329 }
00330
00331
BrowserExtension::ActionSlotMap * BrowserExtension::s_actionSlotMap = 0L;
00332
static KStaticDeleter<BrowserExtension::ActionSlotMap> actionSlotMapsd;
00333
BrowserExtension::ActionNumberMap * BrowserExtension::s_actionNumberMap = 0L;
00334
static KStaticDeleter<BrowserExtension::ActionNumberMap> actionNumberMapsd;
00335
00336 BrowserExtension::BrowserExtension(
KParts::ReadOnlyPart *parent,
00337
const char *name )
00338 :
QObject( parent, name), m_part( parent )
00339 {
00340
00341 d =
new BrowserExtensionPrivate;
00342 d->m_urlDropHandlingEnabled =
false;
00343
00344
if ( !s_actionSlotMap )
00345
00346 createActionSlotMap();
00347
00348
00349
00350 ActionSlotMap::ConstIterator it = s_actionSlotMap->begin();
00351 ActionSlotMap::ConstIterator itEnd = s_actionSlotMap->end();
00352
QStrList slotNames = metaObject()->slotNames();
00353
for (
int i=0 ; it != itEnd ; ++it, ++i )
00354 {
00355
00356 d->m_actionStatus.setBit( i, slotNames.contains( it.key()+
"()" ) );
00357 }
00358
00359 connect( m_part, SIGNAL( completed() ),
00360
this, SLOT( slotCompleted() ) );
00361 connect(
this, SIGNAL(
openURLRequest(
const KURL &,
const KParts::URLArgs & ) ),
00362
this, SLOT( slotOpenURLRequest(
const KURL &,
const KParts::URLArgs & ) ) );
00363 connect(
this, SIGNAL(
enableAction(
const char *,
bool ) ),
00364
this, SLOT( slotEnableAction(
const char *,
bool ) ) );
00365 }
00366
00367 BrowserExtension::~BrowserExtension()
00368 {
00369
00370
delete d;
00371 }
00372
00373 void BrowserExtension::setURLArgs(
const URLArgs &args )
00374 {
00375 m_args = args;
00376 }
00377
00378 URLArgs BrowserExtension::urlArgs()
const
00379
{
00380
return m_args;
00381 }
00382
00383 int BrowserExtension::xOffset()
00384 {
00385
return 0;
00386 }
00387
00388 int BrowserExtension::yOffset()
00389 {
00390
return 0;
00391 }
00392
00393 void BrowserExtension::saveState(
QDataStream &stream )
00394 {
00395 stream << m_part->
url() << (Q_INT32)
xOffset() << (Q_INT32)
yOffset();
00396 }
00397
00398 void BrowserExtension::restoreState(
QDataStream &stream )
00399 {
00400
KURL u;
00401 Q_INT32 xOfs, yOfs;
00402 stream >> u >> xOfs >> yOfs;
00403
00404
URLArgs args(
urlArgs() );
00405 args.
xOffset = xOfs;
00406 args.
yOffset = yOfs;
00407
00408
setURLArgs( args );
00409
00410 m_part->
openURL( u );
00411 }
00412
00413 bool BrowserExtension::isURLDropHandlingEnabled()
const
00414
{
00415
return d->m_urlDropHandlingEnabled;
00416 }
00417
00418 void BrowserExtension::setURLDropHandlingEnabled(
bool enable )
00419 {
00420 d->m_urlDropHandlingEnabled = enable;
00421 }
00422
00423
void BrowserExtension::slotCompleted()
00424 {
00425
00426
setURLArgs(
URLArgs() );
00427 }
00428
00429 void BrowserExtension::pasteRequest()
00430 {
00431
QCString plain(
"plain");
00432
QString url = QApplication::clipboard()->text(plain, QClipboard::Selection).stripWhiteSpace();
00433
00434 url.replace(
QRegExp(
"[\\ ]*\\n+[\\ ]*"),
"");
00435
00436
00437
QStringList filters =
KURIFilter::self()->
pluginNames();
00438 filters.remove(
"kuriikwsfilter" );
00439 filters.remove(
"localdomainurifilter" );
00440
KURIFilterData filterData;
00441 filterData.
setData( url );
00442 filterData.
setCheckForExecutables(
false );
00443
if (
KURIFilter::self()->
filterURI( filterData, filters ) )
00444 {
00445
switch ( filterData.
uriType() )
00446 {
00447
case KURIFilterData::LOCAL_FILE:
00448
case KURIFilterData::LOCAL_DIR:
00449
case KURIFilterData::NET_PROTOCOL:
00450 slotOpenURLRequest( filterData.
uri(),
KParts::URLArgs() );
00451
break;
00452
case KURIFilterData::ERROR:
00453
KMessageBox::sorry( m_part->
widget(), filterData.
errorMsg() );
00454
break;
00455
default:
00456
break;
00457 }
00458 }
00459
else if (
KURIFilter::self()->
filterURI( filterData,
"kuriikwsfilter" ) && url.length() < 250 )
00460 {
00461
if (
KMessageBox::questionYesNo( m_part->
widget(),
00462 i18n(
"<qt>Do you want to search the Internet for <b>%1</b>?" ).arg( QStyleSheet::escape(url) ),
00463 i18n(
"Internet Search" ),
KGuiItem( i18n(
"&Search" ),
"find"),
00464
KStdGuiItem::cancel(),
"MiddleClickSearch" ) == KMessageBox::Yes)
00465 slotOpenURLRequest( filterData.
uri(),
KParts::URLArgs() );
00466 }
00467 }
00468
00469
void BrowserExtension::slotOpenURLRequest(
const KURL &url,
const KParts::URLArgs &args )
00470 {
00471
00472 BrowserExtensionPrivate::DelayedRequest req;
00473 req.m_delayedURL = url;
00474 req.m_delayedArgs = args;
00475 d->m_requests.append( req );
00476 QTimer::singleShot( 0,
this, SLOT( slotEmitOpenURLRequestDelayed() ) );
00477 }
00478
00479
void BrowserExtension::slotEmitOpenURLRequestDelayed()
00480 {
00481
if (d->m_requests.isEmpty())
return;
00482 BrowserExtensionPrivate::DelayedRequest req = d->m_requests.front();
00483 d->m_requests.pop_front();
00484 emit
openURLRequestDelayed( req.m_delayedURL, req.m_delayedArgs );
00485
00486 }
00487
00488
void BrowserExtension::setBrowserInterface(
BrowserInterface *impl )
00489 {
00490 d->m_browserInterface = impl;
00491 }
00492
00493
BrowserInterface *BrowserExtension::browserInterface()
const
00494
{
00495
return d->m_browserInterface;
00496 }
00497
00498
void BrowserExtension::slotEnableAction(
const char * name,
bool enabled )
00499 {
00500
00501 ActionNumberMap::ConstIterator it = s_actionNumberMap->find( name );
00502
if ( it != s_actionNumberMap->end() )
00503 {
00504 d->m_actionStatus.setBit( it.data(), enabled );
00505
00506 }
00507
else
00508
kdWarning() <<
"BrowserExtension::slotEnableAction unknown action " <<
name <<
endl;
00509 }
00510
00511 bool BrowserExtension::isActionEnabled(
const char * name )
const
00512
{
00513
int actionNumber = (*s_actionNumberMap)[ name ];
00514
return d->m_actionStatus[ actionNumber ];
00515 }
00516
00517
00518 BrowserExtension::ActionSlotMap BrowserExtension::actionSlotMap()
00519 {
00520
return *
actionSlotMapPtr();
00521 }
00522
00523 BrowserExtension::ActionSlotMap *
BrowserExtension::actionSlotMapPtr()
00524 {
00525
if (!s_actionSlotMap)
00526 createActionSlotMap();
00527
return s_actionSlotMap;
00528 }
00529
00530
void BrowserExtension::createActionSlotMap()
00531 {
00532 assert(!s_actionSlotMap);
00533 s_actionSlotMap = actionSlotMapsd.setObject( s_actionSlotMap,
new ActionSlotMap );
00534
00535 s_actionSlotMap->insert(
"cut", SLOT( cut() ) );
00536 s_actionSlotMap->insert(
"copy", SLOT( copy() ) );
00537 s_actionSlotMap->insert(
"paste", SLOT( paste() ) );
00538 s_actionSlotMap->insert(
"rename", SLOT( rename() ) );
00539 s_actionSlotMap->insert(
"trash", SLOT( trash() ) );
00540 s_actionSlotMap->insert(
"del", SLOT( del() ) );
00541 s_actionSlotMap->insert(
"properties", SLOT( properties() ) );
00542 s_actionSlotMap->insert(
"editMimeType", SLOT( editMimeType() ) );
00543 s_actionSlotMap->insert(
"print", SLOT( print() ) );
00544 s_actionSlotMap->insert(
"searchProvider", SLOT( searchProvider() ) );
00545
00546
00547
00548
00549
00550
00551
00552 assert(!s_actionNumberMap);
00553 s_actionNumberMap = actionNumberMapsd.setObject( s_actionNumberMap,
new ActionNumberMap );
00554 ActionSlotMap::ConstIterator it = s_actionSlotMap->begin();
00555 ActionSlotMap::ConstIterator itEnd = s_actionSlotMap->end();
00556
for (
int i=0 ; it != itEnd ; ++it, ++i )
00557 {
00558
00559 s_actionNumberMap->insert( it.key(), i );
00560 }
00561 }
00562
00563 BrowserExtension *
BrowserExtension::childObject(
QObject *obj )
00564 {
00565
if ( !obj || !obj->children() )
00566
return 0L;
00567
00568
00569
00570
const QObjectList *children = obj->children();
00571 QObjectListIt it( *children );
00572
for (; it.current(); ++it )
00573
if ( it.current()->inherits(
"KParts::BrowserExtension" ) )
00574
return static_cast<KParts::BrowserExtension *>( it.current() );
00575
00576
return 0L;
00577 }
00578
00579
namespace KParts
00580 {
00581
00582
class BrowserHostExtension::BrowserHostExtensionPrivate
00583 {
00584
public:
00585 BrowserHostExtensionPrivate()
00586 {
00587 }
00588 ~BrowserHostExtensionPrivate()
00589 {
00590 }
00591
00592
KParts::ReadOnlyPart *m_part;
00593 };
00594
00595 }
00596
00597 BrowserHostExtension::BrowserHostExtension(
KParts::ReadOnlyPart *parent,
const char *name )
00598 :
QObject( parent,
name )
00599 {
00600 d =
new BrowserHostExtensionPrivate;
00601 d->m_part = parent;
00602 }
00603
00604 BrowserHostExtension::~BrowserHostExtension()
00605 {
00606
delete d;
00607 }
00608
00609 QStringList BrowserHostExtension::frameNames()
const
00610
{
00611
return QStringList();
00612 }
00613
00614 const QPtrList<KParts::ReadOnlyPart> BrowserHostExtension::frames()
const
00615
{
00616
return QPtrList<KParts::ReadOnlyPart>();
00617 }
00618
00619 bool BrowserHostExtension::openURLInFrame(
const KURL &,
const KParts::URLArgs & )
00620 {
00621
return false;
00622 }
00623
00624 BrowserHostExtension *
BrowserHostExtension::childObject(
QObject *obj )
00625 {
00626
if ( !obj || !obj->children() )
00627
return 0L;
00628
00629
00630
00631
const QObjectList *children = obj->children();
00632 QObjectListIt it( *children );
00633
for (; it.current(); ++it )
00634
if ( it.current()->inherits(
"KParts::BrowserHostExtension" ) )
00635
return static_cast<KParts::BrowserHostExtension *>( it.current() );
00636
00637
return 0L;
00638 }
00639
00640
void BrowserExtension::virtual_hook(
int,
void* )
00641 { }
00642
00643
BrowserHostExtension *
00644 BrowserHostExtension::findFrameParent(
KParts::ReadOnlyPart *callingPart,
const QString &frame)
00645 {
00646 FindFrameParentParams param;
00647 param.parent = 0;
00648 param.callingPart = callingPart;
00649 param.frame = frame;
00650 virtual_hook(VIRTUAL_FIND_FRAME_PARENT, ¶m);
00651
return param.parent;
00652 }
00653
00654
void BrowserHostExtension::virtual_hook(
int,
void* )
00655 { }
00656
00657 LiveConnectExtension::LiveConnectExtension(
KParts::ReadOnlyPart *parent,
const char *name ) :
QObject( parent, name) {}
00658
00659 bool LiveConnectExtension::get(
const unsigned long,
const QString &, Type &,
unsigned long &,
QString & ) {
00660
return false;
00661 }
00662
00663 bool LiveConnectExtension::put(
const unsigned long,
const QString &,
const QString & ) {
00664
return false;
00665 }
00666
00667 bool LiveConnectExtension::call(
const unsigned long,
const QString &,
const QStringList &, Type &,
unsigned long &,
QString & ) {
00668
return false;
00669 }
00670
00671 void LiveConnectExtension::unregister(
const unsigned long ) {}
00672
00673
LiveConnectExtension *LiveConnectExtension::childObject(
QObject *obj )
00674 {
00675
if ( !obj || !obj->children() )
00676
return 0L;
00677
00678
00679
00680
const QObjectList *children = obj->children();
00681 QObjectListIt it( *children );
00682
for (; it.current(); ++it )
00683
if ( it.current()->inherits(
"KParts::LiveConnectExtension" ) )
00684
return static_cast<KParts::LiveConnectExtension *>( it.current() );
00685
00686
return 0L;
00687 }
00688
00689
#include "browserextension.moc"