Summary: | rendering of Amazon Online Reader is wrong | ||
---|---|---|---|
Product: | [Applications] konqueror | Reporter: | Simon Perreault <simon.perreault> |
Component: | khtml | Assignee: | Konqueror Developers <konq-bugs> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | maksim |
Priority: | NOR | ||
Version: | unspecified | ||
Target Milestone: | --- | ||
Platform: | Fedora RPMs | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Sentry Crash Report: | |||
Attachments: | patch |
Description
Simon Perreault
2006-07-10 22:29:26 UTC
somehow we don't get some of the style attrs on that sidebar... hmm, might be clientHeight in the body...Now where did I put this patch... Yep, my patch to fix how these properties work on body fixes it. Problem is, I did the work on it like half a year back, and don't remember the details anymore, but do remember there was something I wasn't happy with. Created attachment 16948 [details]
patch
here it is. Now I just need to find my notes on it, redo all the testing, find
mail conversations with other developers. (sigh)
SVN commit 561392 by orlovich: Improve the compatibility of our scrollTop/Left/Height/Width, offsetWidth/offsetHeight,clientWidth/clientHeight on body and the root element. These aren't quite perfectly compatible, but should be clearly better... This fixes core of #86794, #117163, and #130577 (amazon.com book reader --- though error reporting popups seem to mess that up a bit(!?)) CCBUG:86794 BUG:117163 BUG:130577 M +46 -0 kjs_dom.cpp M +0 -33 kjs_html.cpp M +1 -2 kjs_html.h --- branches/KDE/3.5/kdelibs/khtml/ecma/kjs_dom.cpp #561391:561392 @@ -182,6 +182,46 @@ return DOMObjectLookupGetValue<DOMNode, DOMObject>(exec, propertyName, &DOMNodeTable, this); } +static khtml::RenderObject* handleBodyRootQuirk(const DOM::Node& node, khtml::RenderObject* rend, int token) +{ + //This emulates the quirks of various height/width properties on the viewport and root. Note that it + //is (mostly) IE-compatible in quirks, and mozilla-compatible in strict. + if (!rend) return 0; + + bool quirksMode = rend->style() && rend->style()->htmlHacks(); + + //There are a couple quirks here. One is that in quirks mode body is always forwarded to root... + //This is relevant for even the scrollTop/scrollLeft type properties. + if (quirksMode && node.handle()->id() == ID_BODY) { + while (rend->parent() && !rend->isRoot()) + rend = rend->parent(); + } + + //Also, some properties of the root are really done in terms of the viewport. + //These are {offset/client}{Height/Width}. The offset versions do it only in + //quirks mode, the client always. + if (!rend->isRoot()) return rend; //Don't care about non-root things here! + bool needViewport = false; + + switch (token) { + case DOMNode::OffsetHeight: + case DOMNode::OffsetWidth: + needViewport = quirksMode; + break; + case DOMNode::ClientHeight: + case DOMNode::ClientWidth: + needViewport = true; + break; + } + + if (needViewport) { + //Scan up to find the new target + while (rend->parent()) + rend = rend->parent(); + } + return rend; +} + Value DOMNode::getValueProperty(ExecState *exec, int token) const { switch (token) { @@ -287,6 +327,9 @@ khtml::RenderObject *rend = node.handle()->renderer(); + //In quirks mode, may need to forward if to body. + rend = handleBodyRootQuirk(node, rend, token); + switch (token) { case OffsetLeft: return rend ? static_cast<Value>( Number( rend->offsetLeft() ) ) : Undefined(); @@ -427,6 +470,9 @@ khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L; + //In quirks mode, may need to forward. + rend = handleBodyRootQuirk(node, rend, token); + switch (token) { case ScrollLeft: if (rend && rend->layer()) { --- branches/KDE/3.5/kdelibs/khtml/ecma/kjs_html.cpp #561391:561392 @@ -676,10 +676,6 @@ text KJS::HTMLElement::BodyText DontDelete vLink KJS::HTMLElement::BodyVLink DontDelete # IE extension - scrollLeft KJS::HTMLElement::BodyScrollLeft DontDelete - scrollTop KJS::HTMLElement::BodyScrollTop DontDelete - scrollWidth KJS::HTMLElement::BodyScrollWidth DontDelete|ReadOnly - scrollHeight KJS::HTMLElement::BodyScrollHeight DontDelete|ReadOnly onload KJS::HTMLElement::BodyOnLoad DontDelete @end @begin HTMLFormElementTable 11 @@ -1257,20 +1253,6 @@ Value nodeValue(kjsDocNode); return kjsDocNode->getListener( DOM::EventImpl::LOAD_EVENT ); } - default: - // Update the document's layout before we compute these attributes. - DOM::DocumentImpl* docimpl = node.handle()->getDocument(); - if (docimpl) - docimpl->updateLayout(); - - switch( token ) { - case BodyScrollLeft: - return Number(body.ownerDocument().view() ? body.ownerDocument().view()->contentsX() : 0); - case BodyScrollTop: - return Number(body.ownerDocument().view() ? body.ownerDocument().view()->contentsY() : 0); - case BodyScrollHeight: return Number(body.ownerDocument().view() ? body.ownerDocument().view()->contentsHeight() : 0); - case BodyScrollWidth: return Number(body.ownerDocument().view() ? body.ownerDocument().view()->contentsWidth() : 0); - } } } break; @@ -2487,21 +2469,6 @@ case BodyLink: { body.setLink(str); return; } case BodyText: { body.setText(str); return; } case BodyVLink: { body.setVLink(str); return; } - case BodyScrollLeft: - case BodyScrollTop: { - QScrollView* sview = body.ownerDocument().view(); - if (sview) { - // Update the document's layout before we compute these attributes. - DOM::DocumentImpl* docimpl = body.handle()->getDocument(); - if (docimpl) - docimpl->updateLayout(); - if (token == BodyScrollLeft) - sview->setContentsPos(value.toInteger(exec), sview->contentsY()); - else - sview->setContentsPos(sview->contentsX(), value.toInteger(exec)); - } - return; - } case BodyOnLoad: DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl *>(node.ownerDocument().handle()); if (doc && checkNodeSecurity(exec, node)) --- branches/KDE/3.5/kdelibs/khtml/ecma/kjs_html.h #561391:561392 @@ -84,8 +84,7 @@ LinkSheet, TitleText, MetaName, MetaHttpEquiv, MetaContent, MetaScheme, BaseHref, BaseTarget, IsIndexForm, IsIndexPrompt, StyleDisabled, StyleSheet, StyleType, StyleMedia, BodyBackground, BodyVLink, BodyText, - BodyLink, BodyALink, BodyBgColor, BodyScrollLeft, BodyScrollTop, - BodyScrollHeight, BodyScrollWidth, BodyOnLoad, + BodyLink, BodyALink, BodyBgColor, BodyOnLoad, FormAction, FormEncType, FormElements, FormLength, FormAcceptCharset, FormReset, FormTarget, FormName, FormMethod, FormSubmit, SelectAdd, SelectTabIndex, SelectValue, SelectSelectedIndex, SelectLength, Is this supposed to be fixed in 3.5.5? Because Amazon look inside still doesn't render correctly for me (can't see the page). |