Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 81 ScriptController& scriptController = frame->script(); | 81 ScriptController& scriptController = frame->script(); |
| 82 if (!scriptController.canExecuteScripts(AboutToExecuteScript)) | 82 if (!scriptController.canExecuteScripts(AboutToExecuteScript)) |
| 83 return nullptr; | 83 return nullptr; |
| 84 | 84 |
| 85 TextPosition position = scriptController.eventHandlerPosition(); | 85 TextPosition position = scriptController.eventHandlerPosition(); |
| 86 String sourceURL = frame->document()->url().string(); | 86 String sourceURL = frame->document()->url().string(); |
| 87 | 87 |
| 88 return V8LazyEventListener::create(name.localName(), eventParameterName, val ue, sourceURL, position, 0, toIsolate(frame)); | 88 return V8LazyEventListener::create(name.localName(), eventParameterName, val ue, sourceURL, position, 0, toIsolate(frame)); |
| 89 } | 89 } |
| 90 | 90 |
| 91 static v8::MaybeLocal<v8::Function> eventListenerEffectiveFunction(v8::Isolate* isolate, v8::Local<v8::Context> context, v8::Local<v8::Object> listenerObject) | 91 v8::Local<v8::Object> eventListenerHandler(ExecutionContext* executionContext, E ventListener* listener) |
| 92 { | 92 { |
| 93 if (listenerObject->IsFunction()) { | 93 if (listener->type() != EventListener::JSEventListenerType) |
| 94 return v8::MaybeLocal<v8::Function>(listenerObject.As<v8::Function>()); | 94 return v8::Local<v8::Object>(); |
| 95 } else if (listenerObject->IsObject()) { | 95 V8AbstractEventListener* v8Listener = static_cast<V8AbstractEventListener*>( listener); |
| 96 // Try the "handleEvent" method (EventListener interface). | 96 return v8Listener->getListenerObject(executionContext); |
| 97 v8::Local<v8::Value> property; | |
| 98 if (listenerObject->Get(context, v8AtomicString(isolate, "handleEvent")) .ToLocal(&property) && property->IsFunction()) | |
| 99 return v8::MaybeLocal<v8::Function>(property.As<v8::Function>()); | |
| 100 // Fall back to the "constructor" property. | |
| 101 if (listenerObject->Get(context, v8AtomicString(isolate, "constructor")) .ToLocal(&property) && property->IsFunction()) | |
| 102 return v8::MaybeLocal<v8::Function>(property.As<v8::Function>()); | |
| 103 } | |
| 104 return v8::MaybeLocal<v8::Function>(); | |
| 105 } | 97 } |
| 106 | 98 |
| 107 ScriptValue eventListenerHandler(ExecutionContext* executionContext, EventListen er* listener) | 99 v8::Local<v8::Function> eventListenerEffectiveFunction(v8::Isolate* isolate, v8: :Local<v8::Object> handler) |
| 108 { | 100 { |
| 109 if (listener->type() != EventListener::JSEventListenerType) | 101 v8::Local<v8::Function> function; |
| 110 return ScriptValue(); | 102 if (handler->IsFunction()) { |
| 111 | 103 function = handler.As<v8::Function>(); |
| 112 v8::Isolate* isolate = toIsolate(executionContext); | 104 } else if (handler->IsObject()) { |
| 113 v8::HandleScope scope(isolate); | 105 v8::Local<v8::Value> property; |
| 114 V8AbstractEventListener* v8Listener = static_cast<V8AbstractEventListener*>( listener); | 106 // Try the "handleEvent" method (EventListener interface). |
| 115 v8::Local<v8::Context> context = toV8Context(executionContext, v8Listener->w orld()); | 107 if (handler->Get(handler->CreationContext(), v8AtomicString(isolate, "ha ndleEvent")).ToLocal(&property) && property->IsFunction()) |
| 116 v8::Context::Scope contextScope(context); | 108 function = property.As<v8::Function>(); |
| 117 v8::Local<v8::Object> function = v8Listener->getListenerObject(executionCont ext); | 109 // Fall back to the "constructor" property. |
| 118 if (function.IsEmpty()) | 110 else if (handler->Get(handler->CreationContext(), v8AtomicString(isolate , "constructor")).ToLocal(&property) && property->IsFunction()) |
| 119 return ScriptValue(); | 111 function = property.As<v8::Function>(); |
| 120 return ScriptValue(ScriptState::from(context), function); | 112 } |
| 113 if (!function.IsEmpty()) | |
| 114 return getBoundFunction(function); | |
| 115 return v8::Local<v8::Function>(); | |
| 121 } | 116 } |
| 122 | 117 |
| 123 ScriptState* eventListenerHandlerScriptState(LocalFrame* frame, EventListener* l istener) | 118 void functionLocation(v8::Local<v8::Function> function, String& scriptId, int& l ineNumber, int& columnNumber) |
|
yurys
2015/08/11 21:10:24
style: getFunctionLocation since we use return par
kozy
2015/08/12 18:02:22
Done.
| |
| 124 { | 119 { |
| 125 if (listener->type() != EventListener::JSEventListenerType) | 120 int scriptIdValue = function->ScriptId(); |
| 126 return 0; | |
| 127 V8AbstractEventListener* v8Listener = static_cast<V8AbstractEventListener*>( listener); | |
| 128 v8::HandleScope scope(toIsolate(frame)); | |
| 129 v8::Local<v8::Context> v8Context = frame->script().windowProxy(v8Listener->w orld())->context(); | |
| 130 return ScriptState::from(v8Context); | |
| 131 } | |
| 132 | |
| 133 bool eventListenerHandlerLocation(ExecutionContext* executionContext, EventListe ner* listener, String& scriptId, int& lineNumber, int& columnNumber) | |
| 134 { | |
| 135 if (listener->type() != EventListener::JSEventListenerType) | |
| 136 return false; | |
| 137 | |
| 138 v8::HandleScope scope(toIsolate(executionContext)); | |
| 139 V8AbstractEventListener* v8Listener = static_cast<V8AbstractEventListener*>( listener); | |
| 140 v8::Local<v8::Context> context = toV8Context(executionContext, v8Listener->w orld()); | |
| 141 v8::Context::Scope contextScope(context); | |
| 142 v8::Local<v8::Object> object = v8Listener->getListenerObject(executionContex t); | |
| 143 if (object.IsEmpty()) | |
| 144 return false; | |
| 145 v8::Local<v8::Function> function; | |
| 146 if (!eventListenerEffectiveFunction(scope.GetIsolate(), context, object).ToL ocal(&function)) | |
| 147 return false; | |
| 148 v8::Local<v8::Function> originalFunction = getBoundFunction(function); | |
| 149 int scriptIdValue = originalFunction->ScriptId(); | |
| 150 scriptId = String::number(scriptIdValue); | 121 scriptId = String::number(scriptIdValue); |
| 151 lineNumber = originalFunction->GetScriptLineNumber(); | 122 lineNumber = function->GetScriptLineNumber(); |
| 152 columnNumber = originalFunction->GetScriptColumnNumber(); | 123 columnNumber = function->GetScriptColumnNumber(); |
| 153 return true; | |
| 154 } | 124 } |
| 155 | 125 |
| 156 } // namespace blink | 126 } // namespace blink |
| OLD | NEW |