OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "bindings/core/v8/WindowProxyManager.h" | 5 #include "bindings/core/v8/WindowProxyManager.h" |
6 | 6 |
7 #include "bindings/core/v8/DOMWrapperWorld.h" | 7 #include "bindings/core/v8/DOMWrapperWorld.h" |
8 #include "bindings/core/v8/WindowProxy.h" | |
9 #include "core/frame/Frame.h" | |
10 | 8 |
11 namespace blink { | 9 namespace blink { |
12 | 10 |
13 WindowProxyManager* WindowProxyManager::create(Frame& frame) { | 11 namespace { |
14 return new WindowProxyManager(frame); | 12 |
| 13 WindowProxy* createWindowProxyForFrame(Frame& frame, |
| 14 v8::Isolate* isolate, |
| 15 RefPtr<DOMWrapperWorld> world) { |
| 16 if (frame.isLocalFrame()) { |
| 17 return LocalWindowProxy::create(toLocalFrame(frame), isolate, |
| 18 std::move(world)); |
| 19 } |
| 20 return RemoteWindowProxy::create(toRemoteFrame(frame), isolate, |
| 21 std::move(world)); |
| 22 } |
15 } | 23 } |
16 | 24 |
17 DEFINE_TRACE(WindowProxyManager) { | 25 DEFINE_TRACE(WindowProxyManagerBase) { |
18 visitor->trace(m_frame); | 26 visitor->trace(m_frame); |
19 visitor->trace(m_windowProxy); | 27 visitor->trace(m_windowProxy); |
20 visitor->trace(m_isolatedWorlds); | 28 visitor->trace(m_isolatedWorlds); |
21 } | 29 } |
22 | 30 |
23 WindowProxy* WindowProxyManager::windowProxy(DOMWrapperWorld& world) { | 31 WindowProxy* WindowProxyManagerBase::windowProxy(DOMWrapperWorld& world) { |
24 WindowProxy* windowProxy = nullptr; | 32 WindowProxy* windowProxy = nullptr; |
25 if (world.isMainWorld()) { | 33 if (world.isMainWorld()) { |
26 windowProxy = m_windowProxy.get(); | 34 windowProxy = m_windowProxy.get(); |
27 } else { | 35 } else { |
28 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId()); | 36 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId()); |
29 if (iter != m_isolatedWorlds.end()) { | 37 if (iter != m_isolatedWorlds.end()) { |
30 windowProxy = iter->value.get(); | 38 windowProxy = iter->value.get(); |
31 } else { | 39 } else { |
32 windowProxy = WindowProxy::create(m_isolate, m_frame, world); | 40 windowProxy = createWindowProxyForFrame(*m_frame, m_isolate, &world); |
33 m_isolatedWorlds.set(world.worldId(), windowProxy); | 41 m_isolatedWorlds.set(world.worldId(), windowProxy); |
34 } | 42 } |
35 } | 43 } |
36 return windowProxy; | 44 return windowProxy; |
37 } | 45 } |
38 | 46 |
39 void WindowProxyManager::clearForClose() { | 47 void WindowProxyManagerBase::clearForClose() { |
40 m_windowProxy->clearForClose(); | 48 m_windowProxy->clearForClose(); |
41 for (auto& entry : m_isolatedWorlds) | 49 for (auto& entry : m_isolatedWorlds) |
42 entry.value->clearForClose(); | 50 entry.value->clearForClose(); |
43 } | 51 } |
44 | 52 |
45 void WindowProxyManager::clearForNavigation() { | 53 void WindowProxyManagerBase::clearForNavigation() { |
46 m_windowProxy->clearForNavigation(); | 54 m_windowProxy->clearForNavigation(); |
47 for (auto& entry : m_isolatedWorlds) | 55 for (auto& entry : m_isolatedWorlds) |
48 entry.value->clearForNavigation(); | 56 entry.value->clearForNavigation(); |
49 } | 57 } |
50 | 58 |
51 void WindowProxyManager::updateSecurityOrigin(SecurityOrigin* securityOrigin) { | 59 void WindowProxyManagerBase::releaseGlobals( |
52 m_windowProxy->updateSecurityOrigin(securityOrigin); | |
53 for (auto& entry : m_isolatedWorlds) { | |
54 WindowProxy* isolatedWindowProxy = entry.value.get(); | |
55 SecurityOrigin* isolatedSecurityOrigin = | |
56 isolatedWindowProxy->world().isolatedWorldSecurityOrigin(); | |
57 isolatedWindowProxy->updateSecurityOrigin(isolatedSecurityOrigin); | |
58 } | |
59 } | |
60 | |
61 void WindowProxyManager::releaseGlobals( | |
62 HashMap<DOMWrapperWorld*, v8::Local<v8::Object>>& map) { | 60 HashMap<DOMWrapperWorld*, v8::Local<v8::Object>>& map) { |
63 map.add(&m_windowProxy->world(), m_windowProxy->releaseGlobal()); | 61 map.add(&m_windowProxy->world(), m_windowProxy->releaseGlobal()); |
64 for (auto& entry : m_isolatedWorlds) | 62 for (auto& entry : m_isolatedWorlds) |
65 map.add(&entry.value->world(), | 63 map.add(&entry.value->world(), |
66 windowProxy(entry.value->world())->releaseGlobal()); | 64 windowProxy(entry.value->world())->releaseGlobal()); |
67 } | 65 } |
68 | 66 |
69 void WindowProxyManager::setGlobals( | 67 void WindowProxyManagerBase::setGlobals( |
70 const HashMap<DOMWrapperWorld*, v8::Local<v8::Object>>& map) { | 68 const HashMap<DOMWrapperWorld*, v8::Local<v8::Object>>& map) { |
71 for (auto& entry : map) | 69 for (auto& entry : map) |
72 windowProxy(*entry.key)->setGlobal(entry.value); | 70 windowProxy(*entry.key)->setGlobal(entry.value); |
73 } | 71 } |
74 | 72 |
75 WindowProxyManager::WindowProxyManager(Frame& frame) | 73 WindowProxyManagerBase::WindowProxyManagerBase(Frame& frame) |
76 : m_frame(&frame), | 74 : m_frame(&frame), |
77 m_isolate(v8::Isolate::GetCurrent()), | 75 m_isolate(v8::Isolate::GetCurrent()), |
78 m_windowProxy(WindowProxy::create(m_isolate, | 76 m_windowProxy(createWindowProxyForFrame(frame, |
79 &frame, | 77 m_isolate, |
80 DOMWrapperWorld::mainWorld())) {} | 78 &DOMWrapperWorld::mainWorld())) {} |
| 79 |
| 80 void LocalWindowProxyManager::updateSecurityOrigin( |
| 81 SecurityOrigin* securityOrigin) { |
| 82 static_cast<LocalWindowProxy*>(m_windowProxy.get()) |
| 83 ->updateSecurityOrigin(securityOrigin); |
| 84 for (auto& entry : m_isolatedWorlds) { |
| 85 auto* isolatedWindowProxy = |
| 86 static_cast<LocalWindowProxy*>(entry.value.get()); |
| 87 SecurityOrigin* isolatedSecurityOrigin = |
| 88 isolatedWindowProxy->world().isolatedWorldSecurityOrigin(); |
| 89 isolatedWindowProxy->updateSecurityOrigin(isolatedSecurityOrigin); |
| 90 } |
| 91 } |
81 | 92 |
82 } // namespace blink | 93 } // namespace blink |
OLD | NEW |