X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fthird_party%2FWebKit%2FSource%2Fbindings%2Fv8%2FV8NodeFilterCondition.cpp;h=49ef6d0731b5c0f70b80f2edd712398d9befdb56;hb=004985e17e624662a4c85c76a7654039dc83f028;hp=77ec3a149dbf0b5163357265bc14a0967843f355;hpb=2f108dbacb161091e42a3479f4e171339b7e7623;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/third_party/WebKit/Source/bindings/v8/V8NodeFilterCondition.cpp b/src/third_party/WebKit/Source/bindings/v8/V8NodeFilterCondition.cpp index 77ec3a1..49ef6d0 100644 --- a/src/third_party/WebKit/Source/bindings/v8/V8NodeFilterCondition.cpp +++ b/src/third_party/WebKit/Source/bindings/v8/V8NodeFilterCondition.cpp @@ -33,7 +33,6 @@ #include "V8Node.h" #include "bindings/v8/ScriptController.h" -#include "bindings/v8/ScriptState.h" #include "bindings/v8/V8HiddenValue.h" #include "core/dom/Node.h" #include "core/dom/NodeFilter.h" @@ -42,24 +41,31 @@ namespace WebCore { V8NodeFilterCondition::V8NodeFilterCondition(v8::Handle filter, v8::Handle owner, v8::Isolate* isolate) - : m_filter(isolate, filter) + : m_scriptState(ScriptState::current(isolate)) { - V8HiddenValue::setHiddenValue(isolate, owner, V8HiddenValue::condition(isolate), filter); - m_filter.setWeak(this, &setWeakCallback); + // ..acceptNode(..) will only dispatch m_filter if m_filter->IsObject(). + // We'll make sure m_filter is either usable by acceptNode or empty. + // (See the fast/dom/node-filter-gc test for a case where 'empty' happens.) + if (!filter.IsEmpty() && filter->IsObject()) { + V8HiddenValue::setHiddenValue(isolate, owner, V8HiddenValue::condition(isolate), filter); + m_filter.set(isolate, filter); + m_filter.setWeak(this, &setWeakCallback); + } } V8NodeFilterCondition::~V8NodeFilterCondition() { } -short V8NodeFilterCondition::acceptNode(ScriptState* state, Node* node) const +short V8NodeFilterCondition::acceptNode(Node* node, ExceptionState& exceptionState) const { - v8::Isolate* isolate = state->isolate(); - ASSERT(isolate->InContext()); + v8::Isolate* isolate = m_scriptState->isolate(); + ASSERT(!m_scriptState->context().IsEmpty()); v8::HandleScope handleScope(isolate); v8::Handle filter = m_filter.newLocal(isolate); - ASSERT(!filter.IsEmpty()); - if (!filter->IsObject()) + + ASSERT(filter.IsEmpty() || filter->IsObject()); + if (filter.IsEmpty()) return NodeFilter::FILTER_ACCEPT; v8::TryCatch exceptionCatcher; @@ -70,20 +76,20 @@ short V8NodeFilterCondition::acceptNode(ScriptState* state, Node* node) const else { v8::Local value = filter->ToObject()->Get(v8AtomicString(isolate, "acceptNode")); if (value.IsEmpty() || !value->IsFunction()) { - throwTypeError("NodeFilter object does not have an acceptNode function", state->isolate()); + throwTypeError("NodeFilter object does not have an acceptNode function", isolate); return NodeFilter::FILTER_REJECT; } callback = v8::Handle::Cast(value); } OwnPtr[]> info = adoptArrayPtr(new v8::Handle[1]); - info[0] = toV8(node, v8::Handle(), state->isolate()); + info[0] = toV8(node, v8::Handle(), isolate); - v8::Handle object = isolate->GetCurrentContext()->Global(); - v8::Handle result = ScriptController::callFunction(state->executionContext(), callback, object, 1, info.get(), isolate); + v8::Handle object = m_scriptState->context()->Global(); + v8::Handle result = ScriptController::callFunction(m_scriptState->executionContext(), callback, object, 1, info.get(), isolate); if (exceptionCatcher.HasCaught()) { - state->setException(exceptionCatcher.Exception()); + exceptionState.rethrowV8Exception(exceptionCatcher.Exception()); return NodeFilter::FILTER_REJECT; }