brad 2004-08-14 18:03:47 +00:00
parent 036acaf2ff
commit cb3487157b
10 changed files with 755 additions and 0 deletions

View File

@ -0,0 +1,114 @@
$OpenBSD: patch-konqueror_konq_mainwindow_cc,v 1.1 2004/08/14 18:03:48 brad Exp $
--- konqueror/konq_mainwindow.cc.orig Sun May 30 07:41:54 2004
+++ konqueror/konq_mainwindow.cc Fri Aug 13 17:08:05 2004
@@ -856,6 +856,7 @@ void KonqMainWindow::slotOpenURLRequest(
{
kdDebug(1202) << "KonqMainWindow::slotOpenURLRequest frameName=" << args.frameName << endl;
+ KParts::ReadOnlyPart *callingPart = static_cast<KParts::ReadOnlyPart *>( sender()->parent() );
QString frameName = args.frameName;
if ( !frameName.isEmpty() )
@@ -876,11 +877,11 @@ void KonqMainWindow::slotOpenURLRequest(
frameName.lower() != _parent )
{
KParts::BrowserHostExtension *hostExtension = 0;
- KonqView *view = childView( frameName, &hostExtension, 0 );
+ KonqView *view = childView( callingPart, frameName, &hostExtension, 0 );
if ( !view )
{
KonqMainWindow *mainWindow = 0;
- view = findChildView( frameName, &mainWindow, &hostExtension, 0 );
+ view = findChildView( callingPart, frameName, &mainWindow, &hostExtension, 0 );
if ( !view || !mainWindow )
{
@@ -903,8 +904,7 @@ void KonqMainWindow::slotOpenURLRequest(
}
}
- KParts::ReadOnlyPart *part = static_cast<KParts::ReadOnlyPart *>( sender()->parent() );
- KonqView *view = childView( part );
+ KonqView *view = childView( callingPart );
openURL( view, url, args );
}
@@ -1039,7 +1039,7 @@ void KonqMainWindow::slotCreateNewWindow
if ( !args.frameName.isEmpty() && args.frameName.lower() != "_blank" )
{
KParts::BrowserHostExtension *hostExtension = 0;
- if ( findChildView( args.frameName, &mainWindow, &hostExtension, &part ) )
+ if ( findChildView( 0, args.frameName, &mainWindow, &hostExtension, &part ) )
{
// Found a view. If url isn't empty, we should open it - but this never happens currently
// findChildView put the resulting part in 'part', so we can just return now
@@ -2091,9 +2091,9 @@ KonqView * KonqMainWindow::childView( KP
return 0L;
}
-KonqView * KonqMainWindow::childView( const QString &name, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part )
+KonqView * KonqMainWindow::childView( KParts::ReadOnlyPart *callingPart, const QString &name, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part )
{
- //kdDebug() << "KonqMainWindow::childView this=" << this << " looking for " << name << endl;
+ kdDebug() << "KonqMainWindow::childView this=" << this << " looking for " << name << endl;
MapViews::ConstIterator it = m_mapViews.begin();
MapViews::ConstIterator end = m_mapViews.end();
@@ -2101,11 +2101,11 @@ KonqView * KonqMainWindow::childView( co
{
KonqView* view = it.data();
QString viewName = view->viewName();
- //kdDebug() << " - viewName=" << viewName << " "
- // << "frame names:" << view->frameNames().join( "," ) << endl;
+ kdDebug() << " - viewName=" << viewName << " "
+ << "frame names:" << view->frameNames().join( "," ) << endl;
if ( !viewName.isEmpty() && viewName == name )
{
- //kdDebug() << "found existing view by name: " << view << endl;
+ kdDebug() << "found existing view by name: " << view << endl;
if ( hostExtension )
*hostExtension = 0;
if ( part )
@@ -2114,8 +2114,13 @@ KonqView * KonqMainWindow::childView( co
}
// First look for a hostextension containing this frame name
- // (KonqView looks for it recursively)
- KParts::BrowserHostExtension* ext = KonqView::hostExtension( view->part(), name );
+ KParts::BrowserHostExtension *ext = KParts::BrowserHostExtension::childObject( view->part() );
+ if ( ext )
+ {
+ ext = ext->findFrameParent(callingPart, name);
+ }
+
+// KParts::BrowserHostExtension* ext = KonqView::hostExtension( view->part(), name );
if ( ext )
{
@@ -2125,7 +2130,7 @@ KonqView * KonqMainWindow::childView( co
{
if ( frameIt.current()->name() == name )
{
- //kdDebug() << "found a frame of name " << name << " : " << frameIt.current() << endl;
+ kdDebug() << "found a frame of name " << name << " : " << frameIt.current() << endl;
if ( hostExtension )
*hostExtension = ext;
if ( part )
@@ -2140,7 +2145,7 @@ KonqView * KonqMainWindow::childView( co
}
// static
-KonqView * KonqMainWindow::findChildView( const QString &name, KonqMainWindow **mainWindow, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part )
+KonqView * KonqMainWindow::findChildView( KParts::ReadOnlyPart *callingPart, const QString &name, KonqMainWindow **mainWindow, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part )
{
if ( !s_lstViews )
return 0;
@@ -2148,7 +2153,7 @@ KonqView * KonqMainWindow::findChildView
QPtrListIterator<KonqMainWindow> it( *s_lstViews );
for (; it.current(); ++it )
{
- KonqView *res = it.current()->childView( name, hostExtension, part );
+ KonqView *res = it.current()->childView( callingPart, name, hostExtension, part );
if ( res )
{
if ( mainWindow )

View File

@ -0,0 +1,16 @@
$OpenBSD: patch-konqueror_konq_mainwindow_h,v 1.1 2004/08/14 18:03:48 brad Exp $
--- konqueror/konq_mainwindow.h.orig Sun May 30 07:41:54 2004
+++ konqueror/konq_mainwindow.h Fri Aug 13 17:08:05 2004
@@ -145,10 +145,10 @@ public:
void insertChildView( KonqView *childView );
void removeChildView( KonqView *childView );
KonqView *childView( KParts::ReadOnlyPart *view );
- KonqView *childView( const QString &name, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part );
+ KonqView *childView( KParts::ReadOnlyPart *callingPart, const QString &name, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part );
// dcop idl bug! it can't handle KonqMainWindow *&mainWindow
- static KonqView *findChildView( const QString &name, KonqMainWindow **mainWindow, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part );
+ static KonqView *findChildView( KParts::ReadOnlyPart *callingPart, const QString &name, KonqMainWindow **mainWindow, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part );
// Total number of views
int viewCount() const { return m_mapViews.count(); }

View File

@ -0,0 +1,182 @@
$OpenBSD: patch-dcop_dcopserver_cpp,v 1.1 2004/08/14 18:03:47 brad Exp $
--- dcop/dcopserver.cpp.orig Sun May 30 08:23:44 2004
+++ dcop/dcopserver.cpp Fri Aug 13 16:04:38 2004
@@ -443,35 +443,78 @@ write_iceauth (FILE *addfp, IceAuthDataE
fprintf (addfp, "\n");
}
+#ifndef HAVE_MKSTEMPS
+#include <string.h>
+#include <strings.h>
-#ifndef HAVE_MKSTEMP
-static char *unique_filename (const char *path, const char *prefix)
-#else
-static char *unique_filename (const char *path, const char *prefix, int *pFd)
-#endif
+/* this is based on code taken from the GNU libc, distributed under the LGPL license */
+
+/* Generate a unique temporary file name from TEMPLATE.
+
+ TEMPLATE has the form:
+
+ <path>/ccXXXXXX<suffix>
+
+ SUFFIX_LEN tells us how long <suffix> is (it can be zero length).
+
+ The last six characters of TEMPLATE before <suffix> must be "XXXXXX";
+ they are replaced with a string that makes the filename unique.
+
+ Returns a file descriptor open on the file for reading and writing. */
+
+int mkstemps (char* _template, int suffix_len)
{
-#ifndef HAVE_MKSTEMP
-#ifndef X_NOT_POSIX
- return ((char *) tempnam (path, prefix));
-#else
- char tempFile[PATH_MAX];
- char *tmp;
+ static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ char *XXXXXX;
+ int len;
+ int count;
+ int value;
- snprintf (tempFile, PATH_MAX, "%s/%sXXXXXX", path, prefix);
- tmp = (char *) mktemp (tempFile);
- if (tmp)
- {
- char *ptr = (char *) malloc (strlen (tmp) + 1);
- if (ptr != NULL)
- {
- strcpy (ptr, tmp);
- }
- return (ptr);
- }
- else
- return (NULL);
+ len = strlen (_template);
+
+ if ((int) len < 6 + suffix_len || strncmp (&_template[len - 6 - suffix_len], "XXXXXX", 6))
+ return -1;
+
+ XXXXXX = &_template[len - 6 - suffix_len];
+
+ value = rand();
+ for (count = 0; count < 256; ++count)
+ {
+ int v = value;
+ int fd;
+
+ /* Fill in the random bits. */
+ XXXXXX[0] = letters[v % 62];
+ v /= 62;
+ XXXXXX[1] = letters[v % 62];
+ v /= 62;
+ XXXXXX[2] = letters[v % 62];
+ v /= 62;
+ XXXXXX[3] = letters[v % 62];
+ v /= 62;
+ XXXXXX[4] = letters[v % 62];
+ v /= 62;
+ XXXXXX[5] = letters[v % 62];
+
+ fd = open (_template, O_RDWR|O_CREAT|O_EXCL, 0600);
+ if (fd >= 0)
+ /* The file does not exist. */
+ return fd;
+
+ /* This is a random value. It is only necessary that the next
+ TMP_MAX values generated by adding 7777 to VALUE are different
+ with (module 2^32). */
+ value += 7777;
+ }
+ /* We return the null string if we can't find a unique file name. */
+ _template[0] = '\0';
+ return -1;
+}
+
#endif
-#else
+
+static char *unique_filename (const char *path, const char *prefix, int *pFd)
+{
char tempFile[PATH_MAX];
char *ptr;
@@ -480,44 +523,11 @@ static char *unique_filename (const char
if (ptr != NULL)
{
strcpy(ptr, tempFile);
- *pFd = mkstemp(ptr);
+ *pFd = mkstemps(ptr, 0);
}
return ptr;
-#endif
}
-#if 0
-Status SetAuthentication_local (int count, IceListenObj *listenObjs)
-{
- int i;
- for (i = 0; i < count; i ++) {
- char *prot = IceGetListenConnectionString(listenObjs[i]);
- if (!prot) continue;
- char *host = strchr(prot, '/');
- char *sock = 0;
- if (host) {
- *host=0;
- host++;
- sock = strchr(host, ':');
- if (sock) {
- *sock = 0;
- sock++;
- }
- }
-#ifndef NDEBUG
- qDebug("DCOPServer: SetAProc_loc: conn %d, prot=%s, file=%s",
- (unsigned)i, prot, sock);
-#endif
- if (sock && !strcmp(prot, "local")) {
- chmod(sock, 0700);
- }
- IceSetHostBasedAuthProc (listenObjs[i], HostBasedAuthProc);
- free(prot);
- }
- return 1;
-}
-#endif
-
#define MAGIC_COOKIE_LEN 16
Status
@@ -529,28 +539,19 @@ SetAuthentication (int count, IceListenO
int original_umask;
int i;
QCString command;
-#ifdef HAVE_MKSTEMP
int fd;
-#endif
original_umask = umask (0077); /* disallow non-owner access */
path = getenv ("DCOP_SAVE_DIR");
if (!path)
path = "/tmp";
-#ifndef HAVE_MKSTEMP
- if ((addAuthFile = unique_filename (path, "dcop")) == NULL)
- goto bad;
- if (!(addfp = fopen (addAuthFile, "w")))
- goto bad;
-#else
if ((addAuthFile = unique_filename (path, "dcop", &fd)) == NULL)
goto bad;
if (!(addfp = fdopen(fd, "wb")))
goto bad;
-#endif
if ((*_authDataEntries = static_cast<IceAuthDataEntry *>(malloc (count * 2 * sizeof (IceAuthDataEntry)))) == NULL)
goto bad;

View File

@ -0,0 +1,33 @@
$OpenBSD: patch-kdecore_kstandarddirs_cpp,v 1.1 2004/08/14 18:03:48 brad Exp $
--- kdecore/kstandarddirs.cpp.orig Sun May 30 08:24:00 2004
+++ kdecore/kstandarddirs.cpp Fri Aug 13 16:04:57 2004
@@ -650,7 +650,28 @@ void KStandardDirs::createSpecialResourc
char link[1024];
link[1023] = 0;
int result = readlink(QFile::encodeName(dir).data(), link, 1023);
- if ((result == -1) && (errno == ENOENT))
+ bool relink = (result == -1) && (errno == ENOENT);
+ if ((result > 0) && (link[0] == '/'))
+ {
+ link[result] = 0;
+ struct stat stat_buf;
+ int res = lstat(link, &stat_buf);
+ if ((res == -1) && (errno == ENOENT))
+ {
+ relink = true;
+ }
+ else if ((res == -1) || (!S_ISDIR(stat_buf.st_mode)))
+ {
+ fprintf(stderr, "Error: \"%s\" is not a directory.\n", link);
+ relink = true;
+ }
+ else if (stat_buf.st_uid != getuid())
+ {
+ fprintf(stderr, "Error: \"%s\" is owned by uid %d instead of uid %d.\n", link, stat_buf.st_uid, getuid());
+ relink = true;
+ }
+ }
+ if (relink)
{
QString srv = findExe(QString::fromLatin1("lnusertemp"), KDEDIR+QString::fromLatin1("/bin"));
if (srv.isEmpty())

View File

@ -0,0 +1,23 @@
$OpenBSD: patch-khtml_khtml_ext_cpp,v 1.1 2004/08/14 18:03:48 brad Exp $
--- khtml/khtml_ext.cpp.orig Sun May 30 08:24:21 2004
+++ khtml/khtml_ext.cpp Fri Aug 13 16:04:21 2004
@@ -646,6 +646,19 @@ bool KHTMLPartBrowserHostExtension::open
return m_part->openURLInFrame( url, urlArgs );
}
+void KHTMLPartBrowserHostExtension::virtual_hook( int id, void *data )
+{
+ if (id == VIRTUAL_FIND_FRAME_PARENT)
+ {
+ FindFrameParentParams *param = static_cast<FindFrameParentParams*>(data);
+ KHTMLPart *parentPart = m_part->findFrameParent(param->callingPart, param->frame);
+ if (parentPart)
+ param->parent = parentPart->browserHostExtension();
+ return;
+ }
+ BrowserHostExtension::virtual_hook( id, data );
+}
+
// BCI: remove in KDE 4
KHTMLZoomFactorAction::KHTMLZoomFactorAction( KHTMLPart *part, bool direction, const QString &text, const QString &icon, const QObject *receiver, const char *slot, QObject *parent, const char *name )
: KAction( text, icon, 0, receiver, slot, parent, name )

View File

@ -0,0 +1,13 @@
$OpenBSD: patch-khtml_khtml_ext_h,v 1.1 2004/08/14 18:03:48 brad Exp $
--- khtml/khtml_ext.h.orig Mon Mar 1 01:25:08 2004
+++ khtml/khtml_ext.h Fri Aug 13 16:04:21 2004
@@ -98,6 +98,9 @@ public:
virtual const QPtrList<KParts::ReadOnlyPart> frames() const;
virtual bool openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs );
+
+protected:
+ virtual void virtual_hook( int id, void* data );
private:
KHTMLPart *m_part;
};

View File

@ -0,0 +1,266 @@
$OpenBSD: patch-khtml_khtml_part_cpp,v 1.2 2004/08/14 18:03:48 brad Exp $
--- khtml/khtml_part.cpp.orig Sun May 30 08:24:22 2004
+++ khtml/khtml_part.cpp Fri Aug 13 16:04:22 2004
@@ -734,12 +734,16 @@ DOM::Document KHTMLPart::document() cons
return d->m_doc;
}
-
KParts::BrowserExtension *KHTMLPart::browserExtension() const
{
return d->m_extension;
}
+KParts::BrowserHostExtension *KHTMLPart::browserHostExtension() const
+{
+ return d->m_hostExtension;
+}
+
KHTMLView *KHTMLPart::view() const
{
return d->m_view;
@@ -857,30 +861,19 @@ QVariant KHTMLPart::crossFrameExecuteScr
// we always allow these
}
else {
- while (destpart->parentPart())
- destpart = destpart->parentPart();
- destpart = destpart->findFrame(target);
-
+ destpart = findFrame(target);
if (!destpart)
- destpart = this; // ### doesn't make sense, does it?
+ destpart = this;
}
// easy way out?
if (destpart == this)
return executeScript(DOM::Node(), script);
-
// now compare the domains
- if (!destpart->htmlDocument().isNull() &&
- !htmlDocument().isNull()) {
- DOM::DOMString actDomain = htmlDocument().domain();
- DOM::DOMString destDomain = destpart->htmlDocument().domain();
+ if (destpart->checkFrameAccess(this))
+ return destpart->executeScript(DOM::Node(), script);
- if (actDomain == destDomain)
- return destpart->executeScript(DOM::Node(), script);
- }
-
-
// eww, something went wrong. better execute it in our frame
return executeScript(DOM::Node(), script);
}
@@ -3331,7 +3324,7 @@ void KHTMLPart::urlSelected( const QStri
if ( hasTarget )
{
// unknown frame names should open in a new window.
- khtml::ChildFrame *frame = recursiveFrameRequest( cURL, args, false );
+ khtml::ChildFrame *frame = recursiveFrameRequest( this, cURL, args, false );
if ( frame )
{
args.metaData()["referrer"] = d->m_referrer;
@@ -4337,6 +4330,7 @@ void KHTMLPart::slotChildDocCreated()
void KHTMLPart::slotChildURLRequest( const KURL &url, const KParts::URLArgs &args )
{
khtml::ChildFrame *child = frame( sender()->parent() );
+ KHTMLPart *callingHtmlPart = const_cast<KHTMLPart *>(dynamic_cast<const KHTMLPart *>(sender()->parent()));
// TODO: handle child target correctly! currently the script are always executed fur the parent
QString urlStr = url.url();
@@ -4368,7 +4362,7 @@ void KHTMLPart::slotChildURLRequest( con
}
else if ( frameName != QString::fromLatin1( "_self" ) )
{
- khtml::ChildFrame *_frame = recursiveFrameRequest( url, args );
+ khtml::ChildFrame *_frame = recursiveFrameRequest( callingHtmlPart, url, args );
if ( !_frame )
{
@@ -4412,46 +4406,92 @@ khtml::ChildFrame *KHTMLPart::frame( con
//#define DEBUG_FINDFRAME
-KHTMLPart *KHTMLPart::findFrame( const QString &f )
+bool KHTMLPart::checkFrameAccess(KHTMLPart *callingHtmlPart)
{
+ if (callingHtmlPart == this)
+ return true; // trivial
+
+ if (htmlDocument().isNull()) {
#ifdef DEBUG_FINDFRAME
- kdDebug(6050) << "KHTMLPart::findFrame '" << f << "'" << endl;
- FrameIt it2 = d->m_frames.begin();
- FrameIt end = d->m_frames.end();
- for (; it2 != end; ++it2 )
- kdDebug(6050) << " - having frame '" << (*it2).m_name << "'" << endl;
+ kdDebug(6050) << "KHTMLPart::checkFrameAccess: Empty part " << this << " URL = " << m_url << endl;
#endif
- // ### http://www.w3.org/TR/html4/appendix/notes.html#notes-frames
- ConstFrameIt it = d->m_frames.find( f );
- if ( it == d->m_frames.end() )
+ return false; // we are empty?
+ }
+
+ // now compare the domains
+ if (callingHtmlPart && !callingHtmlPart->htmlDocument().isNull() &&
+ !htmlDocument().isNull()) {
+ DOM::DOMString actDomain = callingHtmlPart->htmlDocument().domain();
+ DOM::DOMString destDomain = htmlDocument().domain();
+
+#ifdef DEBUG_FINDFRAME
+ kdDebug(6050) << "KHTMLPart::checkFrameAccess: actDomain = '" << actDomain.string() << "' destDomain = '" << destDomain.string() << "'" << endl;
+#endif
+
+ if (actDomain == destDomain)
+ return true;
+ }
+#ifdef DEBUG_FINDFRAME
+ else
{
+ kdDebug(6050) << "KHTMLPart::checkFrameAccess: Unknown part/domain " << callingHtmlPart << " tries to access part " << this << endl;
+ }
+#endif
+ return false;
+}
+
+KHTMLPart *
+KHTMLPart::findFrameParent( KParts::ReadOnlyPart *callingPart, const QString &f, khtml::ChildFrame **childFrame )
+{
#ifdef DEBUG_FINDFRAME
- kdDebug(6050) << "KHTMLPart::findFrame frame " << f << " not found" << endl;
+ kdDebug(6050) << "KHTMLPart::findFrameParent: this = " << this << " URL = " << m_url << " findFrameParent( " << f << " )" << endl;
#endif
- return 0L;
+ // Check access
+ KHTMLPart *callingHtmlPart = dynamic_cast<KHTMLPart *>(callingPart);
+
+ if (!checkFrameAccess(callingHtmlPart))
+ return 0;
+
+ FrameIt it = d->m_frames.find( f );
+ FrameIt end = d->m_frames.end();
+ if ( it != end )
+ {
+#ifdef DEBUG_FINDFRAME
+ kdDebug(6050) << "KHTMLPart::findFrameParent: FOUND!" << endl;
+#endif
+ if (childFrame)
+ *childFrame = &(*it);
+ return this;
}
- else {
+
+ it = d->m_frames.begin();
+ for (; it != end; ++it )
+ {
KParts::ReadOnlyPart *p = (*it).m_part;
if ( p && p->inherits( "KHTMLPart" ))
{
-#ifdef DEBUG_FINDFRAME
- kdDebug(6050) << "KHTMLPart::findFrame frame " << f << " is a KHTMLPart, ok" << endl;
-#endif
- return (KHTMLPart*)p;
+ KHTMLPart *frameParent = static_cast<KHTMLPart*>(p)->findFrameParent(callingPart, f, childFrame);
+ if (frameParent)
+ return frameParent;
}
- else
- {
-#ifdef DEBUG_FINDFRAME
- if (p)
- kdWarning() << "KHTMLPart::findFrame frame " << f << " found but isn't a KHTMLPart ! " << p->className() << endl;
- else
- kdWarning() << "KHTMLPart::findFrame frame " << f << " found but m_part=0L" << endl;
-#endif
- return 0L;
- }
}
+ return 0;
}
+
+KHTMLPart *KHTMLPart::findFrame( const QString &f )
+{
+ khtml::ChildFrame *childFrame;
+ KHTMLPart *parentFrame = findFrameParent(this, f, &childFrame);
+ if (parentFrame)
+ {
+ KParts::ReadOnlyPart *p = childFrame->m_part;
+ if ( p && p->inherits( "KHTMLPart" ))
+ return static_cast<KHTMLPart *>(p);
+ }
+ return 0;
+}
+
KParts::ReadOnlyPart *KHTMLPart::currentFrame() const
{
KParts::ReadOnlyPart* part = (KParts::ReadOnlyPart*)(this);
@@ -4487,37 +4527,29 @@ KHTMLPart *KHTMLPart::parentPart()
return (KHTMLPart *)parent();
}
-khtml::ChildFrame *KHTMLPart::recursiveFrameRequest( const KURL &url, const KParts::URLArgs &args,
- bool callParent )
+khtml::ChildFrame *KHTMLPart::recursiveFrameRequest( KHTMLPart *callingHtmlPart, const KURL &url,
+ const KParts::URLArgs &args, bool callParent )
{
- FrameIt it = d->m_frames.find( args.frameName );
+#ifdef DEBUG_FINDFRAME
+ kdDebug( 6050 ) << "KHTMLPart::recursiveFrameRequest this = " << this << ", frame = " << args.frameName << ", url = " << url << endl;
+#endif
+ khtml::ChildFrame *childFrame;
+ KHTMLPart *childPart = findFrameParent(callingHtmlPart, args.frameName, &childFrame);
+ if (childPart)
+ {
+ if (childPart == this)
+ return childFrame;
+
+ childPart->requestObject( childFrame, url, args );
+ return 0;
+ }
- if ( it != d->m_frames.end() )
- return &(*it);
-
- it = d->m_frames.begin();
- FrameIt end = d->m_frames.end();
- for (; it != end; ++it )
- if ( (*it).m_part && (*it).m_part->inherits( "KHTMLPart" ) )
- {
- KHTMLPart *childPart = (KHTMLPart *)(KParts::ReadOnlyPart *)(*it).m_part;
-
- khtml::ChildFrame *res = childPart->recursiveFrameRequest( url, args, false );
- if ( !res )
- continue;
-
- childPart->requestObject( res, url, args );
- return 0L;
- }
-
if ( parentPart() && callParent )
{
- khtml::ChildFrame *res = parentPart()->recursiveFrameRequest( url, args );
+ khtml::ChildFrame *res = parentPart()->recursiveFrameRequest( callingHtmlPart, url, args, callParent );
- if ( res )
- parentPart()->requestObject( res, url, args );
-
- return 0L;
+ if ( res )
+ parentPart()->requestObject( res, url, args );
}
return 0L;
@@ -4525,7 +4557,7 @@ khtml::ChildFrame *KHTMLPart::recursiveF
void KHTMLPart::saveState( QDataStream &stream )
{
- kdDebug( 6050 ) << "KHTMLPart::saveState saving URL " << m_url.url() << endl;
+ kdDebug( 6050 ) << "KHTMLPart::saveState this = " << this << " saving URL " << m_url.url() << endl;
stream << m_url << (Q_INT32)d->m_view->contentsX() << (Q_INT32)d->m_view->contentsY()
<< (Q_INT32) d->m_view->contentsWidth() << (Q_INT32) d->m_view->contentsHeight() << (Q_INT32) d->m_view->marginWidth() << (Q_INT32) d->m_view->marginHeight();

View File

@ -0,0 +1,46 @@
$OpenBSD: patch-khtml_khtml_part_h,v 1.2 2004/08/14 18:03:48 brad Exp $
--- khtml/khtml_part.h.orig Sun Apr 4 03:08:39 2004
+++ khtml/khtml_part.h Fri Aug 13 16:04:22 2004
@@ -287,6 +287,7 @@ public:
*/
KParts::BrowserExtension *browserExtension() const;
KParts::LiveConnectExtension *liveConnectExtension( const khtml::RenderPart *) const;
+ KParts::BrowserHostExtension *browserHostExtension() const;
/**
* Returns a pointer to the HTML document's view.
@@ -812,6 +813,16 @@ public:
KHTMLPart *findFrame( const QString &f );
/**
+ * @internal
+ * Recursively finds the part containing the frame with name @p f
+ * and checks if it is accessible by @p callingPart
+ * Returns 0L if no suitable frame can't be found.
+ * Returns parent part if a suitable frame was found and
+ * frame info in @p *childFrame
+ */
+ KHTMLPart *findFrameParent( KParts::ReadOnlyPart *callingPart, const QString &f, khtml::ChildFrame **childFrame=0 );
+
+ /**
* Return the current frame (the one that has focus)
* Not necessarily a direct child of ours, framesets can be nested.
* Returns "this" if this part isn't a frameset.
@@ -1368,6 +1379,8 @@ private:
bool restoreURL( const KURL &url );
void emitSelectionChanged();
+ // Returns whether callingHtmlPart may access this part
+ bool checkFrameAccess(KHTMLPart *callingHtmlPart);
bool openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs );
void startAutoScroll();
void stopAutoScroll();
@@ -1426,7 +1439,7 @@ private:
DOM::DocumentImpl *xmlDocImpl() const;
khtml::ChildFrame *frame( const QObject *obj );
- khtml::ChildFrame *recursiveFrameRequest( const KURL &url, const KParts::URLArgs &args, bool callParent = true );
+ khtml::ChildFrame *recursiveFrameRequest( KHTMLPart *callingHtmlPart, const KURL &url, const KParts::URLArgs &args, bool callParent = true );
bool checkLinkSecurity( const KURL &linkURL,const QString &message = QString::null, const QString &button = QString::null );
QVariant executeScript( const QString& filename, int baseLine, const DOM::Node &n, const QString& script );

View File

@ -0,0 +1,21 @@
$OpenBSD: patch-kparts_browserextension_cpp,v 1.1 2004/08/14 18:03:48 brad Exp $
--- kparts/browserextension.cpp.orig Sun May 30 08:24:45 2004
+++ kparts/browserextension.cpp Fri Aug 13 16:04:22 2004
@@ -636,6 +636,17 @@ BrowserHostExtension *BrowserHostExtensi
void BrowserExtension::virtual_hook( int, void* )
{ /*BASE::virtual_hook( id, data );*/ }
+BrowserHostExtension *
+BrowserHostExtension::findFrameParent(KParts::ReadOnlyPart *callingPart, const QString &frame)
+{
+ FindFrameParentParams param;
+ param.parent = 0;
+ param.callingPart = callingPart;
+ param.frame = frame;
+ virtual_hook(VIRTUAL_FIND_FRAME_PARENT, &param);
+ return param.parent;
+}
+
void BrowserHostExtension::virtual_hook( int, void* )
{ /*BASE::virtual_hook( id, data );*/ }

View File

@ -0,0 +1,41 @@
$OpenBSD: patch-kparts_browserextension_h,v 1.1 2004/08/14 18:03:48 brad Exp $
--- kparts/browserextension.h.orig Sun Oct 26 03:54:24 2003
+++ kparts/browserextension.h Fri Aug 13 16:04:22 2004
@@ -671,10 +671,16 @@ public:
*
* Note that this method does not query the child objects recursively.
*/
-
virtual const QPtrList<KParts::ReadOnlyPart> frames() const;
/**
+ * @internal
+ * Returns the part that contains @p frame and that may be accessed
+ * by @p callingPart
+ */
+ BrowserHostExtension *findFrameParent(KParts::ReadOnlyPart *callingPart, const QString &frame);
+
+ /**
* Opens the given url in a hosted child frame. The frame name is specified in the
* frameName variable in the urlArgs argument structure (see KParts::URLArgs ) .
*/
@@ -687,6 +693,19 @@ public:
static BrowserHostExtension *childObject( QObject *obj );
protected:
+ /** This 'enum' along with the structure below is NOT part of the public API.
+ * It's going to disappear in KDE 4.0 and is likely to change inbetween.
+ *
+ * @internal
+ */
+ enum { VIRTUAL_FIND_FRAME_PARENT = 0x10 };
+ struct FindFrameParentParams
+ {
+ BrowserHostExtension *parent;
+ KParts::ReadOnlyPart *callingPart;
+ QString frame;
+ };
+
virtual void virtual_hook( int id, void* data );
private:
class BrowserHostExtensionPrivate;