Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(624)

Unified Diff: content/browser/frame_host/frame_tree.cc

Issue 1015243004: Move load progress tracking logic to the frame tree. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/frame_host/frame_tree.cc
diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc
index 39c0563a3c79e728df197f4e7b08469c7291fcb1..f3a0a0908e9f3c2424e50d952e275f4421a3f367 100644
--- a/content/browser/frame_host/frame_tree.cc
+++ b/content/browser/frame_host/frame_tree.cc
@@ -46,6 +46,39 @@ bool CreateProxyForSiteInstance(const scoped_refptr<SiteInstance>& instance,
return true;
}
+// Helper function used with FrameTree::ForEach() for retrieving the total
+// loading progress and number of frames in a frame tree.
+bool CollectLoadProgress(double* progress,
+ int* frame_count,
+ FrameTreeNode* node) {
+ // Ignore the current frame if it has not started loading.
+ double frame_progress = node->loading_progress();
+ if (frame_progress == FrameTreeNode::kLoadingProgressNotStarted)
+ return true;
+
+ // Collect progress.
+ *progress += frame_progress;
+ (*frame_count)++;
+ return true;
+}
+
+// Helper function used with FrameTree::ForEach() to reset the load progress.
+bool ResetNodeLoadProgress(FrameTreeNode* node) {
+ node->set_loading_progress(FrameTreeNode::kLoadingProgressNotStarted);
+ return true;
+}
+
+// Helper function used with FrameTree::ForEach() to check if at least one of
+// the nodes is loading.
+bool IsNodeLoading(bool* is_loading, FrameTreeNode* node) {
+ if (node->IsLoading()) {
+ // There is at least one node loading, so abort traversal.
+ *is_loading = true;
+ return false;
+ }
+ return true;
+}
+
} // namespace
FrameTree::FrameTree(Navigator* navigator,
@@ -312,4 +345,24 @@ void FrameTree::FrameRemoved(FrameTreeNode* frame) {
on_frame_removed_.Run(frame->current_frame_host());
}
+double FrameTree::GetLoadProgress() {
+ double progress = 0.0;
+ int frame_count = 0;
+
+ ForEach(base::Bind(&CollectLoadProgress, &progress, &frame_count));
+ if (frame_count != 0)
+ progress /= frame_count;
+ return progress;
+}
+
+void FrameTree::ResetLoadProgress() {
+ ForEach(base::Bind(&ResetNodeLoadProgress));
+}
+
+bool FrameTree::IsLoading() {
+ bool is_loading = false;
+ ForEach(base::Bind(&IsNodeLoading, &is_loading));
+ return is_loading;
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698