Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: Source/bindings/v8/V8AbstractEventListener.cpp

Issue 14334002: Delete WorldContextHandle in favor of DOMWrapperWorld (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 #include "WorkerContext.h" 45 #include "WorkerContext.h"
46 46
47 namespace WebCore { 47 namespace WebCore {
48 48
49 template<> 49 template<>
50 void WeakHandleListener<V8AbstractEventListener>::callback(v8::Isolate*, v8::Per sistent<v8::Value>, V8AbstractEventListener* listener) 50 void WeakHandleListener<V8AbstractEventListener>::callback(v8::Isolate*, v8::Per sistent<v8::Value>, V8AbstractEventListener* listener)
51 { 51 {
52 listener->m_listener.clear(); 52 listener->m_listener.clear();
53 } 53 }
54 54
55 V8AbstractEventListener::V8AbstractEventListener(bool isAttribute, const WorldCo ntextHandle& worldContext, v8::Isolate* isolate) 55 V8AbstractEventListener::V8AbstractEventListener(bool isAttribute, PassRefPtr<DO MWrapperWorld> world, v8::Isolate* isolate)
56 : EventListener(JSEventListenerType) 56 : EventListener(JSEventListenerType)
57 , m_isAttribute(isAttribute) 57 , m_isAttribute(isAttribute)
58 , m_worldContext(worldContext) 58 , m_world(world)
59 , m_isolate(isolate) 59 , m_isolate(isolate)
60 { 60 {
61 ThreadLocalInspectorCounters::current().incrementCounter(ThreadLocalInspecto rCounters::JSEventListenerCounter); 61 ThreadLocalInspectorCounters::current().incrementCounter(ThreadLocalInspecto rCounters::JSEventListenerCounter);
62 } 62 }
63 63
64 V8AbstractEventListener::~V8AbstractEventListener() 64 V8AbstractEventListener::~V8AbstractEventListener()
65 { 65 {
66 if (!m_listener.isEmpty()) { 66 if (!m_listener.isEmpty()) {
67 v8::HandleScope scope; 67 v8::HandleScope scope;
68 V8EventListenerList::clearWrapper(v8::Local<v8::Object>::New(m_listener. get()), m_isAttribute); 68 V8EventListenerList::clearWrapper(v8::Local<v8::Object>::New(m_listener. get()), m_isAttribute);
69 } 69 }
70 ThreadLocalInspectorCounters::current().decrementCounter(ThreadLocalInspecto rCounters::JSEventListenerCounter); 70 ThreadLocalInspectorCounters::current().decrementCounter(ThreadLocalInspecto rCounters::JSEventListenerCounter);
71 } 71 }
72 72
73 void V8AbstractEventListener::handleEvent(ScriptExecutionContext* context, Event * event) 73 void V8AbstractEventListener::handleEvent(ScriptExecutionContext* context, Event * event)
74 { 74 {
75 // Don't reenter V8 if execution was terminated in this instance of V8. 75 // Don't reenter V8 if execution was terminated in this instance of V8.
76 if (context->isJSExecutionForbidden()) 76 if (context->isJSExecutionForbidden())
77 return; 77 return;
78 78
79 ASSERT(event); 79 ASSERT(event);
80 80
81 // The callback function on XMLHttpRequest can clear the event listener and destroys 'this' object. Keep a local reference to it. 81 // The callback function on XMLHttpRequest can clear the event listener and destroys 'this' object. Keep a local reference to it.
82 // See issue 889829. 82 // See issue 889829.
83 RefPtr<V8AbstractEventListener> protect(this); 83 RefPtr<V8AbstractEventListener> protect(this);
84 84
85 v8::HandleScope handleScope; 85 v8::HandleScope handleScope;
86 86
87 v8::Local<v8::Context> v8Context = toV8Context(context, worldContext()); 87 v8::Local<v8::Context> v8Context = toV8Context(context, world());
88 if (v8Context.IsEmpty()) 88 if (v8Context.IsEmpty())
89 return; 89 return;
90 90
91 // Enter the V8 context in which to perform the event handling. 91 // Enter the V8 context in which to perform the event handling.
92 v8::Context::Scope scope(v8Context); 92 v8::Context::Scope scope(v8Context);
93 93
94 // Get the V8 wrapper for the event object. 94 // Get the V8 wrapper for the event object.
95 v8::Handle<v8::Value> jsEvent = toV8(event, v8::Handle<v8::Object>(), v8Cont ext->GetIsolate()); 95 v8::Handle<v8::Value> jsEvent = toV8(event, v8::Handle<v8::Object>(), v8Cont ext->GetIsolate());
96 if (jsEvent.IsEmpty()) 96 if (jsEvent.IsEmpty())
97 return; 97 return;
98 invokeEventHandler(context, event, jsEvent); 98 invokeEventHandler(context, event, jsEvent);
99 } 99 }
100 100
101 void V8AbstractEventListener::setListenerObject(v8::Handle<v8::Object> listener) 101 void V8AbstractEventListener::setListenerObject(v8::Handle<v8::Object> listener)
102 { 102 {
103 m_listener.set(listener); 103 m_listener.set(listener);
104 WeakHandleListener<V8AbstractEventListener>::makeWeak(m_isolate, m_listener. get(), this); 104 WeakHandleListener<V8AbstractEventListener>::makeWeak(m_isolate, m_listener. get(), this);
105 } 105 }
106 106
107 void V8AbstractEventListener::invokeEventHandler(ScriptExecutionContext* context , Event* event, v8::Handle<v8::Value> jsEvent) 107 void V8AbstractEventListener::invokeEventHandler(ScriptExecutionContext* context , Event* event, v8::Handle<v8::Value> jsEvent)
108 { 108 {
109 // If jsEvent is empty, attempt to set it as a hidden value would crash v8. 109 // If jsEvent is empty, attempt to set it as a hidden value would crash v8.
110 if (jsEvent.IsEmpty()) 110 if (jsEvent.IsEmpty())
111 return; 111 return;
112 112
113 v8::Local<v8::Context> v8Context = toV8Context(context, worldContext()); 113 v8::Local<v8::Context> v8Context = toV8Context(context, world());
114 if (v8Context.IsEmpty()) 114 if (v8Context.IsEmpty())
115 return; 115 return;
116 116
117 // We push the event being processed into the global object, so that it can be exposed by DOMWindow's bindings. 117 // We push the event being processed into the global object, so that it can be exposed by DOMWindow's bindings.
118 v8::Handle<v8::String> eventSymbol = V8HiddenPropertyName::event(); 118 v8::Handle<v8::String> eventSymbol = V8HiddenPropertyName::event();
119 v8::Local<v8::Value> returnValue; 119 v8::Local<v8::Value> returnValue;
120 120
121 // In beforeunload/unload handlers, we want to avoid sleeps which do tight l oops of calling Date.getTime(). 121 // In beforeunload/unload handlers, we want to avoid sleeps which do tight l oops of calling Date.getTime().
122 if (event->type() == eventNames().beforeunloadEvent || event->type() == even tNames().unloadEvent) 122 if (event->type() == eventNames().beforeunloadEvent || event->type() == even tNames().unloadEvent)
123 DateExtension::get()->setAllowSleep(false); 123 DateExtension::get()->setAllowSleep(false);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 // http://www.w3.org/TR/html5/webappapis.html#event-handler-attributes 175 // http://www.w3.org/TR/html5/webappapis.html#event-handler-attributes
176 return returnValue->IsBoolean() && !returnValue->BooleanValue(); 176 return returnValue->IsBoolean() && !returnValue->BooleanValue();
177 } 177 }
178 178
179 v8::Local<v8::Object> V8AbstractEventListener::getReceiverObject(ScriptExecution Context* context, Event* event) 179 v8::Local<v8::Object> V8AbstractEventListener::getReceiverObject(ScriptExecution Context* context, Event* event)
180 { 180 {
181 if (!m_listener.isEmpty() && !m_listener->IsFunction()) 181 if (!m_listener.isEmpty() && !m_listener->IsFunction())
182 return v8::Local<v8::Object>::New(m_listener.get()); 182 return v8::Local<v8::Object>::New(m_listener.get());
183 183
184 EventTarget* target = event->currentTarget(); 184 EventTarget* target = event->currentTarget();
185 v8::Handle<v8::Value> value = toV8(target, v8::Handle<v8::Object>(), toV8Con text(context, worldContext())->GetIsolate()); 185 v8::Handle<v8::Value> value = toV8(target, v8::Handle<v8::Object>(), toV8Con text(context, world())->GetIsolate());
186 if (value.IsEmpty()) 186 if (value.IsEmpty())
187 return v8::Local<v8::Object>(); 187 return v8::Local<v8::Object>();
188 return v8::Local<v8::Object>::New(v8::Handle<v8::Object>::Cast(value)); 188 return v8::Local<v8::Object>::New(v8::Handle<v8::Object>::Cast(value));
189 } 189 }
190 190
191 } // namespace WebCore 191 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698