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(v8::Isolate* isolate, |
| 14 Frame& frame, |
| 15 |
| 16 RefPtr<DOMWrapperWorld> world) { |
| 17 if (frame.isLocalFrame()) { |
| 18 return LocalWindowProxy::create(isolate, toLocalFrame(frame), |
| 19 std::move(world)); |
| 20 } |
| 21 return RemoteWindowProxy::create(isolate, toRemoteFrame(frame), |
| 22 std::move(world)); |
| 23 } |
15 } | 24 } |
16 | 25 |
17 DEFINE_TRACE(WindowProxyManager) { | 26 DEFINE_TRACE(WindowProxyManagerBase) { |
18 visitor->trace(m_frame); | 27 visitor->trace(m_frame); |
19 visitor->trace(m_windowProxy); | 28 visitor->trace(m_windowProxy); |
20 visitor->trace(m_isolatedWorlds); | 29 visitor->trace(m_isolatedWorlds); |
21 } | 30 } |
22 | 31 |
23 WindowProxy* WindowProxyManager::windowProxy(DOMWrapperWorld& world) { | 32 WindowProxy* WindowProxyManagerBase::windowProxy(DOMWrapperWorld& world) { |
24 WindowProxy* windowProxy = nullptr; | 33 WindowProxy* windowProxy = nullptr; |
25 if (world.isMainWorld()) { | 34 if (world.isMainWorld()) { |
26 windowProxy = m_windowProxy.get(); | 35 windowProxy = m_windowProxy.get(); |
27 } else { | 36 } else { |
28 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId()); | 37 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId()); |
29 if (iter != m_isolatedWorlds.end()) { | 38 if (iter != m_isolatedWorlds.end()) { |
30 windowProxy = iter->value.get(); | 39 windowProxy = iter->value.get(); |
31 } else { | 40 } else { |
32 windowProxy = WindowProxy::create(m_isolate, m_frame, world); | 41 windowProxy = createWindowProxyForFrame(m_isolate, *m_frame, &world); |
33 m_isolatedWorlds.set(world.worldId(), windowProxy); | 42 m_isolatedWorlds.set(world.worldId(), windowProxy); |
34 } | 43 } |
35 } | 44 } |
36 return windowProxy; | 45 return windowProxy; |
37 } | 46 } |
38 | 47 |
39 void WindowProxyManager::clearForClose() { | 48 void WindowProxyManagerBase::clearForClose() { |
40 m_windowProxy->clearForClose(); | 49 m_windowProxy->clearForClose(); |
41 for (auto& entry : m_isolatedWorlds) | 50 for (auto& entry : m_isolatedWorlds) |
42 entry.value->clearForClose(); | 51 entry.value->clearForClose(); |
43 } | 52 } |
44 | 53 |
45 void WindowProxyManager::clearForNavigation() { | 54 void WindowProxyManagerBase::clearForNavigation() { |
46 m_windowProxy->clearForNavigation(); | 55 m_windowProxy->clearForNavigation(); |
47 for (auto& entry : m_isolatedWorlds) | 56 for (auto& entry : m_isolatedWorlds) |
48 entry.value->clearForNavigation(); | 57 entry.value->clearForNavigation(); |
49 } | 58 } |
50 | 59 |
51 void WindowProxyManager::updateSecurityOrigin(SecurityOrigin* securityOrigin) { | 60 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) { | 61 HashMap<DOMWrapperWorld*, v8::Local<v8::Object>>& map) { |
63 map.add(&m_windowProxy->world(), m_windowProxy->releaseGlobal()); | 62 map.add(&m_windowProxy->world(), m_windowProxy->releaseGlobal()); |
64 for (auto& entry : m_isolatedWorlds) | 63 for (auto& entry : m_isolatedWorlds) |
65 map.add(&entry.value->world(), | 64 map.add(&entry.value->world(), |
66 windowProxy(entry.value->world())->releaseGlobal()); | 65 windowProxy(entry.value->world())->releaseGlobal()); |
67 } | 66 } |
68 | 67 |
69 void WindowProxyManager::setGlobals( | 68 void WindowProxyManagerBase::setGlobals( |
70 const HashMap<DOMWrapperWorld*, v8::Local<v8::Object>>& map) { | 69 const HashMap<DOMWrapperWorld*, v8::Local<v8::Object>>& map) { |
71 for (auto& entry : map) | 70 for (auto& entry : map) |
72 windowProxy(*entry.key)->setGlobal(entry.value); | 71 windowProxy(*entry.key)->setGlobal(entry.value); |
73 } | 72 } |
74 | 73 |
75 WindowProxyManager::WindowProxyManager(Frame& frame) | 74 WindowProxyManagerBase::WindowProxyManagerBase(Frame& frame) |
76 : m_frame(&frame), | 75 : m_isolate(v8::Isolate::GetCurrent()), |
77 m_isolate(v8::Isolate::GetCurrent()), | 76 m_frame(&frame), |
78 m_windowProxy(WindowProxy::create(m_isolate, | 77 m_windowProxy(createWindowProxyForFrame(m_isolate, |
79 &frame, | 78 frame, |
80 DOMWrapperWorld::mainWorld())) {} | 79 &DOMWrapperWorld::mainWorld())) {} |
| 80 |
| 81 void LocalWindowProxyManager::updateSecurityOrigin( |
| 82 SecurityOrigin* securityOrigin) { |
| 83 static_cast<LocalWindowProxy*>(mainWorldProxy()) |
| 84 ->updateSecurityOrigin(securityOrigin); |
| 85 for (auto& entry : isolatedWorlds()) { |
| 86 auto* isolatedWindowProxy = |
| 87 static_cast<LocalWindowProxy*>(entry.value.get()); |
| 88 SecurityOrigin* isolatedSecurityOrigin = |
| 89 isolatedWindowProxy->world().isolatedWorldSecurityOrigin(); |
| 90 isolatedWindowProxy->updateSecurityOrigin(isolatedSecurityOrigin); |
| 91 } |
| 92 } |
81 | 93 |
82 } // namespace blink | 94 } // namespace blink |
OLD | NEW |