Index: blimp/engine/session/page_load_tracker.cc |
diff --git a/blimp/engine/session/page_load_tracker.cc b/blimp/engine/session/page_load_tracker.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6f248ea119f9a4c99e8d66c79b60e710be67ea10 |
--- /dev/null |
+++ b/blimp/engine/session/page_load_tracker.cc |
@@ -0,0 +1,103 @@ |
+// Copyright 2016 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 "blimp/engine/session/page_load_tracker.h" |
+ |
+#include "content/public/browser/render_widget_host_view.h" |
+ |
+namespace blimp { |
+namespace engine { |
+ |
+namespace { |
+ |
+content::RenderWidgetHost* GetRenderWidgetHostIfMainFrame( |
+ content::RenderFrameHost* render_frame_host) { |
+ if (render_frame_host->GetParent() != nullptr) |
+ return nullptr; |
+ |
+ return render_frame_host->GetView()->GetRenderWidgetHost(); |
+} |
+ |
+} // namespace |
+ |
+PageLoadTracker::PageLoadTracker(content::WebContents* web_contents, |
+ PageLoadTrackerClient* client) |
+ : client_(client) { |
+ Observe(web_contents); |
+} |
+ |
+PageLoadTracker::~PageLoadTracker() {} |
+ |
+void PageLoadTracker::DidStartProvisionalLoadForFrame( |
+ content::RenderFrameHost* render_frame_host, |
+ const GURL& validated_url, |
+ bool is_error_page, |
+ bool is_iframe_srcdoc) { |
+ content::RenderWidgetHost* render_widget_host = |
+ GetRenderWidgetHostIfMainFrame(render_frame_host); |
+ if (!render_widget_host) |
+ return; |
+ |
+ render_widget_load_status_[render_widget_host] = LoadStatus(); |
+ |
+ // Notify the client that a navigation was initiated. |
+ client_->SendPageLoadStatusUpdate(PageLoadStatus::LOADING); |
+} |
+ |
+void PageLoadTracker::DidFinishLoad(content::RenderFrameHost* render_frame_host, |
+ const GURL& validated_url) { |
+ content::RenderWidgetHost* render_widget_host = |
+ GetRenderWidgetHostIfMainFrame(render_frame_host); |
+ if (!render_widget_host) |
+ return; |
+ |
+ RenderWidgetLoadStatusMap::iterator it = |
+ render_widget_load_status_.find(render_widget_host); |
+ DCHECK(it != render_widget_load_status_.end()); |
+ |
+ it->second.page_loaded = true; |
+ if (it->second.Loaded()) { |
+ client_->SendPageLoadStatusUpdate(PageLoadStatus::LOADED); |
+ render_widget_load_status_.erase(it); |
+ } |
+} |
+ |
+void PageLoadTracker::DidFailLoad(content::RenderFrameHost* render_frame_host, |
+ const GURL& validated_url, |
+ int error_code, |
+ const base::string16& error_description, |
+ bool was_ignored_by_handler) { |
+ content::RenderWidgetHost* render_widget_host = |
+ GetRenderWidgetHostIfMainFrame(render_frame_host); |
+ if (!render_widget_host) |
+ return; |
+ |
+ RenderWidgetLoadStatusMap::iterator it = |
+ render_widget_load_status_.find(render_widget_host); |
+ DCHECK(it != render_widget_load_status_.end()); |
+ |
+ // If the navigation failed, the client should dismiss the load indicator. |
+ client_->SendPageLoadStatusUpdate(PageLoadStatus::LOADED); |
+ render_widget_load_status_.erase(it); |
+} |
+ |
+void PageLoadTracker::DidFirstPaintAfterLoad( |
+ content::RenderWidgetHost* render_widget_host) { |
+ RenderWidgetLoadStatusMap::iterator it = |
+ render_widget_load_status_.find(render_widget_host); |
+ DCHECK(it != render_widget_load_status_.end()); |
+ |
+ it->second.did_first_paint = true; |
+ if (it->second.Loaded()) { |
+ client_->SendPageLoadStatusUpdate(PageLoadStatus::LOADED); |
+ render_widget_load_status_.erase(it); |
+ } |
+} |
+ |
+bool PageLoadTracker::LoadStatus::Loaded() const { |
+ return page_loaded && did_first_paint; |
+} |
+ |
+} // namespace engine |
+} // namespace blimp |