summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/js/JSNodeFilterCondition.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/js/JSNodeFilterCondition.cpp')
-rw-r--r--WebCore/bindings/js/JSNodeFilterCondition.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/WebCore/bindings/js/JSNodeFilterCondition.cpp b/WebCore/bindings/js/JSNodeFilterCondition.cpp
new file mode 100644
index 0000000..17884f9
--- /dev/null
+++ b/WebCore/bindings/js/JSNodeFilterCondition.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2001 Peter Kelly (pmk@post.com)
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "JSNodeFilterCondition.h"
+
+#include "Document.h"
+#include "Frame.h"
+#include "JSNode.h"
+#include "JSNodeFilter.h"
+#include "NodeFilter.h"
+#include "kjs_proxy.h"
+
+namespace WebCore {
+
+using namespace KJS;
+
+// FIXME: Add takeException as a member of ExecState?
+static JSValue* takeException(ExecState* exec)
+{
+ JSValue* exception = exec->exception();
+ exec->clearException();
+ return exception;
+}
+
+JSNodeFilterCondition::JSNodeFilterCondition(JSObject* filter)
+ : m_filter(filter)
+{
+}
+
+void JSNodeFilterCondition::mark()
+{
+ m_filter->mark();
+}
+
+short JSNodeFilterCondition::acceptNode(Node* filterNode, JSValue*& exception) const
+{
+ // FIXME: It makes no sense for this to depend on the document being in a frame!
+ Frame* frame = filterNode->document()->frame();
+ if (!frame)
+ return NodeFilter::FILTER_REJECT;
+
+ JSLock lock;
+
+ if (!m_filter->implementsCall())
+ return NodeFilter::FILTER_REJECT;
+
+ ExecState* exec = frame->scriptProxy()->globalObject()->globalExec();
+ List args;
+ args.append(toJS(exec, filterNode));
+ if (exec->hadException()) {
+ exception = takeException(exec);
+ return NodeFilter::FILTER_REJECT;
+ }
+ JSValue* result = m_filter->call(exec, m_filter, args);
+ if (exec->hadException()) {
+ exception = takeException(exec);
+ return NodeFilter::FILTER_REJECT;
+ }
+ int intResult = result->toInt32(exec);
+ if (exec->hadException()) {
+ exception = takeException(exec);
+ return NodeFilter::FILTER_REJECT;
+ }
+ return intResult;
+}
+
+} // namespace WebCore