Unify the GlobalEventHandlers list on the C++ side

Several changes need to be made in sync to achieve this.

Teach the IDL compiler to generate static calls for EventTarget,
allowing GlobalEventHandlers.h to be the single list of the event
attributes on the C++ side.

The handling of the 5 special event handler attributes on body and
frameset was very strange, with both virtual getters/setters in C++
and overrides at the IDL level. Remove the former mechanism, and fix
up the later to fill the job it was clearly added to do.

Also fix some style issues in EventTarget.h to please presubmit.tributes on the C++ side.

BUG=305112

Review URL: https://codereview.chromium.org/37263002

git-svn-id: svn://svn.chromium.org/blink/trunk@160676 bbb929c8-8fbe-4397-9dbb-9b2b20218538
diff --git a/third_party/WebKit/Source/bindings/scripts/code_generator_v8.pm b/third_party/WebKit/Source/bindings/scripts/code_generator_v8.pm
index 7eace567..c714c34 100644
--- a/third_party/WebKit/Source/bindings/scripts/code_generator_v8.pm
+++ b/third_party/WebKit/Source/bindings/scripts/code_generator_v8.pm
@@ -1635,9 +1635,18 @@
         }
     } elsif ($attribute->type eq "EventHandler") {
         AddToImplIncludes("bindings/v8/V8AbstractEventListener.h");
-        my $getterFunc = ToMethodName($attribute->name);
         # FIXME: Pass the main world ID for main-world-only getters.
-        $code .= "    EventListener* jsValue = imp->${getterFunc}(isolatedWorldForIsolate(info.GetIsolate()));\n";
+        my ($functionName, @arguments) = GetterExpression($interfaceName, $attribute);
+        my $implementedBy = $attribute->extendedAttributes->{"ImplementedBy"};
+        if ($implementedBy) {
+            my $implementedByImplName = GetImplNameFromImplementedBy($implementedBy);
+            $functionName = "${implementedByImplName}::${functionName}";
+            push(@arguments, "imp");
+        } else {
+            $functionName = "imp->${functionName}";
+        }
+        push(@arguments, "isolatedWorldForIsolate(info.GetIsolate())");
+        $code .= "    EventListener* jsValue = ${functionName}(" . join(", ", @arguments) . ");\n";
         $code .= "    v8SetReturnValue(info, jsValue ? v8::Handle<v8::Value>(V8AbstractEventListener::cast(jsValue)->getListenerObject(imp->executionContext())) : v8::Handle<v8::Value>(v8::Null(info.GetIsolate())));\n";
     } else {
         my $nativeValue = NativeToJSValue($attribute->type, $attribute->extendedAttributes, $expression, "    ", "", "info.Holder()", "info.GetIsolate()", "info", "imp", $forMainWorldSuffix, "return");
@@ -1956,17 +1965,38 @@
     }
 
     if ($attribute->type eq "EventHandler") {
-        my $implSetterFunctionName = FirstLetterToUpperCase($attrName);
+        my $implementedBy = $attribute->extendedAttributes->{"ImplementedBy"};
+        my $implementedByImplName;
+        if ($implementedBy) {
+            $implementedByImplName = GetImplNameFromImplementedBy($implementedBy);
+        }
         if (!InheritsInterface($interface, "Node")) {
             my $attrImplName = GetImplName($attribute);
-            $code .= "    transferHiddenDependency(info.Holder(), imp->${attrImplName}(isolatedWorldForIsolate(info.GetIsolate())), jsValue, ${v8ClassName}::eventListenerCacheIndex, info.GetIsolate());\n";
+            my @arguments;
+            if ($implementedBy) {
+                $attrImplName = "${implementedByImplName}::${attrImplName}";
+                push(@arguments, "imp");
+            } else {
+                $attrImplName = "imp->${attrImplName}";
+            }
+            push(@arguments, "isolatedWorldForIsolate(info.GetIsolate())");
+            $code .= "    transferHiddenDependency(info.Holder(), ${attrImplName}(" . join(", ", @arguments) . "), jsValue, ${v8ClassName}::eventListenerCacheIndex, info.GetIsolate());\n";
+        }
+        my ($functionName, @arguments) = SetterExpression($interfaceName, $attribute);
+        if ($implementedBy) {
+            $functionName = "${implementedByImplName}::${functionName}";
+            push(@arguments, "imp");
+        } else {
+            $functionName = "imp->${functionName}";
         }
         if (($interfaceName eq "Window" or $interfaceName eq "WorkerGlobalScope") and $attribute->name eq "onerror") {
             AddToImplIncludes("bindings/v8/V8ErrorHandler.h");
-            $code .= "    imp->set$implSetterFunctionName(V8EventListenerList::findOrCreateWrapper<V8ErrorHandler>(jsValue, true, info.GetIsolate()), isolatedWorldForIsolate(info.GetIsolate()));\n";
+            push(@arguments, "V8EventListenerList::findOrCreateWrapper<V8ErrorHandler>(jsValue, true, info.GetIsolate())");
         } else {
-            $code .= "    imp->set$implSetterFunctionName(V8EventListenerList::getEventListener(jsValue, true, ListenerFindOrCreate), isolatedWorldForIsolate(info.GetIsolate()));\n";
+            push(@arguments, "V8EventListenerList::getEventListener(jsValue, true, ListenerFindOrCreate)");
         }
+        push(@arguments, "isolatedWorldForIsolate(info.GetIsolate())");
+        $code .= "    ${functionName}(" . join(", ", @arguments) . ");\n";
     } else {
         my ($functionName, @arguments) = SetterExpression($interfaceName, $attribute);
         push(@arguments, $expression);
diff --git a/third_party/WebKit/Source/bindings/tests/idls/TestImplements.idl b/third_party/WebKit/Source/bindings/tests/idls/TestImplements.idl
index 71c01e3..eaaedcf 100644
--- a/third_party/WebKit/Source/bindings/tests/idls/TestImplements.idl
+++ b/third_party/WebKit/Source/bindings/tests/idls/TestImplements.idl
@@ -35,6 +35,7 @@
     attribute DOMString implementsStr2;
     [Custom] attribute DOMString implementsStr3;
     attribute Node implementsNode;
+    attribute EventHandler eventHandlerAttribute;
 
     void implementsMethod1();
     [CallWith=ExecutionContext, RaisesException] TestObject implementsMethod2(DOMString strArg, TestObject objArg);
diff --git a/third_party/WebKit/Source/bindings/tests/results/V8TestInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/V8TestInterface.cpp
index 710187e..4dc58ea6 100644
--- a/third_party/WebKit/Source/bindings/tests/results/V8TestInterface.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/V8TestInterface.cpp
@@ -31,9 +31,11 @@
 #include "bindings/v8/ExceptionMessages.h"
 #include "bindings/v8/ExceptionState.h"
 #include "bindings/v8/ScriptController.h"
+#include "bindings/v8/V8AbstractEventListener.h"
 #include "bindings/v8/V8Binding.h"
 #include "bindings/v8/V8DOMConfiguration.h"
 #include "bindings/v8/V8DOMWrapper.h"
+#include "bindings/v8/V8EventListenerList.h"
 #include "bindings/v8/V8ObjectConstructor.h"
 #include "core/dom/ContextFeatures.h"
 #include "core/dom/Document.h"
@@ -188,6 +190,34 @@
     TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
 }
 
+static void eventHandlerAttributeAttributeGetter(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info)
+{
+    TestInterface* imp = V8TestInterface::toNative(info.Holder());
+    EventListener* jsValue = TestImplements::eventHandlerAttribute(imp, isolatedWorldForIsolate(info.GetIsolate()));
+    v8SetReturnValue(info, jsValue ? v8::Handle<v8::Value>(V8AbstractEventListener::cast(jsValue)->getListenerObject(imp->executionContext())) : v8::Handle<v8::Value>(v8::Null(info.GetIsolate())));
+}
+
+static void eventHandlerAttributeAttributeGetterCallback(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info)
+{
+    TRACE_EVENT_SET_SAMPLING_STATE("Blink", "DOMGetter");
+    TestInterfaceV8Internal::eventHandlerAttributeAttributeGetter(name, info);
+    TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
+}
+
+static void eventHandlerAttributeAttributeSetter(v8::Local<v8::String> name, v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info)
+{
+    TestInterface* imp = V8TestInterface::toNative(info.Holder());
+    transferHiddenDependency(info.Holder(), TestImplements::eventHandlerAttribute(imp, isolatedWorldForIsolate(info.GetIsolate())), jsValue, V8TestInterface::eventListenerCacheIndex, info.GetIsolate());
+    TestImplements::setEventHandlerAttribute(imp, V8EventListenerList::getEventListener(jsValue, true, ListenerFindOrCreate), isolatedWorldForIsolate(info.GetIsolate()));
+}
+
+static void eventHandlerAttributeAttributeSetterCallback(v8::Local<v8::String> name, v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info)
+{
+    TRACE_EVENT_SET_SAMPLING_STATE("Blink", "DOMSetter");
+    TestInterfaceV8Internal::eventHandlerAttributeAttributeSetter(name, jsValue, info);
+    TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
+}
+
 static void Node23AttributeGetter(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info)
 {
     TestInterface* imp = V8TestInterface::toNative(info.Holder());
@@ -763,6 +793,7 @@
     {"implementsStr2", TestInterfaceV8Internal::implementsStr2AttributeGetterCallback, TestInterfaceV8Internal::implementsStr2AttributeSetterCallback, 0, 0, 0, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
     {"implementsStr3", TestInterfaceV8Internal::implementsStr3AttributeGetterCallback, TestInterfaceV8Internal::implementsStr3AttributeSetterCallback, 0, 0, 0, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
     {"implementsNode", TestInterfaceV8Internal::implementsNodeAttributeGetterCallback, TestInterfaceV8Internal::implementsNodeAttributeSetterCallback, 0, 0, 0, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
+    {"eventHandlerAttribute", TestInterfaceV8Internal::eventHandlerAttributeAttributeGetterCallback, TestInterfaceV8Internal::eventHandlerAttributeAttributeSetterCallback, 0, 0, 0, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
 #if ENABLE(Condition11) || ENABLE(Condition12)
     {"supplementalStr1", TestInterfaceV8Internal::supplementalStr1AttributeGetterCallback, 0, 0, 0, 0, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
 #endif // ENABLE(Condition11) || ENABLE(Condition12)
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h
index 3f53314..4346ac5 100644
--- a/third_party/WebKit/Source/core/dom/Document.h
+++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -239,78 +239,21 @@
 
     // DOM methods & attributes for Document
 
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecopy);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecut);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforepaste);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(blur);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(cancel);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(canplay);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(canplaythrough);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(change);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(contextmenu);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(copy);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(cuechange);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(cut);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dblclick);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(drag);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragend);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragenter);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragleave);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragover);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragstart);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(drop);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(durationchange);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(emptied);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(ended);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(focus);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(input);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(invalid);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(keydown);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(keypress);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(keyup);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(loadeddata);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(loadedmetadata);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mousedown);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseenter);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseleave);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mousemove);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseout);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseover);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseup);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mousewheel);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(paste);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(pause);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(play);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(playing);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(ratechange);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(reset);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(scroll);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(securitypolicyviolation);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(seeked);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(seeking);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(select);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(selectionchange);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(selectstart);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(show);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(stalled);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(submit);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(suspend);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(timeupdate);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(volumechange);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(waiting);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenchange);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenerror);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitpointerlockchange);
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index 71a661bb..edfd54ea 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -290,12 +290,6 @@
     return true;
 }
 
-DEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, blur);
-DEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, error);
-DEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, focus);
-DEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, load);
-DEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, scroll);
-
 PassRefPtr<Node> Element::cloneNode(bool deep)
 {
     return deep ? cloneElementWithChildren() : cloneElementWithoutChildren();
diff --git a/third_party/WebKit/Source/core/dom/Element.h b/third_party/WebKit/Source/core/dom/Element.h
index 547ba77..c35fe66 100644
--- a/third_party/WebKit/Source/core/dom/Element.h
+++ b/third_party/WebKit/Source/core/dom/Element.h
@@ -82,82 +82,22 @@
     static PassRefPtr<Element> create(const QualifiedName&, Document*);
     virtual ~Element();
 
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecopy);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecut);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforepaste);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(cancel);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(canplay);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(canplaythrough);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(change);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(contextmenu);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(copy);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(cuechange);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(cut);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dblclick);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(drag);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragend);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragenter);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragleave);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragover);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(dragstart);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(drop);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(durationchange);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(emptied);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(ended);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(input);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(invalid);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(keydown);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(keypress);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(keyup);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(loadeddata);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(loadedmetadata);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mousedown);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseenter);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseleave);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mousemove);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseout);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseover);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseup);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(mousewheel);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(paste);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(pause);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(play);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(playing);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(ratechange);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(reset);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(seeked);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(seeking);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(select);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(selectstart);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(show);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(stalled);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(submit);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(suspend);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(timeupdate);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(volumechange);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(waiting);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenchange);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenerror);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel);
 
-    // These four attribute event handler attributes are overridden by HTMLBodyElement
-    // and HTMLFrameSetElement to forward to the DOMWindow.
-    DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(blur);
-    DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(error);
-    DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(focus);
-    DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(load);
-    DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(scroll);
-
     bool hasAttribute(const QualifiedName&) const;
     const AtomicString& getAttribute(const QualifiedName&) const;
     void setAttribute(const QualifiedName&, const AtomicString& value);
diff --git a/third_party/WebKit/Source/core/dom/GlobalEventHandlers.h b/third_party/WebKit/Source/core/dom/GlobalEventHandlers.h
index 4df0ef0..8da83b9 100644
--- a/third_party/WebKit/Source/core/dom/GlobalEventHandlers.h
+++ b/third_party/WebKit/Source/core/dom/GlobalEventHandlers.h
@@ -30,9 +30,68 @@
 #ifndef GlobalEventHandlers_h
 #define GlobalEventHandlers_h
 
+#include "core/events/EventTarget.h"
+
 namespace WebCore {
 
 namespace GlobalEventHandlers {
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(abort);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(blur);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(cancel);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(canplay);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(canplaythrough);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(change);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(click);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(close);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(contextmenu);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(cuechange);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(dblclick);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(drag);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(dragend);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(dragenter);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(dragleave);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(dragover);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(dragstart);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(drop);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(durationchange);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(emptied);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(ended);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(error);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(focus);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(input);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(invalid);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(keydown);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(keypress);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(keyup);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(load);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(loadeddata);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(loadedmetadata);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(loadstart);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(mousedown);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(mouseenter);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(mouseleave);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(mousemove);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(mouseout);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(mouseover);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(mouseup);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(mousewheel);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(pause);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(play);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(playing);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(progress);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(ratechange);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(reset);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(scroll);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(seeked);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(seeking);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(select);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(show);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(stalled);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(submit);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(suspend);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(timeupdate);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(volumechange);
+DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(waiting);
 }
 
 } // namespace
diff --git a/third_party/WebKit/Source/core/events/EventTarget.h b/third_party/WebKit/Source/core/events/EventTarget.h
index 3c5965b..6889bfc 100644
--- a/third_party/WebKit/Source/core/events/EventTarget.h
+++ b/third_party/WebKit/Source/core/events/EventTarget.h
@@ -38,185 +38,185 @@
 
 namespace WebCore {
 
-    class ApplicationCache;
-    class AudioContext;
-    class DOMWindow;
-    class DedicatedWorkerGlobalScope;
-    class Event;
-    class EventListener;
-    class EventSource;
-    class ExceptionState;
-    class FileReader;
-    class FileWriter;
-    class IDBDatabase;
-    class IDBRequest;
-    class IDBTransaction;
-    class MIDIAccess;
-    class MIDIInput;
-    class MIDIPort;
-    class MediaController;
-    class MediaStream;
-    class MessagePort;
-    class NamedFlow;
-    class Node;
-    class Notification;
-    class SVGElementInstance;
-    class ExecutionContext;
-    class ScriptProcessorNode;
-    class SharedWorker;
-    class SharedWorkerGlobalScope;
-    class TextTrack;
-    class TextTrackCue;
-    class WebSocket;
-    class Worker;
-    class XMLHttpRequest;
-    class XMLHttpRequestUpload;
+class ApplicationCache;
+class AudioContext;
+class DOMWindow;
+class DedicatedWorkerGlobalScope;
+class Event;
+class EventListener;
+class EventSource;
+class ExceptionState;
+class FileReader;
+class FileWriter;
+class IDBDatabase;
+class IDBRequest;
+class IDBTransaction;
+class MIDIAccess;
+class MIDIInput;
+class MIDIPort;
+class MediaController;
+class MediaStream;
+class MessagePort;
+class NamedFlow;
+class Node;
+class Notification;
+class SVGElementInstance;
+class ExecutionContext;
+class ScriptProcessorNode;
+class SharedWorker;
+class SharedWorkerGlobalScope;
+class TextTrack;
+class TextTrackCue;
+class WebSocket;
+class Worker;
+class XMLHttpRequest;
+class XMLHttpRequestUpload;
 
-    struct FiringEventIterator {
-        FiringEventIterator(const AtomicString& eventType, size_t& iterator, size_t& end)
-            : eventType(eventType)
-            , iterator(iterator)
-            , end(end)
-        {
-        }
-
-        const AtomicString& eventType;
-        size_t& iterator;
-        size_t& end;
-    };
-    typedef Vector<FiringEventIterator, 1> FiringEventIteratorVector;
-
-    struct EventTargetData {
-        WTF_MAKE_NONCOPYABLE(EventTargetData); WTF_MAKE_FAST_ALLOCATED;
-    public:
-        EventTargetData();
-        ~EventTargetData();
-
-        EventListenerMap eventListenerMap;
-        OwnPtr<FiringEventIteratorVector> firingEventIterators;
-    };
-
-    class EventTarget {
-    public:
-        void ref() { refEventTarget(); }
-        void deref() { derefEventTarget(); }
-
-        virtual const AtomicString& interfaceName() const = 0;
-        virtual ExecutionContext* executionContext() const = 0;
-
-        virtual Node* toNode();
-        virtual DOMWindow* toDOMWindow();
-        virtual MessagePort* toMessagePort();
-
-        virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
-        virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
-        virtual void removeAllEventListeners();
-        virtual bool dispatchEvent(PassRefPtr<Event>);
-        bool dispatchEvent(PassRefPtr<Event>, ExceptionState&); // DOM API
-        virtual void uncaughtExceptionInEventHandler();
-
-        // Used for legacy "onEvent" attribute APIs.
-        bool setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, DOMWrapperWorld* isolatedWorld = 0);
-        EventListener* getAttributeEventListener(const AtomicString& eventType, DOMWrapperWorld* isolatedWorld = 0);
-
-        bool hasEventListeners() const;
-        bool hasEventListeners(const AtomicString& eventType) const;
-        bool hasCapturingEventListeners(const AtomicString& eventType);
-        const EventListenerVector& getEventListeners(const AtomicString& eventType);
-
-        bool fireEventListeners(Event*);
-        bool isFiringEventListeners();
-
-    protected:
-        virtual ~EventTarget();
-
-        // Subclasses should likely not override these themselves; instead, they should subclass EventTargetWithInlineData.
-        virtual EventTargetData* eventTargetData() = 0;
-        virtual EventTargetData& ensureEventTargetData() = 0;
-
-    private:
-        // Subclasses should likely not override these themselves; instead, they should use the REFCOUNTED_EVENT_TARGET() macro.
-        virtual void refEventTarget() = 0;
-        virtual void derefEventTarget() = 0;
-
-        DOMWindow* executingWindow();
-        void fireEventListeners(Event*, EventTargetData*, EventListenerVector&);
-        void countLegacyEvents(const AtomicString& legacyTypeName, EventListenerVector*, EventListenerVector*);
-
-        bool clearAttributeEventListener(const AtomicString& eventType, DOMWrapperWorld* isolatedWorld);
-
-        friend class EventListenerIterator;
-    };
-
-    class EventTargetWithInlineData : public EventTarget {
-    protected:
-        virtual EventTargetData* eventTargetData() OVERRIDE FINAL { return &m_eventTargetData; }
-        virtual EventTargetData& ensureEventTargetData() OVERRIDE FINAL { return m_eventTargetData; }
-    private:
-        EventTargetData m_eventTargetData;
-    };
-
-    // FIXME: These macros should be split into separate DEFINE and DECLARE
-    // macros to avoid causing so many header includes.
-    #define DEFINE_ATTRIBUTE_EVENT_LISTENER(attribute) \
-        EventListener* on##attribute(DOMWrapperWorld* isolatedWorld) { return getAttributeEventListener(EventTypeNames::attribute, isolatedWorld); } \
-        void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld = 0) { setAttributeEventListener(EventTypeNames::attribute, listener, isolatedWorld); } \
-
-    #define DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(attribute) \
-        virtual EventListener* on##attribute(DOMWrapperWorld* isolatedWorld); \
-        virtual void setOn##attribute(PassRefPtr<EventListener>, DOMWrapperWorld* isolatedWorld); \
-
-    #define DEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(type, attribute) \
-        EventListener* type::on##attribute(DOMWrapperWorld* isolatedWorld) { return getAttributeEventListener(EventTypeNames::attribute, isolatedWorld); } \
-        void type::setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld) { setAttributeEventListener(EventTypeNames::attribute, listener, isolatedWorld); } \
-
-    #define DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \
-        EventListener* on##attribute(DOMWrapperWorld* isolatedWorld) { return document().getWindowAttributeEventListener(EventTypeNames::attribute, isolatedWorld); } \
-        void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld) { document().setWindowAttributeEventListener(EventTypeNames::attribute, listener, isolatedWorld); } \
-
-    #define DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(attribute, eventName) \
-        EventListener* on##attribute(DOMWrapperWorld* isolatedWorld) { return getAttributeEventListener(EventTypeNames::eventName, isolatedWorld); } \
-        void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld) { setAttributeEventListener(EventTypeNames::eventName, listener, isolatedWorld); } \
-
-    #define DECLARE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(recipient, attribute) \
-        EventListener* on##attribute(DOMWrapperWorld* isolatedWorld); \
-        void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld);
-
-    #define DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(type, recipient, attribute) \
-        EventListener* type::on##attribute(DOMWrapperWorld* isolatedWorld) { return recipient ? recipient->getAttributeEventListener(EventTypeNames::attribute, isolatedWorld) : 0; } \
-        void type::setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld) { if (recipient) recipient->setAttributeEventListener(EventTypeNames::attribute, listener, isolatedWorld); }
-
-    inline bool EventTarget::isFiringEventListeners()
+struct FiringEventIterator {
+    FiringEventIterator(const AtomicString& eventType, size_t& iterator, size_t& end)
+        : eventType(eventType)
+        , iterator(iterator)
+        , end(end)
     {
-        EventTargetData* d = eventTargetData();
-        if (!d)
-            return false;
-        return d->firingEventIterators && !d->firingEventIterators->isEmpty();
     }
 
-    inline bool EventTarget::hasEventListeners() const
-    {
-        // FIXME: We should have a const version of eventTargetData.
-        if (const EventTargetData* d = const_cast<EventTarget*>(this)->eventTargetData())
-            return !d->eventListenerMap.isEmpty();
+    const AtomicString& eventType;
+    size_t& iterator;
+    size_t& end;
+};
+typedef Vector<FiringEventIterator, 1> FiringEventIteratorVector;
+
+struct EventTargetData {
+    WTF_MAKE_NONCOPYABLE(EventTargetData); WTF_MAKE_FAST_ALLOCATED;
+public:
+    EventTargetData();
+    ~EventTargetData();
+
+    EventListenerMap eventListenerMap;
+    OwnPtr<FiringEventIteratorVector> firingEventIterators;
+};
+
+class EventTarget {
+public:
+    void ref() { refEventTarget(); }
+    void deref() { derefEventTarget(); }
+
+    virtual const AtomicString& interfaceName() const = 0;
+    virtual ExecutionContext* executionContext() const = 0;
+
+    virtual Node* toNode();
+    virtual DOMWindow* toDOMWindow();
+    virtual MessagePort* toMessagePort();
+
+    virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
+    virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
+    virtual void removeAllEventListeners();
+    virtual bool dispatchEvent(PassRefPtr<Event>);
+    bool dispatchEvent(PassRefPtr<Event>, ExceptionState&); // DOM API
+    virtual void uncaughtExceptionInEventHandler();
+
+    // Used for legacy "onEvent" attribute APIs.
+    bool setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, DOMWrapperWorld* isolatedWorld = 0);
+    EventListener* getAttributeEventListener(const AtomicString& eventType, DOMWrapperWorld* isolatedWorld = 0);
+
+    bool hasEventListeners() const;
+    bool hasEventListeners(const AtomicString& eventType) const;
+    bool hasCapturingEventListeners(const AtomicString& eventType);
+    const EventListenerVector& getEventListeners(const AtomicString& eventType);
+
+    bool fireEventListeners(Event*);
+    bool isFiringEventListeners();
+
+protected:
+    virtual ~EventTarget();
+
+    // Subclasses should likely not override these themselves; instead, they should subclass EventTargetWithInlineData.
+    virtual EventTargetData* eventTargetData() = 0;
+    virtual EventTargetData& ensureEventTargetData() = 0;
+
+private:
+    // Subclasses should likely not override these themselves; instead, they should use the REFCOUNTED_EVENT_TARGET() macro.
+    virtual void refEventTarget() = 0;
+    virtual void derefEventTarget() = 0;
+
+    DOMWindow* executingWindow();
+    void fireEventListeners(Event*, EventTargetData*, EventListenerVector&);
+    void countLegacyEvents(const AtomicString& legacyTypeName, EventListenerVector*, EventListenerVector*);
+
+    bool clearAttributeEventListener(const AtomicString& eventType, DOMWrapperWorld* isolatedWorld);
+
+    friend class EventListenerIterator;
+};
+
+class EventTargetWithInlineData : public EventTarget {
+protected:
+    virtual EventTargetData* eventTargetData() OVERRIDE FINAL { return &m_eventTargetData; }
+    virtual EventTargetData& ensureEventTargetData() OVERRIDE FINAL { return m_eventTargetData; }
+private:
+    EventTargetData m_eventTargetData;
+};
+
+// FIXME: These macros should be split into separate DEFINE and DECLARE
+// macros to avoid causing so many header includes.
+#define DEFINE_ATTRIBUTE_EVENT_LISTENER(attribute) \
+    EventListener* on##attribute(DOMWrapperWorld* isolatedWorld) { return getAttributeEventListener(EventTypeNames::attribute, isolatedWorld); } \
+    void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld = 0) { setAttributeEventListener(EventTypeNames::attribute, listener, isolatedWorld); } \
+
+#define DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(attribute) \
+    static EventListener* on##attribute(EventTarget* eventTarget, DOMWrapperWorld* isolatedWorld) { return eventTarget->getAttributeEventListener(EventTypeNames::attribute, isolatedWorld); } \
+    static void setOn##attribute(EventTarget* eventTarget, PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld = 0) { eventTarget->setAttributeEventListener(EventTypeNames::attribute, listener, isolatedWorld); } \
+
+#define DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(attribute) \
+    EventListener* on##attribute(DOMWrapperWorld* isolatedWorld) { return document().getWindowAttributeEventListener(EventTypeNames::attribute, isolatedWorld); } \
+    void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld) { document().setWindowAttributeEventListener(EventTypeNames::attribute, listener, isolatedWorld); } \
+
+#define DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(attribute, eventName) \
+    EventListener* on##attribute(DOMWrapperWorld* isolatedWorld) { return getAttributeEventListener(EventTypeNames::eventName, isolatedWorld); } \
+    void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld) { setAttributeEventListener(EventTypeNames::eventName, listener, isolatedWorld); } \
+
+#define DECLARE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(recipient, attribute) \
+    EventListener* on##attribute(DOMWrapperWorld* isolatedWorld); \
+    void setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld);
+
+#define DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(type, recipient, attribute) \
+    EventListener* type::on##attribute(DOMWrapperWorld* isolatedWorld) { return recipient ? recipient->getAttributeEventListener(EventTypeNames::attribute, isolatedWorld) : 0; } \
+    void type::setOn##attribute(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld) \
+    { \
+        if (recipient) \
+            recipient->setAttributeEventListener(EventTypeNames::attribute, listener, isolatedWorld); \
+    }
+
+inline bool EventTarget::isFiringEventListeners()
+{
+    EventTargetData* d = eventTargetData();
+    if (!d)
         return false;
-    }
+    return d->firingEventIterators && !d->firingEventIterators->isEmpty();
+}
 
-    inline bool EventTarget::hasEventListeners(const AtomicString& eventType) const
-    {
-        // FIXME: We should have const version of eventTargetData.
-        if (const EventTargetData* d = const_cast<EventTarget*>(this)->eventTargetData())
-            return d->eventListenerMap.contains(eventType);
+inline bool EventTarget::hasEventListeners() const
+{
+    // FIXME: We should have a const version of eventTargetData.
+    if (const EventTargetData* d = const_cast<EventTarget*>(this)->eventTargetData())
+        return !d->eventListenerMap.isEmpty();
+    return false;
+}
+
+inline bool EventTarget::hasEventListeners(const AtomicString& eventType) const
+{
+    // FIXME: We should have const version of eventTargetData.
+    if (const EventTargetData* d = const_cast<EventTarget*>(this)->eventTargetData())
+        return d->eventListenerMap.contains(eventType);
+    return false;
+}
+
+inline bool EventTarget::hasCapturingEventListeners(const AtomicString& eventType)
+{
+    EventTargetData* d = eventTargetData();
+    if (!d)
         return false;
-    }
-
-    inline bool EventTarget::hasCapturingEventListeners(const AtomicString& eventType)
-    {
-        EventTargetData* d = eventTargetData();
-        if (!d)
-            return false;
-        return d->eventListenerMap.containsCapturing(eventType);
-    }
+    return d->eventListenerMap.containsCapturing(eventType);
+}
 
 } // namespace WebCore
 
diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.h b/third_party/WebKit/Source/core/frame/DOMWindow.h
index 351b3697..5d89798 100644
--- a/third_party/WebKit/Source/core/frame/DOMWindow.h
+++ b/third_party/WebKit/Source/core/frame/DOMWindow.h
@@ -257,79 +257,22 @@
 
         void dispatchLoadEvent();
 
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(animationend);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(animationiteration);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(animationstart);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(beforeunload);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(blur);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(cancel);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(canplay);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(canplaythrough);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(change);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(contextmenu);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(cuechange);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(dblclick);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(drag);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(dragend);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(dragenter);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(dragleave);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(dragover);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(dragstart);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(drop);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(durationchange);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(emptied);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(ended);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(focus);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(hashchange);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(input);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(invalid);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(keydown);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(keypress);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(keyup);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(loadeddata);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(loadedmetadata);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(message);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(mousedown);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseenter);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseleave);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(mousemove);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseout);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseover);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseup);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(mousewheel);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(offline);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(online);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(pagehide);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(pageshow);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(pause);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(play);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(playing);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(popstate);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(ratechange);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(reset);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(resize);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(scroll);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(seeked);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(seeking);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(select);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(show);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(stalled);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(storage);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(submit);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(suspend);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(timeupdate);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(transitionend);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(unload);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(volumechange);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(waiting);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel);
 
         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationstart, webkitAnimationStart);
diff --git a/third_party/WebKit/Source/core/html/HTMLBodyElement.h b/third_party/WebKit/Source/core/html/HTMLBodyElement.h
index 769bd4f..69b9910 100644
--- a/third_party/WebKit/Source/core/html/HTMLBodyElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLBodyElement.h
@@ -36,7 +36,6 @@
     static PassRefPtr<HTMLBodyElement> create(const QualifiedName&, Document&);
     virtual ~HTMLBodyElement();
 
-    // Declared virtual in Element
     DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(blur);
     DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(error);
     DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(focus);
diff --git a/third_party/WebKit/Source/core/html/HTMLBodyElement.idl b/third_party/WebKit/Source/core/html/HTMLBodyElement.idl
index 374f671..d96c36d 100644
--- a/third_party/WebKit/Source/core/html/HTMLBodyElement.idl
+++ b/third_party/WebKit/Source/core/html/HTMLBodyElement.idl
@@ -39,11 +39,12 @@
 
     [Conditional=ORIENTATION_EVENTS] attribute EventHandler onorientationchange;
 
-    // Overrides of Element attributes (with different implementation in bindings).
+    // Overrides of GlobalEventHandler attributes
     attribute EventHandler onblur;
     attribute EventHandler onerror;
     attribute EventHandler onfocus;
     attribute EventHandler onload;
+    attribute EventHandler onscroll;
 
     // Not implemented yet.
     // attribute EventHandler onafterprint;
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameSetElement.h b/third_party/WebKit/Source/core/html/HTMLFrameSetElement.h
index 8ff251b..0ffd6d83 100644
--- a/third_party/WebKit/Source/core/html/HTMLFrameSetElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLFrameSetElement.h
@@ -47,7 +47,6 @@
 
     DOMWindow* anonymousNamedGetter(const AtomicString&);
 
-    // Declared virtual in Element
     DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(blur);
     DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(error);
     DEFINE_WINDOW_ATTRIBUTE_EVENT_LISTENER(focus);
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameSetElement.idl b/third_party/WebKit/Source/core/html/HTMLFrameSetElement.idl
index 455f8ee..ba8679e 100644
--- a/third_party/WebKit/Source/core/html/HTMLFrameSetElement.idl
+++ b/third_party/WebKit/Source/core/html/HTMLFrameSetElement.idl
@@ -36,11 +36,12 @@
 
     [Conditional=ORIENTATION_EVENTS] attribute EventHandler onorientationchange;
 
-    // Overrides of Element attributes (with different implementation in bindings).
+    // Overrides of GlobalEventHandler attributes
     attribute EventHandler onblur;
     attribute EventHandler onerror;
     attribute EventHandler onfocus;
     attribute EventHandler onload;
+    attribute EventHandler onscroll;
 
     // Not implemented yet.
     // attribute EventHandler onafterprint;