void WebRemoteFrameImpl::setReplicatedOrigin(const WebSecurityOrigin& origin) const { ASSERT(frame()); frame()->securityContext()->setReplicatedOrigin(origin); // If the origin of a remote frame changed, the accessibility object for the owner // element now points to a different child. // // TODO(dmazzoni, dcheng): there's probably a better way to solve this. // Run SitePerProcessAccessibilityBrowserTest.TwoCrossSiteNavigations to // ensure an alternate fix works. http://crbug.com/566222 FrameOwner* owner = frame()->owner(); if (owner && owner->isLocal()) { HTMLElement* ownerElement = toHTMLFrameOwnerElement(owner); AXObjectCache* cache = ownerElement->document().existingAXObjectCache(); if (cache) cache->childrenChanged(ownerElement); } }
bool WebFrame::swap(WebFrame* frame) { using std::swap; RefPtrWillBeRawPtr<Frame> oldFrame = toCoreFrame(this); // All child frames must be detached first. oldFrame->detachChildren(); // If the frame has been detached during detaching its children, return // immediately. // FIXME: There is no unit test for this condition, so one needs to be // written. if (!oldFrame->host()) return false; if (m_parent) { if (m_parent->m_firstChild == this) m_parent->m_firstChild = frame; if (m_parent->m_lastChild == this) m_parent->m_lastChild = frame; swap(m_parent, frame->m_parent); } if (m_previousSibling) { m_previousSibling->m_nextSibling = frame; swap(m_previousSibling, frame->m_previousSibling); } if (m_nextSibling) { m_nextSibling->m_previousSibling = frame; swap(m_nextSibling, frame->m_nextSibling); } if (m_opener) { m_opener->m_openedFrameTracker->remove(this); m_opener->m_openedFrameTracker->add(frame); swap(m_opener, frame->m_opener); } if (!m_openedFrameTracker->isEmpty()) { m_openedFrameTracker->updateOpener(frame); frame->m_openedFrameTracker.reset(m_openedFrameTracker.release()); } // Finally, clone the state of the current Frame into one matching // the type of the passed in WebFrame. // FIXME: This is a bit clunky; this results in pointless decrements and // increments of connected subframes. FrameOwner* owner = oldFrame->owner(); oldFrame->disconnectOwnerElement(); if (Frame* newFrame = toCoreFrame(frame)) { ASSERT(owner == newFrame->owner()); if (owner->isLocal()) { HTMLFrameOwnerElement* ownerElement = toHTMLFrameOwnerElement(owner); ownerElement->setContentFrame(*newFrame); if (newFrame->isLocalFrame()) ownerElement->setWidget(toLocalFrame(newFrame)->view()); } } else if (frame->isWebLocalFrame()) { toWebLocalFrameImpl(frame)->initializeCoreFrame(oldFrame->host(), owner, oldFrame->tree().name(), nullAtom); } else { toWebRemoteFrameImpl(frame)->initializeCoreFrame(oldFrame->host(), owner, oldFrame->tree().name()); } return true; }