This source file includes following definitions.
- m_scriptState
- call
- setWeakCallback
#include "config.h"
#include "bindings/v8/V8MutationCallback.h"
#include "V8MutationObserver.h"
#include "V8MutationRecord.h"
#include "bindings/v8/ScriptController.h"
#include "bindings/v8/V8Binding.h"
#include "bindings/v8/V8HiddenValue.h"
#include "core/dom/ExecutionContext.h"
#include "wtf/Assertions.h"
namespace WebCore {
V8MutationCallback::V8MutationCallback(v8::Handle<v8::Function> callback, ExecutionContext* context, v8::Handle<v8::Object> owner, v8::Isolate* isolate)
: ActiveDOMCallback(context)
, m_callback(isolate, callback)
, m_scriptState(NewScriptState::current(isolate))
{
V8HiddenValue::setHiddenValue(isolate, owner, V8HiddenValue::callback(isolate), callback);
m_callback.setWeak(this, &setWeakCallback);
}
void V8MutationCallback::call(const Vector<RefPtr<MutationRecord> >& mutations, MutationObserver* observer)
{
if (!canInvokeCallback())
return;
v8::Isolate* isolate = m_scriptState->isolate();
v8::HandleScope handleScope(isolate);
v8::Handle<v8::Context> v8Context = m_scriptState->context();
if (v8Context.IsEmpty())
return;
v8::Context::Scope scope(v8Context);
v8::Handle<v8::Function> callback = m_callback.newLocal(isolate);
if (callback.IsEmpty())
return;
v8::Handle<v8::Value> observerHandle = toV8(observer, v8::Handle<v8::Object>(), isolate);
if (observerHandle.IsEmpty()) {
if (!isScriptControllerTerminating())
CRASH();
return;
}
if (!observerHandle->IsObject())
return;
v8::Handle<v8::Object> thisObject = v8::Handle<v8::Object>::Cast(observerHandle);
v8::Handle<v8::Value> argv[] = { v8Array(mutations, isolate), observerHandle };
v8::TryCatch exceptionCatcher;
exceptionCatcher.SetVerbose(true);
ScriptController::callFunction(executionContext(), callback, thisObject, 2, argv, isolate);
}
void V8MutationCallback::setWeakCallback(const v8::WeakCallbackData<v8::Function, V8MutationCallback>& data)
{
data.GetParameter()->m_callback.clear();
}
}