OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/files/file_path.h" | 6 #include "base/files/file_path.h" |
7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
8 #include "base/test/histogram_tester.h" | 8 #include "base/test/histogram_tester.h" |
9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
10 #include "content/browser/frame_host/cross_site_transferring_request.h" | 10 #include "content/browser/frame_host/cross_site_transferring_request.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 | 44 |
45 namespace content { | 45 namespace content { |
46 namespace { | 46 namespace { |
47 | 47 |
48 class RenderFrameHostManagerTestWebUIControllerFactory | 48 class RenderFrameHostManagerTestWebUIControllerFactory |
49 : public WebUIControllerFactory { | 49 : public WebUIControllerFactory { |
50 public: | 50 public: |
51 RenderFrameHostManagerTestWebUIControllerFactory() | 51 RenderFrameHostManagerTestWebUIControllerFactory() |
52 : should_create_webui_(false) { | 52 : should_create_webui_(false) { |
53 } | 53 } |
54 virtual ~RenderFrameHostManagerTestWebUIControllerFactory() {} | 54 ~RenderFrameHostManagerTestWebUIControllerFactory() override {} |
55 | 55 |
56 void set_should_create_webui(bool should_create_webui) { | 56 void set_should_create_webui(bool should_create_webui) { |
57 should_create_webui_ = should_create_webui; | 57 should_create_webui_ = should_create_webui; |
58 } | 58 } |
59 | 59 |
60 // WebUIFactory implementation. | 60 // WebUIFactory implementation. |
61 virtual WebUIController* CreateWebUIControllerForURL( | 61 WebUIController* CreateWebUIControllerForURL(WebUI* web_ui, |
62 WebUI* web_ui, const GURL& url) const override { | 62 const GURL& url) const override { |
63 if (!(should_create_webui_ && HasWebUIScheme(url))) | 63 if (!(should_create_webui_ && HasWebUIScheme(url))) |
64 return NULL; | 64 return NULL; |
65 return new WebUIController(web_ui); | 65 return new WebUIController(web_ui); |
66 } | 66 } |
67 | 67 |
68 virtual WebUI::TypeID GetWebUIType(BrowserContext* browser_context, | 68 WebUI::TypeID GetWebUIType(BrowserContext* browser_context, |
69 const GURL& url) const override { | 69 const GURL& url) const override { |
70 return WebUI::kNoWebUI; | 70 return WebUI::kNoWebUI; |
71 } | 71 } |
72 | 72 |
73 virtual bool UseWebUIForURL(BrowserContext* browser_context, | 73 bool UseWebUIForURL(BrowserContext* browser_context, |
| 74 const GURL& url) const override { |
| 75 return HasWebUIScheme(url); |
| 76 } |
| 77 |
| 78 bool UseWebUIBindingsForURL(BrowserContext* browser_context, |
74 const GURL& url) const override { | 79 const GURL& url) const override { |
75 return HasWebUIScheme(url); | 80 return HasWebUIScheme(url); |
76 } | 81 } |
77 | 82 |
78 virtual bool UseWebUIBindingsForURL(BrowserContext* browser_context, | |
79 const GURL& url) const override { | |
80 return HasWebUIScheme(url); | |
81 } | |
82 | |
83 private: | 83 private: |
84 bool should_create_webui_; | 84 bool should_create_webui_; |
85 | 85 |
86 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManagerTestWebUIControllerFactory); | 86 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManagerTestWebUIControllerFactory); |
87 }; | 87 }; |
88 | 88 |
89 class BeforeUnloadFiredWebContentsDelegate : public WebContentsDelegate { | 89 class BeforeUnloadFiredWebContentsDelegate : public WebContentsDelegate { |
90 public: | 90 public: |
91 BeforeUnloadFiredWebContentsDelegate() {} | 91 BeforeUnloadFiredWebContentsDelegate() {} |
92 virtual ~BeforeUnloadFiredWebContentsDelegate() {} | 92 ~BeforeUnloadFiredWebContentsDelegate() override {} |
93 | 93 |
94 virtual void BeforeUnloadFired(WebContents* web_contents, | 94 void BeforeUnloadFired(WebContents* web_contents, |
95 bool proceed, | 95 bool proceed, |
96 bool* proceed_to_fire_unload) override { | 96 bool* proceed_to_fire_unload) override { |
97 *proceed_to_fire_unload = proceed; | 97 *proceed_to_fire_unload = proceed; |
98 } | 98 } |
99 | 99 |
100 private: | 100 private: |
101 DISALLOW_COPY_AND_ASSIGN(BeforeUnloadFiredWebContentsDelegate); | 101 DISALLOW_COPY_AND_ASSIGN(BeforeUnloadFiredWebContentsDelegate); |
102 }; | 102 }; |
103 | 103 |
104 class CloseWebContentsDelegate : public WebContentsDelegate { | 104 class CloseWebContentsDelegate : public WebContentsDelegate { |
105 public: | 105 public: |
106 CloseWebContentsDelegate() : close_called_(false) {} | 106 CloseWebContentsDelegate() : close_called_(false) {} |
107 virtual ~CloseWebContentsDelegate() {} | 107 ~CloseWebContentsDelegate() override {} |
108 | 108 |
109 virtual void CloseContents(WebContents* web_contents) override { | 109 void CloseContents(WebContents* web_contents) override { |
110 close_called_ = true; | 110 close_called_ = true; |
111 } | 111 } |
112 | 112 |
113 bool is_closed() { return close_called_; } | 113 bool is_closed() { return close_called_; } |
114 | 114 |
115 private: | 115 private: |
116 DISALLOW_COPY_AND_ASSIGN(CloseWebContentsDelegate); | 116 DISALLOW_COPY_AND_ASSIGN(CloseWebContentsDelegate); |
117 | 117 |
118 bool close_called_; | 118 bool close_called_; |
119 }; | 119 }; |
120 | 120 |
121 // This observer keeps track of the last deleted RenderViewHost to avoid | 121 // This observer keeps track of the last deleted RenderViewHost to avoid |
122 // accessing it and causing use-after-free condition. | 122 // accessing it and causing use-after-free condition. |
123 class RenderViewHostDeletedObserver : public WebContentsObserver { | 123 class RenderViewHostDeletedObserver : public WebContentsObserver { |
124 public: | 124 public: |
125 RenderViewHostDeletedObserver(RenderViewHost* rvh) | 125 RenderViewHostDeletedObserver(RenderViewHost* rvh) |
126 : WebContentsObserver(WebContents::FromRenderViewHost(rvh)), | 126 : WebContentsObserver(WebContents::FromRenderViewHost(rvh)), |
127 process_id_(rvh->GetProcess()->GetID()), | 127 process_id_(rvh->GetProcess()->GetID()), |
128 routing_id_(rvh->GetRoutingID()), | 128 routing_id_(rvh->GetRoutingID()), |
129 deleted_(false) { | 129 deleted_(false) { |
130 } | 130 } |
131 | 131 |
132 virtual void RenderViewDeleted(RenderViewHost* render_view_host) override { | 132 void RenderViewDeleted(RenderViewHost* render_view_host) override { |
133 if (render_view_host->GetProcess()->GetID() == process_id_ && | 133 if (render_view_host->GetProcess()->GetID() == process_id_ && |
134 render_view_host->GetRoutingID() == routing_id_) { | 134 render_view_host->GetRoutingID() == routing_id_) { |
135 deleted_ = true; | 135 deleted_ = true; |
136 } | 136 } |
137 } | 137 } |
138 | 138 |
139 bool deleted() { | 139 bool deleted() { |
140 return deleted_; | 140 return deleted_; |
141 } | 141 } |
142 | 142 |
143 private: | 143 private: |
144 int process_id_; | 144 int process_id_; |
145 int routing_id_; | 145 int routing_id_; |
146 bool deleted_; | 146 bool deleted_; |
147 | 147 |
148 DISALLOW_COPY_AND_ASSIGN(RenderViewHostDeletedObserver); | 148 DISALLOW_COPY_AND_ASSIGN(RenderViewHostDeletedObserver); |
149 }; | 149 }; |
150 | 150 |
151 // This observer keeps track of the last created RenderFrameHost to allow tests | 151 // This observer keeps track of the last created RenderFrameHost to allow tests |
152 // to ensure that no RenderFrameHost objects are created when not expected. | 152 // to ensure that no RenderFrameHost objects are created when not expected. |
153 class RenderFrameHostCreatedObserver : public WebContentsObserver { | 153 class RenderFrameHostCreatedObserver : public WebContentsObserver { |
154 public: | 154 public: |
155 RenderFrameHostCreatedObserver(WebContents* web_contents) | 155 RenderFrameHostCreatedObserver(WebContents* web_contents) |
156 : WebContentsObserver(web_contents), | 156 : WebContentsObserver(web_contents), |
157 created_(false) { | 157 created_(false) { |
158 } | 158 } |
159 | 159 |
160 virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) override { | 160 void RenderFrameCreated(RenderFrameHost* render_frame_host) override { |
161 created_ = true; | 161 created_ = true; |
162 } | 162 } |
163 | 163 |
164 bool created() { | 164 bool created() { |
165 return created_; | 165 return created_; |
166 } | 166 } |
167 | 167 |
168 private: | 168 private: |
169 bool created_; | 169 bool created_; |
170 | 170 |
171 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostCreatedObserver); | 171 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostCreatedObserver); |
172 }; | 172 }; |
173 | 173 |
174 // This observer keeps track of the last deleted RenderFrameHost to avoid | 174 // This observer keeps track of the last deleted RenderFrameHost to avoid |
175 // accessing it and causing use-after-free condition. | 175 // accessing it and causing use-after-free condition. |
176 class RenderFrameHostDeletedObserver : public WebContentsObserver { | 176 class RenderFrameHostDeletedObserver : public WebContentsObserver { |
177 public: | 177 public: |
178 RenderFrameHostDeletedObserver(RenderFrameHost* rfh) | 178 RenderFrameHostDeletedObserver(RenderFrameHost* rfh) |
179 : WebContentsObserver(WebContents::FromRenderFrameHost(rfh)), | 179 : WebContentsObserver(WebContents::FromRenderFrameHost(rfh)), |
180 process_id_(rfh->GetProcess()->GetID()), | 180 process_id_(rfh->GetProcess()->GetID()), |
181 routing_id_(rfh->GetRoutingID()), | 181 routing_id_(rfh->GetRoutingID()), |
182 deleted_(false) { | 182 deleted_(false) { |
183 } | 183 } |
184 | 184 |
185 virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) override { | 185 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override { |
186 if (render_frame_host->GetProcess()->GetID() == process_id_ && | 186 if (render_frame_host->GetProcess()->GetID() == process_id_ && |
187 render_frame_host->GetRoutingID() == routing_id_) { | 187 render_frame_host->GetRoutingID() == routing_id_) { |
188 deleted_ = true; | 188 deleted_ = true; |
189 } | 189 } |
190 } | 190 } |
191 | 191 |
192 bool deleted() { | 192 bool deleted() { |
193 return deleted_; | 193 return deleted_; |
194 } | 194 } |
195 | 195 |
(...skipping 10 matching lines...) Expand all Loading... |
206 // update events, which the FilterMessagesWhileSwappedOut test simulates being | 206 // update events, which the FilterMessagesWhileSwappedOut test simulates being |
207 // sent. The test is successful if the event is not observed. | 207 // sent. The test is successful if the event is not observed. |
208 // See http://crbug.com/351815 | 208 // See http://crbug.com/351815 |
209 class PluginFaviconMessageObserver : public WebContentsObserver { | 209 class PluginFaviconMessageObserver : public WebContentsObserver { |
210 public: | 210 public: |
211 PluginFaviconMessageObserver(WebContents* web_contents) | 211 PluginFaviconMessageObserver(WebContents* web_contents) |
212 : WebContentsObserver(web_contents), | 212 : WebContentsObserver(web_contents), |
213 plugin_crashed_(false), | 213 plugin_crashed_(false), |
214 favicon_received_(false) { } | 214 favicon_received_(false) { } |
215 | 215 |
216 virtual void PluginCrashed(const base::FilePath& plugin_path, | 216 void PluginCrashed(const base::FilePath& plugin_path, |
217 base::ProcessId plugin_pid) override { | 217 base::ProcessId plugin_pid) override { |
218 plugin_crashed_ = true; | 218 plugin_crashed_ = true; |
219 } | 219 } |
220 | 220 |
221 virtual void DidUpdateFaviconURL( | 221 void DidUpdateFaviconURL(const std::vector<FaviconURL>& candidates) override { |
222 const std::vector<FaviconURL>& candidates) override { | |
223 favicon_received_ = true; | 222 favicon_received_ = true; |
224 } | 223 } |
225 | 224 |
226 bool plugin_crashed() { | 225 bool plugin_crashed() { |
227 return plugin_crashed_; | 226 return plugin_crashed_; |
228 } | 227 } |
229 | 228 |
230 bool favicon_received() { | 229 bool favicon_received() { |
231 return favicon_received_; | 230 return favicon_received_; |
232 } | 231 } |
233 | 232 |
234 private: | 233 private: |
235 bool plugin_crashed_; | 234 bool plugin_crashed_; |
236 bool favicon_received_; | 235 bool favicon_received_; |
237 | 236 |
238 DISALLOW_COPY_AND_ASSIGN(PluginFaviconMessageObserver); | 237 DISALLOW_COPY_AND_ASSIGN(PluginFaviconMessageObserver); |
239 }; | 238 }; |
240 | 239 |
241 // Ensures that RenderFrameDeleted and RenderFrameCreated are called in a | 240 // Ensures that RenderFrameDeleted and RenderFrameCreated are called in a |
242 // consistent manner. | 241 // consistent manner. |
243 class FrameLifetimeConsistencyChecker : public WebContentsObserver { | 242 class FrameLifetimeConsistencyChecker : public WebContentsObserver { |
244 public: | 243 public: |
245 explicit FrameLifetimeConsistencyChecker(WebContentsImpl* web_contents) | 244 explicit FrameLifetimeConsistencyChecker(WebContentsImpl* web_contents) |
246 : WebContentsObserver(web_contents) { | 245 : WebContentsObserver(web_contents) { |
247 RenderViewCreated(web_contents->GetRenderViewHost()); | 246 RenderViewCreated(web_contents->GetRenderViewHost()); |
248 RenderFrameCreated(web_contents->GetMainFrame()); | 247 RenderFrameCreated(web_contents->GetMainFrame()); |
249 } | 248 } |
250 | 249 |
251 virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) override { | 250 void RenderFrameCreated(RenderFrameHost* render_frame_host) override { |
252 std::pair<int, int> routing_pair = | 251 std::pair<int, int> routing_pair = |
253 std::make_pair(render_frame_host->GetProcess()->GetID(), | 252 std::make_pair(render_frame_host->GetProcess()->GetID(), |
254 render_frame_host->GetRoutingID()); | 253 render_frame_host->GetRoutingID()); |
255 bool was_live_already = !live_routes_.insert(routing_pair).second; | 254 bool was_live_already = !live_routes_.insert(routing_pair).second; |
256 bool was_used_before = deleted_routes_.count(routing_pair) != 0; | 255 bool was_used_before = deleted_routes_.count(routing_pair) != 0; |
257 | 256 |
258 if (was_live_already) { | 257 if (was_live_already) { |
259 FAIL() << "RenderFrameCreated called more than once for routing pair: " | 258 FAIL() << "RenderFrameCreated called more than once for routing pair: " |
260 << Format(render_frame_host); | 259 << Format(render_frame_host); |
261 } else if (was_used_before) { | 260 } else if (was_used_before) { |
262 FAIL() << "RenderFrameCreated called for routing pair " | 261 FAIL() << "RenderFrameCreated called for routing pair " |
263 << Format(render_frame_host) << " that was previously deleted."; | 262 << Format(render_frame_host) << " that was previously deleted."; |
264 } | 263 } |
265 } | 264 } |
266 | 265 |
267 virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) override { | 266 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override { |
268 std::pair<int, int> routing_pair = | 267 std::pair<int, int> routing_pair = |
269 std::make_pair(render_frame_host->GetProcess()->GetID(), | 268 std::make_pair(render_frame_host->GetProcess()->GetID(), |
270 render_frame_host->GetRoutingID()); | 269 render_frame_host->GetRoutingID()); |
271 bool was_live = live_routes_.erase(routing_pair); | 270 bool was_live = live_routes_.erase(routing_pair); |
272 bool was_dead_already = !deleted_routes_.insert(routing_pair).second; | 271 bool was_dead_already = !deleted_routes_.insert(routing_pair).second; |
273 | 272 |
274 if (was_dead_already) { | 273 if (was_dead_already) { |
275 FAIL() << "RenderFrameDeleted called more than once for routing pair " | 274 FAIL() << "RenderFrameDeleted called more than once for routing pair " |
276 << Format(render_frame_host); | 275 << Format(render_frame_host); |
277 } else if (!was_live) { | 276 } else if (!was_live) { |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
743 // next test cases to detect the bug mentioned at | 742 // next test cases to detect the bug mentioned at |
744 // http://crbug.com/259859. | 743 // http://crbug.com/259859. |
745 class RenderViewHostDestroyer : public WebContentsObserver { | 744 class RenderViewHostDestroyer : public WebContentsObserver { |
746 public: | 745 public: |
747 RenderViewHostDestroyer(RenderViewHost* render_view_host, | 746 RenderViewHostDestroyer(RenderViewHost* render_view_host, |
748 WebContents* web_contents) | 747 WebContents* web_contents) |
749 : WebContentsObserver(WebContents::FromRenderViewHost(render_view_host)), | 748 : WebContentsObserver(WebContents::FromRenderViewHost(render_view_host)), |
750 render_view_host_(render_view_host), | 749 render_view_host_(render_view_host), |
751 web_contents_(web_contents) {} | 750 web_contents_(web_contents) {} |
752 | 751 |
753 virtual void RenderViewDeleted( | 752 void RenderViewDeleted(RenderViewHost* render_view_host) override { |
754 RenderViewHost* render_view_host) override { | |
755 if (render_view_host == render_view_host_) | 753 if (render_view_host == render_view_host_) |
756 delete web_contents_; | 754 delete web_contents_; |
757 } | 755 } |
758 | 756 |
759 private: | 757 private: |
760 RenderViewHost* render_view_host_; | 758 RenderViewHost* render_view_host_; |
761 WebContents* web_contents_; | 759 WebContents* web_contents_; |
762 | 760 |
763 DISALLOW_COPY_AND_ASSIGN(RenderViewHostDestroyer); | 761 DISALLOW_COPY_AND_ASSIGN(RenderViewHostDestroyer); |
764 }; | 762 }; |
(...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1798 pending_rfh->GetSiteInstance()->increment_active_frame_count(); | 1796 pending_rfh->GetSiteInstance()->increment_active_frame_count(); |
1799 | 1797 |
1800 contents()->GetMainFrame()->OnMessageReceived( | 1798 contents()->GetMainFrame()->OnMessageReceived( |
1801 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); | 1799 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); |
1802 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1800 EXPECT_FALSE(contents()->cross_navigation_pending()); |
1803 EXPECT_FALSE(rfh_deleted_observer.deleted()); | 1801 EXPECT_FALSE(rfh_deleted_observer.deleted()); |
1804 } | 1802 } |
1805 } | 1803 } |
1806 | 1804 |
1807 } // namespace content | 1805 } // namespace content |
OLD | NEW |