[prev in list] [next in list] [prev in thread] [next in thread]
List: kfm-devel
Subject: [PATCH] Re: assigning onload event to an image created with JavaScript doesn't work
From: David Faure <david () mandrakesoft ! com>
Date: 2002-11-06 23:57:37
[Download RAW message or body]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Wednesday 06 November 2002 19:59, David Joham wrote:
> Hello all,
>
> I'm using Konq 3.01 at the moment at work and I've noticed that onload events assigned via
> Javascript to Image objects don't seem to work. I'm trying to track this down to get the new HP
> site working in Konq.
>
> Here's a small recreation that demonstrates the problem: [...]
Got it to work... after quite some fighting and rewriting :)
According to the NS doc (http://docs.sun.com/source/816-6408-10/image.htm)
(couldn't find a IE doc for this !?), we are still missing _many_ attributes
for the Image object...
- --
David FAURE, david@mandrakesoft.com, faure@kde.org
http://people.mandrakesoft.com/~david/
Contributing to: http://www.konqueror.org/, http://www.koffice.org/
Get the latest KOffice - http://download.kde.org/stable/koffice-1.2/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (GNU/Linux)
iD8DBQE9yaxy72KcVAmwbhARAlF9AJ9TuCNEo5aj1B/QyYLG4PAevdJe3gCfRWgR
AEPETv3Z95thQPgGz8WSXbY=
=gC9J
-----END PGP SIGNATURE-----
["image_onload.diff" (text/x-diff)]
Index: kjs_html.cpp
===================================================================
RCS file: /home/kde/kdelibs/khtml/ecma/kjs_html.cpp,v
retrieving revision 1.212
diff -u -p -r1.212 kjs_html.cpp
--- kjs_html.cpp 2002/11/04 11:25:32 1.212
+++ kjs_html.cpp 2002/11/06 23:53:49
@@ -34,12 +34,15 @@
#include "html/html_imageimpl.h"
#include "html/html_objectimpl.h"
#include "html/html_miscimpl.h"
+#include "xml/dom2_eventsimpl.h"
+
#include <kparts/browserextension.h>
#include "khtml_part.h"
#include "khtmlview.h"
#include "ecma/kjs_css.h"
+#include "ecma/kjs_events.h"
#include "ecma/kjs_html.h"
#include "ecma/kjs_window.h"
#include "ecma/kjs_html.lut.h"
@@ -47,6 +50,7 @@
#include "java/kjavaappletcontext.h"
#include "misc/htmltags.h"
+#include "misc/htmlattrs.h"
#include "rendering/render_object.h"
#include "rendering/render_root.h"
@@ -2846,12 +2850,12 @@ DEFINE_PROTOTYPE("HTMLCollection", HTMLC
IMPLEMENT_PROTOFUNC_DOM(HTMLCollectionProtoFunc)
IMPLEMENT_PROTOTYPE(HTMLCollectionProto,HTMLCollectionProtoFunc)
-const ClassInfo HTMLCollection::info = { "HTMLCollection", 0, 0, 0 };
+const ClassInfo KJS::HTMLCollection::info = { "HTMLCollection", 0, 0, 0 };
-HTMLCollection::HTMLCollection(ExecState *exec, DOM::HTMLCollection c)
+KJS::HTMLCollection::HTMLCollection(ExecState *exec, DOM::HTMLCollection c)
: DOMObject(HTMLCollectionProto::self(exec)), collection(c) {}
-HTMLCollection::~HTMLCollection()
+KJS::HTMLCollection::~HTMLCollection()
{
ScriptInterpreter::forgetDOMObject(collection.handle());
}
@@ -3186,10 +3190,13 @@ const ClassInfo KJS::Image::info = { "Im
@begin ImageTable 3
src Image::Src DontDelete
complete Image::Complete DontDelete|ReadOnly
+ onload Image::OnLoad DontDelete
@end
*/
Image::Image(ExecState* exec, const DOM::Document &d)
- : DOMObject(exec->interpreter()->builtinObjectPrototype()), doc(d), img(0) { }
+ : DOMObject(exec->interpreter()->builtinObjectPrototype()), doc(d), img(0),
+ m_onLoadListener(0L)
+{ }
Value Image::tryGet(ExecState *exec, const UString &propertyName) const
{
@@ -3203,6 +3210,10 @@ Value Image::getValueProperty(ExecState
return String(src);
case Complete:
return Boolean(!img || img->status() >= khtml::CachedObject::Persistent);
+ case OnLoad:
+ if ( m_onLoadListener )
+ return m_onLoadListener->listenerObj();
+ return Undefined();
default:
kdWarning() << "Image::getValueProperty unhandled token " << token << endl;
return Value();
@@ -3211,15 +3222,30 @@ Value Image::getValueProperty(ExecState
void Image::tryPut(ExecState *exec, const UString &propertyName, const Value& value, \
int attr) {
- // Not worth using the hashtable
+ // TODO: use the hashtable
if (propertyName == "src") {
String str = value.toString(exec);
src = str.value();
if ( img ) img->deref(this);
img = static_cast<DOM::DocumentImpl*>( doc.handle() \
)->docLoader()->requestImage( src.string() ); if ( img ) img->ref(this);
+ } else if (propertyName == "onload" ) {
+ m_onLoadListener = Window::retrieveActive(exec)->getJSEventListener(value,true);
} else {
DOMObject::tryPut(exec, propertyName, value, attr);
+ }
+}
+
+void Image::notifyFinished(khtml::CachedObject * finishedObj)
+{
+ if (img == finishedObj /*&& !loadEventSent*/ && m_onLoadListener ) {
+ //loadEventSent = true;
+ DOM::EventImpl *evt = new DOM::EventImpl( (DOM::EventImpl::EventId)ATTR_ONLOAD, \
false, false ); + evt->setTarget( 0 );
+ evt->ref();
+ DOM::Event e(evt);
+ m_onLoadListener->handleEvent( e );
+ evt->deref();
}
}
Index: kjs_html.h
===================================================================
RCS file: /home/kde/kdelibs/khtml/ecma/kjs_html.h,v
retrieving revision 1.67
diff -u -p -r1.67 kjs_html.h
--- kjs_html.h 2002/11/03 20:55:34 1.67
+++ kjs_html.h 2002/11/06 23:53:49
@@ -217,13 +217,15 @@ namespace KJS {
Value getValueProperty(ExecState *exec, int token) const;
virtual void tryPut(ExecState *exec, const UString &propertyName, const Value& \
value, int attr = None); virtual bool toBoolean(ExecState *) const { return true; }
+ virtual void notifyFinished(khtml::CachedObject * finishedObj);
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
- enum { Src, Complete };
+ enum { Src, Complete, OnLoad };
private:
UString src;
DOM::Document doc;
khtml::CachedImage* img;
+ JSEventListener *m_onLoadListener;
};
Value getHTMLCollection(ExecState *exec, DOM::HTMLCollection c);
Index: kjs_html.lut.h
===================================================================
RCS file: /home/kde/kdelibs/khtml/ecma/kjs_html.lut.h,v
retrieving revision 1.20
diff -u -p -r1.20 kjs_html.lut.h
--- kjs_html.lut.h 2002/11/03 20:55:34 1.20
+++ kjs_html.lut.h 2002/11/06 23:53:49
@@ -1098,10 +1098,11 @@ namespace KJS {
const struct HashEntry ImageTableEntries[] = {
{ 0, 0, 0, 0, 0 },
- { "src", Image::Src, DontDelete, 0, 0 },
- { "complete", Image::Complete, DontDelete|ReadOnly, 0, 0 }
+ { "src", Image::Src, DontDelete, 0, &ImageTableEntries[3] },
+ { "complete", Image::Complete, DontDelete|ReadOnly, 0, 0 },
+ { "onload", Image::OnLoad, DontDelete, 0, 0 }
};
-const struct HashTable ImageTable = { 2, 3, ImageTableEntries, 3 };
+const struct HashTable ImageTable = { 2, 4, ImageTableEntries, 3 };
}; // namespace
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic