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

Side by Side Diff: chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc

Issue 10835033: Only delete old frames when a new main frame navigation commits (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h" 5 #include "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "chrome/common/url_constants.h" 8 #include "chrome/common/url_constants.h"
9 9
10 namespace extensions { 10 namespace extensions {
11 11
12 namespace { 12 namespace {
13 13
14 // URL schemes for which we'll send events. 14 // URL schemes for which we'll send events.
15 const char* kValidSchemes[] = { 15 const char* kValidSchemes[] = {
16 chrome::kHttpScheme, 16 chrome::kHttpScheme,
17 chrome::kHttpsScheme, 17 chrome::kHttpsScheme,
18 chrome::kFileScheme, 18 chrome::kFileScheme,
19 chrome::kFtpScheme, 19 chrome::kFtpScheme,
20 chrome::kJavaScriptScheme, 20 chrome::kJavaScriptScheme,
21 chrome::kDataScheme, 21 chrome::kDataScheme,
22 chrome::kFileSystemScheme, 22 chrome::kFileSystemScheme,
23 }; 23 };
24 24
25 } // namespace 25 } // namespace
26 26
27 FrameNavigationState::FrameID::FrameID() 27 FrameNavigationState::FrameID::FrameID()
28 : frame_num(-1), 28 : frame_num(-1),
29 render_process_id(-1) { 29 render_view_host(NULL) {
30 } 30 }
31 31
32 FrameNavigationState::FrameID::FrameID(int64 frame_num, 32 FrameNavigationState::FrameID::FrameID(
33 int render_process_id) 33 int64 frame_num,
34 content::RenderViewHost* render_view_host)
34 : frame_num(frame_num), 35 : frame_num(frame_num),
35 render_process_id(render_process_id) { 36 render_view_host(render_view_host) {
36 } 37 }
37 38
38 bool FrameNavigationState::FrameID::IsValid() const { 39 bool FrameNavigationState::FrameID::IsValid() const {
39 return frame_num >= 0 && render_process_id >= 0; 40 return frame_num >= 0 && render_view_host;
40 } 41 }
41 42
42 bool FrameNavigationState::FrameID::operator<( 43 bool FrameNavigationState::FrameID::operator<(
43 const FrameNavigationState::FrameID& other) const { 44 const FrameNavigationState::FrameID& other) const {
44 return frame_num < other.frame_num || 45 return frame_num < other.frame_num ||
45 (frame_num == other.frame_num && 46 (frame_num == other.frame_num &&
46 render_process_id < other.render_process_id); 47 render_view_host < other.render_view_host);
47 } 48 }
48 49
49 bool FrameNavigationState::FrameID::operator==( 50 bool FrameNavigationState::FrameID::operator==(
50 const FrameNavigationState::FrameID& other) const { 51 const FrameNavigationState::FrameID& other) const {
51 return frame_num == other.frame_num && 52 return frame_num == other.frame_num &&
52 render_process_id == other.render_process_id; 53 render_view_host == other.render_view_host;
53 } 54 }
54 55
55 bool FrameNavigationState::FrameID::operator!=( 56 bool FrameNavigationState::FrameID::operator!=(
56 const FrameNavigationState::FrameID& other) const { 57 const FrameNavigationState::FrameID& other) const {
57 return !(*this == other); 58 return !(*this == other);
58 } 59 }
59 60
60 // static 61 // static
61 bool FrameNavigationState::allow_extension_scheme_ = false; 62 bool FrameNavigationState::allow_extension_scheme_ = false;
62 63
(...skipping 21 matching lines...) Expand all
84 return true; 85 return true;
85 if (allow_extension_scheme_ && url.scheme() == chrome::kExtensionScheme) 86 if (allow_extension_scheme_ && url.scheme() == chrome::kExtensionScheme)
86 return true; 87 return true;
87 return false; 88 return false;
88 } 89 }
89 90
90 void FrameNavigationState::TrackFrame(FrameID frame_id, 91 void FrameNavigationState::TrackFrame(FrameID frame_id,
91 const GURL& url, 92 const GURL& url,
92 bool is_main_frame, 93 bool is_main_frame,
93 bool is_error_page) { 94 bool is_error_page) {
94 if (is_main_frame) {
95 frame_state_map_.clear();
96 frame_ids_.clear();
97 }
98 FrameState& frame_state = frame_state_map_[frame_id]; 95 FrameState& frame_state = frame_state_map_[frame_id];
99 frame_state.error_occurred = is_error_page; 96 frame_state.error_occurred = is_error_page;
100 frame_state.url = url; 97 frame_state.url = url;
101 frame_state.is_main_frame = is_main_frame; 98 frame_state.is_main_frame = is_main_frame;
102 frame_state.is_navigating = true; 99 frame_state.is_navigating = true;
103 frame_state.is_committed = false; 100 frame_state.is_committed = false;
104 frame_state.is_server_redirected = false; 101 frame_state.is_server_redirected = false;
105 if (is_main_frame) { 102 frame_ids_.insert(frame_id);
106 main_frame_id_ = frame_id; 103 }
104
105 void FrameNavigationState::StopTrackingFramesInRVH(
106 content::RenderViewHost* render_view_host) {
107 for (std::set<FrameID>::iterator frame = frame_ids_.begin();
108 frame != frame_ids_.end();) {
109 if (frame->render_view_host != render_view_host) {
110 ++frame;
111 continue;
112 }
113 FrameID frame_id = *frame;
114 ++frame;
115 if (frame_id == main_frame_id_)
116 main_frame_id_ = FrameID();
117 frame_state_map_.erase(frame_id);
118 frame_ids_.erase(frame_id);
107 } 119 }
108 frame_ids_.insert(frame_id);
109 } 120 }
110 121
111 void FrameNavigationState::UpdateFrame(FrameID frame_id, const GURL& url) { 122 void FrameNavigationState::UpdateFrame(FrameID frame_id, const GURL& url) {
112 FrameIdToStateMap::iterator frame_state = frame_state_map_.find(frame_id); 123 FrameIdToStateMap::iterator frame_state = frame_state_map_.find(frame_id);
113 if (frame_state == frame_state_map_.end()) { 124 if (frame_state == frame_state_map_.end()) {
114 NOTREACHED(); 125 NOTREACHED();
115 return; 126 return;
116 } 127 }
117 frame_state->second.url = url; 128 frame_state->second.url = url;
118 } 129 }
119 130
120 bool FrameNavigationState::IsValidFrame(FrameID frame_id) const { 131 bool FrameNavigationState::IsValidFrame(FrameID frame_id) const {
121 FrameIdToStateMap::const_iterator frame_state = 132 FrameIdToStateMap::const_iterator frame_state =
122 frame_state_map_.find(frame_id); 133 frame_state_map_.find(frame_id);
123 return (frame_state != frame_state_map_.end()); 134 return (frame_state != frame_state_map_.end());
124 } 135 }
125 136
126 GURL FrameNavigationState::GetUrl(FrameID frame_id) const { 137 GURL FrameNavigationState::GetUrl(FrameID frame_id) const {
127 FrameIdToStateMap::const_iterator frame_state = 138 FrameIdToStateMap::const_iterator frame_state =
128 frame_state_map_.find(frame_id); 139 frame_state_map_.find(frame_id);
129 if (frame_state == frame_state_map_.end()) { 140 if (frame_state == frame_state_map_.end()) {
130 NOTREACHED(); 141 NOTREACHED();
131 return GURL(); 142 return GURL();
132 } 143 }
133 return frame_state->second.url; 144 return frame_state->second.url;
134 } 145 }
135 146
136 bool FrameNavigationState::IsMainFrame(FrameID frame_id) const { 147 bool FrameNavigationState::IsMainFrame(FrameID frame_id) const {
137 return main_frame_id_.IsValid() && main_frame_id_ == frame_id; 148 FrameIdToStateMap::const_iterator frame_state =
149 frame_state_map_.find(frame_id);
150 return (frame_state != frame_state_map_.end() &&
151 frame_state->second.is_main_frame);
138 } 152 }
139 153
140 FrameNavigationState::FrameID FrameNavigationState::GetMainFrameID() const { 154 FrameNavigationState::FrameID FrameNavigationState::GetMainFrameID() const {
141 return main_frame_id_; 155 return main_frame_id_;
142 } 156 }
143 157
144 void FrameNavigationState::SetErrorOccurredInFrame(FrameID frame_id) { 158 void FrameNavigationState::SetErrorOccurredInFrame(FrameID frame_id) {
145 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); 159 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
146 frame_state_map_[frame_id].error_occurred = true; 160 frame_state_map_[frame_id].error_occurred = true;
147 } 161 }
(...skipping 13 matching lines...) Expand all
161 bool FrameNavigationState::GetNavigationCompleted(FrameID frame_id) const { 175 bool FrameNavigationState::GetNavigationCompleted(FrameID frame_id) const {
162 FrameIdToStateMap::const_iterator frame_state = 176 FrameIdToStateMap::const_iterator frame_state =
163 frame_state_map_.find(frame_id); 177 frame_state_map_.find(frame_id);
164 return (frame_state == frame_state_map_.end() || 178 return (frame_state == frame_state_map_.end() ||
165 !frame_state->second.is_navigating); 179 !frame_state->second.is_navigating);
166 } 180 }
167 181
168 void FrameNavigationState::SetNavigationCommitted(FrameID frame_id) { 182 void FrameNavigationState::SetNavigationCommitted(FrameID frame_id) {
169 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); 183 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
170 frame_state_map_[frame_id].is_committed = true; 184 frame_state_map_[frame_id].is_committed = true;
185 if (frame_state_map_[frame_id].is_main_frame)
186 main_frame_id_ = frame_id;
171 } 187 }
172 188
173 bool FrameNavigationState::GetNavigationCommitted(FrameID frame_id) const { 189 bool FrameNavigationState::GetNavigationCommitted(FrameID frame_id) const {
174 FrameIdToStateMap::const_iterator frame_state = 190 FrameIdToStateMap::const_iterator frame_state =
175 frame_state_map_.find(frame_id); 191 frame_state_map_.find(frame_id);
176 return (frame_state != frame_state_map_.end() && 192 return (frame_state != frame_state_map_.end() &&
177 frame_state->second.is_committed); 193 frame_state->second.is_committed);
178 } 194 }
179 195
180 void FrameNavigationState::SetIsServerRedirected(FrameID frame_id) { 196 void FrameNavigationState::SetIsServerRedirected(FrameID frame_id) {
181 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); 197 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
182 frame_state_map_[frame_id].is_server_redirected = true; 198 frame_state_map_[frame_id].is_server_redirected = true;
183 } 199 }
184 200
185 bool FrameNavigationState::GetIsServerRedirected(FrameID frame_id) const { 201 bool FrameNavigationState::GetIsServerRedirected(FrameID frame_id) const {
186 FrameIdToStateMap::const_iterator frame_state = 202 FrameIdToStateMap::const_iterator frame_state =
187 frame_state_map_.find(frame_id); 203 frame_state_map_.find(frame_id);
188 return (frame_state != frame_state_map_.end() && 204 return (frame_state != frame_state_map_.end() &&
189 frame_state->second.is_server_redirected); 205 frame_state->second.is_server_redirected);
190 } 206 }
191 207
192 } // namespace extensions 208 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698