Index: content/browser/content_frame.cc |
diff --git a/content/browser/content_frame.cc b/content/browser/content_frame.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c3a2b6c28311a651af886ddceb938619546da9a3 |
--- /dev/null |
+++ b/content/browser/content_frame.cc |
@@ -0,0 +1,103 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content_frame.h" |
+ |
+#include "content/browser/frame_map.h" |
+#include "content/browser/renderer_host/render_view_host.h" |
+#include "content/public/browser/browser_context.h" |
+ |
+namespace content { |
+ |
+// This class tracks all frame loads for a top-level ContentFrame. This |
+// updates the FrameMap with the current WebKitIdTuple for the ContentFrame |
+// and its children. |
+class ContentFrameObserver : public TabContentsObserver { |
+ public: |
+ ContentFrameObserver(ContentFrame* frame); |
+ // TabContentsObserver methods |
+ virtual void DidCommitProvisionalLoadForFrame( |
+ int64 frame_id, |
+ bool is_main_frame, |
+ const GURL& url, |
+ content::PageTransition transition_type) OVERRIDE; |
+ virtual void TabContentsDestroyed(TabContents* tab) OVERRIDE; |
+ private: |
+ ContentFrame* frame_; |
+}; |
+ |
+ContentFrameObserver::ContentFrameObserver( |
+ ContentFrame* frame) |
+ : TabContentsObserver(&frame->tab_contents()), |
+ frame_(frame) { |
+} |
+ |
+void ContentFrameObserver::DidCommitProvisionalLoadForFrame( |
+ int64 frame_id, |
+ bool is_main_frame, |
+ const GURL& url, |
+ content::PageTransition transition_type) { |
+ content::FrameMap* mapper = |
+ frame_->tab_contents_.browser_context()->frame_mapper(); |
+ |
+ if (is_main_frame) { |
+ mapper->UpdateFrame( |
+ frame_, frame_->tab_contents_.render_view_host()->process()->GetID(), |
+ frame_->tab_contents_.render_view_host()->routing_id(), frame_id); |
+ } else { |
+ // If we're navigating a subframe, we may need to create a ContentFrame |
+ // TODO(supersat): This is hack until we get proper subframe support |
+ ContentFrame* frame = mapper->FindRendererFrame( |
+ frame_->tab_contents_.render_view_host()->process()->GetID(), |
+ frame_id); |
+ |
+ if (!frame) { |
+ frame = mapper->InitializeFrame(false, frame_->tab_contents_, frame_); |
+ mapper->UpdateFrame(frame, |
+ frame_->tab_contents_.render_view_host()->process()->GetID(), |
+ frame_->tab_contents_.render_view_host()->routing_id(), |
+ frame_id); |
+ } |
+ } |
+} |
+ |
+void ContentFrameObserver::TabContentsDestroyed(TabContents* tab) { |
+ delete this; |
+} |
+ |
+ContentFrame::ContentFrame(int64 id, |
+ bool is_top_level, |
+ TabContents& tab_contents, |
+ ContentFrame* opener) |
+ : id_(id), |
+ active_webkit_frame_(WebKitFrameIdentifier(-1, -1, -1)), |
+ is_top_level_(is_top_level), |
+ tab_contents_(tab_contents), |
+ opener_(opener) { |
+ if (is_top_level) |
+ new ContentFrameObserver(this); |
+} |
+ |
+ContentFrame::~ContentFrame() { |
+} |
+ |
+void ContentFrame::UpdateFrame(int new_process_host_id, |
+ int new_route_id, |
+ int64 new_frame_id) { |
+ WebKitFrameIdentifier newWebKitId(new_process_host_id, new_route_id, |
+ new_frame_id); |
+ active_webkit_frame_ = newWebKitId; |
+ |
+ all_webkit_frames_.push_back(newWebKitId); |
+} |
+ |
+void ContentFrame::AddChildFrame(ContentFrame* child) { |
+ children_.push_back(child); |
+} |
+ |
+void ContentFrame::RemoveChildren() { |
+ children_.clear(); |
+} |
+ |
+} // namespace content |