Chromium Code Reviews| Index: Source/web/WebFrameImpl.cpp |
| diff --git a/Source/web/WebFrameImpl.cpp b/Source/web/WebFrameImpl.cpp |
| index eceb6899bc7fe030dc114d8793b801f48fac98ea..54184c6e0c1ab1e4a2dfa501ce364de8ad0e9eb0 100644 |
| --- a/Source/web/WebFrameImpl.cpp |
| +++ b/Source/web/WebFrameImpl.cpp |
| @@ -50,7 +50,7 @@ |
| // ref initially and it is removed when the FrameLoader is getting destroyed. |
| // |
| // WebFrames are created in two places, first in WebViewImpl when the root |
| -// frame is created, and second in WebFrame::CreateChildFrame when sub-frames |
| +// frame is created, and second in WebFrame::createChildFrame when sub-frames |
| // are created. WebKit will hook up this object to the FrameLoader/Frame |
| // and the refcount will be correct. |
| // |
| @@ -64,9 +64,12 @@ |
| // in FrameLoader::detachFromParent for each subframe. |
| // |
| // Frame going away causes the FrameLoader to get deleted. In FrameLoader's |
| -// destructor, it notifies its client with frameLoaderDestroyed. This calls |
| -// WebFrame::Closing and then derefs the WebFrame and will cause it to be |
| -// deleted (unless an external someone is also holding a reference). |
| +// destructor, it notifies its client with frameLoaderDestroyed. This derefs |
| +// the WebFrame and will cause it to be deleted (unless an external someone |
| +// is also holding a reference). |
| +// |
| +// Thie client is expected to be set whenever the WebFrameImpl is attached to |
| +// the DOM. |
| #include "config.h" |
| #include "WebFrameImpl.h" |
| @@ -266,12 +269,6 @@ static void frameContentAsPlainText(size_t maxChars, Frame* frame, StringBuilder |
| } |
| } |
| -static long long generateFrameIdentifier() |
| -{ |
| - static long long next = 0; |
| - return ++next; |
| -} |
| - |
| WebPluginContainerImpl* WebFrameImpl::pluginContainerFromFrame(Frame* frame) |
| { |
| if (!frame) |
| @@ -536,6 +533,12 @@ WebFrame* WebFrame::fromFrameOwnerElement(const WebElement& element) |
| return WebFrameImpl::fromFrameOwnerElement(PassRefPtr<Element>(element).get()); |
| } |
| +void WebFrameImpl::close() |
|
darin (slow to review)
2013/09/13 04:02:47
not that you should clean this up now, but WebFram
|
| +{ |
| + m_client = 0; |
| + deref(); // Balances ref() acquired in WebFrame::create |
|
darin (slow to review)
2013/09/13 04:02:47
nit: WebFrameImpl::create
|
| +} |
|
darin (slow to review)
2013/09/13 04:02:47
you might want to add a comment here explaining wh
|
| + |
| WebString WebFrameImpl::uniqueName() const |
| { |
| return frame()->tree()->uniqueName(); |
| @@ -2073,12 +2076,29 @@ WebString WebFrameImpl::layerTreeAsText(bool showDebugInfo) const |
| // WebFrameImpl public --------------------------------------------------------- |
| -PassRefPtr<WebFrameImpl> WebFrameImpl::create(WebFrameClient* client) |
| +WebFrame* WebFrame::create(WebFrameClient* client) |
| +{ |
| + return WebFrameImpl::create(client, generateFrameIdentifier()); |
| +} |
| + |
| +WebFrame* WebFrame::create(WebFrameClient* client, long long identifier) |
| +{ |
| + return WebFrameImpl::create(client, identifier); |
| +} |
| + |
| +long long WebFrame::generateFrameIdentifier() |
| { |
| - return adoptRef(new WebFrameImpl(client)); |
| + static long long next = 0; |
| + // Assume that 64-bit will not wrap to -1. |
| + return ++next; |
| } |
| -WebFrameImpl::WebFrameImpl(WebFrameClient* client) |
| +WebFrameImpl* WebFrameImpl::create(WebFrameClient* client, long long identifier) |
| +{ |
| + return adoptRef(new WebFrameImpl(client, identifier)).leakRef(); |
|
darin (slow to review)
2013/09/13 04:02:47
nit: add a comment indicating that this leak gets
|
| +} |
| + |
| +WebFrameImpl::WebFrameImpl(WebFrameClient* client, long long identifier) |
| : FrameDestructionObserver(0) |
| , m_frameLoaderClient(this) |
| , m_client(client) |
| @@ -2095,7 +2115,7 @@ WebFrameImpl::WebFrameImpl(WebFrameClient* client) |
| , m_nextInvalidateAfter(0) |
| , m_findMatchMarkersVersion(0) |
| , m_findMatchRectsAreValid(false) |
| - , m_identifier(generateFrameIdentifier()) |
| + , m_identifier(identifier) |
|
darin (slow to review)
2013/09/13 04:02:47
We should just move the concept of WebFrame identi
awong
2013/09/13 04:25:02
I did this initially, but didn't know how to handl
|
| , m_inSameDocumentHistoryLoad(false) |
| { |
| WebKit::Platform::current()->incrementStatsCounter(webFrameActiveCount); |
| @@ -2121,7 +2141,7 @@ void WebFrameImpl::initializeAsMainFrame(WebCore::Page* page) |
| RefPtr<Frame> mainFrame = Frame::create(page, 0, &m_frameLoaderClient); |
| setWebCoreFrame(mainFrame.get()); |
| - // Add reference on behalf of FrameLoader. See comments in |
| + // Add reference on behalf of FrameLoader. See comments in |
| // WebFrameLoaderClient::frameLoaderDestroyed for more info. |
| ref(); |
| @@ -2132,7 +2152,8 @@ void WebFrameImpl::initializeAsMainFrame(WebCore::Page* page) |
| PassRefPtr<Frame> WebFrameImpl::createChildFrame(const FrameLoadRequest& request, HTMLFrameOwnerElement* ownerElement) |
| { |
| - RefPtr<WebFrameImpl> webframe(adoptRef(new WebFrameImpl(m_client))); |
| + ASSERT(m_client); |
| + WebFrameImpl* webframe = static_cast<WebFrameImpl*>(m_client->createChildFrame(this, request.frameName())); |
| // Add an extra ref on behalf of the Frame/FrameLoader, which references the |
| // WebFrame via the FrameLoaderClient interface. See the comment at the top |
| @@ -2156,8 +2177,11 @@ PassRefPtr<Frame> WebFrameImpl::createChildFrame(const FrameLoadRequest& request |
| // return without loading URL. |
| // (b:791612) |
| childFrame->init(); // create an empty document |
| - if (!childFrame->tree()->parent()) |
| + if (!childFrame->tree()->parent()) { |
| + if (m_client) |
| + m_client->frameDetached(webframe); |
|
darin (slow to review)
2013/09/13 04:02:47
there have been bugs where it appeared from the ch
|
| return 0; |
| + } |
| HistoryItem* parentItem = frame()->loader()->history()->currentItem(); |
| HistoryItem* childItem = 0; |
| @@ -2174,11 +2198,12 @@ PassRefPtr<Frame> WebFrameImpl::createChildFrame(const FrameLoadRequest& request |
| // A synchronous navigation (about:blank) would have already processed |
| // onload, so it is possible for the frame to have already been destroyed by |
| // script in the page. |
| - if (!childFrame->tree()->parent()) |
| + if (!childFrame->tree()->parent()) { |
| + if (m_client) |
| + m_client->frameDetached(webframe); |
| return 0; |
| + } |
| - if (m_client) |
| - m_client->didCreateFrame(this, webframe.get()); |
| return childFrame.release(); |
| } |