summaryrefslogtreecommitdiff
path: root/Source/WebCore/dom/NoEventDispatchAssertion.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/dom/NoEventDispatchAssertion.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/dom/NoEventDispatchAssertion.h')
-rw-r--r--Source/WebCore/dom/NoEventDispatchAssertion.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/Source/WebCore/dom/NoEventDispatchAssertion.h b/Source/WebCore/dom/NoEventDispatchAssertion.h
new file mode 100644
index 000000000..16038611b
--- /dev/null
+++ b/Source/WebCore/dom/NoEventDispatchAssertion.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
+ * (C) 1999 Antti Koivisto (koivisto@kde.org)
+ * (C) 2001 Dirk Mueller (mueller@kde.org)
+ * Copyright (C) 2004-2016 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#pragma once
+
+#include "ContainerNode.h"
+#include <wtf/MainThread.h>
+
+namespace WebCore {
+
+class NoEventDispatchAssertion {
+public:
+ NoEventDispatchAssertion()
+ {
+#if !ASSERT_DISABLED
+ if (!isMainThread())
+ return;
+ ++s_count;
+#endif
+ }
+
+ NoEventDispatchAssertion(const NoEventDispatchAssertion&)
+ : NoEventDispatchAssertion()
+ {
+ }
+
+ ~NoEventDispatchAssertion()
+ {
+#if !ASSERT_DISABLED
+ if (!isMainThread())
+ return;
+ ASSERT(s_count);
+ s_count--;
+#endif
+ }
+
+ static bool isEventAllowedInMainThread()
+ {
+#if ASSERT_DISABLED
+ return true;
+#else
+ return !isMainThread() || !s_count;
+#endif
+ }
+
+ static bool isEventDispatchAllowedInSubtree(Node& node)
+ {
+ return isEventAllowedInMainThread() || EventAllowedScope::isAllowedNode(node);
+ }
+
+#if !ASSERT_DISABLED
+ class EventAllowedScope {
+ public:
+ explicit EventAllowedScope(ContainerNode& userAgentContentRoot)
+ : m_eventAllowedTreeRoot(userAgentContentRoot)
+ , m_previousScope(s_currentScope)
+ {
+ s_currentScope = this;
+ }
+
+ ~EventAllowedScope()
+ {
+ s_currentScope = m_previousScope;
+ }
+
+ static bool isAllowedNode(Node& node)
+ {
+ return s_currentScope && s_currentScope->isAllowedNodeInternal(node);
+ }
+
+ private:
+ bool isAllowedNodeInternal(Node& node)
+ {
+ return m_eventAllowedTreeRoot->contains(&node) || (m_previousScope && m_previousScope->isAllowedNodeInternal(node));
+ }
+
+ Ref<ContainerNode> m_eventAllowedTreeRoot;
+
+ EventAllowedScope* m_previousScope;
+ static EventAllowedScope* s_currentScope;
+ };
+#else
+ class EventAllowedScope {
+ public:
+ explicit EventAllowedScope(ContainerNode&) { }
+ static bool isAllowedNode(Node&) { return true; }
+ };
+#endif
+
+#if !ASSERT_DISABLED
+ class DisableAssertionsInScope {
+ public:
+ DisableAssertionsInScope()
+ {
+ if (!isMainThread())
+ return;
+ s_existingCount = s_count;
+ s_count = 0;
+ }
+
+ ~DisableAssertionsInScope()
+ {
+ s_count = s_existingCount;
+ s_existingCount = 0;
+ }
+ private:
+ WEBCORE_EXPORT static unsigned s_existingCount;
+ };
+#else
+ class DisableAssertionsInScope {
+ public:
+ DisableAssertionsInScope() { }
+ };
+#endif
+
+#if !ASSERT_DISABLED
+private:
+ WEBCORE_EXPORT static unsigned s_count;
+#endif
+};
+
+} // namespace WebCore