Summary: | instanceof ecma operator does not work on DOM objects | ||
---|---|---|---|
Product: | [Applications] konqueror | Reporter: | Germain Garand <germain> |
Component: | khtml | Assignee: | Konqueror Developers <konq-bugs> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | maksim |
Priority: | NOR | ||
Version: | unspecified | ||
Target Milestone: | --- | ||
Platform: | Compiled Sources | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Sentry Crash Report: | |||
Attachments: | patch for review |
Description
Germain Garand
2006-09-28 02:51:51 UTC
Created attachment 17948 [details]
patch for review
I just lift implementations of hasInstance/implementsHasInstance
from KJS's InternalFunctionImp, as it seems a perfect fit...
I suppose that's the best way of doing it, thanks for catching it... > I suppose that's the best way of doing it, thanks for catching it...
glad to hear that as it was just voodoo programming :)
mmh now there is something I don't get at all,
document instanceof HTMLDocument
is now true, whereas
document instanceof Document
isn't...
At first sight, it doesn't seem to be a flaw in the implementsHasInstance logic as eg.
document.getElementsByTagName("body")[0] instanceof Element
is OK, and it seems to properly walk the inheritance chain?
I feebly tried to follow the macros implementing the pseudo constructors, but all I got is a severe headache...
Ugh, the problem is that when we create a prototype with a parent, it doesn't actually setup a prototype link but delegates manually :-( The element case works because we only have a single prototype for the entire hierarchy. .. So basically, to fix this, we would need yet another prototype macro. What ugliness :-(. Might try tomorrow evening... SVN commit 591021 by ggarand: commiting partial fix for #134771 to get a working instanceof on most DOM objects the rest of it is completely above my head and in the benevolent hands of Mighty Maksim... CCBUG: 134771 M +22 -0 kjs_binding.cpp M +2 -1 kjs_binding.h --- branches/KDE/3.5/kdelibs/khtml/ecma/kjs_binding.cpp #591020:591021 @@ -92,6 +92,28 @@ return "[object " + className() + "]"; } +Boolean DOMObject::hasInstance(ExecState *exec, const Value &value) +{ + if (value.type() != ObjectType) + return Boolean(false); + + Value prot = get(exec,prototypePropertyName); + if (prot.type() != ObjectType && prot.type() != NullType) { + Object err = Error::create(exec, TypeError, "Invalid prototype encountered " + "in instanceof operation."); + exec->setException(err); + return Boolean(false); + } + + Object v = Object(static_cast<ObjectImp*>(value.imp())); + while ((v = Object::dynamicCast(v.prototype())).imp()) { + if (v.imp() == prot.imp()) + return Boolean(true); + } + return Boolean(false); +} + + Value DOMFunction::get(ExecState *exec, const Identifier &propertyName) const { try { --- branches/KDE/3.5/kdelibs/khtml/ecma/kjs_binding.h #591020:591021 @@ -53,7 +53,8 @@ virtual Value get(ExecState *exec, const Identifier &propertyName) const; virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const { return ObjectImp::get(exec, propertyName); } - + virtual bool implementsHasInstance() const { return true; } + virtual Boolean hasInstance(ExecState *exec, const Value &value); virtual void put(ExecState *exec, const Identifier &propertyName, const Value &value, int attr = None); virtual void tryPut(ExecState *exec, const Identifier &propertyName, SVN commit 595530 by orlovich: Backport newer prototype macros, that delegate using the prototype system and not directly. FIxes #134771, and make this closer to trunk BUG:134771 M +4 -4 domparser.cpp M +82 -17 kjs_binding.h M +27 -23 kjs_css.cpp M +26 -25 kjs_dom.cpp M +9 -5 kjs_dom.h M +23 -19 kjs_events.cpp M +11 -9 kjs_html.cpp M +9 -6 kjs_range.cpp M +14 -12 kjs_traversal.cpp M +2 -1 kjs_window.cpp M +5 -4 xmlhttprequest.cpp M +4 -4 xmlserializer.cpp SVN commit 595531 by orlovich: Regression test for #134771, and also shows some of the limitations of our implementation.. CCBUG:134771 A baseline/dom/instanceof_pseudoctor.html-dom AM baseline/dom/instanceof_pseudoctor.html-dump.png A baseline/dom/instanceof_pseudoctor.html-render A tests/dom/instanceof_pseudoctor.html ** trunk/tests/khtmltests/regression/baseline/dom/instanceof_pseudoctor.html-dump.png #property svn:mime-type + image/png |