diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp | 167 |
1 files changed, 101 insertions, 66 deletions
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp index 44a1572fec5..624dec6126e 100644 --- a/chromium/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp @@ -24,33 +24,30 @@ #include "config.h" #include "core/html/HTMLBodyElement.h" -#include "CSSValueKeywords.h" -#include "HTMLNames.h" #include "bindings/v8/ScriptEventListener.h" +#include "core/CSSValueKeywords.h" +#include "core/HTMLNames.h" #include "core/css/CSSImageValue.h" -#include "core/css/CSSParser.h" +#include "core/css/parser/BisonCSSParser.h" #include "core/css/StylePropertySet.h" #include "core/dom/Attribute.h" -#include "core/events/ThreadLocalEventNames.h" +#include "core/frame/FrameView.h" +#include "core/frame/LocalFrame.h" #include "core/html/HTMLFrameElementBase.h" #include "core/html/parser/HTMLParserIdioms.h" -#include "core/frame/Frame.h" -#include "core/frame/FrameView.h" +#include "core/rendering/RenderBox.h" namespace WebCore { using namespace HTMLNames; -HTMLBodyElement::HTMLBodyElement(Document& document) +inline HTMLBodyElement::HTMLBodyElement(Document& document) : HTMLElement(bodyTag, document) { ScriptWrappable::init(this); } -PassRefPtr<HTMLBodyElement> HTMLBodyElement::create(Document& document) -{ - return adoptRef(new HTMLBodyElement(document)); -} +DEFINE_NODE_FACTORY(HTMLBodyElement) HTMLBodyElement::~HTMLBodyElement() { @@ -68,8 +65,9 @@ void HTMLBodyElement::collectStyleForPresentationAttribute(const QualifiedName& if (name == backgroundAttr) { String url = stripLeadingAndTrailingHTMLSpaces(value); if (!url.isEmpty()) { - RefPtr<CSSImageValue> imageValue = CSSImageValue::create(document().completeURL(url).string()); + RefPtrWillBeRawPtr<CSSImageValue> imageValue = CSSImageValue::create(url, document().completeURL(url)); imageValue->setInitiator(localName()); + imageValue->setReferrer(Referrer(document().outgoingReferrer(), document().referrerPolicy())); style->setProperty(CSSProperty(CSSPropertyBackgroundImage, imageValue.release())); } } else if (name == marginwidthAttr || name == leftmarginAttr) { @@ -101,7 +99,7 @@ void HTMLBodyElement::parseAttribute(const QualifiedName& name, const AtomicStri document().textLinkColors().resetActiveLinkColor(); } else { RGBA32 color; - if (CSSParser::parseColor(color, value, !document().inQuirksMode())) { + if (BisonCSSParser::parseColor(color, value, !document().inQuirksMode())) { if (name == linkAttr) document().textLinkColors().setLinkColor(color); else if (name == vlinkAttr) @@ -111,45 +109,45 @@ void HTMLBodyElement::parseAttribute(const QualifiedName& name, const AtomicStri } } - setNeedsStyleRecalc(); + setNeedsStyleRecalc(SubtreeStyleChange); } else if (name == onloadAttr) - document().setWindowAttributeEventListener(EventTypeNames::load, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::load, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onbeforeunloadAttr) - document().setWindowAttributeEventListener(EventTypeNames::beforeunload, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::beforeunload, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onunloadAttr) - document().setWindowAttributeEventListener(EventTypeNames::unload, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::unload, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onpagehideAttr) - document().setWindowAttributeEventListener(EventTypeNames::pagehide, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::pagehide, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onpageshowAttr) - document().setWindowAttributeEventListener(EventTypeNames::pageshow, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::pageshow, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onpopstateAttr) - document().setWindowAttributeEventListener(EventTypeNames::popstate, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::popstate, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onblurAttr) - document().setWindowAttributeEventListener(EventTypeNames::blur, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::blur, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onerrorAttr) - document().setWindowAttributeEventListener(EventTypeNames::error, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::error, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onfocusAttr) - document().setWindowAttributeEventListener(EventTypeNames::focus, createAttributeEventListener(document().frame(), name, value)); -#if ENABLE(ORIENTATION_EVENTS) - else if (name == onorientationchangeAttr) - document().setWindowAttributeEventListener(EventTypeNames::orientationchange, createAttributeEventListener(document().frame(), name, value)); -#endif + document().setWindowAttributeEventListener(EventTypeNames::focus, createAttributeEventListener(document().frame(), name, value, eventParameterName())); + else if (RuntimeEnabledFeatures::orientationEventEnabled() && name == onorientationchangeAttr) + document().setWindowAttributeEventListener(EventTypeNames::orientationchange, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onhashchangeAttr) - document().setWindowAttributeEventListener(EventTypeNames::hashchange, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::hashchange, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onmessageAttr) - document().setWindowAttributeEventListener(EventTypeNames::message, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::message, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onresizeAttr) - document().setWindowAttributeEventListener(EventTypeNames::resize, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::resize, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onscrollAttr) - document().setWindowAttributeEventListener(EventTypeNames::scroll, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::scroll, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onselectionchangeAttr) - document().setAttributeEventListener(EventTypeNames::selectionchange, createAttributeEventListener(document().frame(), name, value)); + document().setAttributeEventListener(EventTypeNames::selectionchange, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onstorageAttr) - document().setWindowAttributeEventListener(EventTypeNames::storage, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::storage, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == ononlineAttr) - document().setWindowAttributeEventListener(EventTypeNames::online, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::online, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else if (name == onofflineAttr) - document().setWindowAttributeEventListener(EventTypeNames::offline, createAttributeEventListener(document().frame(), name, value)); + document().setWindowAttributeEventListener(EventTypeNames::offline, createAttributeEventListener(document().frame(), name, value, eventParameterName())); + else if (name == onlanguagechangeAttr) + document().setWindowAttributeEventListener(EventTypeNames::languagechange, createAttributeEventListener(document().frame(), name, value, eventParameterName())); else HTMLElement::parseAttribute(name, value); } @@ -157,22 +155,24 @@ void HTMLBodyElement::parseAttribute(const QualifiedName& name, const AtomicStri Node::InsertionNotificationRequest HTMLBodyElement::insertedInto(ContainerNode* insertionPoint) { HTMLElement::insertedInto(insertionPoint); - if (insertionPoint->inDocument()) { - // FIXME: It's surprising this is web compatible since it means a marginwidth - // and marginheight attribute can magically appear on the <body> of all documents - // embedded through <iframe> or <frame>. - Element* ownerElement = document().ownerElement(); - if (ownerElement && ownerElement->isFrameElementBase()) { - HTMLFrameElementBase* ownerFrameElement = toHTMLFrameElementBase(ownerElement); - int marginWidth = ownerFrameElement->marginWidth(); - if (marginWidth != -1) - setIntegralAttribute(marginwidthAttr, marginWidth); - int marginHeight = ownerFrameElement->marginHeight(); - if (marginHeight != -1) - setIntegralAttribute(marginheightAttr, marginHeight); - } - } - return InsertionDone; + return InsertionShouldCallDidNotifySubtreeInsertions; +} + +void HTMLBodyElement::didNotifySubtreeInsertionsToDocument() +{ + // FIXME: It's surprising this is web compatible since it means a + // marginwidth and marginheight attribute can magically appear on the <body> + // of all documents embedded through <iframe> or <frame>. + Element* ownerElement = document().ownerElement(); + if (!isHTMLFrameElementBase(ownerElement)) + return; + HTMLFrameElementBase& ownerFrameElement = toHTMLFrameElementBase(*ownerElement); + int marginWidth = ownerFrameElement.marginWidth(); + int marginHeight = ownerFrameElement.marginHeight(); + if (marginWidth != -1) + setIntegralAttribute(marginwidthAttr, marginWidth); + if (marginHeight != -1) + setIntegralAttribute(marginheightAttr, marginHeight); } bool HTMLBodyElement::isURLAttribute(const Attribute& attribute) const @@ -180,6 +180,16 @@ bool HTMLBodyElement::isURLAttribute(const Attribute& attribute) const return attribute.name() == backgroundAttr || HTMLElement::isURLAttribute(attribute); } +bool HTMLBodyElement::hasLegalLinkAttribute(const QualifiedName& name) const +{ + return name == backgroundAttr || HTMLElement::hasLegalLinkAttribute(name); +} + +const QualifiedName& HTMLBodyElement::subResourceAttributeName() const +{ + return backgroundAttr; +} + bool HTMLBodyElement::supportsFocus() const { // This override is needed because the inherited method bails if the parent is editable. @@ -189,7 +199,7 @@ bool HTMLBodyElement::supportsFocus() const static int adjustForZoom(int value, Document* document) { - Frame* frame = document->frame(); + LocalFrame* frame = document->frame(); float zoomFactor = frame->pageZoomFactor(); if (zoomFactor == 1) return value; @@ -199,17 +209,28 @@ static int adjustForZoom(int value, Document* document) return static_cast<int>(value / zoomFactor); } -// FIXME: There are cases where body.scrollLeft is allowed to return -// non-zero values in both quirks and strict mode. It happens when -// <body> has an overflow that is not the Frame overflow. -// http://dev.w3.org/csswg/cssom-view/#dom-element-scrollleft -// http://code.google.com/p/chromium/issues/detail?id=312435 +// Blink, Gecko and Presto's quirks mode implementations of overflow set to the +// body element differ from IE's: the formers can create a scrollable area for the +// body element that is not the same as the root elements's one. On IE's quirks mode +// though, as body is the root element, body's and the root element's scrollable areas, +// if any, are the same. +// In order words, a <body> will only have an overflow clip (that differs from +// documentElement's) if both html and body nodes have its overflow set to either hidden, +// auto or scroll. +// That said, Blink's {set}scroll{Top,Left} behaviors match Gecko's: even if there is a non-overflown +// scrollable area, scrolling should not get propagated to the viewport in neither strict +// or quirks modes. int HTMLBodyElement::scrollLeft() { Document& document = this->document(); document.updateLayoutIgnorePendingStylesheets(); if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { + RenderBox* render = renderBox(); + if (!render) + return 0; + if (render->hasOverflowClip()) + return adjustForAbsoluteZoom(render->scrollLeft(), render); if (!document.inQuirksMode()) return 0; } @@ -224,11 +245,19 @@ void HTMLBodyElement::setScrollLeft(int scrollLeft) document.updateLayoutIgnorePendingStylesheets(); if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { + RenderBox* render = renderBox(); + if (!render) + return; + if (render->hasOverflowClip()) { + // FIXME: Investigate how are other browsers casting to int (rounding, ceiling, ...). + render->setScrollLeft(static_cast<int>(scrollLeft * render->style()->effectiveZoom())); + return; + } if (!document.inQuirksMode()) return; } - Frame* frame = document.frame(); + LocalFrame* frame = document.frame(); if (!frame) return; FrameView* view = frame->view(); @@ -243,6 +272,11 @@ int HTMLBodyElement::scrollTop() document.updateLayoutIgnorePendingStylesheets(); if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { + RenderBox* render = renderBox(); + if (!render) + return 0; + if (render->hasOverflowClip()) + return adjustForAbsoluteZoom(render->scrollTop(), render); if (!document.inQuirksMode()) return 0; } @@ -257,11 +291,19 @@ void HTMLBodyElement::setScrollTop(int scrollTop) document.updateLayoutIgnorePendingStylesheets(); if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { + RenderBox* render = renderBox(); + if (!render) + return; + if (render->hasOverflowClip()) { + // FIXME: Investigate how are other browsers casting to int (rounding, ceiling, ...). + render->setScrollTop(static_cast<int>(scrollTop * render->style()->effectiveZoom())); + return; + } if (!document.inQuirksMode()) return; } - Frame* frame = document.frame(); + LocalFrame* frame = document.frame(); if (!frame) return; FrameView* view = frame->view(); @@ -288,11 +330,4 @@ int HTMLBodyElement::scrollWidth() return view ? adjustForZoom(view->contentsWidth(), &document) : 0; } -void HTMLBodyElement::addSubresourceAttributeURLs(ListHashSet<KURL>& urls) const -{ - HTMLElement::addSubresourceAttributeURLs(urls); - - addSubresourceURL(urls, document().completeURL(getAttribute(backgroundAttr))); -} - } // namespace WebCore |