From kde-commits Sat Feb 04 17:45:53 2006 From: Maks Orlovich Date: Sat, 04 Feb 2006 17:45:53 +0000 To: kde-commits Subject: branches/KDE/3.5/kdelibs/khtml Message-Id: <1139075153.303685.12814.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=113907516424766 SVN commit 505729 by orlovich: Emulate IE quirk of finding -everything- by name/ID under document.frames (well, almost -- we don't let frames be hidden by non-frames) Makes menu on http://www.carton.smurfit.es/ work (moz and opera can't handle it ;-) ) BUG:106930 M +6 -10 ecma/kjs_html.cpp M +20 -0 ecma/kjs_window.cpp M +12 -0 html/html_baseimpl.cpp M +2 -0 html/html_baseimpl.h --- branches/KDE/3.5/kdelibs/khtml/ecma/kjs_html.cpp #505728:505729 @@ -1847,9 +1847,9 @@ case FrameContentDocument: return checkNodeSecurity(exec,frameElement.contentDocument()) ? getDOMNode(exec, frameElement.contentDocument()) : Undefined(); case FrameContentWindow: { - KHTMLView *view = static_cast(frameElement.contentDocument().handle())->view(); - if (view && view->part()) - return Value(Window::retrieveWindow(view->part())); + KHTMLPart* part = static_cast(frameElement.handle())->contentPart(); + if (part) + return Value(Window::retrieveWindow(part)); else return Undefined(); } @@ -1872,13 +1872,9 @@ case IFrameContentDocument: return checkNodeSecurity(exec,iFrame.contentDocument()) ? getDOMNode(exec, iFrame.contentDocument()) : Undefined(); case IFrameContentWindow: { - DOM::DocumentImpl* contentDoc = static_cast(iFrame.contentDocument().handle()); - if (!contentDoc) - return Undefined(); - - KHTMLView *view = contentDoc->view(); - if (view && view->part()) - return Value(Window::retrieveWindow(view->part())); + KHTMLPart* part = static_cast(iFrame.handle())->contentPart(); + if (part) + return Value(Window::retrieveWindow(part)); else return Undefined(); } --- branches/KDE/3.5/kdelibs/khtml/ecma/kjs_window.cpp #505728:505729 @@ -2147,6 +2147,26 @@ return Window::retrieve(frame); } + // 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(part->document().handle()); + DOM::HTMLCollectionImpl docuAll(doc, DOM::HTMLCollectionImpl::DOC_ALL); + DOM::NodeImpl* node = docuAll.namedItem(p.string()); + if (node) { + if (node->id() == ID_FRAME || node->id() == ID_IFRAME) { + //Return the Window object. + KHTMLPart* part = static_cast(node)->contentPart(); + if (part) + return Value(Window::retrieveWindow(part)); + else + return Undefined(); + } else { + //Just a regular node.. + return getDOMNode(exec, node); + } + } + return ObjectImp::get(exec, p); } --- branches/KDE/3.5/kdelibs/khtml/html/html_baseimpl.cpp #505728:505729 @@ -418,6 +418,18 @@ return 0; } +KHTMLPart* HTMLFrameElementImpl::contentPart() const +{ + if ( !m_render ) return 0; + + RenderPart* render = static_cast( m_render ); + + if(render->widget() && ::qt_cast( render->widget()) ) + return static_cast( render->widget() )->part(); + + return 0; +} + // ------------------------------------------------------------------------- HTMLFrameSetElementImpl::HTMLFrameSetElementImpl(DocumentPtr *doc) --- branches/KDE/3.5/kdelibs/khtml/html/html_baseimpl.h #505728:505729 @@ -34,6 +34,7 @@ #include class KHTMLView; +class KHTMLPart; namespace khtml { class RenderFrameSet; @@ -95,6 +96,7 @@ virtual void setFocus(bool); DocumentImpl* contentDocument() const; + KHTMLPart* contentPart() const; DOMString url; DOMString name;