Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp b/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp |
| index a96d286f31687deeaf88dc932298b25d0dcbc2f4..8097cdb8d78b1b4d6a63a04a8e1eecc41eb9f76c 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp |
| +++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp |
| @@ -8,81 +8,86 @@ |
| namespace blink { |
| -namespace { |
| - |
| -WindowProxy* createWindowProxyForFrame(v8::Isolate* isolate, |
| - Frame& frame, |
| - |
| - RefPtr<DOMWrapperWorld> world) { |
| - if (frame.isLocalFrame()) { |
| - return LocalWindowProxy::create(isolate, toLocalFrame(frame), |
| - std::move(world)); |
| - } |
| - return RemoteWindowProxy::create(isolate, toRemoteFrame(frame), |
| - std::move(world)); |
| -} |
| -} |
| - |
| -DEFINE_TRACE(WindowProxyManagerBase) { |
| +DEFINE_TRACE(WindowProxyManager) { |
| visitor->trace(m_frame); |
| visitor->trace(m_windowProxy); |
| visitor->trace(m_isolatedWorlds); |
| } |
| -WindowProxy* WindowProxyManagerBase::windowProxy(DOMWrapperWorld& world) { |
| - WindowProxy* windowProxy = nullptr; |
| - if (world.isMainWorld()) { |
| - windowProxy = m_windowProxy.get(); |
| - } else { |
| - IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId()); |
| - if (iter != m_isolatedWorlds.end()) { |
| - windowProxy = iter->value.get(); |
| - } else { |
| - windowProxy = createWindowProxyForFrame(m_isolate, *m_frame, &world); |
| - m_isolatedWorlds.set(world.worldId(), windowProxy); |
| - } |
| - } |
| - return windowProxy; |
| -} |
| - |
| -void WindowProxyManagerBase::clearForClose() { |
| +void WindowProxyManager::clearForClose() { |
| m_windowProxy->clearForClose(); |
| for (auto& entry : m_isolatedWorlds) |
| entry.value->clearForClose(); |
| } |
| -void WindowProxyManagerBase::clearForNavigation() { |
| +void WindowProxyManager::clearForNavigation() { |
| m_windowProxy->clearForNavigation(); |
| for (auto& entry : m_isolatedWorlds) |
| entry.value->clearForNavigation(); |
| } |
| -void WindowProxyManagerBase::releaseGlobals(GlobalsVector& globals) { |
| +void WindowProxyManager::releaseGlobals(GlobalsVector& globals) { |
| globals.reserveInitialCapacity(1 + m_isolatedWorlds.size()); |
| globals.emplace_back(&m_windowProxy->world(), m_windowProxy->releaseGlobal()); |
| for (auto& entry : m_isolatedWorlds) { |
| - globals.emplace_back(&entry.value->world(), |
| - windowProxy(entry.value->world())->releaseGlobal()); |
| + globals.emplace_back( |
| + &entry.value->world(), |
| + windowProxyMaybeUninitialized(entry.value->world())->releaseGlobal()); |
| } |
| } |
| -void WindowProxyManagerBase::setGlobals(const GlobalsVector& globals) { |
| +void WindowProxyManager::setGlobals(const GlobalsVector& globals) { |
| for (const auto& entry : globals) |
| - windowProxy(*entry.first)->setGlobal(entry.second); |
| + windowProxyMaybeUninitialized(*entry.first)->setGlobal(entry.second); |
| } |
| -WindowProxyManagerBase::WindowProxyManagerBase(Frame& frame) |
| +WindowProxyManager::WindowProxyManager(Frame& frame, FrameType frameType) |
| : m_isolate(v8::Isolate::GetCurrent()), |
| m_frame(&frame), |
| - m_windowProxy(createWindowProxyForFrame(m_isolate, |
| - frame, |
| - &DOMWrapperWorld::mainWorld())) {} |
| + m_frameType(frameType), |
| + m_windowProxy(createWindowProxy(DOMWrapperWorld::mainWorld())) {} |
| + |
| +WindowProxy* WindowProxyManager::createWindowProxy(DOMWrapperWorld& world) { |
| + switch (m_frameType) { |
| + case FrameType::Local: |
| + // Directly use static_cast instead of toLocalFrame because |
| + // WindowProxyManager gets instantiated during a construction of |
| + // LocalFrame and at that time virtual member functions are not yet |
| + // available (we cannot use LocalFrame::isLocalFrame). Ditto for |
| + // RemoteFrame. |
|
dcheng
2017/03/16 08:43:16
This makes me a little nervous: I remember hitting
Yuki
2017/03/16 12:41:21
I personally prefer making Frame::m_windowProxyMan
|
| + return LocalWindowProxy::create( |
| + m_isolate, *static_cast<LocalFrame*>(m_frame.get()), &world); |
| + case FrameType::Remote: |
| + return RemoteWindowProxy::create( |
| + m_isolate, *static_cast<RemoteFrame*>(m_frame.get()), &world); |
| + } |
| + NOTREACHED(); |
| + return nullptr; |
| +} |
| + |
| +WindowProxy* WindowProxyManager::windowProxyMaybeUninitialized( |
| + DOMWrapperWorld& world) { |
| + WindowProxy* windowProxy = nullptr; |
| + if (world.isMainWorld()) { |
| + windowProxy = m_windowProxy.get(); |
| + } else { |
| + IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId()); |
| + if (iter != m_isolatedWorlds.end()) { |
| + windowProxy = iter->value.get(); |
| + } else { |
| + windowProxy = createWindowProxy(world); |
| + m_isolatedWorlds.set(world.worldId(), windowProxy); |
| + } |
| + } |
| + return windowProxy; |
| +} |
| void LocalWindowProxyManager::updateSecurityOrigin( |
| SecurityOrigin* securityOrigin) { |
| - static_cast<LocalWindowProxy*>(mainWorldProxy()) |
| + static_cast<LocalWindowProxy*>(m_windowProxy.get()) |
| ->updateSecurityOrigin(securityOrigin); |
| - for (auto& entry : isolatedWorlds()) { |
| + |
| + for (auto& entry : m_isolatedWorlds) { |
| auto* isolatedWindowProxy = |
| static_cast<LocalWindowProxy*>(entry.value.get()); |
| SecurityOrigin* isolatedSecurityOrigin = |