[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