[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

rjw rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 05:54:41 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 9171de0ed52c70bb3705ec1d2b31610988e00145
Author: rjw <rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Jan 29 23:14:37 2002 +0000

    First pass at frame code.  Still needs lots of cleanup.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@560 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2002-12-03 b/WebCore/ChangeLog-2002-12-03
index ce6bbac..6df7dde 100644
--- a/WebCore/ChangeLog-2002-12-03
+++ b/WebCore/ChangeLog-2002-12-03
@@ -1,3 +1,17 @@
+2002-01-29  Richard Williamson  <rjw at apple.com>
+
+    First pass as frame code.  Still needs cleanup.
+    
+	* src/kdelibs/khtml/dom/dom_misc.cpp: (DomShared::ref), (DomShared::deref):
+	* src/kdelibs/khtml/dom/dom_misc.h:
+	* src/kdelibs/khtml/khtmlview.cpp: (KHTMLView::~KHTMLView):
+	* src/kwq/KWQComboBox.mm: (QComboBox::setCurrentItem):
+	* src/kwq/KWQKHTMLPart.h:
+	* src/kwq/KWQKHTMLPart.mm: (KHTMLPart::~KHTMLPart), (KHTMLPart::begin),
+	(KHTMLPart::end), (KHTMLPart::xmlDocImpl), (KHTMLPart::khtmlMouseReleaseEvent),
+	(KHTMLPart::requestFrameName), (KHTMLPart::requestFrame),
+	(KHTMLPart::requestObject), (KHTMLPart::checkCompleted):
+
 2002-01-29  Kenneth Kocienda  <kocienda at apple.com>
 
         Checked in the missing file
@@ -88,6 +102,7 @@
 	src/kwq/qt/_qptrdict.h: Avoid causing problems when the relevant
 	defines are not defined.
 
+>>>>>>> 1.28
 2002-01-22  Richard Williamson  <rjw at apple.com>
 
     Implemented KWQDesktopWidget to represent main screen.  Used by javascript.
diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index ce6bbac..6df7dde 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,17 @@
+2002-01-29  Richard Williamson  <rjw at apple.com>
+
+    First pass as frame code.  Still needs cleanup.
+    
+	* src/kdelibs/khtml/dom/dom_misc.cpp: (DomShared::ref), (DomShared::deref):
+	* src/kdelibs/khtml/dom/dom_misc.h:
+	* src/kdelibs/khtml/khtmlview.cpp: (KHTMLView::~KHTMLView):
+	* src/kwq/KWQComboBox.mm: (QComboBox::setCurrentItem):
+	* src/kwq/KWQKHTMLPart.h:
+	* src/kwq/KWQKHTMLPart.mm: (KHTMLPart::~KHTMLPart), (KHTMLPart::begin),
+	(KHTMLPart::end), (KHTMLPart::xmlDocImpl), (KHTMLPart::khtmlMouseReleaseEvent),
+	(KHTMLPart::requestFrameName), (KHTMLPart::requestFrame),
+	(KHTMLPart::requestObject), (KHTMLPart::checkCompleted):
+
 2002-01-29  Kenneth Kocienda  <kocienda at apple.com>
 
         Checked in the missing file
@@ -88,6 +102,7 @@
 	src/kwq/qt/_qptrdict.h: Avoid causing problems when the relevant
 	defines are not defined.
 
+>>>>>>> 1.28
 2002-01-22  Richard Williamson  <rjw at apple.com>
 
     Implemented KWQDesktopWidget to represent main screen.  Used by javascript.
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index ce6bbac..6df7dde 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,17 @@
+2002-01-29  Richard Williamson  <rjw at apple.com>
+
+    First pass as frame code.  Still needs cleanup.
+    
+	* src/kdelibs/khtml/dom/dom_misc.cpp: (DomShared::ref), (DomShared::deref):
+	* src/kdelibs/khtml/dom/dom_misc.h:
+	* src/kdelibs/khtml/khtmlview.cpp: (KHTMLView::~KHTMLView):
+	* src/kwq/KWQComboBox.mm: (QComboBox::setCurrentItem):
+	* src/kwq/KWQKHTMLPart.h:
+	* src/kwq/KWQKHTMLPart.mm: (KHTMLPart::~KHTMLPart), (KHTMLPart::begin),
+	(KHTMLPart::end), (KHTMLPart::xmlDocImpl), (KHTMLPart::khtmlMouseReleaseEvent),
+	(KHTMLPart::requestFrameName), (KHTMLPart::requestFrame),
+	(KHTMLPart::requestObject), (KHTMLPart::checkCompleted):
+
 2002-01-29  Kenneth Kocienda  <kocienda at apple.com>
 
         Checked in the missing file
@@ -88,6 +102,7 @@
 	src/kwq/qt/_qptrdict.h: Avoid causing problems when the relevant
 	defines are not defined.
 
+>>>>>>> 1.28
 2002-01-22  Richard Williamson  <rjw at apple.com>
 
     Implemented KWQDesktopWidget to represent main screen.  Used by javascript.
diff --git a/WebCore/khtml/dom/dom_misc.cpp b/WebCore/khtml/dom/dom_misc.cpp
index e746382..de664e1 100644
--- a/WebCore/khtml/dom/dom_misc.cpp
+++ b/WebCore/khtml/dom/dom_misc.cpp
@@ -24,6 +24,8 @@
 #include "dom_misc.h"
 using namespace DOM;
 
+#include <stdio.h>
+
 DomShared::~DomShared()
 {
   // deliberately left blank
@@ -36,4 +38,25 @@ bool DomShared::deleteMe()
   return false;
 }
 
+#ifdef _KWQ_
+void *DomShared::instanceToCheck;
+
+void DomShared::ref()
+{
+    if (((void *)this) == instanceToCheck){
+        printf ("0x%08x incrementing ref %d\n", (unsigned int)this, _ref);
+    }
+    _ref++;
+}
 
+void DomShared::deref() 
+{
+    if (((void *)this) == instanceToCheck){
+        fprintf (stdout, "0x%08x decrementing ref %d\n", (unsigned int)this, _ref);
+    }
+    if(_ref)
+        _ref--; 
+    if(!_ref && deleteMe())
+        delete this; 
+}
+#endif
diff --git a/WebCore/khtml/dom/dom_misc.h b/WebCore/khtml/dom/dom_misc.h
index 9241f77..265b571 100644
--- a/WebCore/khtml/dom/dom_misc.h
+++ b/WebCore/khtml/dom/dom_misc.h
@@ -32,6 +32,7 @@ namespace DOM {
  * Other objects should overload deleteMe() to fit their needs. The default
  * implementation deletes the object if the ref count drops to 0.
  */
+ 
 class DomShared
 {
 public:
@@ -42,8 +43,16 @@ public:
    */
   virtual bool deleteMe();
 
+#ifndef _KWQ_
   void ref() { _ref++; }
   void deref() { if(_ref) _ref--; if(!_ref && deleteMe()) delete this; }
+#else
+  static void *instanceToCheck;
+
+  void ref();
+  void deref();
+#endif
+
   // ###  KDE 3.0: add const
   bool hasOneRef() { return _ref == 1; }
   unsigned int refCount() const { return _ref; }
diff --git a/WebCore/khtml/html/html_formimpl.cpp b/WebCore/khtml/html/html_formimpl.cpp
index 4fc14ea..cae01fb 100644
--- a/WebCore/khtml/html/html_formimpl.cpp
+++ b/WebCore/khtml/html/html_formimpl.cpp
@@ -180,9 +180,26 @@ QByteArray HTMLFormElementImpl::formData()
     QCString enc_string = ""; // used for non-multipart data
 
     // find out the QTextcodec to use
+#ifdef _KWQ_
+    QString origStr = m_acceptcharset.string();
+    QChar space(' ');
+    QChar strChars[origStr.length()];
+
+    for(unsigned int i=0; i < origStr.length(); i++)
+        if(origStr[i].latin1() == ',')
+            strChars[i] = space;
+        else
+            strChars[i] = origStr[i];
+    QString str(strChars, origStr.length());
+#else
     QString str = m_acceptcharset.string();
     QChar space(' ');
-    for(unsigned int i=0; i < str.length(); i++) if(str[i].latin1() == ',') str[i] = space;
+
+    for(unsigned int i=0; i < str.length(); i++)
+        if(str[i].latin1() == ',')
+            str[i] = space;
+#endif
+
     QStringList charsets = QStringList::split(' ', str);
     QTextCodec* codec = 0;
     for ( QStringList::Iterator it = charsets.begin(); it != charsets.end(); ++it )
@@ -208,9 +225,17 @@ QByteArray HTMLFormElementImpl::formData()
     if(!codec)
         codec = QTextCodec::codecForLocale();
 
+#ifdef _KWQ_
+    QString encCharset = codec->name();
+    QChar encChars[encCharset.length()];
+    for(unsigned int i=0; i < encCharset.length(); i++)
+        encChars[i] = encCharset[i].latin1() == ' ' ? QChar('-') : encCharset[i].lower();
+    QString m_encCharset(encChars,  encCharset.length());
+#else
     m_encCharset = codec->name();
     for(unsigned int i=0; i < m_encCharset.length(); i++)
         m_encCharset[i] = m_encCharset[i].latin1() == ' ' ? QChar('-') : m_encCharset[i].lower();
+#endif
 
     for(HTMLGenericFormElementImpl *current = formElements.first(); current; current = formElements.next())
     {
@@ -1484,15 +1509,27 @@ void HTMLSelectElementImpl::setValue(DOMStringImpl* /*value*/)
 
 QString HTMLSelectElementImpl::state( )
 {
-    QString state;
     QArray<HTMLGenericFormElementImpl*> items = listItems();
 
     int l = items.count();
 
+#ifndef _KWQ_
+    QString state;
+
     state.fill('.', l);
     for(int i = 0; i < l; i++)
         if(items[i]->id() == ID_OPTION && static_cast<HTMLOptionElementImpl*>(items[i])->selected())
             state[i] = 'X';
+#else
+    QChar stateChars[l];
+    
+    for(int i = 0; i < l; i++)
+        if(items[i]->id() == ID_OPTION && static_cast<HTMLOptionElementImpl*>(items[i])->selected())
+            stateChars[i] = 'X';
+        else
+            stateChars[i] = '.';
+    QString state(stateChars, l);
+#endif
 
     return state;
 }
@@ -1504,7 +1541,13 @@ void HTMLSelectElementImpl::restoreState(const QString &_state)
     QString state = _state;
     if(!state.isEmpty() && !state.contains('X') && !m_multiple) {
         ASSERT("should not happen in restoreState!");
+#ifdef _KWQ_
+        // Invalid access to string's internal buffer.  Should never get here
+        // anyway.
+        //state[0] = 'X';
+#else
         state[0] = 'X';
+#endif
     }
 
     QArray<HTMLGenericFormElementImpl*> items = listItems();
diff --git a/WebCore/khtml/khtmlview.cpp b/WebCore/khtml/khtmlview.cpp
index 608b68f..ca3f73f 100644
--- a/WebCore/khtml/khtmlview.cpp
+++ b/WebCore/khtml/khtmlview.cpp
@@ -200,14 +200,6 @@ KHTMLView::KHTMLView( KHTMLPart *part, QWidget *parent, const char *name)
 
 KHTMLView::~KHTMLView()
 {
-    if (m_part)
-    {
-        //WABA: Is this Ok? Do I need to deref it as well?
-        //Does this need to be done somewhere else?
-        DOM::DocumentImpl *doc = m_part->xmlDocImpl();
-        if (doc)
-            doc->detach();
-    }
     lstViews->removeRef( this );
     if(lstViews->isEmpty())
     {
diff --git a/WebCore/khtml/xml/dom_stringimpl.cpp b/WebCore/khtml/xml/dom_stringimpl.cpp
index 5327766..6e39f88 100644
--- a/WebCore/khtml/xml/dom_stringimpl.cpp
+++ b/WebCore/khtml/xml/dom_stringimpl.cpp
@@ -213,7 +213,6 @@ Length DOMStringImpl::toLength() const
 
 QList<Length> *DOMStringImpl::toLengthList() const
 {
-    QString str(s, l);
     int pos = 0;
     int pos2;
 
@@ -221,12 +220,29 @@ QList<Length> *DOMStringImpl::toLengthList() const
     // to fix lists like "1,2px 3 ,4"
     // make sure not to break percentage or relative widths
     // ### what about "auto" ?
+#ifdef _KWQ_
+    QChar spacified[l];
+    QChar space(' ');
+    for(unsigned int i=0; i < l; i++) {
+        QChar cc = s[i];
+        if ( cc > '9' || ( cc < '0' && cc != '-' && cc != '*' && cc != '%' && cc != '.') ){
+            spacified[i] = space;
+        }
+        else {
+            spacified[i] = cc;
+        }
+    }
+    QString str(spacified, l);
+#else
+    QString str(s, l);
     QChar space(' ');
     for(unsigned int i=0; i < l; i++) {
         char cc = str[i].latin1();
-        if ( cc > '9' || ( cc < '0' && cc != '-' && cc != '*' && cc != '%' && cc != '.') )
+        if ( cc > '9' || ( cc < '0' && cc != '-' && cc != '*' && cc != '%' && cc != '.') ){
             str[i] = space;
+        }
     }
+#endif
     str = str.simplifyWhiteSpace();
 
     QList<Length> *list = new QList<Length>;
diff --git a/WebCore/kwq/KWQComboBox.mm b/WebCore/kwq/KWQComboBox.mm
index 975a0a8..f2f94ec 100644
--- a/WebCore/kwq/KWQComboBox.mm
+++ b/WebCore/kwq/KWQComboBox.mm
@@ -118,7 +118,11 @@ void QComboBox::clear()
 void QComboBox::setCurrentItem(int index)
 {
     KWQNSComboBox *comboBox = (KWQNSComboBox *)getView();
-    [comboBox selectItemAtIndex: index];
+    int num = [comboBox numberOfItems];
+    if (num != 0 && index < num)
+        [comboBox selectItemAtIndex: index];
+    else
+        NSLog (@"Error, index incorrect");
 }
 
 
diff --git a/WebCore/kwq/KWQKHTMLPart.mm b/WebCore/kwq/KWQKHTMLPart.mm
index 9d1993d..d6307ec 100644
--- a/WebCore/kwq/KWQKHTMLPart.mm
+++ b/WebCore/kwq/KWQKHTMLPart.mm
@@ -186,6 +186,8 @@ public:
     QPoint m_dragLastPos;
 #endif
 
+    int m_frameNameId;
+
     KHTMLPartPrivate(KHTMLPart *part)
     {
         if (!cache_init) {
@@ -194,7 +196,10 @@ public:
         }
         m_part = part;
         m_view = 0L;
+        
+        // Why is this allocated here?
         m_doc = new HTMLDocumentImpl();
+        
         m_decoder = 0L;
         m_bFirstData = true;
         //m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
@@ -206,11 +211,25 @@ public:
         m_jscript = 0L;
         m_runningScripts = 0;
         m_onlyLocalReferences = 0;
+
+        m_frameNameId = 1;
     }
 
     ~KHTMLPartPrivate()
     {
-        [m_recv release];   
+        if ( m_doc )
+             m_doc->detach();
+
+        if (m_doc->refCount() != 1)
+            fprintf (stdout, "Warning:  document reference count not 1 as expect,  ref = %d\n", m_doc->refCount());
+        if ( m_doc )
+           m_doc->deref();
+        
+        m_doc = 0;
+
+        delete m_settings;
+
+        [m_recv autorelease];   
     }
 
 };
@@ -238,7 +257,6 @@ void KHTMLPart::init()
 KHTMLPart::~KHTMLPart()
 {
     delete d;
-    _logNotYetImplemented();
     NSLog(@"destructing KHTMLPart");
 }
 
@@ -513,6 +531,7 @@ void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset)
     //d->m_referrer = url.url();
     
     d->m_doc = new HTMLDocumentImpl(d->m_view);
+    //DomShared::instanceToCheck = (void *)((DomShared *)d->m_doc);
     d->m_doc->ref();
 
     d->m_baseURL = KURL();
@@ -599,7 +618,9 @@ void KHTMLPart::write(const char *str, int len)
     
     double start = CFAbsoluteTimeGetCurrent();
     
+#ifdef _KWQ_TIMING        
     QString decoded = d->m_decoder->decode( str, len );
+#endif
             
     if(decoded.isEmpty())
         return;
@@ -638,10 +659,15 @@ void KHTMLPart::write( const QString &str )
 
 void KHTMLPart::end()
 {
+    fprintf (stdout, "0x%08x end(): for url %s\n", (unsigned int)this, d->m_url.url().latin1());
     // make sure nothing's left in there...
-    if(d->m_decoder)
-        write(d->m_decoder->flush());
-    d->m_doc->finishParsing();
+    //if(d->m_decoder)
+    //    write(d->m_decoder->flush());
+    //d->m_doc->finishParsing();
+
+    QString str = d->m_doc->recursive_toHTML(1);
+    
+    d->m_doc->close();
 }
 
 
@@ -884,7 +910,9 @@ DOM::HTMLDocumentImpl *KHTMLPart::docImpl() const
 DOM::DocumentImpl *KHTMLPart::xmlDocImpl() const
 {
 //    _logPartiallyImplemented();
-    return d->m_doc;
+    if (d)
+        return d->m_doc;
+    return 0;
 }
 
 
@@ -1183,6 +1211,12 @@ void KHTMLPart::khtmlMouseMoveEvent( khtml::MouseMoveEvent *event )
 
 }
 
+// [rjw]:  hack-o-rama.  This will all have to change once we
+// implement this correctly.
+ at interface WKWebView : NSObject
+- (void)_resetView;
+ at end
+
 void KHTMLPart::khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event )
 {
   DOM::Node innerNode = event->innerNode();
@@ -1197,7 +1231,7 @@ void KHTMLPart::khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event )
 
     // HACK!  FIXME!
     if (d->m_strSelectedURL != QString::null) {
-        [((KWQHTMLView *)((QWidget *)view())->getView()) resetView];
+        [((WKWebView *)((QWidget *)view())->getView()) _resetView];
         KURL clickedURL(completeURL( splitUrlTarget(d->m_strSelectedURL)));
         openURL (clickedURL);
         // [kocienda]: shield your eyes!
@@ -1399,8 +1433,7 @@ DOM::EventListener *KHTMLPart::createHTMLEventListener( QString code )
 
 QString KHTMLPart::requestFrameName()
 {
-    _logNeverImplemented();
-    return QString();
+    return QString::fromLatin1("<!--frame %1-->").arg(d->m_frameNameId++);
 }
 
 
@@ -1410,15 +1443,6 @@ bool KHTMLPart::frameExists( const QString &frameName )
     return FALSE;
 }
 
-
-bool KHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
-                    const QStringList &args, bool isIFrame)
-{
-    _logNeverImplemented();
-    return FALSE;
-}
-
-
 void KHTMLPart::emitUnloadEvent()
 {
     _logNeverImplemented();
@@ -1437,10 +1461,99 @@ void KHTMLPart::urlSelected( const QString &url, int button, int state, const QS
     _logNeverImplemented();
 }
 
+ at class WKWebDataSource;
+ at class WKWebView;
+
+ at protocol WKWebController
+- (void)addFrame: child toParent: parent;
+- (void)viewForFrameNamed: (NSString *)name inDataSource: (WKWebDataSource *)dataSource;
+ at end
+
+ at interface WKWebDataSource : NSObject
+- initWithURL: (NSURL *)url;
+- (void)_setFrameName: (NSString *)fName;
+- (id <WKWebController>)controller;
+- (void)startLoading: (BOOL)forceRefresh;
+- (void)addFrame: frame;
+- frameNamed: (NSString *)f;
+ at end
+
+ at interface WKWebView (Foo)
+- initWithFrame: (NSRect)frame;
+- (QWidget *)_widget;
+ at end
+
+ at interface WKWebFrame: NSObject
+- initWithName: (NSString *)n view: v dataSource: (WKWebDataSource *)d;
+- view;
+ at end
+
+
+bool KHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
+                    const QStringList &params, bool isIFrame)
+{
+    NSString *nsframeName = QSTRING_TO_NSSTRING(frameName);
+    WKWebFrame *aFrame;
+    WKWebDataSource *childDataSource;
+    NSURL *childURL;
+    WKWebView *childView;
+    WKWebFrame *newFrame;
+    
+    
+    fprintf (stdout, "0x%08x requestFrame():  part = 0x%08x, name = %s, url = %s\n", (unsigned int)this, (unsigned int)frame, frameName.latin1(), url.latin1());    
+    aFrame =[getDataSource() frameNamed: nsframeName];
+    if (aFrame){
+        fprintf (stdout, "0x%08x requestFrame():  part = 0x%08x frame found\n", (unsigned int)this, (unsigned int)frame);    
+        // ?
+        frame->setWidget ([[aFrame view] _widget]);
+    }
+    else {        
+        fprintf (stdout, "0x%08x requestFrame():  part = 0x%08x creating frame\n", (unsigned int)this, (unsigned int)frame);    
+        childURL = [NSURL URLWithString: QSTRING_TO_NSSTRING (completeURL( url ).url() )];
+        childDataSource = [[WKWebDataSource alloc] initWithURL: childURL];
+        [childDataSource _setFrameName: nsframeName];
+        childView = [[WKWebView alloc] initWithFrame: 
+                NSMakeRect (0,0,frame->intrinsicWidth(),frame->intrinsicHeight())];
+    
+        newFrame = [[[WKWebFrame alloc] initWithName: nsframeName view: childView dataSource: childDataSource] autorelease];
+        
+        [getDataSource() addFrame: newFrame];
+        
+        [[getDataSource() controller] addFrame: newFrame toParent: getDataSource()];
+    
+        frame->setWidget ([childView _widget]);
+        
+        [childDataSource startLoading: YES];
+    }
+
+#ifdef _SUPPORT_JAVASCRIPT_URL_    
+    if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 && !isIFrame )
+    {
+        // static cast is safe as of isIFrame being false.
+        // but: shouldn't we support this javascript hack for iframes aswell?
+        khtml::RenderFrame* rf = static_cast<khtml::RenderFrame*>(frame);
+        assert(rf);
+        QVariant res = executeScript( DOM::Node(rf->frameImpl()), url.right( url.length() - 11) );
+        if ( res.type() == QVariant::String ) {
+            KURL myurl;
+            myurl.setProtocol("javascript");
+            myurl.setPath(res.asString());
+            return processObjectRequest(&(*it), myurl, QString("text/html") );
+        }
+        return false;
+    }
+#endif
+
+
+    return true;
+}
+
+
 
 bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, const QString &serviceType,
                     const QStringList &args)
 {
+#ifdef _KWQ_
     WKPluginWidget *pluginWidget;
     
     if(url.isEmpty() || serviceType.isEmpty()){
@@ -1448,10 +1561,27 @@ bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, con
     }
     pluginWidget = new WKPluginWidget(0, url, serviceType, args);
     frame->setWidget(pluginWidget);
+
     return TRUE;
+#else
+    if (url.isEmpty())
+        return false;
+    
+    khtml::ChildFrame child;
+    QValueList<khtml::ChildFrame>::Iterator it = d->m_objects.append( child );
+    (*it).m_frame = frame;
+    (*it).m_type = khtml::ChildFrame::Object;
+    (*it).m_params = params;
+    
+    KParts::URLArgs args;
+    args.serviceType = serviceType;
+    
+    return requestObject( &(*it), completeURL( url ), args );
+#endif
 }
 
 
+
 void KHTMLPart::nodeActivated(const DOM::Node &aNode)
 {
     KWQDEBUG2 ("name %s = %s\n", (const char *)aNode.nodeName().string(), (const char *)aNode.nodeValue().string());
@@ -1500,5 +1630,7 @@ void KHTMLPart::checkCompleted()
         [[NSNotificationCenter defaultCenter] removeObserver:d->m_recv name:urlString object:nil];
         // tell anyone who's interested that we're done
         [[NSNotificationCenter defaultCenter] postNotificationName:@"uri-done" object:urlString];
+
+        end();
     }
 }
diff --git a/WebCore/kwq/KWQKHTMLPartImpl.mm b/WebCore/kwq/KWQKHTMLPartImpl.mm
index 9d1993d..d6307ec 100644
--- a/WebCore/kwq/KWQKHTMLPartImpl.mm
+++ b/WebCore/kwq/KWQKHTMLPartImpl.mm
@@ -186,6 +186,8 @@ public:
     QPoint m_dragLastPos;
 #endif
 
+    int m_frameNameId;
+
     KHTMLPartPrivate(KHTMLPart *part)
     {
         if (!cache_init) {
@@ -194,7 +196,10 @@ public:
         }
         m_part = part;
         m_view = 0L;
+        
+        // Why is this allocated here?
         m_doc = new HTMLDocumentImpl();
+        
         m_decoder = 0L;
         m_bFirstData = true;
         //m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
@@ -206,11 +211,25 @@ public:
         m_jscript = 0L;
         m_runningScripts = 0;
         m_onlyLocalReferences = 0;
+
+        m_frameNameId = 1;
     }
 
     ~KHTMLPartPrivate()
     {
-        [m_recv release];   
+        if ( m_doc )
+             m_doc->detach();
+
+        if (m_doc->refCount() != 1)
+            fprintf (stdout, "Warning:  document reference count not 1 as expect,  ref = %d\n", m_doc->refCount());
+        if ( m_doc )
+           m_doc->deref();
+        
+        m_doc = 0;
+
+        delete m_settings;
+
+        [m_recv autorelease];   
     }
 
 };
@@ -238,7 +257,6 @@ void KHTMLPart::init()
 KHTMLPart::~KHTMLPart()
 {
     delete d;
-    _logNotYetImplemented();
     NSLog(@"destructing KHTMLPart");
 }
 
@@ -513,6 +531,7 @@ void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset)
     //d->m_referrer = url.url();
     
     d->m_doc = new HTMLDocumentImpl(d->m_view);
+    //DomShared::instanceToCheck = (void *)((DomShared *)d->m_doc);
     d->m_doc->ref();
 
     d->m_baseURL = KURL();
@@ -599,7 +618,9 @@ void KHTMLPart::write(const char *str, int len)
     
     double start = CFAbsoluteTimeGetCurrent();
     
+#ifdef _KWQ_TIMING        
     QString decoded = d->m_decoder->decode( str, len );
+#endif
             
     if(decoded.isEmpty())
         return;
@@ -638,10 +659,15 @@ void KHTMLPart::write( const QString &str )
 
 void KHTMLPart::end()
 {
+    fprintf (stdout, "0x%08x end(): for url %s\n", (unsigned int)this, d->m_url.url().latin1());
     // make sure nothing's left in there...
-    if(d->m_decoder)
-        write(d->m_decoder->flush());
-    d->m_doc->finishParsing();
+    //if(d->m_decoder)
+    //    write(d->m_decoder->flush());
+    //d->m_doc->finishParsing();
+
+    QString str = d->m_doc->recursive_toHTML(1);
+    
+    d->m_doc->close();
 }
 
 
@@ -884,7 +910,9 @@ DOM::HTMLDocumentImpl *KHTMLPart::docImpl() const
 DOM::DocumentImpl *KHTMLPart::xmlDocImpl() const
 {
 //    _logPartiallyImplemented();
-    return d->m_doc;
+    if (d)
+        return d->m_doc;
+    return 0;
 }
 
 
@@ -1183,6 +1211,12 @@ void KHTMLPart::khtmlMouseMoveEvent( khtml::MouseMoveEvent *event )
 
 }
 
+// [rjw]:  hack-o-rama.  This will all have to change once we
+// implement this correctly.
+ at interface WKWebView : NSObject
+- (void)_resetView;
+ at end
+
 void KHTMLPart::khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event )
 {
   DOM::Node innerNode = event->innerNode();
@@ -1197,7 +1231,7 @@ void KHTMLPart::khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event )
 
     // HACK!  FIXME!
     if (d->m_strSelectedURL != QString::null) {
-        [((KWQHTMLView *)((QWidget *)view())->getView()) resetView];
+        [((WKWebView *)((QWidget *)view())->getView()) _resetView];
         KURL clickedURL(completeURL( splitUrlTarget(d->m_strSelectedURL)));
         openURL (clickedURL);
         // [kocienda]: shield your eyes!
@@ -1399,8 +1433,7 @@ DOM::EventListener *KHTMLPart::createHTMLEventListener( QString code )
 
 QString KHTMLPart::requestFrameName()
 {
-    _logNeverImplemented();
-    return QString();
+    return QString::fromLatin1("<!--frame %1-->").arg(d->m_frameNameId++);
 }
 
 
@@ -1410,15 +1443,6 @@ bool KHTMLPart::frameExists( const QString &frameName )
     return FALSE;
 }
 
-
-bool KHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
-                    const QStringList &args, bool isIFrame)
-{
-    _logNeverImplemented();
-    return FALSE;
-}
-
-
 void KHTMLPart::emitUnloadEvent()
 {
     _logNeverImplemented();
@@ -1437,10 +1461,99 @@ void KHTMLPart::urlSelected( const QString &url, int button, int state, const QS
     _logNeverImplemented();
 }
 
+ at class WKWebDataSource;
+ at class WKWebView;
+
+ at protocol WKWebController
+- (void)addFrame: child toParent: parent;
+- (void)viewForFrameNamed: (NSString *)name inDataSource: (WKWebDataSource *)dataSource;
+ at end
+
+ at interface WKWebDataSource : NSObject
+- initWithURL: (NSURL *)url;
+- (void)_setFrameName: (NSString *)fName;
+- (id <WKWebController>)controller;
+- (void)startLoading: (BOOL)forceRefresh;
+- (void)addFrame: frame;
+- frameNamed: (NSString *)f;
+ at end
+
+ at interface WKWebView (Foo)
+- initWithFrame: (NSRect)frame;
+- (QWidget *)_widget;
+ at end
+
+ at interface WKWebFrame: NSObject
+- initWithName: (NSString *)n view: v dataSource: (WKWebDataSource *)d;
+- view;
+ at end
+
+
+bool KHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
+                    const QStringList &params, bool isIFrame)
+{
+    NSString *nsframeName = QSTRING_TO_NSSTRING(frameName);
+    WKWebFrame *aFrame;
+    WKWebDataSource *childDataSource;
+    NSURL *childURL;
+    WKWebView *childView;
+    WKWebFrame *newFrame;
+    
+    
+    fprintf (stdout, "0x%08x requestFrame():  part = 0x%08x, name = %s, url = %s\n", (unsigned int)this, (unsigned int)frame, frameName.latin1(), url.latin1());    
+    aFrame =[getDataSource() frameNamed: nsframeName];
+    if (aFrame){
+        fprintf (stdout, "0x%08x requestFrame():  part = 0x%08x frame found\n", (unsigned int)this, (unsigned int)frame);    
+        // ?
+        frame->setWidget ([[aFrame view] _widget]);
+    }
+    else {        
+        fprintf (stdout, "0x%08x requestFrame():  part = 0x%08x creating frame\n", (unsigned int)this, (unsigned int)frame);    
+        childURL = [NSURL URLWithString: QSTRING_TO_NSSTRING (completeURL( url ).url() )];
+        childDataSource = [[WKWebDataSource alloc] initWithURL: childURL];
+        [childDataSource _setFrameName: nsframeName];
+        childView = [[WKWebView alloc] initWithFrame: 
+                NSMakeRect (0,0,frame->intrinsicWidth(),frame->intrinsicHeight())];
+    
+        newFrame = [[[WKWebFrame alloc] initWithName: nsframeName view: childView dataSource: childDataSource] autorelease];
+        
+        [getDataSource() addFrame: newFrame];
+        
+        [[getDataSource() controller] addFrame: newFrame toParent: getDataSource()];
+    
+        frame->setWidget ([childView _widget]);
+        
+        [childDataSource startLoading: YES];
+    }
+
+#ifdef _SUPPORT_JAVASCRIPT_URL_    
+    if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 && !isIFrame )
+    {
+        // static cast is safe as of isIFrame being false.
+        // but: shouldn't we support this javascript hack for iframes aswell?
+        khtml::RenderFrame* rf = static_cast<khtml::RenderFrame*>(frame);
+        assert(rf);
+        QVariant res = executeScript( DOM::Node(rf->frameImpl()), url.right( url.length() - 11) );
+        if ( res.type() == QVariant::String ) {
+            KURL myurl;
+            myurl.setProtocol("javascript");
+            myurl.setPath(res.asString());
+            return processObjectRequest(&(*it), myurl, QString("text/html") );
+        }
+        return false;
+    }
+#endif
+
+
+    return true;
+}
+
+
 
 bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, const QString &serviceType,
                     const QStringList &args)
 {
+#ifdef _KWQ_
     WKPluginWidget *pluginWidget;
     
     if(url.isEmpty() || serviceType.isEmpty()){
@@ -1448,10 +1561,27 @@ bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, con
     }
     pluginWidget = new WKPluginWidget(0, url, serviceType, args);
     frame->setWidget(pluginWidget);
+
     return TRUE;
+#else
+    if (url.isEmpty())
+        return false;
+    
+    khtml::ChildFrame child;
+    QValueList<khtml::ChildFrame>::Iterator it = d->m_objects.append( child );
+    (*it).m_frame = frame;
+    (*it).m_type = khtml::ChildFrame::Object;
+    (*it).m_params = params;
+    
+    KParts::URLArgs args;
+    args.serviceType = serviceType;
+    
+    return requestObject( &(*it), completeURL( url ), args );
+#endif
 }
 
 
+
 void KHTMLPart::nodeActivated(const DOM::Node &aNode)
 {
     KWQDEBUG2 ("name %s = %s\n", (const char *)aNode.nodeName().string(), (const char *)aNode.nodeValue().string());
@@ -1500,5 +1630,7 @@ void KHTMLPart::checkCompleted()
         [[NSNotificationCenter defaultCenter] removeObserver:d->m_recv name:urlString object:nil];
         // tell anyone who's interested that we're done
         [[NSNotificationCenter defaultCenter] postNotificationName:@"uri-done" object:urlString];
+
+        end();
     }
 }
diff --git a/WebCore/kwq/KWQString.h b/WebCore/kwq/KWQString.h
index 8bd8fe9..1cbc9cc 100644
--- a/WebCore/kwq/KWQString.h
+++ b/WebCore/kwq/KWQString.h
@@ -161,9 +161,8 @@ public:
 
 // protected -------------------------------------------------------------------
 // private ---------------------------------------------------------------------
-
+    
 private:
-
     // data members ------------------------------------------------------------
 
     UniChar c;
@@ -466,7 +465,7 @@ public:
 
     operator const char *() const;
 
-    QChar operator[](int) const;
+    const QChar operator[](int) const;
 
     QString &operator+=(const QString &);
     QString &operator+=(QChar);
@@ -526,6 +525,19 @@ private:
     friend class QConstString;
     friend class QGDict;
 
+#ifdef _KWQ_
+    void _copyInternalString();
+#endif
+
+#ifdef KWQ_STRING_DEBUG
+    // Added for debugging purposes.  Compiler should optimize.
+    void _cf_release(CFStringRef) const;
+    void _cf_retain(CFStringRef) const;
+#else
+#define _cf_release(s) CFRelease(s)
+#define _cf_retain(s) CFRetain(s)
+#endif
+
 }; // class QString ============================================================
 
 
diff --git a/WebCore/kwq/KWQString.mm b/WebCore/kwq/KWQString.mm
index 0853dab..508d63e 100644
--- a/WebCore/kwq/KWQString.mm
+++ b/WebCore/kwq/KWQString.mm
@@ -25,12 +25,21 @@
 
 // FIXME: obviously many functions here can be made inline
 
+/*
+    This implementation uses CFMutableStringRefs as a rep for the actual
+    string data.  Reps may be shared between QString instances, and follow
+    a copy-on-write sematic.  If you change the implementation be sure to
+    copy the rep before calling any of the CF functions that might mutate
+    the string.
+*/
+
 #include <Foundation/Foundation.h>
 #include <kwqdebug.h>
 #include <qstring.h>
 #include <qregexp.h>
 #include <stdio.h>
 
+
 #ifndef USING_BORROWED_QSTRING
 
 // QString class ===============================================================
@@ -108,7 +117,10 @@ QString QString::fromStringWithEncoding(const char *chs, int len,
                     strncpy(buf, chs, len);
                     *(buf + len) = '\0';
                     CFStringAppendCString(qs.s, buf, encoding);
+#ifdef KWQ_STRING_DEBUG
+#else
                     CFAllocatorDeallocate(kCFAllocatorDefault, buf);
+#endif
                 }
 #else
                 const int capacity = 64;
@@ -151,7 +163,10 @@ QString QString::fromCFString(CFStringRef cfs)
 
     ref = CFStringCreateMutableCopy(NULL, CFStringGetLength(cfs), cfs);
     qs = QString::fromCFMutableString(ref);
+#ifdef KWQ_STRING_DEBUG
+#else
     CFRelease(ref);
+#endif
     
     return qs;
 }
@@ -168,13 +183,32 @@ QString::QString()
     cacheType = CacheInvalid;
 }
 
+#ifdef KWQ_STRING_DEBUG
+void QString::_cf_release(CFStringRef x) const
+{
+    //if (x)
+    //    CFRelease(x);
+}
+
+void QString::_cf_retain(CFStringRef x) const
+{
+    if (x)
+        CFRetain(x);
+    else
+        fprintf (stderr, "Attempt to retain nil string\n");
+}
+#endif
+
 QString::~QString()
 {
     if (s) {
-        CFRelease(s);
+        _cf_release(s);
     }
     if (cache) {
+#ifdef KWQ_STRING_DEBUG
+#else
         CFAllocatorDeallocate(kCFAllocatorDefault, cache);
+#endif
     }
 }
 
@@ -252,7 +286,7 @@ QString::QString(const QString &qs)
 {
     // shared copy
     if (qs.s) {
-        CFRetain(qs.s);
+        _cf_retain(qs.s);
     }
     s = qs.s;
     cache = NULL;
@@ -265,10 +299,10 @@ QString &QString::operator=(const QString &qs)
 {
     // shared copy
     if (qs.s) {
-        CFRetain(qs.s);
+        _cf_retain(qs.s);
     }
     if (s) {
-        CFRelease(s);
+        _cf_release(s);
     }
     s = qs.s;
     cacheType = CacheInvalid;
@@ -495,7 +529,7 @@ int QString::find(const char *chs, int index, bool cs) const
                         cs ? 0 : kCFCompareCaseInsensitive, &r)) {
                     pos = r.location;
                 }
-                CFRelease(tmp);
+                _cf_release(tmp);
             }
         }
     }
@@ -554,7 +588,7 @@ int QString::findRev(const char *chs, int index) const
                         kCFCompareBackwards, &r)) {
                     pos = r.location;
                 }
-                CFRelease(tmp);
+                _cf_release(tmp);
             }
         }
     }
@@ -600,7 +634,7 @@ int QString::contains(const char *chs, bool cs) const
                 // move to next possible overlapping match
                 pos += r.location + 1;
             }
-            CFRelease(tmp);
+            _cf_release(tmp);
         }
     }
     return c;
@@ -728,7 +762,7 @@ QString QString::arg(const QString &replacement, int width) const
                     if (tmp) {
                         CFStringPad(tmp, CFSTR(" "), padding, 0);
                         CFStringInsert(qs.s, pos, tmp);
-                        CFRelease(tmp);
+                        _cf_release(tmp);
                     }
                 }
             }
@@ -797,10 +831,10 @@ QString QString::mid(uint index, uint width) const
                 if (tmp) {
                     qs.s = CFStringCreateMutableCopy(kCFAllocatorDefault, 0,
                             tmp);
-                    CFRelease(tmp);
+                    _cf_release(tmp);
                 }
             } else {
-                CFRetain(s);
+                _cf_retain(s);
                 qs.s = s;
             }
         }
@@ -824,7 +858,7 @@ QString QString::lower() const
         qs.s = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, s);
     }
     if (qs.s) {
-	CFStringLowercase(qs.s, NULL);
+	    CFStringLowercase(qs.s, NULL);
     }
     return qs;
 }
@@ -847,7 +881,7 @@ QString QString::stripWhiteSpace() const
                 }
             }
             if (!qs.s) {
-                CFRetain(s);
+                _cf_retain(s);
                 qs.s = s;
             }
         }
@@ -906,7 +940,7 @@ QString QString::simplifyWhiteSpace() const
                     CFStringAppendCharacters(qs.s, buf, fill);
                 }
             } else {
-                CFRetain(s);
+                _cf_retain(s);
                 qs.s = s;
             }
         }
@@ -918,21 +952,14 @@ QString &QString::setUnicode(const QChar *qcs, uint len)
 {
     flushCache();
     if (qcs && len) {
+        if (s) 
+            _cf_release(s);
+        s = CFStringCreateMutable(kCFAllocatorDefault, 0);
         if (s) {
-            CFStringRef tmp = CFStringCreateWithCharactersNoCopy(
-                    kCFAllocatorDefault, &qcs->c, len, kCFAllocatorNull);
-            if (tmp) {
-                CFStringReplaceAll(s, tmp);
-                CFRelease(tmp);
-            }
-        } else {
-            s = CFStringCreateMutable(kCFAllocatorDefault, 0);
-            if (s) {
-                CFStringAppendCharacters(s, &qcs->c, len);
-            }
+            CFStringAppendCharacters(s, &qcs->c, len);
         }
     } else if (s) {
-        CFRelease(s);
+        _cf_release(s);
         s = NULL;
     }
     return *this;
@@ -942,22 +969,14 @@ QString &QString::setLatin1(const char *chs)
 {
     flushCache();
     if (chs && *chs) {
+        if (s) 
+            _cf_release(s);
+        s = CFStringCreateMutable(kCFAllocatorDefault, 0);
         if (s) {
-            CFStringRef tmp = CFStringCreateWithCStringNoCopy(
-                    kCFAllocatorDefault, chs, kCFStringEncodingISOLatin1,
-                    kCFAllocatorNull);
-            if (tmp) {
-                CFStringReplaceAll(s, tmp);
-                CFRelease(tmp);
-            }
-        } else {
-            s = CFStringCreateMutable(kCFAllocatorDefault, 0);
-            if (s) {
-                CFStringAppendCString(s, chs, kCFStringEncodingISOLatin1);
-            }
+            CFStringAppendCString(s, chs, kCFStringEncodingISOLatin1);
         }
     } else if (s) {
-        CFRelease(s);
+        _cf_release(s);
         s = NULL;
     }
     return *this;
@@ -1019,24 +1038,23 @@ QString &QString::sprintf(const char *format, ...)
     va_start(args, format);
     flushCache();
     if (format && *format) {
-        if (!s) {
-            s = CFStringCreateMutable(kCFAllocatorDefault, 0);
-        }
-        if (s) {
-            CFStringRef f = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault,
-                    format, kCFStringEncodingISOLatin1, kCFAllocatorNull);
-            if (f) {
-                CFStringRef tmp = CFStringCreateWithFormatAndArguments(
-                        kCFAllocatorDefault, NULL, f, args);
-                if (tmp) {
-                    CFStringReplaceAll(s, tmp);
-                    CFRelease(tmp);
-                }
-                CFRelease(f);
+        if (s)
+            _cf_release(s);
+
+        s = CFStringCreateMutable(kCFAllocatorDefault, 0);
+        CFStringRef f = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault,
+                format, kCFStringEncodingISOLatin1, kCFAllocatorNull);
+        if (f) {
+            CFStringRef tmp = CFStringCreateWithFormatAndArguments(
+                    kCFAllocatorDefault, NULL, f, args);
+            if (tmp) {
+                CFStringReplaceAll(s, tmp);
+                _cf_release(tmp);
             }
+            _cf_release(f);
         }
     } else if (s) {
-        CFRelease(s);
+        _cf_release(s);
         s = NULL;
     }
     va_end(args);
@@ -1053,15 +1071,28 @@ QString &QString::append(const QString &qs)
     return insert(length(), qs);
 }
 
+void QString::_copyInternalString()
+{
+    if (s) {
+        CFMutableStringRef tmp;
+        tmp = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, s);
+        CFRelease (s);
+        s = tmp;
+    }
+}
+
 QString &QString::insert(uint index, const QString &qs)
 {
     flushCache();
     if (qs.s) {
         CFIndex len = CFStringGetLength(qs.s);
         if (len) {
+            // How do we know that s mutable?
+            // 
             if (!s) {
                 s = CFStringCreateMutable(kCFAllocatorDefault, 0);
             }
+            _copyInternalString();
             if (s) {
                 if (index < (uint)CFStringGetLength(s)) {
                     CFStringInsert(s, index, qs.s);
@@ -1093,6 +1124,7 @@ QString &QString::remove(uint index, uint width)
             if (width > (len - index)) {
                 width = len - index;
             }
+            _copyInternalString();
             CFStringDelete(s, CFRangeMake(index, width));
         }
     }
@@ -1111,6 +1143,7 @@ QString &QString::replace(const QRegExp &qre, const QString &qs)
                 break;
             }
             CFRange r = CFRangeMake(i, width);
+            _copyInternalString();
             if (len) {
                 CFStringReplace(s, r, qs.s);
             } else {
@@ -1127,11 +1160,12 @@ void QString::truncate(uint newLen)
     if (s) {
         if (newLen) {
             CFIndex len = CFStringGetLength(s);
+            _copyInternalString();
             if (len && (newLen < (uint)len)) {
                 CFStringDelete(s, CFRangeMake(newLen, len - newLen));
             }
         } else {
-            CFRelease(s);
+            _cf_release(s);
             s = NULL;
         }
     }
@@ -1144,7 +1178,7 @@ void QString::fill(QChar qc, int len)
         if (len < 0) {
             len = CFStringGetLength(s);
         }
-        CFRelease(s);
+        _cf_release(s);
         s = NULL;
     }
     if (len > 0) {
@@ -1157,7 +1191,10 @@ void QString::fill(QChar qc, int len)
             s = CFStringCreateMutableWithExternalCharactersNoCopy(
                     kCFAllocatorDefault, ucs, len, 0, kCFAllocatorDefault);
             if (!s) {
+#ifdef KWQ_STRING_DEBUG
+#else
                 CFAllocatorDeallocate(kCFAllocatorDefault, ucs);
+#endif
             }
         }
     }
@@ -1193,7 +1230,7 @@ QString::operator const char *() const
     return latin1();
 }
 
-QChar QString::operator[](int index) const
+const QChar QString::operator[](int index) const
 {
     if (index >= 0) {
         return at(index);
@@ -1221,7 +1258,10 @@ QString &QString::operator+=(char ch)
 void QString::flushCache() const
 {
     if (cache) {
+#ifdef KWQ_STRING_DEBUG
+#else
         CFAllocatorDeallocate(kCFAllocatorDefault, cache);
+#endif
         cache = NULL;
         cacheType = CacheInvalid;
     }
@@ -1241,7 +1281,10 @@ QCString QString::convertToQCString(CFStringEncoding enc) const
                 *reinterpret_cast<char *>(chs) = '\0';
             }
             QCString qcs = QCString(chs);
+#ifdef KWQ_STRING_DEBUG
+#else
             CFAllocatorDeallocate(kCFAllocatorDefault, chs);
+#endif
             return qcs;
         }
     }
@@ -1348,10 +1391,10 @@ QString QString::leftRight(uint width, bool left) const
                 if (tmp) {
                     qs.s = CFStringCreateMutableCopy(kCFAllocatorDefault, 0,
                             tmp);
-                    CFRelease(tmp);
+                    _cf_release(tmp);
                 }
             } else {
-                CFRetain(s);
+                _cf_retain(s);
                 qs.s = s;
             }
         }
@@ -1372,7 +1415,7 @@ int QString::compareToLatin1(const char *chs) const
             kCFAllocatorNull);
     if (tmp) {
         int result = CFStringCompare(s, tmp, 0);
-        CFRelease(tmp);
+        _cf_release(tmp);
         return result;
     }
     return kCFCompareGreaterThan;
@@ -1406,7 +1449,7 @@ bool operator==(const QString &qs, const char *chs)
                 kCFAllocatorNull);
         if (tmp) {
             result = CFStringCompare(qs.s, tmp, 0) == kCFCompareEqualTo;
-            CFRelease(tmp);
+            _cf_release(tmp);
         }
     }
     return result;
diff --git a/WebCore/kwq/qt/_qurl.cpp b/WebCore/kwq/qt/_qurl.cpp
index 3c5ca9e..a82de3c 100644
--- a/WebCore/kwq/qt/_qurl.cpp
+++ b/WebCore/kwq/qt/_qurl.cpp
@@ -62,6 +62,9 @@ struct QUrlPrivate
 
 static void slashify( QString& s, bool allowMultiple = TRUE )
 {
+#ifdef _KWQ_
+    fprintf (stderr, "UNSAFE API, should not be called.  This entire class will not be used when KURL is finished.\n");
+#else
     bool justHadSlash = FALSE;
     for ( int i = 0; i < (int)s.length(); i++ ) {
 	if ( !allowMultiple && justHadSlash &&
@@ -77,6 +80,7 @@ static void slashify( QString& s, bool allowMultiple = TRUE )
 	else
 	    justHadSlash = FALSE;
     }
+#endif
 }
 
 // NOT REVISED
@@ -1016,6 +1020,9 @@ QString QUrl::dirPath() const
 
 void QUrl::encode( QString& url )
 {
+#ifdef _KWQ_
+    fprintf (stderr, "UNSAFE API, should not be called.  This entire class will not be used when KURL is finished.\n");
+#else
     int oldlen = url.length();
 
     if ( !oldlen )
@@ -1044,8 +1051,10 @@ void QUrl::encode( QString& url )
     }
 
     url = newUrl;
+#endif
 }
 
+#ifndef _KWQ_
 static ushort hex_to_int( ushort c )
 {
     if ( c >= 'A' && c <= 'F')
@@ -1056,6 +1065,8 @@ static ushort hex_to_int( ushort c )
 	return c - '0';
     return 0;
 }
+#endif
+
 
 /*!
   Decodes the string \a url.
@@ -1063,6 +1074,9 @@ static ushort hex_to_int( ushort c )
 
 void QUrl::decode( QString& url )
 {
+#ifdef _KWQ_
+    fprintf (stderr, "UNSAFE API, should not be called.  This entire class will not be used when KURL is finished.\n");
+#else
     int oldlen = url.length();
     if ( !oldlen )
 	return;
@@ -1082,6 +1096,7 @@ void QUrl::decode( QString& url )
     }
 
     url = newUrl;
+#endif
 }
 
 /*!  Composes a string of the URL and returns it. If \a encodedPath is
diff --git a/WebCore/kwq/qt/qstring.h b/WebCore/kwq/qt/qstring.h
index 8bd8fe9..1cbc9cc 100644
--- a/WebCore/kwq/qt/qstring.h
+++ b/WebCore/kwq/qt/qstring.h
@@ -161,9 +161,8 @@ public:
 
 // protected -------------------------------------------------------------------
 // private ---------------------------------------------------------------------
-
+    
 private:
-
     // data members ------------------------------------------------------------
 
     UniChar c;
@@ -466,7 +465,7 @@ public:
 
     operator const char *() const;
 
-    QChar operator[](int) const;
+    const QChar operator[](int) const;
 
     QString &operator+=(const QString &);
     QString &operator+=(QChar);
@@ -526,6 +525,19 @@ private:
     friend class QConstString;
     friend class QGDict;
 
+#ifdef _KWQ_
+    void _copyInternalString();
+#endif
+
+#ifdef KWQ_STRING_DEBUG
+    // Added for debugging purposes.  Compiler should optimize.
+    void _cf_release(CFStringRef) const;
+    void _cf_retain(CFStringRef) const;
+#else
+#define _cf_release(s) CFRelease(s)
+#define _cf_retain(s) CFRetain(s)
+#endif
+
 }; // class QString ============================================================
 
 
diff --git a/WebCore/src/kdelibs/khtml/dom/dom_misc.cpp b/WebCore/src/kdelibs/khtml/dom/dom_misc.cpp
index e746382..de664e1 100644
--- a/WebCore/src/kdelibs/khtml/dom/dom_misc.cpp
+++ b/WebCore/src/kdelibs/khtml/dom/dom_misc.cpp
@@ -24,6 +24,8 @@
 #include "dom_misc.h"
 using namespace DOM;
 
+#include <stdio.h>
+
 DomShared::~DomShared()
 {
   // deliberately left blank
@@ -36,4 +38,25 @@ bool DomShared::deleteMe()
   return false;
 }
 
+#ifdef _KWQ_
+void *DomShared::instanceToCheck;
+
+void DomShared::ref()
+{
+    if (((void *)this) == instanceToCheck){
+        printf ("0x%08x incrementing ref %d\n", (unsigned int)this, _ref);
+    }
+    _ref++;
+}
 
+void DomShared::deref() 
+{
+    if (((void *)this) == instanceToCheck){
+        fprintf (stdout, "0x%08x decrementing ref %d\n", (unsigned int)this, _ref);
+    }
+    if(_ref)
+        _ref--; 
+    if(!_ref && deleteMe())
+        delete this; 
+}
+#endif
diff --git a/WebCore/src/kdelibs/khtml/dom/dom_misc.h b/WebCore/src/kdelibs/khtml/dom/dom_misc.h
index 9241f77..265b571 100644
--- a/WebCore/src/kdelibs/khtml/dom/dom_misc.h
+++ b/WebCore/src/kdelibs/khtml/dom/dom_misc.h
@@ -32,6 +32,7 @@ namespace DOM {
  * Other objects should overload deleteMe() to fit their needs. The default
  * implementation deletes the object if the ref count drops to 0.
  */
+ 
 class DomShared
 {
 public:
@@ -42,8 +43,16 @@ public:
    */
   virtual bool deleteMe();
 
+#ifndef _KWQ_
   void ref() { _ref++; }
   void deref() { if(_ref) _ref--; if(!_ref && deleteMe()) delete this; }
+#else
+  static void *instanceToCheck;
+
+  void ref();
+  void deref();
+#endif
+
   // ###  KDE 3.0: add const
   bool hasOneRef() { return _ref == 1; }
   unsigned int refCount() const { return _ref; }
diff --git a/WebCore/src/kdelibs/khtml/html/html_formimpl.cpp b/WebCore/src/kdelibs/khtml/html/html_formimpl.cpp
index 4fc14ea..cae01fb 100644
--- a/WebCore/src/kdelibs/khtml/html/html_formimpl.cpp
+++ b/WebCore/src/kdelibs/khtml/html/html_formimpl.cpp
@@ -180,9 +180,26 @@ QByteArray HTMLFormElementImpl::formData()
     QCString enc_string = ""; // used for non-multipart data
 
     // find out the QTextcodec to use
+#ifdef _KWQ_
+    QString origStr = m_acceptcharset.string();
+    QChar space(' ');
+    QChar strChars[origStr.length()];
+
+    for(unsigned int i=0; i < origStr.length(); i++)
+        if(origStr[i].latin1() == ',')
+            strChars[i] = space;
+        else
+            strChars[i] = origStr[i];
+    QString str(strChars, origStr.length());
+#else
     QString str = m_acceptcharset.string();
     QChar space(' ');
-    for(unsigned int i=0; i < str.length(); i++) if(str[i].latin1() == ',') str[i] = space;
+
+    for(unsigned int i=0; i < str.length(); i++)
+        if(str[i].latin1() == ',')
+            str[i] = space;
+#endif
+
     QStringList charsets = QStringList::split(' ', str);
     QTextCodec* codec = 0;
     for ( QStringList::Iterator it = charsets.begin(); it != charsets.end(); ++it )
@@ -208,9 +225,17 @@ QByteArray HTMLFormElementImpl::formData()
     if(!codec)
         codec = QTextCodec::codecForLocale();
 
+#ifdef _KWQ_
+    QString encCharset = codec->name();
+    QChar encChars[encCharset.length()];
+    for(unsigned int i=0; i < encCharset.length(); i++)
+        encChars[i] = encCharset[i].latin1() == ' ' ? QChar('-') : encCharset[i].lower();
+    QString m_encCharset(encChars,  encCharset.length());
+#else
     m_encCharset = codec->name();
     for(unsigned int i=0; i < m_encCharset.length(); i++)
         m_encCharset[i] = m_encCharset[i].latin1() == ' ' ? QChar('-') : m_encCharset[i].lower();
+#endif
 
     for(HTMLGenericFormElementImpl *current = formElements.first(); current; current = formElements.next())
     {
@@ -1484,15 +1509,27 @@ void HTMLSelectElementImpl::setValue(DOMStringImpl* /*value*/)
 
 QString HTMLSelectElementImpl::state( )
 {
-    QString state;
     QArray<HTMLGenericFormElementImpl*> items = listItems();
 
     int l = items.count();
 
+#ifndef _KWQ_
+    QString state;
+
     state.fill('.', l);
     for(int i = 0; i < l; i++)
         if(items[i]->id() == ID_OPTION && static_cast<HTMLOptionElementImpl*>(items[i])->selected())
             state[i] = 'X';
+#else
+    QChar stateChars[l];
+    
+    for(int i = 0; i < l; i++)
+        if(items[i]->id() == ID_OPTION && static_cast<HTMLOptionElementImpl*>(items[i])->selected())
+            stateChars[i] = 'X';
+        else
+            stateChars[i] = '.';
+    QString state(stateChars, l);
+#endif
 
     return state;
 }
@@ -1504,7 +1541,13 @@ void HTMLSelectElementImpl::restoreState(const QString &_state)
     QString state = _state;
     if(!state.isEmpty() && !state.contains('X') && !m_multiple) {
         ASSERT("should not happen in restoreState!");
+#ifdef _KWQ_
+        // Invalid access to string's internal buffer.  Should never get here
+        // anyway.
+        //state[0] = 'X';
+#else
         state[0] = 'X';
+#endif
     }
 
     QArray<HTMLGenericFormElementImpl*> items = listItems();
diff --git a/WebCore/src/kdelibs/khtml/khtmlview.cpp b/WebCore/src/kdelibs/khtml/khtmlview.cpp
index 608b68f..ca3f73f 100644
--- a/WebCore/src/kdelibs/khtml/khtmlview.cpp
+++ b/WebCore/src/kdelibs/khtml/khtmlview.cpp
@@ -200,14 +200,6 @@ KHTMLView::KHTMLView( KHTMLPart *part, QWidget *parent, const char *name)
 
 KHTMLView::~KHTMLView()
 {
-    if (m_part)
-    {
-        //WABA: Is this Ok? Do I need to deref it as well?
-        //Does this need to be done somewhere else?
-        DOM::DocumentImpl *doc = m_part->xmlDocImpl();
-        if (doc)
-            doc->detach();
-    }
     lstViews->removeRef( this );
     if(lstViews->isEmpty())
     {
diff --git a/WebCore/src/kdelibs/khtml/xml/dom_stringimpl.cpp b/WebCore/src/kdelibs/khtml/xml/dom_stringimpl.cpp
index 5327766..6e39f88 100644
--- a/WebCore/src/kdelibs/khtml/xml/dom_stringimpl.cpp
+++ b/WebCore/src/kdelibs/khtml/xml/dom_stringimpl.cpp
@@ -213,7 +213,6 @@ Length DOMStringImpl::toLength() const
 
 QList<Length> *DOMStringImpl::toLengthList() const
 {
-    QString str(s, l);
     int pos = 0;
     int pos2;
 
@@ -221,12 +220,29 @@ QList<Length> *DOMStringImpl::toLengthList() const
     // to fix lists like "1,2px 3 ,4"
     // make sure not to break percentage or relative widths
     // ### what about "auto" ?
+#ifdef _KWQ_
+    QChar spacified[l];
+    QChar space(' ');
+    for(unsigned int i=0; i < l; i++) {
+        QChar cc = s[i];
+        if ( cc > '9' || ( cc < '0' && cc != '-' && cc != '*' && cc != '%' && cc != '.') ){
+            spacified[i] = space;
+        }
+        else {
+            spacified[i] = cc;
+        }
+    }
+    QString str(spacified, l);
+#else
+    QString str(s, l);
     QChar space(' ');
     for(unsigned int i=0; i < l; i++) {
         char cc = str[i].latin1();
-        if ( cc > '9' || ( cc < '0' && cc != '-' && cc != '*' && cc != '%' && cc != '.') )
+        if ( cc > '9' || ( cc < '0' && cc != '-' && cc != '*' && cc != '%' && cc != '.') ){
             str[i] = space;
+        }
     }
+#endif
     str = str.simplifyWhiteSpace();
 
     QList<Length> *list = new QList<Length>;
diff --git a/WebCore/src/kwq/KWQComboBox.mm b/WebCore/src/kwq/KWQComboBox.mm
index 975a0a8..f2f94ec 100644
--- a/WebCore/src/kwq/KWQComboBox.mm
+++ b/WebCore/src/kwq/KWQComboBox.mm
@@ -118,7 +118,11 @@ void QComboBox::clear()
 void QComboBox::setCurrentItem(int index)
 {
     KWQNSComboBox *comboBox = (KWQNSComboBox *)getView();
-    [comboBox selectItemAtIndex: index];
+    int num = [comboBox numberOfItems];
+    if (num != 0 && index < num)
+        [comboBox selectItemAtIndex: index];
+    else
+        NSLog (@"Error, index incorrect");
 }
 
 
diff --git a/WebCore/src/kwq/KWQKHTMLPart.h b/WebCore/src/kwq/KWQKHTMLPart.h
index cfa0a63..b190c9d 100644
--- a/WebCore/src/kwq/KWQKHTMLPart.h
+++ b/WebCore/src/kwq/KWQKHTMLPart.h
@@ -46,6 +46,10 @@ class KJavaAppletContext;
 class KJSProxy;
 class KHTMLPartPrivate;
 
+#if (defined(__APPLE__) && defined(__OBJC__) && defined(__cplusplus))
+ at class WKWebDataSource;
+#endif
+
 namespace DOM
 {
   class HTMLDocument;
@@ -57,6 +61,7 @@ namespace DOM
 namespace khtml
 {
   class RenderPart;
+  struct ChildFrame;
 };
 
 extern "C" {
@@ -560,6 +565,7 @@ public:
                             const QString &_target = QString::null ); // ### KDE 3.0: make private
     bool requestObject( khtml::RenderPart *frame, const QString &url, const QString &serviceType,
                         const QStringList &args = QStringList() );
+
     void nodeActivated(const DOM::Node &);
     QVariant executeScheduledScript();
     void stopAutoScroll();
@@ -586,12 +592,30 @@ public:
     // associated sub-URIs have loaded
     void checkCompleted();
 
+#ifdef _KWQ_
+#if (defined(__APPLE__) && defined(__OBJC__) && defined(__cplusplus))
+    // Not retained.
+    void setDataSource(WKWebDataSource *d) { dataSource = d; }
+    WKWebDataSource *getDataSource() { return dataSource; }
+#else
+    void setDataSource(void *d) { dataSource = d; }
+    void *getDataSource() { return dataSource; }
+#endif
+#endif
+
 private:
 
     KHTMLPartPrivate *d;
     // DUBIOUS, why are impls being referenced?
     DOM::HTMLDocumentImpl *docImpl() const;    
 
+#ifdef _KWQ_
+#if (defined(__APPLE__) && defined(__OBJC__) && defined(__cplusplus))
+    WKWebDataSource *dataSource;
+#else    
+    void *dataSource;
+#endif
+#endif
 };
 
 #endif
diff --git a/WebCore/src/kwq/KWQKHTMLPart.mm b/WebCore/src/kwq/KWQKHTMLPart.mm
index 9d1993d..d6307ec 100644
--- a/WebCore/src/kwq/KWQKHTMLPart.mm
+++ b/WebCore/src/kwq/KWQKHTMLPart.mm
@@ -186,6 +186,8 @@ public:
     QPoint m_dragLastPos;
 #endif
 
+    int m_frameNameId;
+
     KHTMLPartPrivate(KHTMLPart *part)
     {
         if (!cache_init) {
@@ -194,7 +196,10 @@ public:
         }
         m_part = part;
         m_view = 0L;
+        
+        // Why is this allocated here?
         m_doc = new HTMLDocumentImpl();
+        
         m_decoder = 0L;
         m_bFirstData = true;
         //m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
@@ -206,11 +211,25 @@ public:
         m_jscript = 0L;
         m_runningScripts = 0;
         m_onlyLocalReferences = 0;
+
+        m_frameNameId = 1;
     }
 
     ~KHTMLPartPrivate()
     {
-        [m_recv release];   
+        if ( m_doc )
+             m_doc->detach();
+
+        if (m_doc->refCount() != 1)
+            fprintf (stdout, "Warning:  document reference count not 1 as expect,  ref = %d\n", m_doc->refCount());
+        if ( m_doc )
+           m_doc->deref();
+        
+        m_doc = 0;
+
+        delete m_settings;
+
+        [m_recv autorelease];   
     }
 
 };
@@ -238,7 +257,6 @@ void KHTMLPart::init()
 KHTMLPart::~KHTMLPart()
 {
     delete d;
-    _logNotYetImplemented();
     NSLog(@"destructing KHTMLPart");
 }
 
@@ -513,6 +531,7 @@ void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset)
     //d->m_referrer = url.url();
     
     d->m_doc = new HTMLDocumentImpl(d->m_view);
+    //DomShared::instanceToCheck = (void *)((DomShared *)d->m_doc);
     d->m_doc->ref();
 
     d->m_baseURL = KURL();
@@ -599,7 +618,9 @@ void KHTMLPart::write(const char *str, int len)
     
     double start = CFAbsoluteTimeGetCurrent();
     
+#ifdef _KWQ_TIMING        
     QString decoded = d->m_decoder->decode( str, len );
+#endif
             
     if(decoded.isEmpty())
         return;
@@ -638,10 +659,15 @@ void KHTMLPart::write( const QString &str )
 
 void KHTMLPart::end()
 {
+    fprintf (stdout, "0x%08x end(): for url %s\n", (unsigned int)this, d->m_url.url().latin1());
     // make sure nothing's left in there...
-    if(d->m_decoder)
-        write(d->m_decoder->flush());
-    d->m_doc->finishParsing();
+    //if(d->m_decoder)
+    //    write(d->m_decoder->flush());
+    //d->m_doc->finishParsing();
+
+    QString str = d->m_doc->recursive_toHTML(1);
+    
+    d->m_doc->close();
 }
 
 
@@ -884,7 +910,9 @@ DOM::HTMLDocumentImpl *KHTMLPart::docImpl() const
 DOM::DocumentImpl *KHTMLPart::xmlDocImpl() const
 {
 //    _logPartiallyImplemented();
-    return d->m_doc;
+    if (d)
+        return d->m_doc;
+    return 0;
 }
 
 
@@ -1183,6 +1211,12 @@ void KHTMLPart::khtmlMouseMoveEvent( khtml::MouseMoveEvent *event )
 
 }
 
+// [rjw]:  hack-o-rama.  This will all have to change once we
+// implement this correctly.
+ at interface WKWebView : NSObject
+- (void)_resetView;
+ at end
+
 void KHTMLPart::khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event )
 {
   DOM::Node innerNode = event->innerNode();
@@ -1197,7 +1231,7 @@ void KHTMLPart::khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event )
 
     // HACK!  FIXME!
     if (d->m_strSelectedURL != QString::null) {
-        [((KWQHTMLView *)((QWidget *)view())->getView()) resetView];
+        [((WKWebView *)((QWidget *)view())->getView()) _resetView];
         KURL clickedURL(completeURL( splitUrlTarget(d->m_strSelectedURL)));
         openURL (clickedURL);
         // [kocienda]: shield your eyes!
@@ -1399,8 +1433,7 @@ DOM::EventListener *KHTMLPart::createHTMLEventListener( QString code )
 
 QString KHTMLPart::requestFrameName()
 {
-    _logNeverImplemented();
-    return QString();
+    return QString::fromLatin1("<!--frame %1-->").arg(d->m_frameNameId++);
 }
 
 
@@ -1410,15 +1443,6 @@ bool KHTMLPart::frameExists( const QString &frameName )
     return FALSE;
 }
 
-
-bool KHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
-                    const QStringList &args, bool isIFrame)
-{
-    _logNeverImplemented();
-    return FALSE;
-}
-
-
 void KHTMLPart::emitUnloadEvent()
 {
     _logNeverImplemented();
@@ -1437,10 +1461,99 @@ void KHTMLPart::urlSelected( const QString &url, int button, int state, const QS
     _logNeverImplemented();
 }
 
+ at class WKWebDataSource;
+ at class WKWebView;
+
+ at protocol WKWebController
+- (void)addFrame: child toParent: parent;
+- (void)viewForFrameNamed: (NSString *)name inDataSource: (WKWebDataSource *)dataSource;
+ at end
+
+ at interface WKWebDataSource : NSObject
+- initWithURL: (NSURL *)url;
+- (void)_setFrameName: (NSString *)fName;
+- (id <WKWebController>)controller;
+- (void)startLoading: (BOOL)forceRefresh;
+- (void)addFrame: frame;
+- frameNamed: (NSString *)f;
+ at end
+
+ at interface WKWebView (Foo)
+- initWithFrame: (NSRect)frame;
+- (QWidget *)_widget;
+ at end
+
+ at interface WKWebFrame: NSObject
+- initWithName: (NSString *)n view: v dataSource: (WKWebDataSource *)d;
+- view;
+ at end
+
+
+bool KHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
+                    const QStringList &params, bool isIFrame)
+{
+    NSString *nsframeName = QSTRING_TO_NSSTRING(frameName);
+    WKWebFrame *aFrame;
+    WKWebDataSource *childDataSource;
+    NSURL *childURL;
+    WKWebView *childView;
+    WKWebFrame *newFrame;
+    
+    
+    fprintf (stdout, "0x%08x requestFrame():  part = 0x%08x, name = %s, url = %s\n", (unsigned int)this, (unsigned int)frame, frameName.latin1(), url.latin1());    
+    aFrame =[getDataSource() frameNamed: nsframeName];
+    if (aFrame){
+        fprintf (stdout, "0x%08x requestFrame():  part = 0x%08x frame found\n", (unsigned int)this, (unsigned int)frame);    
+        // ?
+        frame->setWidget ([[aFrame view] _widget]);
+    }
+    else {        
+        fprintf (stdout, "0x%08x requestFrame():  part = 0x%08x creating frame\n", (unsigned int)this, (unsigned int)frame);    
+        childURL = [NSURL URLWithString: QSTRING_TO_NSSTRING (completeURL( url ).url() )];
+        childDataSource = [[WKWebDataSource alloc] initWithURL: childURL];
+        [childDataSource _setFrameName: nsframeName];
+        childView = [[WKWebView alloc] initWithFrame: 
+                NSMakeRect (0,0,frame->intrinsicWidth(),frame->intrinsicHeight())];
+    
+        newFrame = [[[WKWebFrame alloc] initWithName: nsframeName view: childView dataSource: childDataSource] autorelease];
+        
+        [getDataSource() addFrame: newFrame];
+        
+        [[getDataSource() controller] addFrame: newFrame toParent: getDataSource()];
+    
+        frame->setWidget ([childView _widget]);
+        
+        [childDataSource startLoading: YES];
+    }
+
+#ifdef _SUPPORT_JAVASCRIPT_URL_    
+    if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 && !isIFrame )
+    {
+        // static cast is safe as of isIFrame being false.
+        // but: shouldn't we support this javascript hack for iframes aswell?
+        khtml::RenderFrame* rf = static_cast<khtml::RenderFrame*>(frame);
+        assert(rf);
+        QVariant res = executeScript( DOM::Node(rf->frameImpl()), url.right( url.length() - 11) );
+        if ( res.type() == QVariant::String ) {
+            KURL myurl;
+            myurl.setProtocol("javascript");
+            myurl.setPath(res.asString());
+            return processObjectRequest(&(*it), myurl, QString("text/html") );
+        }
+        return false;
+    }
+#endif
+
+
+    return true;
+}
+
+
 
 bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, const QString &serviceType,
                     const QStringList &args)
 {
+#ifdef _KWQ_
     WKPluginWidget *pluginWidget;
     
     if(url.isEmpty() || serviceType.isEmpty()){
@@ -1448,10 +1561,27 @@ bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, con
     }
     pluginWidget = new WKPluginWidget(0, url, serviceType, args);
     frame->setWidget(pluginWidget);
+
     return TRUE;
+#else
+    if (url.isEmpty())
+        return false;
+    
+    khtml::ChildFrame child;
+    QValueList<khtml::ChildFrame>::Iterator it = d->m_objects.append( child );
+    (*it).m_frame = frame;
+    (*it).m_type = khtml::ChildFrame::Object;
+    (*it).m_params = params;
+    
+    KParts::URLArgs args;
+    args.serviceType = serviceType;
+    
+    return requestObject( &(*it), completeURL( url ), args );
+#endif
 }
 
 
+
 void KHTMLPart::nodeActivated(const DOM::Node &aNode)
 {
     KWQDEBUG2 ("name %s = %s\n", (const char *)aNode.nodeName().string(), (const char *)aNode.nodeValue().string());
@@ -1500,5 +1630,7 @@ void KHTMLPart::checkCompleted()
         [[NSNotificationCenter defaultCenter] removeObserver:d->m_recv name:urlString object:nil];
         // tell anyone who's interested that we're done
         [[NSNotificationCenter defaultCenter] postNotificationName:@"uri-done" object:urlString];
+
+        end();
     }
 }
diff --git a/WebCore/src/kwq/KWQString.mm b/WebCore/src/kwq/KWQString.mm
index 0853dab..508d63e 100644
--- a/WebCore/src/kwq/KWQString.mm
+++ b/WebCore/src/kwq/KWQString.mm
@@ -25,12 +25,21 @@
 
 // FIXME: obviously many functions here can be made inline
 
+/*
+    This implementation uses CFMutableStringRefs as a rep for the actual
+    string data.  Reps may be shared between QString instances, and follow
+    a copy-on-write sematic.  If you change the implementation be sure to
+    copy the rep before calling any of the CF functions that might mutate
+    the string.
+*/
+
 #include <Foundation/Foundation.h>
 #include <kwqdebug.h>
 #include <qstring.h>
 #include <qregexp.h>
 #include <stdio.h>
 
+
 #ifndef USING_BORROWED_QSTRING
 
 // QString class ===============================================================
@@ -108,7 +117,10 @@ QString QString::fromStringWithEncoding(const char *chs, int len,
                     strncpy(buf, chs, len);
                     *(buf + len) = '\0';
                     CFStringAppendCString(qs.s, buf, encoding);
+#ifdef KWQ_STRING_DEBUG
+#else
                     CFAllocatorDeallocate(kCFAllocatorDefault, buf);
+#endif
                 }
 #else
                 const int capacity = 64;
@@ -151,7 +163,10 @@ QString QString::fromCFString(CFStringRef cfs)
 
     ref = CFStringCreateMutableCopy(NULL, CFStringGetLength(cfs), cfs);
     qs = QString::fromCFMutableString(ref);
+#ifdef KWQ_STRING_DEBUG
+#else
     CFRelease(ref);
+#endif
     
     return qs;
 }
@@ -168,13 +183,32 @@ QString::QString()
     cacheType = CacheInvalid;
 }
 
+#ifdef KWQ_STRING_DEBUG
+void QString::_cf_release(CFStringRef x) const
+{
+    //if (x)
+    //    CFRelease(x);
+}
+
+void QString::_cf_retain(CFStringRef x) const
+{
+    if (x)
+        CFRetain(x);
+    else
+        fprintf (stderr, "Attempt to retain nil string\n");
+}
+#endif
+
 QString::~QString()
 {
     if (s) {
-        CFRelease(s);
+        _cf_release(s);
     }
     if (cache) {
+#ifdef KWQ_STRING_DEBUG
+#else
         CFAllocatorDeallocate(kCFAllocatorDefault, cache);
+#endif
     }
 }
 
@@ -252,7 +286,7 @@ QString::QString(const QString &qs)
 {
     // shared copy
     if (qs.s) {
-        CFRetain(qs.s);
+        _cf_retain(qs.s);
     }
     s = qs.s;
     cache = NULL;
@@ -265,10 +299,10 @@ QString &QString::operator=(const QString &qs)
 {
     // shared copy
     if (qs.s) {
-        CFRetain(qs.s);
+        _cf_retain(qs.s);
     }
     if (s) {
-        CFRelease(s);
+        _cf_release(s);
     }
     s = qs.s;
     cacheType = CacheInvalid;
@@ -495,7 +529,7 @@ int QString::find(const char *chs, int index, bool cs) const
                         cs ? 0 : kCFCompareCaseInsensitive, &r)) {
                     pos = r.location;
                 }
-                CFRelease(tmp);
+                _cf_release(tmp);
             }
         }
     }
@@ -554,7 +588,7 @@ int QString::findRev(const char *chs, int index) const
                         kCFCompareBackwards, &r)) {
                     pos = r.location;
                 }
-                CFRelease(tmp);
+                _cf_release(tmp);
             }
         }
     }
@@ -600,7 +634,7 @@ int QString::contains(const char *chs, bool cs) const
                 // move to next possible overlapping match
                 pos += r.location + 1;
             }
-            CFRelease(tmp);
+            _cf_release(tmp);
         }
     }
     return c;
@@ -728,7 +762,7 @@ QString QString::arg(const QString &replacement, int width) const
                     if (tmp) {
                         CFStringPad(tmp, CFSTR(" "), padding, 0);
                         CFStringInsert(qs.s, pos, tmp);
-                        CFRelease(tmp);
+                        _cf_release(tmp);
                     }
                 }
             }
@@ -797,10 +831,10 @@ QString QString::mid(uint index, uint width) const
                 if (tmp) {
                     qs.s = CFStringCreateMutableCopy(kCFAllocatorDefault, 0,
                             tmp);
-                    CFRelease(tmp);
+                    _cf_release(tmp);
                 }
             } else {
-                CFRetain(s);
+                _cf_retain(s);
                 qs.s = s;
             }
         }
@@ -824,7 +858,7 @@ QString QString::lower() const
         qs.s = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, s);
     }
     if (qs.s) {
-	CFStringLowercase(qs.s, NULL);
+	    CFStringLowercase(qs.s, NULL);
     }
     return qs;
 }
@@ -847,7 +881,7 @@ QString QString::stripWhiteSpace() const
                 }
             }
             if (!qs.s) {
-                CFRetain(s);
+                _cf_retain(s);
                 qs.s = s;
             }
         }
@@ -906,7 +940,7 @@ QString QString::simplifyWhiteSpace() const
                     CFStringAppendCharacters(qs.s, buf, fill);
                 }
             } else {
-                CFRetain(s);
+                _cf_retain(s);
                 qs.s = s;
             }
         }
@@ -918,21 +952,14 @@ QString &QString::setUnicode(const QChar *qcs, uint len)
 {
     flushCache();
     if (qcs && len) {
+        if (s) 
+            _cf_release(s);
+        s = CFStringCreateMutable(kCFAllocatorDefault, 0);
         if (s) {
-            CFStringRef tmp = CFStringCreateWithCharactersNoCopy(
-                    kCFAllocatorDefault, &qcs->c, len, kCFAllocatorNull);
-            if (tmp) {
-                CFStringReplaceAll(s, tmp);
-                CFRelease(tmp);
-            }
-        } else {
-            s = CFStringCreateMutable(kCFAllocatorDefault, 0);
-            if (s) {
-                CFStringAppendCharacters(s, &qcs->c, len);
-            }
+            CFStringAppendCharacters(s, &qcs->c, len);
         }
     } else if (s) {
-        CFRelease(s);
+        _cf_release(s);
         s = NULL;
     }
     return *this;
@@ -942,22 +969,14 @@ QString &QString::setLatin1(const char *chs)
 {
     flushCache();
     if (chs && *chs) {
+        if (s) 
+            _cf_release(s);
+        s = CFStringCreateMutable(kCFAllocatorDefault, 0);
         if (s) {
-            CFStringRef tmp = CFStringCreateWithCStringNoCopy(
-                    kCFAllocatorDefault, chs, kCFStringEncodingISOLatin1,
-                    kCFAllocatorNull);
-            if (tmp) {
-                CFStringReplaceAll(s, tmp);
-                CFRelease(tmp);
-            }
-        } else {
-            s = CFStringCreateMutable(kCFAllocatorDefault, 0);
-            if (s) {
-                CFStringAppendCString(s, chs, kCFStringEncodingISOLatin1);
-            }
+            CFStringAppendCString(s, chs, kCFStringEncodingISOLatin1);
         }
     } else if (s) {
-        CFRelease(s);
+        _cf_release(s);
         s = NULL;
     }
     return *this;
@@ -1019,24 +1038,23 @@ QString &QString::sprintf(const char *format, ...)
     va_start(args, format);
     flushCache();
     if (format && *format) {
-        if (!s) {
-            s = CFStringCreateMutable(kCFAllocatorDefault, 0);
-        }
-        if (s) {
-            CFStringRef f = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault,
-                    format, kCFStringEncodingISOLatin1, kCFAllocatorNull);
-            if (f) {
-                CFStringRef tmp = CFStringCreateWithFormatAndArguments(
-                        kCFAllocatorDefault, NULL, f, args);
-                if (tmp) {
-                    CFStringReplaceAll(s, tmp);
-                    CFRelease(tmp);
-                }
-                CFRelease(f);
+        if (s)
+            _cf_release(s);
+
+        s = CFStringCreateMutable(kCFAllocatorDefault, 0);
+        CFStringRef f = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault,
+                format, kCFStringEncodingISOLatin1, kCFAllocatorNull);
+        if (f) {
+            CFStringRef tmp = CFStringCreateWithFormatAndArguments(
+                    kCFAllocatorDefault, NULL, f, args);
+            if (tmp) {
+                CFStringReplaceAll(s, tmp);
+                _cf_release(tmp);
             }
+            _cf_release(f);
         }
     } else if (s) {
-        CFRelease(s);
+        _cf_release(s);
         s = NULL;
     }
     va_end(args);
@@ -1053,15 +1071,28 @@ QString &QString::append(const QString &qs)
     return insert(length(), qs);
 }
 
+void QString::_copyInternalString()
+{
+    if (s) {
+        CFMutableStringRef tmp;
+        tmp = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, s);
+        CFRelease (s);
+        s = tmp;
+    }
+}
+
 QString &QString::insert(uint index, const QString &qs)
 {
     flushCache();
     if (qs.s) {
         CFIndex len = CFStringGetLength(qs.s);
         if (len) {
+            // How do we know that s mutable?
+            // 
             if (!s) {
                 s = CFStringCreateMutable(kCFAllocatorDefault, 0);
             }
+            _copyInternalString();
             if (s) {
                 if (index < (uint)CFStringGetLength(s)) {
                     CFStringInsert(s, index, qs.s);
@@ -1093,6 +1124,7 @@ QString &QString::remove(uint index, uint width)
             if (width > (len - index)) {
                 width = len - index;
             }
+            _copyInternalString();
             CFStringDelete(s, CFRangeMake(index, width));
         }
     }
@@ -1111,6 +1143,7 @@ QString &QString::replace(const QRegExp &qre, const QString &qs)
                 break;
             }
             CFRange r = CFRangeMake(i, width);
+            _copyInternalString();
             if (len) {
                 CFStringReplace(s, r, qs.s);
             } else {
@@ -1127,11 +1160,12 @@ void QString::truncate(uint newLen)
     if (s) {
         if (newLen) {
             CFIndex len = CFStringGetLength(s);
+            _copyInternalString();
             if (len && (newLen < (uint)len)) {
                 CFStringDelete(s, CFRangeMake(newLen, len - newLen));
             }
         } else {
-            CFRelease(s);
+            _cf_release(s);
             s = NULL;
         }
     }
@@ -1144,7 +1178,7 @@ void QString::fill(QChar qc, int len)
         if (len < 0) {
             len = CFStringGetLength(s);
         }
-        CFRelease(s);
+        _cf_release(s);
         s = NULL;
     }
     if (len > 0) {
@@ -1157,7 +1191,10 @@ void QString::fill(QChar qc, int len)
             s = CFStringCreateMutableWithExternalCharactersNoCopy(
                     kCFAllocatorDefault, ucs, len, 0, kCFAllocatorDefault);
             if (!s) {
+#ifdef KWQ_STRING_DEBUG
+#else
                 CFAllocatorDeallocate(kCFAllocatorDefault, ucs);
+#endif
             }
         }
     }
@@ -1193,7 +1230,7 @@ QString::operator const char *() const
     return latin1();
 }
 
-QChar QString::operator[](int index) const
+const QChar QString::operator[](int index) const
 {
     if (index >= 0) {
         return at(index);
@@ -1221,7 +1258,10 @@ QString &QString::operator+=(char ch)
 void QString::flushCache() const
 {
     if (cache) {
+#ifdef KWQ_STRING_DEBUG
+#else
         CFAllocatorDeallocate(kCFAllocatorDefault, cache);
+#endif
         cache = NULL;
         cacheType = CacheInvalid;
     }
@@ -1241,7 +1281,10 @@ QCString QString::convertToQCString(CFStringEncoding enc) const
                 *reinterpret_cast<char *>(chs) = '\0';
             }
             QCString qcs = QCString(chs);
+#ifdef KWQ_STRING_DEBUG
+#else
             CFAllocatorDeallocate(kCFAllocatorDefault, chs);
+#endif
             return qcs;
         }
     }
@@ -1348,10 +1391,10 @@ QString QString::leftRight(uint width, bool left) const
                 if (tmp) {
                     qs.s = CFStringCreateMutableCopy(kCFAllocatorDefault, 0,
                             tmp);
-                    CFRelease(tmp);
+                    _cf_release(tmp);
                 }
             } else {
-                CFRetain(s);
+                _cf_retain(s);
                 qs.s = s;
             }
         }
@@ -1372,7 +1415,7 @@ int QString::compareToLatin1(const char *chs) const
             kCFAllocatorNull);
     if (tmp) {
         int result = CFStringCompare(s, tmp, 0);
-        CFRelease(tmp);
+        _cf_release(tmp);
         return result;
     }
     return kCFCompareGreaterThan;
@@ -1406,7 +1449,7 @@ bool operator==(const QString &qs, const char *chs)
                 kCFAllocatorNull);
         if (tmp) {
             result = CFStringCompare(qs.s, tmp, 0) == kCFCompareEqualTo;
-            CFRelease(tmp);
+            _cf_release(tmp);
         }
     }
     return result;
diff --git a/WebCore/src/kwq/qt/_qurl.cpp b/WebCore/src/kwq/qt/_qurl.cpp
index 3c5ca9e..a82de3c 100644
--- a/WebCore/src/kwq/qt/_qurl.cpp
+++ b/WebCore/src/kwq/qt/_qurl.cpp
@@ -62,6 +62,9 @@ struct QUrlPrivate
 
 static void slashify( QString& s, bool allowMultiple = TRUE )
 {
+#ifdef _KWQ_
+    fprintf (stderr, "UNSAFE API, should not be called.  This entire class will not be used when KURL is finished.\n");
+#else
     bool justHadSlash = FALSE;
     for ( int i = 0; i < (int)s.length(); i++ ) {
 	if ( !allowMultiple && justHadSlash &&
@@ -77,6 +80,7 @@ static void slashify( QString& s, bool allowMultiple = TRUE )
 	else
 	    justHadSlash = FALSE;
     }
+#endif
 }
 
 // NOT REVISED
@@ -1016,6 +1020,9 @@ QString QUrl::dirPath() const
 
 void QUrl::encode( QString& url )
 {
+#ifdef _KWQ_
+    fprintf (stderr, "UNSAFE API, should not be called.  This entire class will not be used when KURL is finished.\n");
+#else
     int oldlen = url.length();
 
     if ( !oldlen )
@@ -1044,8 +1051,10 @@ void QUrl::encode( QString& url )
     }
 
     url = newUrl;
+#endif
 }
 
+#ifndef _KWQ_
 static ushort hex_to_int( ushort c )
 {
     if ( c >= 'A' && c <= 'F')
@@ -1056,6 +1065,8 @@ static ushort hex_to_int( ushort c )
 	return c - '0';
     return 0;
 }
+#endif
+
 
 /*!
   Decodes the string \a url.
@@ -1063,6 +1074,9 @@ static ushort hex_to_int( ushort c )
 
 void QUrl::decode( QString& url )
 {
+#ifdef _KWQ_
+    fprintf (stderr, "UNSAFE API, should not be called.  This entire class will not be used when KURL is finished.\n");
+#else
     int oldlen = url.length();
     if ( !oldlen )
 	return;
@@ -1082,6 +1096,7 @@ void QUrl::decode( QString& url )
     }
 
     url = newUrl;
+#endif
 }
 
 /*!  Composes a string of the URL and returns it. If \a encodedPath is
diff --git a/WebCore/src/kwq/qt/qstring.h b/WebCore/src/kwq/qt/qstring.h
index 8bd8fe9..1cbc9cc 100644
--- a/WebCore/src/kwq/qt/qstring.h
+++ b/WebCore/src/kwq/qt/qstring.h
@@ -161,9 +161,8 @@ public:
 
 // protected -------------------------------------------------------------------
 // private ---------------------------------------------------------------------
-
+    
 private:
-
     // data members ------------------------------------------------------------
 
     UniChar c;
@@ -466,7 +465,7 @@ public:
 
     operator const char *() const;
 
-    QChar operator[](int) const;
+    const QChar operator[](int) const;
 
     QString &operator+=(const QString &);
     QString &operator+=(QChar);
@@ -526,6 +525,19 @@ private:
     friend class QConstString;
     friend class QGDict;
 
+#ifdef _KWQ_
+    void _copyInternalString();
+#endif
+
+#ifdef KWQ_STRING_DEBUG
+    // Added for debugging purposes.  Compiler should optimize.
+    void _cf_release(CFStringRef) const;
+    void _cf_retain(CFStringRef) const;
+#else
+#define _cf_release(s) CFRelease(s)
+#define _cf_retain(s) CFRetain(s)
+#endif
+
 }; // class QString ============================================================
 
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list