Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / html / HTMLElement.cpp
index f9dff42..59e0cba 100644 (file)
@@ -45,6 +45,7 @@
 #include "core/events/EventListener.h"
 #include "core/events/KeyboardEvent.h"
 #include "core/frame/Settings.h"
+#include "core/frame/UseCounter.h"
 #include "core/html/HTMLBRElement.h"
 #include "core/html/HTMLFormElement.h"
 #include "core/html/HTMLInputElement.h"
@@ -53,6 +54,7 @@
 #include "core/html/HTMLTextFormControlElement.h"
 #include "core/html/parser/HTMLParserIdioms.h"
 #include "core/rendering/RenderObject.h"
+#include "platform/Language.h"
 #include "platform/text/BidiResolver.h"
 #include "platform/text/BidiTextRun.h"
 #include "platform/text/TextRunIterator.h"
@@ -140,6 +142,27 @@ void HTMLElement::mapLanguageAttributeToLocale(const AtomicString& value, Mutabl
     if (!value.isEmpty()) {
         // Have to quote so the locale id is treated as a string instead of as a CSS keyword.
         addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitLocale, quoteCSSString(value));
+
+        // FIXME: Remove the following UseCounter code when we collect enough
+        // data.
+        UseCounter::count(document(), UseCounter::LangAttribute);
+        if (isHTMLHtmlElement(*this))
+            UseCounter::count(document(), UseCounter::LangAttributeOnHTML);
+        else if (isHTMLBodyElement(*this))
+            UseCounter::count(document(), UseCounter::LangAttributeOnBody);
+        String htmlLanguage = value.string();
+        size_t firstSeparator = htmlLanguage.find('-');
+        if (firstSeparator != kNotFound)
+            htmlLanguage = htmlLanguage.left(firstSeparator);
+        String uiLanguage = defaultLanguage();
+        firstSeparator = uiLanguage.find('-');
+        if (firstSeparator != kNotFound)
+            uiLanguage = uiLanguage.left(firstSeparator);
+        firstSeparator = uiLanguage.find('_');
+        if (firstSeparator != kNotFound)
+            uiLanguage = uiLanguage.left(firstSeparator);
+        if (!equalIgnoringCase(htmlLanguage, uiLanguage))
+            UseCounter::count(document(), UseCounter::LangAttributeDoesNotMatchToUILocale);
     } else {
         // The empty string means the language is explicitly unknown.
         addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitLocale, CSSValueAuto);
@@ -216,91 +239,100 @@ const AtomicString& HTMLElement::eventNameForAttributeName(const QualifiedName&
     typedef HashMap<AtomicString, AtomicString> StringToStringMap;
     DEFINE_STATIC_LOCAL(StringToStringMap, attributeNameToEventNameMap, ());
     if (!attributeNameToEventNameMap.size()) {
-        attributeNameToEventNameMap.set(onabortAttr.localName(), EventTypeNames::abort);
-        attributeNameToEventNameMap.set(onanimationendAttr.localName(), EventTypeNames::animationend);
-        attributeNameToEventNameMap.set(onanimationiterationAttr.localName(), EventTypeNames::animationiteration);
-        attributeNameToEventNameMap.set(onanimationstartAttr.localName(), EventTypeNames::animationstart);
-        attributeNameToEventNameMap.set(onautocompleteAttr.localName(), EventTypeNames::autocomplete);
-        attributeNameToEventNameMap.set(onautocompleteerrorAttr.localName(), EventTypeNames::autocompleteerror);
-        attributeNameToEventNameMap.set(onbeforecopyAttr.localName(), EventTypeNames::beforecopy);
-        attributeNameToEventNameMap.set(onbeforecutAttr.localName(), EventTypeNames::beforecut);
-        attributeNameToEventNameMap.set(onbeforepasteAttr.localName(), EventTypeNames::beforepaste);
-        attributeNameToEventNameMap.set(onblurAttr.localName(), EventTypeNames::blur);
-        attributeNameToEventNameMap.set(oncancelAttr.localName(), EventTypeNames::cancel);
-        attributeNameToEventNameMap.set(oncanplayAttr.localName(), EventTypeNames::canplay);
-        attributeNameToEventNameMap.set(oncanplaythroughAttr.localName(), EventTypeNames::canplaythrough);
-        attributeNameToEventNameMap.set(onchangeAttr.localName(), EventTypeNames::change);
-        attributeNameToEventNameMap.set(onclickAttr.localName(), EventTypeNames::click);
-        attributeNameToEventNameMap.set(oncloseAttr.localName(), EventTypeNames::close);
-        attributeNameToEventNameMap.set(oncontextmenuAttr.localName(), EventTypeNames::contextmenu);
-        attributeNameToEventNameMap.set(oncopyAttr.localName(), EventTypeNames::copy);
-        attributeNameToEventNameMap.set(oncuechangeAttr.localName(), EventTypeNames::cuechange);
-        attributeNameToEventNameMap.set(oncutAttr.localName(), EventTypeNames::cut);
-        attributeNameToEventNameMap.set(ondblclickAttr.localName(), EventTypeNames::dblclick);
-        attributeNameToEventNameMap.set(ondragAttr.localName(), EventTypeNames::drag);
-        attributeNameToEventNameMap.set(ondragendAttr.localName(), EventTypeNames::dragend);
-        attributeNameToEventNameMap.set(ondragenterAttr.localName(), EventTypeNames::dragenter);
-        attributeNameToEventNameMap.set(ondragleaveAttr.localName(), EventTypeNames::dragleave);
-        attributeNameToEventNameMap.set(ondragoverAttr.localName(), EventTypeNames::dragover);
-        attributeNameToEventNameMap.set(ondragstartAttr.localName(), EventTypeNames::dragstart);
-        attributeNameToEventNameMap.set(ondropAttr.localName(), EventTypeNames::drop);
-        attributeNameToEventNameMap.set(ondurationchangeAttr.localName(), EventTypeNames::durationchange);
-        attributeNameToEventNameMap.set(onemptiedAttr.localName(), EventTypeNames::emptied);
-        attributeNameToEventNameMap.set(onendedAttr.localName(), EventTypeNames::ended);
-        attributeNameToEventNameMap.set(onerrorAttr.localName(), EventTypeNames::error);
-        attributeNameToEventNameMap.set(onfocusAttr.localName(), EventTypeNames::focus);
-        attributeNameToEventNameMap.set(onfocusinAttr.localName(), EventTypeNames::focusin);
-        attributeNameToEventNameMap.set(onfocusoutAttr.localName(), EventTypeNames::focusout);
-        attributeNameToEventNameMap.set(oninputAttr.localName(), EventTypeNames::input);
-        attributeNameToEventNameMap.set(oninvalidAttr.localName(), EventTypeNames::invalid);
-        attributeNameToEventNameMap.set(onkeydownAttr.localName(), EventTypeNames::keydown);
-        attributeNameToEventNameMap.set(onkeypressAttr.localName(), EventTypeNames::keypress);
-        attributeNameToEventNameMap.set(onkeyupAttr.localName(), EventTypeNames::keyup);
-        attributeNameToEventNameMap.set(onloadAttr.localName(), EventTypeNames::load);
-        attributeNameToEventNameMap.set(onloadeddataAttr.localName(), EventTypeNames::loadeddata);
-        attributeNameToEventNameMap.set(onloadedmetadataAttr.localName(), EventTypeNames::loadedmetadata);
-        attributeNameToEventNameMap.set(onloadstartAttr.localName(), EventTypeNames::loadstart);
-        attributeNameToEventNameMap.set(onmousedownAttr.localName(), EventTypeNames::mousedown);
-        attributeNameToEventNameMap.set(onmouseenterAttr.localName(), EventTypeNames::mouseenter);
-        attributeNameToEventNameMap.set(onmouseleaveAttr.localName(), EventTypeNames::mouseleave);
-        attributeNameToEventNameMap.set(onmousemoveAttr.localName(), EventTypeNames::mousemove);
-        attributeNameToEventNameMap.set(onmouseoutAttr.localName(), EventTypeNames::mouseout);
-        attributeNameToEventNameMap.set(onmouseoverAttr.localName(), EventTypeNames::mouseover);
-        attributeNameToEventNameMap.set(onmouseupAttr.localName(), EventTypeNames::mouseup);
-        attributeNameToEventNameMap.set(onmousewheelAttr.localName(), EventTypeNames::mousewheel);
-        attributeNameToEventNameMap.set(onpasteAttr.localName(), EventTypeNames::paste);
-        attributeNameToEventNameMap.set(onpauseAttr.localName(), EventTypeNames::pause);
-        attributeNameToEventNameMap.set(onplayAttr.localName(), EventTypeNames::play);
-        attributeNameToEventNameMap.set(onplayingAttr.localName(), EventTypeNames::playing);
-        attributeNameToEventNameMap.set(onprogressAttr.localName(), EventTypeNames::progress);
-        attributeNameToEventNameMap.set(onratechangeAttr.localName(), EventTypeNames::ratechange);
-        attributeNameToEventNameMap.set(onresetAttr.localName(), EventTypeNames::reset);
-        attributeNameToEventNameMap.set(onresizeAttr.localName(), EventTypeNames::resize);
-        attributeNameToEventNameMap.set(onscrollAttr.localName(), EventTypeNames::scroll);
-        attributeNameToEventNameMap.set(onseekedAttr.localName(), EventTypeNames::seeked);
-        attributeNameToEventNameMap.set(onseekingAttr.localName(), EventTypeNames::seeking);
-        attributeNameToEventNameMap.set(onselectAttr.localName(), EventTypeNames::select);
-        attributeNameToEventNameMap.set(onselectstartAttr.localName(), EventTypeNames::selectstart);
-        attributeNameToEventNameMap.set(onshowAttr.localName(), EventTypeNames::show);
-        attributeNameToEventNameMap.set(onstalledAttr.localName(), EventTypeNames::stalled);
-        attributeNameToEventNameMap.set(onsubmitAttr.localName(), EventTypeNames::submit);
-        attributeNameToEventNameMap.set(onsuspendAttr.localName(), EventTypeNames::suspend);
-        attributeNameToEventNameMap.set(ontimeupdateAttr.localName(), EventTypeNames::timeupdate);
-        attributeNameToEventNameMap.set(ontoggleAttr.localName(), EventTypeNames::toggle);
-        attributeNameToEventNameMap.set(ontouchcancelAttr.localName(), EventTypeNames::touchcancel);
-        attributeNameToEventNameMap.set(ontouchendAttr.localName(), EventTypeNames::touchend);
-        attributeNameToEventNameMap.set(ontouchmoveAttr.localName(), EventTypeNames::touchmove);
-        attributeNameToEventNameMap.set(ontouchstartAttr.localName(), EventTypeNames::touchstart);
-        attributeNameToEventNameMap.set(ontransitionendAttr.localName(), EventTypeNames::webkitTransitionEnd);
-        attributeNameToEventNameMap.set(onvolumechangeAttr.localName(), EventTypeNames::volumechange);
-        attributeNameToEventNameMap.set(onwaitingAttr.localName(), EventTypeNames::waiting);
-        attributeNameToEventNameMap.set(onwebkitanimationendAttr.localName(), EventTypeNames::webkitAnimationEnd);
-        attributeNameToEventNameMap.set(onwebkitanimationiterationAttr.localName(), EventTypeNames::webkitAnimationIteration);
-        attributeNameToEventNameMap.set(onwebkitanimationstartAttr.localName(), EventTypeNames::webkitAnimationStart);
-        attributeNameToEventNameMap.set(onwebkitfullscreenchangeAttr.localName(), EventTypeNames::webkitfullscreenchange);
-        attributeNameToEventNameMap.set(onwebkitfullscreenerrorAttr.localName(), EventTypeNames::webkitfullscreenerror);
-        attributeNameToEventNameMap.set(onwebkittransitionendAttr.localName(), EventTypeNames::webkitTransitionEnd);
-        attributeNameToEventNameMap.set(onwheelAttr.localName(), EventTypeNames::wheel);
+        struct AttrToEventName {
+            const QualifiedName& attr;
+            const AtomicString& event;
+        };
+        AttrToEventName attrToEventNames[] = {
+            { onabortAttr, EventTypeNames::abort },
+            { onanimationendAttr, EventTypeNames::animationend },
+            { onanimationiterationAttr, EventTypeNames::animationiteration },
+            { onanimationstartAttr, EventTypeNames::animationstart },
+            { onautocompleteAttr, EventTypeNames::autocomplete },
+            { onautocompleteerrorAttr, EventTypeNames::autocompleteerror },
+            { onbeforecopyAttr, EventTypeNames::beforecopy },
+            { onbeforecutAttr, EventTypeNames::beforecut },
+            { onbeforepasteAttr, EventTypeNames::beforepaste },
+            { onblurAttr, EventTypeNames::blur },
+            { oncancelAttr, EventTypeNames::cancel },
+            { oncanplayAttr, EventTypeNames::canplay },
+            { oncanplaythroughAttr, EventTypeNames::canplaythrough },
+            { onchangeAttr, EventTypeNames::change },
+            { onclickAttr, EventTypeNames::click },
+            { oncloseAttr, EventTypeNames::close },
+            { oncontextmenuAttr, EventTypeNames::contextmenu },
+            { oncopyAttr, EventTypeNames::copy },
+            { oncuechangeAttr, EventTypeNames::cuechange },
+            { oncutAttr, EventTypeNames::cut },
+            { ondblclickAttr, EventTypeNames::dblclick },
+            { ondragAttr, EventTypeNames::drag },
+            { ondragendAttr, EventTypeNames::dragend },
+            { ondragenterAttr, EventTypeNames::dragenter },
+            { ondragleaveAttr, EventTypeNames::dragleave },
+            { ondragoverAttr, EventTypeNames::dragover },
+            { ondragstartAttr, EventTypeNames::dragstart },
+            { ondropAttr, EventTypeNames::drop },
+            { ondurationchangeAttr, EventTypeNames::durationchange },
+            { onemptiedAttr, EventTypeNames::emptied },
+            { onendedAttr, EventTypeNames::ended },
+            { onerrorAttr, EventTypeNames::error },
+            { onfocusAttr, EventTypeNames::focus },
+            { onfocusinAttr, EventTypeNames::focusin },
+            { onfocusoutAttr, EventTypeNames::focusout },
+            { oninputAttr, EventTypeNames::input },
+            { oninvalidAttr, EventTypeNames::invalid },
+            { onkeydownAttr, EventTypeNames::keydown },
+            { onkeypressAttr, EventTypeNames::keypress },
+            { onkeyupAttr, EventTypeNames::keyup },
+            { onloadAttr, EventTypeNames::load },
+            { onloadeddataAttr, EventTypeNames::loadeddata },
+            { onloadedmetadataAttr, EventTypeNames::loadedmetadata },
+            { onloadstartAttr, EventTypeNames::loadstart },
+            { onmousedownAttr, EventTypeNames::mousedown },
+            { onmouseenterAttr, EventTypeNames::mouseenter },
+            { onmouseleaveAttr, EventTypeNames::mouseleave },
+            { onmousemoveAttr, EventTypeNames::mousemove },
+            { onmouseoutAttr, EventTypeNames::mouseout },
+            { onmouseoverAttr, EventTypeNames::mouseover },
+            { onmouseupAttr, EventTypeNames::mouseup },
+            { onmousewheelAttr, EventTypeNames::mousewheel },
+            { onpasteAttr, EventTypeNames::paste },
+            { onpauseAttr, EventTypeNames::pause },
+            { onplayAttr, EventTypeNames::play },
+            { onplayingAttr, EventTypeNames::playing },
+            { onprogressAttr, EventTypeNames::progress },
+            { onratechangeAttr, EventTypeNames::ratechange },
+            { onresetAttr, EventTypeNames::reset },
+            { onresizeAttr, EventTypeNames::resize },
+            { onscrollAttr, EventTypeNames::scroll },
+            { onseekedAttr, EventTypeNames::seeked },
+            { onseekingAttr, EventTypeNames::seeking },
+            { onselectAttr, EventTypeNames::select },
+            { onselectstartAttr, EventTypeNames::selectstart },
+            { onshowAttr, EventTypeNames::show },
+            { onstalledAttr, EventTypeNames::stalled },
+            { onsubmitAttr, EventTypeNames::submit },
+            { onsuspendAttr, EventTypeNames::suspend },
+            { ontimeupdateAttr, EventTypeNames::timeupdate },
+            { ontoggleAttr, EventTypeNames::toggle },
+            { ontouchcancelAttr, EventTypeNames::touchcancel },
+            { ontouchendAttr, EventTypeNames::touchend },
+            { ontouchmoveAttr, EventTypeNames::touchmove },
+            { ontouchstartAttr, EventTypeNames::touchstart },
+            { ontransitionendAttr, EventTypeNames::webkitTransitionEnd },
+            { onvolumechangeAttr, EventTypeNames::volumechange },
+            { onwaitingAttr, EventTypeNames::waiting },
+            { onwebkitanimationendAttr, EventTypeNames::webkitAnimationEnd },
+            { onwebkitanimationiterationAttr, EventTypeNames::webkitAnimationIteration },
+            { onwebkitanimationstartAttr, EventTypeNames::webkitAnimationStart },
+            { onwebkitfullscreenchangeAttr, EventTypeNames::webkitfullscreenchange },
+            { onwebkitfullscreenerrorAttr, EventTypeNames::webkitfullscreenerror },
+            { onwebkittransitionendAttr, EventTypeNames::webkitTransitionEnd },
+            { onwheelAttr, EventTypeNames::wheel },
+        };
+
+        for (size_t i = 0; i < WTF_ARRAY_LENGTH(attrToEventNames); i++)
+            attributeNameToEventNameMap.set(attrToEventNames[i].attr.localName(), attrToEventNames[i].event);
     }
 
     return attributeNameToEventNameMap.get(attrName.localName());
@@ -749,7 +781,7 @@ void HTMLElement::adjustDirectionalityIfNeededAfterChildAttributeChanged(Element
         Element* elementToAdjust = this;
         for (; elementToAdjust; elementToAdjust = elementToAdjust->parentElement()) {
             if (elementAffectsDirectionality(elementToAdjust)) {
-                elementToAdjust->setNeedsStyleRecalc(SubtreeStyleChange);
+                elementToAdjust->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::WritingModeChange));
                 return;
             }
         }
@@ -764,7 +796,7 @@ void HTMLElement::calculateAndAdjustDirectionality()
     for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
         setHasDirAutoFlagRecursively(root, hasDirectionAuto());
     if (renderer() && renderer()->style() && renderer()->style()->direction() != textDirection)
-        setNeedsStyleRecalc(SubtreeStyleChange);
+        setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::WritingModeChange));
 }
 
 void HTMLElement::adjustDirectionalityIfNeededAfterChildrenChanged(const ChildrenChange& change)