[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 ¶ms, 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 ¶ms, 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 ¶ms, 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