Chromium Code Reviews| Index: content/renderer/render_view_impl.cc |
| diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc |
| index aef2207674ee7aca7f20337151b20a16de39fe68..456b859edd572e140b1262a851aed76ac76ee368 100644 |
| --- a/content/renderer/render_view_impl.cc |
| +++ b/content/renderer/render_view_impl.cc |
| @@ -3905,12 +3905,14 @@ void RenderViewImpl::CreateFrameTree(WebKit::WebFrame* frame, |
| } |
| } |
| -WebKit::WebFrame* RenderViewImpl::GetFrameByMappedID(int frame_id) { |
| - std::map<int, int>::iterator it = active_frame_id_map_.find(frame_id); |
| - if (it == active_frame_id_map_.end()) |
| - return NULL; |
| - |
| - return FindFrameByID(webview()->mainFrame(), it->second); |
| +WebKit::WebFrame* RenderViewImpl::GetFrameByMappedID(int remote_frame_id) { |
| + std::map<int, int>::const_iterator it = active_frame_id_map_.begin(); |
| + for (; it != active_frame_id_map_.end(); ++it) { |
| + if (it->second == remote_frame_id) { |
| + return FindFrameByID(webview()->mainFrame(), it->first); |
| + } |
| + } |
| + return NULL; |
| } |
| void RenderViewImpl::EnsureMediaStreamImpl() { |
| @@ -4191,7 +4193,6 @@ bool RenderViewImpl::willCheckAndDispatchMessageEvent( |
| } else { |
| params.target_frame_id = 0; |
| } |
| - |
| Send(new ViewHostMsg_RouteMessageEvent(routing_id_, params)); |
| return true; |
| } |
| @@ -6297,19 +6298,18 @@ void RenderViewImpl::OnJavaBridgeInit() { |
| #endif |
| } |
| -void RenderViewImpl::OnUpdatedFrameTree( |
| +void RenderViewImpl::UpdateFrameTree( |
| int process_id, |
| int route_id, |
| const std::string& frame_tree) { |
| // We should only act on this message if we are swapped out. It's possible |
| // for this to happen due to races. |
| - if (!is_swapped_out_) |
| - return; |
| - |
| base::DictionaryValue* frames = NULL; |
| scoped_ptr<base::Value> tree(base::JSONReader::Read(frame_tree)); |
| - if (tree.get() && tree->IsType(base::Value::TYPE_DICTIONARY)) |
| - tree->GetAsDictionary(&frames); |
| + if (tree.get() && tree->IsType(base::Value::TYPE_DICTIONARY)) { |
| + if (!tree->GetAsDictionary(&frames)) |
| + return; |
| + } |
| updating_frame_tree_ = true; |
| active_frame_id_map_.clear(); |
| @@ -6320,3 +6320,23 @@ void RenderViewImpl::OnUpdatedFrameTree( |
| updating_frame_tree_ = false; |
| } |
| + |
| +void RenderViewImpl::OnUpdatedFrameTree( |
|
nasko
2012/10/02 17:52:31
This change might be worthwhile as a separate bug/
Fady Samuel
2012/10/02 22:04:08
Done. Leaving it here until the other patch lands.
|
| + int process_id, |
| + int route_id, |
| + const std::string& frame_tree) { |
| + if (!is_swapped_out_) |
| + return; |
| + |
| + if (frame_tree.empty()) |
| + return; |
| + // Post the task to update the frame tree on the task queue to ensure that |
|
nasko
2012/10/02 17:52:31
nit: An empty line prior to the comment will make
|
| + // that any pending postMessage tasks are handled before the frame tree is |
| + // updated. If we navigate between the time we schedule a postMessage, and |
| + // the time we handle it, we will get a navigation that will prevent the |
| + // message from being posted. |
| + MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&RenderViewImpl::UpdateFrameTree, AsWeakPtr(), |
| + process_id, route_id, frame_tree)); |
| +} |