[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.1/kdelibs/khtml/ecma
From:       Maks Orlovich <maksim () kde ! org>
Date:       2008-08-23 18:44:29
Message-ID: 1219517069.036990.22243.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 851476 by orlovich:

Make the window.frames behavior more Mozilla-like --- frames just returns 
the Window again, which meanthe properties of the window are available there, too.
This kills the FrameArray class.
Fixes #168017, and renders #164348 moot, as Window is robust against these 
cases while FrameArray wasn't

BUG:168017
BUG:164348


 M  +1 -1      kjs_html.cpp  
 M  +3 -161    kjs_window.cpp  
 M  +1 -4      kjs_window.h  


--- branches/KDE/4.1/kdelibs/khtml/ecma/kjs_html.cpp #851475:851476
@@ -412,7 +412,7 @@
       return body ? jsString(body->getAttribute(ATTR_DIR)) : jsUndefined();
     case Frames:
       if ( win )
-        return win->frames(exec);
+        return win;
       else
         return jsUndefined();
   }
--- branches/KDE/4.1/kdelibs/khtml/ecma/kjs_window.cpp #851475:851476
@@ -104,28 +104,6 @@
   private:
     QPointer<KHTMLPart> part;
   };
-
-
-  class FrameArray : public JSObject {
-  public:
-    FrameArray(ExecState *exec, KHTMLPart *p)
-      : JSObject(exec->lexicalInterpreter()->builtinObjectPrototype()), part(p) { }
-    virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
-    JSValue *getValueProperty(ExecState *exec, int token);
-    virtual UString toString(ExecState *exec) const;
-    enum { Length, Location };
-    JSValue *indexGetter(ExecState *, unsigned index);
-    virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List \
                &args);
-    virtual bool implementsCall() const { return true; }
-  private:
-    static JSValue *nameGetter(ExecState *, JSObject*, const Identifier&, const \
                PropertySlot&);
-    static JSValue *nameFallBackGetter(ExecState *, JSObject*, const Identifier&, \
                const PropertySlot&);
-    virtual const ClassInfo* classInfo() const { return &info; }
-    static const ClassInfo info;
-
-    QPointer<KHTMLPart> part;
-  };
-
 } //namespace KJS
 
 #include "kjs_window.lut.h"
@@ -409,7 +387,7 @@
 KJS_IMPLEMENT_PROTOFUNC(WindowFunc)
 
 Window::Window(khtml::ChildFrame *p)
-  : JSObject(/*no proto*/), m_frame(p), screen(0), history(0), external(0), \
m_frames(0), loc(0), m_evt(0) +  : JSObject(/*no proto*/), m_frame(p), screen(0), \
history(0), external(0), loc(0), m_evt(0)  {
   winq = new WindowQObject(this);
   //kDebug(6070) << "Window::Window this=" << this << " part=" << m_part << " " << \
m_part->name(); @@ -480,15 +458,6 @@
   return loc;
 }
 
-JSObject* Window::frames( ExecState* exec ) const
-{
-  KHTMLPart *part = qobject_cast<KHTMLPart*>(m_frame->m_part);
-  if (part)
-    return m_frames ? m_frames :
-      (const_cast<Window*>(this)->m_frames = new FrameArray(exec, part));
-  return 0L;
-}
-
 // reference our special objects during garbage collection
 void Window::mark()
 {
@@ -499,8 +468,6 @@
     history->mark();
   if (external && !external->marked())
     external->mark();
-  if (m_frames && !m_frames->marked())
-    m_frames->mark();
   //kDebug(6070) << "Window::mark " << this << " marking loc=" << loc;
   if (loc && !loc->marked())
     loc->mark();
@@ -711,7 +678,7 @@
   return getDOMNode(exec, element);
 }
 
-JSValue* Window::getValueProperty(ExecState *exec, int token) const
+JSValue* Window::getValueProperty(ExecState *exec, int token)
 {
   KHTMLPart *part = m_frame.isNull() ? 0 : \
qobject_cast<KHTMLPart*>(m_frame->m_part);  if (!part) {
@@ -735,7 +702,7 @@
     case Self:
       return retrieve(part);
     case Frames:
-      return frames(exec);
+      return this;
     case Opener:
       if (!part->opener())
         return jsNull();    // ### a null Window might be better, but == null
@@ -1453,7 +1420,6 @@
   screen   = 0;
   history  = 0;
   external = 0;
-  m_frames = 0;
   loc      = 0;
   setPrototype(jsNull());
 
@@ -2482,130 +2448,6 @@
   parent->closeNow();
 }
 
-const ClassInfo FrameArray::info = { "FrameArray", 0, &FrameArrayTable, 0 };
-
-/*
-@begin FrameArrayTable 2
-length		FrameArray::Length	DontDelete|ReadOnly
-location	FrameArray::Location	DontDelete|ReadOnly
-@end
-*/
-
-JSValue *FrameArray::getValueProperty(ExecState *exec, int token)
-{
-  switch (token) {
-  case Length:
-    return jsNumber(part->frames().count());
-  case Location:
-    // non-standard property, but works in NS and IE
-    if (JSObject *obj = Window::retrieveWindow(part))
-      return obj->get(exec, "location");
-    return jsUndefined();
-  default:
-    assert(0);
-    return jsUndefined();
-  }
-}
-
-JSValue *FrameArray::indexGetter(ExecState *exec, unsigned index)
-{
-  KParts::ReadOnlyPart *frame = part->frames().at(index);
-  if (frame)
-    return Window::retrieve(frame);
-
-  return jsUndefined();
-}
-
-JSValue *FrameArray::nameGetter(ExecState *exec, JSObject*, const Identifier& \
                propertyName, const PropertySlot& slot)
-{
-  FrameArray *thisObj = static_cast<FrameArray *>(slot.slotBase());
-  KParts::ReadOnlyPart *frame = thisObj->part->findFrame(propertyName.qstring());
-  if (frame)
-    return Window::retrieve(frame);
-  return jsUndefined();
-}
-
-JSValue *FrameArray::nameFallBackGetter(ExecState *exec, JSObject*, const \
                Identifier& propertyName, const PropertySlot& slot)
-{
-  FrameArray *thisObj = static_cast<FrameArray *>(slot.slotBase());
-  DOM::DocumentImpl* doc  = \
                static_cast<DOM::DocumentImpl*>(thisObj->part->document().handle());
-  if (doc) {
-    DOM::HTMLCollectionImpl docuAll(doc, DOM::HTMLCollectionImpl::DOC_ALL);
-    DOM::NodeImpl*     node = docuAll.namedItem(propertyName.domString());
-    if (node) {
-      if (node->id() == ID_FRAME || node->id() == ID_IFRAME) {
-        //Return the Window object.
-        KHTMLPart* part = \
                static_cast<DOM::HTMLFrameElementImpl*>(node)->contentPart();
-        if (part)
-          return Window::retrieveWindow(part);
-        else
-          return jsUndefined();
-      } else {
-        //Just a regular node..
-        return getDOMNode(exec, node);
-      }
-    }
-  } else {
-    kWarning(6070) << "Missing own document in FrameArray::get()";
-  }
-  return jsUndefined();
-}
-
-bool FrameArray::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, \
                PropertySlot& slot)
-{
-#ifdef KJS_VERBOSE
-  kDebug(6070) << "FrameArray::getOwnPropertySlot " << propertyName.qstring() << " \
                part=" << (void*)part;
-#endif
-
-  if (part.isNull()) {
-    slot.setUndefined(this);
-    return true;
-  }
-
-  if (getStaticOwnValueSlot(&FrameArrayTable, this, propertyName, slot))
-    return true;
-
-  // check for the name or number
-  KParts::ReadOnlyPart *frame = part->findFrame(propertyName.qstring());
-  if (frame) {
-    slot.setCustom(this, nameGetter);
-    return true;
-  }
-
-  if (getIndexSlot(this, part->frames().count(), propertyName, slot))
-    return true;
-
-  // Fun IE quirk: name lookup in there is actually done by document.all
-  // hence, it can find non-frame things (and even let them hide frame ones!)
-  // We don't quite do that, but do this as a fallback.
-  DOM::DocumentImpl* doc  = \
                static_cast<DOM::DocumentImpl*>(part->document().handle());
-  DOM::HTMLCollectionImpl docuAll(doc, DOM::HTMLCollectionImpl::DOC_ALL);
-  if (docuAll.namedItem(propertyName.domString())) {
-    slot.setCustom(this, nameFallBackGetter);
-    return true;
-  }
-
-  return JSObject::getOwnPropertySlot(exec, propertyName, slot);
-}
-
-UString FrameArray::toString(ExecState *) const
-{
-  return "[object FrameArray]";
-}
-
-JSValue* FrameArray::callAsFunction(ExecState *exec, JSObject * /*thisObj*/, const \
                List &args)
-{
-    //IE supports a subset of the get functionality as call...
-    //... basically, when the return is a window, it supports that, otherwise it
-    //errors out. We do a cheap-and-easy emulation of that, and just do the same
-    //thing as get does.
-    if (args.size() == 1)
-        return get(exec, Identifier(args[0]->toString(exec)));
-
-    return jsUndefined();
-}
-
-
 ////////////////////// Location Object ////////////////////////
 
 const ClassInfo Location::info = { "Location", 0, &LocationTable, 0 };
--- branches/KDE/4.1/kdelibs/khtml/ecma/kjs_window.h #851475:851476
@@ -56,7 +56,6 @@
   class History;
   class External;
   class ScheduledAction;
-  class FrameArray;
   class JSEventListener;
   class JSLazyEventListener;
 
@@ -105,7 +104,7 @@
     }
 
     virtual void mark();
-    JSValue* getValueProperty(ExecState *exec, int token) const;
+    JSValue* getValueProperty(ExecState *exec, int token);
     virtual bool getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, \
                PropertySlot& slot);
     virtual void put(ExecState *exec, const Identifier &propertyName, JSValue* \
value, int attr = None);  virtual bool toBoolean(ExecState *exec) const;
@@ -125,7 +124,6 @@
       return checkIsSafeScript( activePart );
     }
     Location *location() const;
-    JSObject* frames( ExecState* exec ) const;
     JSEventListener *getJSEventListener(JSValue* val, bool html = false);
     JSLazyEventListener *getJSLazyEventListener(const QString &code, const QString& \
                sourceUrl, int lineNo, 
                                                 const QString &name, DOM::NodeImpl* \
node); @@ -198,7 +196,6 @@
     Screen *screen;
     History *history;
     External *external;
-    FrameArray *m_frames;
     Location *loc;
     DOM::EventImpl *m_evt;
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic