ASSERTION FAILED: roundedIntPoint(LayoutPoint(rendererMappedResult)) == result in...
[WebKit.git] / Source / WebCore / Modules / indexeddb / IDBActiveDOMObject.h
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "ActiveDOMObject.h"
29 #include "ScriptExecutionContext.h"
30 #include <wtf/Threading.h>
31
32 #if ENABLE(INDEXED_DATABASE)
33
34 namespace WebCore {
35
36 class IDBActiveDOMObject : public ActiveDOMObject {
37 public:
38     Thread& originThread() const { return m_originThread.get(); }
39
40     void contextDestroyed() final {
41         ASSERT(canCurrentThreadAccessThreadLocalData(originThread()));
42
43         Locker<Lock> lock(m_scriptExecutionContextLock);
44         ActiveDOMObject::contextDestroyed();
45     }
46
47     template<typename T, typename... Parameters, typename... Arguments>
48     void performCallbackOnOriginThread(T& object, void (T::*method)(Parameters...), Arguments&&... arguments)
49     {
50         ASSERT(&originThread() == &object.originThread());
51
52         if (canCurrentThreadAccessThreadLocalData(object.originThread())) {
53             (object.*method)(arguments...);
54             return;
55         }
56
57         Locker<Lock> lock(m_scriptExecutionContextLock);
58
59         ScriptExecutionContext* context = scriptExecutionContext();
60         if (!context)
61             return;
62
63         context->postCrossThreadTask(object, method, arguments...);
64     }
65
66     void callFunctionOnOriginThread(WTF::Function<void ()>&& function)
67     {
68         if (canCurrentThreadAccessThreadLocalData(originThread())) {
69             function();
70             return;
71         }
72
73         Locker<Lock> lock(m_scriptExecutionContextLock);
74
75         ScriptExecutionContext* context = scriptExecutionContext();
76         if (!context)
77             return;
78
79         context->postTask(WTFMove(function));
80     }
81
82 protected:
83     IDBActiveDOMObject(ScriptExecutionContext* context)
84         : ActiveDOMObject(context)
85     {
86         ASSERT(context);
87     }
88
89 private:
90     Ref<Thread> m_originThread { Thread::current() };
91     Lock m_scriptExecutionContextLock;
92 };
93
94 } // namespace WebCore
95
96 #endif // ENABLE(INDEXED_DATABASE)