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

Side by Side Diff: chrome/browser/geolocation/chrome_geolocation_permission_context_unittest.cc

Issue 11269002: Introduce GeolocationPermissionRequestID, a wrapper struct to contain the (render process ID, rende… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 1 month 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 <set> 5 #include <set>
6 #include <string> 6 #include <string>
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/hash_tables.h" 10 #include "base/hash_tables.h"
(...skipping 24 matching lines...) Expand all
35 #include "chrome/browser/prefs/pref_service.h" 35 #include "chrome/browser/prefs/pref_service.h"
36 #include "chrome/common/pref_names.h" 36 #include "chrome/common/pref_names.h"
37 #endif 37 #endif
38 38
39 using content::BrowserThread; 39 using content::BrowserThread;
40 using content::MockRenderProcessHost; 40 using content::MockRenderProcessHost;
41 using content::RenderViewHostTester; 41 using content::RenderViewHostTester;
42 using content::WebContents; 42 using content::WebContents;
43 using content::WebContentsTester; 43 using content::WebContentsTester;
44 44
45
45 // ClosedDelegateTracker ------------------------------------------------------ 46 // ClosedDelegateTracker ------------------------------------------------------
46 47
47 // We need to track which infobars were closed. 48 // We need to track which infobars were closed.
48 class ClosedDelegateTracker : public content::NotificationObserver { 49 class ClosedDelegateTracker : public content::NotificationObserver {
49 public: 50 public:
50 ClosedDelegateTracker(); 51 ClosedDelegateTracker();
51 virtual ~ClosedDelegateTracker(); 52 virtual ~ClosedDelegateTracker();
52 53
53 // content::NotificationObserver: 54 // content::NotificationObserver:
54 virtual void Observe(int type, 55 virtual void Observe(int type,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 } 87 }
87 88
88 bool ClosedDelegateTracker::Contains(InfoBarDelegate* delegate) const { 89 bool ClosedDelegateTracker::Contains(InfoBarDelegate* delegate) const {
89 return removed_infobar_delegates_.count(delegate) != 0; 90 return removed_infobar_delegates_.count(delegate) != 0;
90 } 91 }
91 92
92 void ClosedDelegateTracker::Clear() { 93 void ClosedDelegateTracker::Clear() {
93 removed_infobar_delegates_.clear(); 94 removed_infobar_delegates_.clear();
94 } 95 }
95 96
97
96 // GeolocationPermissionContextTests ------------------------------------------ 98 // GeolocationPermissionContextTests ------------------------------------------
97 99
98 // This class sets up GeolocationArbitrator. 100 // This class sets up GeolocationArbitrator.
99 class GeolocationPermissionContextTests 101 class GeolocationPermissionContextTests
100 : public ChromeRenderViewHostTestHarness { 102 : public ChromeRenderViewHostTestHarness {
101 public: 103 public:
102 GeolocationPermissionContextTests(); 104 GeolocationPermissionContextTests();
103 105
104 protected: 106 protected:
105 virtual ~GeolocationPermissionContextTests(); 107 virtual ~GeolocationPermissionContextTests();
106 108
107 int process_id() { 109 content::GeolocationPermissionRequestID RequestID(int bridge_id);
108 return web_contents()->GetRenderProcessHost()->GetID(); 110 content::GeolocationPermissionRequestID RequestIDForTab(int tab,
109 } 111 int bridge_id);
110 int process_id_for_tab(int tab) {
111 return extra_tabs_[tab]->GetRenderProcessHost()->GetID();
112 }
113 int render_id() {
114 return web_contents()->GetRenderViewHost()->GetRoutingID();
115 }
116 int render_id_for_tab(int tab) {
117 return extra_tabs_[tab]->GetRenderViewHost()->GetRoutingID();
118 }
119 int bridge_id() const { return 42; } // Not relevant at this level.
120 InfoBarTabHelper* infobar_tab_helper() { 112 InfoBarTabHelper* infobar_tab_helper() {
121 return InfoBarTabHelper::FromWebContents(web_contents()); 113 return InfoBarTabHelper::FromWebContents(web_contents());
122 } 114 }
123 InfoBarTabHelper* infobar_tab_helper_for_tab(int tab) { 115 InfoBarTabHelper* infobar_tab_helper_for_tab(int tab) {
124 return InfoBarTabHelper::FromWebContents(extra_tabs_[tab]); 116 return InfoBarTabHelper::FromWebContents(extra_tabs_[tab]);
125 } 117 }
126 118
127 void RequestGeolocationPermission(int render_process_id, 119 void RequestGeolocationPermission(
128 int render_view_id, 120 const content::GeolocationPermissionRequestID& id,
129 int bridge_id, 121 const GURL& requesting_frame);
130 const GURL& requesting_frame); 122 void PermissionResponse(const content::GeolocationPermissionRequestID& id,
131 void PermissionResponse(int render_process_id,
132 int render_view_id,
133 int bridge_id,
134 bool allowed); 123 bool allowed);
135 void CheckPermissionMessageSent(int bridge_id, bool allowed); 124 void CheckPermissionMessageSent(int bridge_id, bool allowed);
136 void CheckPermissionMessageSentForTab(int tab, int bridge_id, bool allowed); 125 void CheckPermissionMessageSentForTab(int tab, int bridge_id, bool allowed);
137 void CheckPermissionMessageSentInternal(MockRenderProcessHost* process, 126 void CheckPermissionMessageSentInternal(MockRenderProcessHost* process,
138 int bridge_id, 127 int bridge_id,
139 bool allowed); 128 bool allowed);
140 void AddNewTab(const GURL& url); 129 void AddNewTab(const GURL& url);
141 void CheckTabContentsState(const GURL& requesting_frame, 130 void CheckTabContentsState(const GURL& requesting_frame,
142 ContentSetting expected_content_setting); 131 ContentSetting expected_content_setting);
143 132
(...skipping 17 matching lines...) Expand all
161 150
162 GeolocationPermissionContextTests::GeolocationPermissionContextTests() 151 GeolocationPermissionContextTests::GeolocationPermissionContextTests()
163 : ChromeRenderViewHostTestHarness(), 152 : ChromeRenderViewHostTestHarness(),
164 ui_thread_(BrowserThread::UI, MessageLoop::current()), 153 ui_thread_(BrowserThread::UI, MessageLoop::current()),
165 db_thread_(BrowserThread::DB) { 154 db_thread_(BrowserThread::DB) {
166 } 155 }
167 156
168 GeolocationPermissionContextTests::~GeolocationPermissionContextTests() { 157 GeolocationPermissionContextTests::~GeolocationPermissionContextTests() {
169 } 158 }
170 159
160 content::GeolocationPermissionRequestID
161 GeolocationPermissionContextTests::RequestID(int bridge_id) {
162 return content::GeolocationPermissionRequestID(
163 web_contents()->GetRenderProcessHost()->GetID(),
164 web_contents()->GetRenderViewHost()->GetRoutingID(),
165 bridge_id);
166 }
167
168 content::GeolocationPermissionRequestID
169 GeolocationPermissionContextTests::RequestIDForTab(int tab, int bridge_id) {
170 return content::GeolocationPermissionRequestID(
171 extra_tabs_[tab]->GetRenderProcessHost()->GetID(),
172 extra_tabs_[tab]->GetRenderViewHost()->GetRoutingID(),
173 bridge_id);
174 }
175
171 void GeolocationPermissionContextTests::RequestGeolocationPermission( 176 void GeolocationPermissionContextTests::RequestGeolocationPermission(
172 int render_process_id, 177 const content::GeolocationPermissionRequestID& id,
173 int render_view_id,
174 int bridge_id,
175 const GURL& requesting_frame) { 178 const GURL& requesting_frame) {
176 geolocation_permission_context_->RequestGeolocationPermission( 179 geolocation_permission_context_->RequestGeolocationPermission(
177 render_process_id, render_view_id, bridge_id, requesting_frame, 180 id, requesting_frame, base::Bind(
178 base::Bind(&GeolocationPermissionContextTests::PermissionResponse, 181 &GeolocationPermissionContextTests::PermissionResponse,
179 base::Unretained(this), 182 base::Unretained(this), id));
180 render_process_id,
181 render_view_id,
182 bridge_id));
183 } 183 }
184 184
185 void GeolocationPermissionContextTests::PermissionResponse( 185 void GeolocationPermissionContextTests::PermissionResponse(
186 int render_process_id, 186 const content::GeolocationPermissionRequestID& id,
187 int render_view_id,
188 int bridge_id,
189 bool allowed) { 187 bool allowed) {
190 responses_[render_process_id] = std::make_pair(bridge_id, allowed); 188 responses_[id.render_process_id] = std::make_pair(id.bridge_id, allowed);
191 } 189 }
192 190
193 void GeolocationPermissionContextTests::CheckPermissionMessageSent( 191 void GeolocationPermissionContextTests::CheckPermissionMessageSent(
194 int bridge_id, 192 int bridge_id,
195 bool allowed) { 193 bool allowed) {
196 CheckPermissionMessageSentInternal(process(), bridge_id, allowed); 194 CheckPermissionMessageSentInternal(process(), bridge_id, allowed);
197 } 195 }
198 196
199 void GeolocationPermissionContextTests::CheckPermissionMessageSentForTab( 197 void GeolocationPermissionContextTests::CheckPermissionMessageSentForTab(
200 int tab, 198 int tab,
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 db_thread_.Stop(); 269 db_thread_.Stop();
272 } 270 }
273 271
274 272
275 // Tests ---------------------------------------------------------------------- 273 // Tests ----------------------------------------------------------------------
276 274
277 TEST_F(GeolocationPermissionContextTests, SinglePermission) { 275 TEST_F(GeolocationPermissionContextTests, SinglePermission) {
278 GURL requesting_frame("http://www.example.com/geolocation"); 276 GURL requesting_frame("http://www.example.com/geolocation");
279 NavigateAndCommit(requesting_frame); 277 NavigateAndCommit(requesting_frame);
280 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 278 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
281 RequestGeolocationPermission( 279 RequestGeolocationPermission(RequestID(0), requesting_frame);
282 process_id(), render_id(), bridge_id(), requesting_frame);
283 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); 280 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount());
284 ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> 281 ConfirmInfoBarDelegate* infobar_0 =
285 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 282 infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
286 infobar_0->Cancel(); 283 infobar_0->Cancel();
287 infobar_tab_helper()->RemoveInfoBar(infobar_0); 284 infobar_tab_helper()->RemoveInfoBar(infobar_0);
288 EXPECT_EQ(1U, closed_delegate_tracker_.size()); 285 EXPECT_EQ(1U, closed_delegate_tracker_.size());
289 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); 286 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0));
290 infobar_0->InfoBarClosed(); 287 infobar_0->InfoBarClosed();
291 } 288 }
292 289
293 #if defined(OS_ANDROID) 290 #if defined(OS_ANDROID)
294 TEST_F(GeolocationPermissionContextTests, GeolocationEnabledDisabled) { 291 TEST_F(GeolocationPermissionContextTests, GeolocationEnabledDisabled) {
295 profile()->GetHostContentSettingsMap()->SetDefaultContentSetting( 292 profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
296 CONTENT_SETTINGS_TYPE_GEOLOCATION, 293 CONTENT_SETTINGS_TYPE_GEOLOCATION,
297 CONTENT_SETTING_ALLOW); 294 CONTENT_SETTING_ALLOW);
298 295
299 // Check that the request is denied with preference disabled, 296 // Check that the request is denied with preference disabled,
300 // even though the default policy allows it. 297 // even though the default policy allows it.
301 GURL requesting_frame("http://www.example.com/geolocation"); 298 GURL requesting_frame("http://www.example.com/geolocation");
302 NavigateAndCommit(requesting_frame); 299 NavigateAndCommit(requesting_frame);
303 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 300 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
304 profile()->GetPrefs()->SetBoolean(prefs::kGeolocationEnabled, false); 301 profile()->GetPrefs()->SetBoolean(prefs::kGeolocationEnabled, false);
305 RequestGeolocationPermission( 302 RequestGeolocationPermission(RequestID(0), requesting_frame);
306 process_id(), render_id(), bridge_id(), requesting_frame);
307 ASSERT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 303 ASSERT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
308 CheckPermissionMessageSent(bridge_id(), false); 304 CheckPermissionMessageSent(0, false);
309 305
310 // Reenable the preference and check that the request now goes though. 306 // Reenable the preference and check that the request now goes though.
311 profile()->GetPrefs()->SetBoolean(prefs::kGeolocationEnabled, true); 307 profile()->GetPrefs()->SetBoolean(prefs::kGeolocationEnabled, true);
312 RequestGeolocationPermission( 308 RequestGeolocationPermission(RequestID(1), requesting_frame);
313 process_id(), render_id(), bridge_id() + 1, requesting_frame);
314 ASSERT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 309 ASSERT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
315 CheckPermissionMessageSent(bridge_id() + 1, true); 310 CheckPermissionMessageSent(1, true);
316 } 311 }
317 #endif 312 #endif
318 313
319 TEST_F(GeolocationPermissionContextTests, QueuedPermission) { 314 TEST_F(GeolocationPermissionContextTests, QueuedPermission) {
320 GURL requesting_frame_0("http://www.example.com/geolocation"); 315 GURL requesting_frame_0("http://www.example.com/geolocation");
321 GURL requesting_frame_1("http://www.example-2.com/geolocation"); 316 GURL requesting_frame_1("http://www.example-2.com/geolocation");
322 EXPECT_EQ(CONTENT_SETTING_ASK, 317 EXPECT_EQ(CONTENT_SETTING_ASK,
323 profile()->GetHostContentSettingsMap()->GetContentSetting( 318 profile()->GetHostContentSettingsMap()->GetContentSetting(
324 requesting_frame_0, 319 requesting_frame_0,
325 requesting_frame_0, 320 requesting_frame_0,
326 CONTENT_SETTINGS_TYPE_GEOLOCATION, 321 CONTENT_SETTINGS_TYPE_GEOLOCATION,
327 std::string())); 322 std::string()));
328 EXPECT_EQ(CONTENT_SETTING_ASK, 323 EXPECT_EQ(CONTENT_SETTING_ASK,
329 profile()->GetHostContentSettingsMap()->GetContentSetting( 324 profile()->GetHostContentSettingsMap()->GetContentSetting(
330 requesting_frame_1, 325 requesting_frame_1,
331 requesting_frame_0, 326 requesting_frame_0,
332 CONTENT_SETTINGS_TYPE_GEOLOCATION, 327 CONTENT_SETTINGS_TYPE_GEOLOCATION,
333 std::string())); 328 std::string()));
334 329
335 330
336 NavigateAndCommit(requesting_frame_0); 331 NavigateAndCommit(requesting_frame_0);
337 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 332 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
338 // Request permission for two frames. 333 // Request permission for two frames.
339 RequestGeolocationPermission( 334 RequestGeolocationPermission(RequestID(0), requesting_frame_0);
340 process_id(), render_id(), bridge_id(), requesting_frame_0); 335 RequestGeolocationPermission(RequestID(1), requesting_frame_1);
341 RequestGeolocationPermission(
342 process_id(), render_id(), bridge_id() + 1, requesting_frame_1);
343 // Ensure only one infobar is created. 336 // Ensure only one infobar is created.
344 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); 337 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount());
345 ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> 338 ConfirmInfoBarDelegate* infobar_0 =
346 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 339 infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
347 ASSERT_TRUE(infobar_0); 340 ASSERT_TRUE(infobar_0);
348 string16 text_0 = infobar_0->GetMessageText(); 341 string16 text_0 = infobar_0->GetMessageText();
349 342
350 // Accept the first frame. 343 // Accept the first frame.
351 infobar_0->Accept(); 344 infobar_0->Accept();
352 CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW); 345 CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW);
353 CheckPermissionMessageSent(bridge_id(), true); 346 CheckPermissionMessageSent(0, true);
354 347
355 infobar_tab_helper()->RemoveInfoBar(infobar_0); 348 infobar_tab_helper()->RemoveInfoBar(infobar_0);
356 EXPECT_EQ(1U, closed_delegate_tracker_.size()); 349 EXPECT_EQ(1U, closed_delegate_tracker_.size());
357 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); 350 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0));
358 closed_delegate_tracker_.Clear(); 351 closed_delegate_tracker_.Clear();
359 infobar_0->InfoBarClosed(); 352 infobar_0->InfoBarClosed();
360 // Now we should have a new infobar for the second frame. 353 // Now we should have a new infobar for the second frame.
361 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); 354 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount());
362 355
363 ConfirmInfoBarDelegate* infobar_1 = infobar_tab_helper()-> 356 ConfirmInfoBarDelegate* infobar_1 =
364 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 357 infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
365 ASSERT_TRUE(infobar_1); 358 ASSERT_TRUE(infobar_1);
366 string16 text_1 = infobar_1->GetMessageText(); 359 string16 text_1 = infobar_1->GetMessageText();
367 EXPECT_NE(text_0, text_1); 360 EXPECT_NE(text_0, text_1);
368 361
369 // Cancel (block) this frame. 362 // Cancel (block) this frame.
370 infobar_1->Cancel(); 363 infobar_1->Cancel();
371 CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_BLOCK); 364 CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_BLOCK);
372 CheckPermissionMessageSent(bridge_id() + 1, false); 365 CheckPermissionMessageSent(1, false);
373 infobar_tab_helper()->RemoveInfoBar(infobar_1); 366 infobar_tab_helper()->RemoveInfoBar(infobar_1);
374 EXPECT_EQ(1U, closed_delegate_tracker_.size()); 367 EXPECT_EQ(1U, closed_delegate_tracker_.size());
375 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); 368 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1));
376 infobar_1->InfoBarClosed(); 369 infobar_1->InfoBarClosed();
377 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 370 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
378 // Ensure the persisted permissions are ok. 371 // Ensure the persisted permissions are ok.
379 EXPECT_EQ(CONTENT_SETTING_ALLOW, 372 EXPECT_EQ(CONTENT_SETTING_ALLOW,
380 profile()->GetHostContentSettingsMap()->GetContentSetting( 373 profile()->GetHostContentSettingsMap()->GetContentSetting(
381 requesting_frame_0, 374 requesting_frame_0,
382 requesting_frame_0, 375 requesting_frame_0,
(...skipping 22 matching lines...) Expand all
405 profile()->GetHostContentSettingsMap()->GetContentSetting( 398 profile()->GetHostContentSettingsMap()->GetContentSetting(
406 requesting_frame_1, 399 requesting_frame_1,
407 requesting_frame_0, 400 requesting_frame_0,
408 CONTENT_SETTINGS_TYPE_GEOLOCATION, 401 CONTENT_SETTINGS_TYPE_GEOLOCATION,
409 std::string())); 402 std::string()));
410 403
411 404
412 NavigateAndCommit(requesting_frame_0); 405 NavigateAndCommit(requesting_frame_0);
413 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 406 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
414 // Request permission for two frames. 407 // Request permission for two frames.
415 RequestGeolocationPermission( 408 RequestGeolocationPermission(RequestID(0), requesting_frame_0);
416 process_id(), render_id(), bridge_id(), requesting_frame_0); 409 RequestGeolocationPermission(RequestID(1), requesting_frame_1);
417 RequestGeolocationPermission(
418 process_id(), render_id(), bridge_id() + 1, requesting_frame_1);
419 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); 410 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount());
420 411
421 ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> 412 ConfirmInfoBarDelegate* infobar_0 =
422 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 413 infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
423 ASSERT_TRUE(infobar_0); 414 ASSERT_TRUE(infobar_0);
424 string16 text_0 = infobar_0->GetMessageText(); 415 string16 text_0 = infobar_0->GetMessageText();
425 416
426 // Simulate the frame going away, ensure the infobar for this frame 417 // Simulate the frame going away, ensure the infobar for this frame
427 // is removed and the next pending infobar is created. 418 // is removed and the next pending infobar is created.
428 geolocation_permission_context_->CancelGeolocationPermissionRequest( 419 geolocation_permission_context_->CancelGeolocationPermissionRequest(
429 process_id(), render_id(), bridge_id(), requesting_frame_0); 420 RequestID(0), requesting_frame_0);
430 EXPECT_EQ(1U, closed_delegate_tracker_.size()); 421 EXPECT_EQ(1U, closed_delegate_tracker_.size());
431 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); 422 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0));
432 closed_delegate_tracker_.Clear(); 423 closed_delegate_tracker_.Clear();
433 infobar_0->InfoBarClosed(); 424 infobar_0->InfoBarClosed();
434 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); 425 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount());
435 426
436 ConfirmInfoBarDelegate* infobar_1 = infobar_tab_helper()-> 427 ConfirmInfoBarDelegate* infobar_1 =
437 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 428 infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
438 ASSERT_TRUE(infobar_1); 429 ASSERT_TRUE(infobar_1);
439 string16 text_1 = infobar_1->GetMessageText(); 430 string16 text_1 = infobar_1->GetMessageText();
440 EXPECT_NE(text_0, text_1); 431 EXPECT_NE(text_0, text_1);
441 432
442 // Allow this frame. 433 // Allow this frame.
443 infobar_1->Accept(); 434 infobar_1->Accept();
444 CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW); 435 CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW);
445 CheckPermissionMessageSent(bridge_id() + 1, true); 436 CheckPermissionMessageSent(1, true);
446 infobar_tab_helper()->RemoveInfoBar(infobar_1); 437 infobar_tab_helper()->RemoveInfoBar(infobar_1);
447 EXPECT_EQ(1U, closed_delegate_tracker_.size()); 438 EXPECT_EQ(1U, closed_delegate_tracker_.size());
448 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); 439 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1));
449 infobar_1->InfoBarClosed(); 440 infobar_1->InfoBarClosed();
450 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 441 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
451 // Ensure the persisted permissions are ok. 442 // Ensure the persisted permissions are ok.
452 EXPECT_EQ(CONTENT_SETTING_ASK, 443 EXPECT_EQ(CONTENT_SETTING_ASK,
453 profile()->GetHostContentSettingsMap()->GetContentSetting( 444 profile()->GetHostContentSettingsMap()->GetContentSetting(
454 requesting_frame_0, 445 requesting_frame_0,
455 requesting_frame_0, 446 requesting_frame_0,
456 CONTENT_SETTINGS_TYPE_GEOLOCATION, 447 CONTENT_SETTINGS_TYPE_GEOLOCATION,
457 std::string())); 448 std::string()));
458 449
459 EXPECT_EQ(CONTENT_SETTING_ALLOW, 450 EXPECT_EQ(CONTENT_SETTING_ALLOW,
460 profile()->GetHostContentSettingsMap()->GetContentSetting( 451 profile()->GetHostContentSettingsMap()->GetContentSetting(
461 requesting_frame_1, 452 requesting_frame_1,
462 requesting_frame_0, 453 requesting_frame_0,
463 CONTENT_SETTINGS_TYPE_GEOLOCATION, 454 CONTENT_SETTINGS_TYPE_GEOLOCATION,
464 std::string())); 455 std::string()));
465 } 456 }
466 457
467 TEST_F(GeolocationPermissionContextTests, InvalidURL) { 458 TEST_F(GeolocationPermissionContextTests, InvalidURL) {
468 GURL invalid_embedder("about:blank"); 459 GURL invalid_embedder("about:blank");
469 GURL requesting_frame; 460 GURL requesting_frame;
470 NavigateAndCommit(invalid_embedder); 461 NavigateAndCommit(invalid_embedder);
471 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 462 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
472 RequestGeolocationPermission( 463 RequestGeolocationPermission(RequestID(0), requesting_frame);
473 process_id(), render_id(), bridge_id(), requesting_frame);
474 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 464 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
475 CheckPermissionMessageSent(bridge_id(), false); 465 CheckPermissionMessageSent(0, false);
476 } 466 }
477 467
478 TEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) { 468 TEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) {
479 GURL url_a("http://www.example.com/geolocation"); 469 GURL url_a("http://www.example.com/geolocation");
480 GURL url_b("http://www.example-2.com/geolocation"); 470 GURL url_b("http://www.example-2.com/geolocation");
481 NavigateAndCommit(url_a); 471 NavigateAndCommit(url_a);
482 AddNewTab(url_b); 472 AddNewTab(url_b);
483 AddNewTab(url_a); 473 AddNewTab(url_a);
484 474
485 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 475 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
486 RequestGeolocationPermission( 476 RequestGeolocationPermission(RequestID(0), url_a);
487 process_id(), render_id(), bridge_id(), url_a);
488 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); 477 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount());
489 478
490 RequestGeolocationPermission( 479 RequestGeolocationPermission(RequestIDForTab(0, 0), url_b);
491 process_id_for_tab(0), render_id_for_tab(0), bridge_id(), url_b);
492 EXPECT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount()); 480 EXPECT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount());
493 481
494 RequestGeolocationPermission( 482 RequestGeolocationPermission(RequestIDForTab(1, 0), url_a);
495 process_id_for_tab(1), render_id_for_tab(1), bridge_id(), url_a);
496 ASSERT_EQ(1U, infobar_tab_helper_for_tab(1)->GetInfoBarCount()); 483 ASSERT_EQ(1U, infobar_tab_helper_for_tab(1)->GetInfoBarCount());
497 484
498 ConfirmInfoBarDelegate* removed_infobar = infobar_tab_helper_for_tab(1)-> 485 ConfirmInfoBarDelegate* removed_infobar = infobar_tab_helper_for_tab(1)->
499 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 486 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
500 487
501 // Accept the first tab. 488 // Accept the first tab.
502 ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> 489 ConfirmInfoBarDelegate* infobar_0 =
503 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 490 infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
504 ASSERT_TRUE(infobar_0); 491 ASSERT_TRUE(infobar_0);
505 infobar_0->Accept(); 492 infobar_0->Accept();
506 CheckPermissionMessageSent(bridge_id(), true); 493 CheckPermissionMessageSent(0, true);
507 infobar_tab_helper()->RemoveInfoBar(infobar_0); 494 infobar_tab_helper()->RemoveInfoBar(infobar_0);
508 EXPECT_EQ(2U, closed_delegate_tracker_.size()); 495 EXPECT_EQ(2U, closed_delegate_tracker_.size());
509 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); 496 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0));
510 infobar_0->InfoBarClosed(); 497 infobar_0->InfoBarClosed();
511 // Now the infobar for the tab with the same origin should have gone. 498 // Now the infobar for the tab with the same origin should have gone.
512 EXPECT_EQ(0U, infobar_tab_helper_for_tab(1)->GetInfoBarCount()); 499 EXPECT_EQ(0U, infobar_tab_helper_for_tab(1)->GetInfoBarCount());
513 CheckPermissionMessageSentForTab(1, bridge_id(), true); 500 CheckPermissionMessageSentForTab(1, 0, true);
514 EXPECT_TRUE(closed_delegate_tracker_.Contains(removed_infobar)); 501 EXPECT_TRUE(closed_delegate_tracker_.Contains(removed_infobar));
515 closed_delegate_tracker_.Clear(); 502 closed_delegate_tracker_.Clear();
516 // Destroy the infobar that has just been removed. 503 // Destroy the infobar that has just been removed.
517 removed_infobar->InfoBarClosed(); 504 removed_infobar->InfoBarClosed();
518 505
519 // But the other tab should still have the info bar... 506 // But the other tab should still have the info bar...
520 ASSERT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount()); 507 ASSERT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount());
521 ConfirmInfoBarDelegate* infobar_1 = infobar_tab_helper_for_tab(0)-> 508 ConfirmInfoBarDelegate* infobar_1 = infobar_tab_helper_for_tab(0)->
522 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 509 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
523 infobar_1->Cancel(); 510 infobar_1->Cancel();
524 infobar_tab_helper_for_tab(0)->RemoveInfoBar(infobar_1); 511 infobar_tab_helper_for_tab(0)->RemoveInfoBar(infobar_1);
525 EXPECT_EQ(1U, closed_delegate_tracker_.size()); 512 EXPECT_EQ(1U, closed_delegate_tracker_.size());
526 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); 513 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1));
527 infobar_1->InfoBarClosed(); 514 infobar_1->InfoBarClosed();
528 } 515 }
529 516
530 TEST_F(GeolocationPermissionContextTests, QueuedOriginMultipleTabs) { 517 TEST_F(GeolocationPermissionContextTests, QueuedOriginMultipleTabs) {
531 GURL url_a("http://www.example.com/geolocation"); 518 GURL url_a("http://www.example.com/geolocation");
532 GURL url_b("http://www.example-2.com/geolocation"); 519 GURL url_b("http://www.example-2.com/geolocation");
533 NavigateAndCommit(url_a); 520 NavigateAndCommit(url_a);
534 AddNewTab(url_a); 521 AddNewTab(url_a);
535 522
536 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 523 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
537 RequestGeolocationPermission( 524 RequestGeolocationPermission(RequestID(0), url_a);
538 process_id(), render_id(), bridge_id(), url_a);
539 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); 525 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount());
540 526
541 RequestGeolocationPermission( 527 RequestGeolocationPermission(RequestIDForTab(0, 0), url_a);
542 process_id_for_tab(0), render_id_for_tab(0), bridge_id(), url_a);
543 EXPECT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount()); 528 EXPECT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount());
544 529
545 RequestGeolocationPermission( 530 RequestGeolocationPermission(RequestIDForTab(0, 1), url_b);
546 process_id_for_tab(0), render_id_for_tab(0), bridge_id() + 1, url_b);
547 ASSERT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount()); 531 ASSERT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount());
548 532
549 ConfirmInfoBarDelegate* removed_infobar = 533 ConfirmInfoBarDelegate* removed_infobar =
550 infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 534 infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
551 535
552 // Accept the second tab. 536 // Accept the second tab.
553 ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper_for_tab(0)-> 537 ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper_for_tab(0)->
554 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 538 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
555 ASSERT_TRUE(infobar_0); 539 ASSERT_TRUE(infobar_0);
556 infobar_0->Accept(); 540 infobar_0->Accept();
557 CheckPermissionMessageSentForTab(0, bridge_id(), true); 541 CheckPermissionMessageSentForTab(0, 0, true);
558 infobar_tab_helper_for_tab(0)->RemoveInfoBar(infobar_0); 542 infobar_tab_helper_for_tab(0)->RemoveInfoBar(infobar_0);
559 EXPECT_EQ(2U, closed_delegate_tracker_.size()); 543 EXPECT_EQ(2U, closed_delegate_tracker_.size());
560 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); 544 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0));
561 infobar_0->InfoBarClosed(); 545 infobar_0->InfoBarClosed();
562 // Now the infobar for the tab with the same origin should have gone. 546 // Now the infobar for the tab with the same origin should have gone.
563 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 547 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
564 CheckPermissionMessageSent(bridge_id(), true); 548 CheckPermissionMessageSent(0, true);
565 EXPECT_TRUE(closed_delegate_tracker_.Contains(removed_infobar)); 549 EXPECT_TRUE(closed_delegate_tracker_.Contains(removed_infobar));
566 closed_delegate_tracker_.Clear(); 550 closed_delegate_tracker_.Clear();
567 // Destroy the infobar that has just been removed. 551 // Destroy the infobar that has just been removed.
568 removed_infobar->InfoBarClosed(); 552 removed_infobar->InfoBarClosed();
569 553
570 // And we should have the queued infobar displayed now. 554 // And we should have the queued infobar displayed now.
571 ASSERT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount()); 555 ASSERT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount());
572 556
573 // Accept the second infobar. 557 // Accept the second infobar.
574 ConfirmInfoBarDelegate* infobar_1 = infobar_tab_helper_for_tab(0)-> 558 ConfirmInfoBarDelegate* infobar_1 = infobar_tab_helper_for_tab(0)->
575 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 559 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
576 ASSERT_TRUE(infobar_1); 560 ASSERT_TRUE(infobar_1);
577 infobar_1->Accept(); 561 infobar_1->Accept();
578 CheckPermissionMessageSentForTab(0, bridge_id() + 1, true); 562 CheckPermissionMessageSentForTab(0, 1, true);
579 infobar_tab_helper_for_tab(0)->RemoveInfoBar(infobar_1); 563 infobar_tab_helper_for_tab(0)->RemoveInfoBar(infobar_1);
580 EXPECT_EQ(1U, closed_delegate_tracker_.size()); 564 EXPECT_EQ(1U, closed_delegate_tracker_.size());
581 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); 565 EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1));
582 infobar_1->InfoBarClosed(); 566 infobar_1->InfoBarClosed();
583 } 567 }
584 568
585 TEST_F(GeolocationPermissionContextTests, TabDestroyed) { 569 TEST_F(GeolocationPermissionContextTests, TabDestroyed) {
586 GURL requesting_frame_0("http://www.example.com/geolocation"); 570 GURL requesting_frame_0("http://www.example.com/geolocation");
587 GURL requesting_frame_1("http://www.example-2.com/geolocation"); 571 GURL requesting_frame_1("http://www.example-2.com/geolocation");
588 EXPECT_EQ( 572 EXPECT_EQ(
589 CONTENT_SETTING_ASK, 573 CONTENT_SETTING_ASK,
590 profile()->GetHostContentSettingsMap()->GetContentSetting( 574 profile()->GetHostContentSettingsMap()->GetContentSetting(
591 requesting_frame_0, 575 requesting_frame_0,
592 requesting_frame_0, 576 requesting_frame_0,
593 CONTENT_SETTINGS_TYPE_GEOLOCATION, 577 CONTENT_SETTINGS_TYPE_GEOLOCATION,
594 std::string())); 578 std::string()));
595 579
596 EXPECT_EQ( 580 EXPECT_EQ(
597 CONTENT_SETTING_ASK, 581 CONTENT_SETTING_ASK,
598 profile()->GetHostContentSettingsMap()->GetContentSetting( 582 profile()->GetHostContentSettingsMap()->GetContentSetting(
599 requesting_frame_1, 583 requesting_frame_1,
600 requesting_frame_0, 584 requesting_frame_0,
601 CONTENT_SETTINGS_TYPE_GEOLOCATION, 585 CONTENT_SETTINGS_TYPE_GEOLOCATION,
602 std::string())); 586 std::string()));
603 587
604 NavigateAndCommit(requesting_frame_0); 588 NavigateAndCommit(requesting_frame_0);
605 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 589 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
606 // Request permission for two frames. 590 // Request permission for two frames.
607 RequestGeolocationPermission( 591 RequestGeolocationPermission(RequestID(0), requesting_frame_0);
608 process_id(), render_id(), bridge_id(), requesting_frame_0); 592 RequestGeolocationPermission(RequestID(1), requesting_frame_1);
609 RequestGeolocationPermission(
610 process_id(), render_id(), bridge_id() + 1, requesting_frame_1);
611 // Ensure only one infobar is created. 593 // Ensure only one infobar is created.
612 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); 594 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount());
613 ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> 595 ConfirmInfoBarDelegate* infobar_0 =
614 GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); 596 infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
615 ASSERT_TRUE(infobar_0); 597 ASSERT_TRUE(infobar_0);
616 598
617 // Delete the tab contents. 599 // Delete the tab contents.
618 DeleteContents(); 600 DeleteContents();
619 infobar_0->InfoBarClosed(); 601 infobar_0->InfoBarClosed();
620 602
621 // During contents destruction, the infobar will have been closed, and a 603 // During contents destruction, the infobar will have been closed, and a
622 // second (with it's own new delegate) will have been created. In Chromium, 604 // second (with it's own new delegate) will have been created. In Chromium,
623 // this would be properly deleted by the InfoBarContainer, but in this unit 605 // this would be properly deleted by the InfoBarContainer, but in this unit
624 // test, the closest thing we have to that is the ClosedDelegateTracker. 606 // test, the closest thing we have to that is the ClosedDelegateTracker.
625 ASSERT_EQ(2U, closed_delegate_tracker_.size()); 607 ASSERT_EQ(2U, closed_delegate_tracker_.size());
626 ASSERT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); 608 ASSERT_TRUE(closed_delegate_tracker_.Contains(infobar_0));
627 closed_delegate_tracker_.removed_infobar_delegates_.erase(infobar_0); 609 closed_delegate_tracker_.removed_infobar_delegates_.erase(infobar_0);
628 (*closed_delegate_tracker_.removed_infobar_delegates_.begin())-> 610 (*closed_delegate_tracker_.removed_infobar_delegates_.begin())->
629 InfoBarClosed(); 611 InfoBarClosed();
630 } 612 }
631 613
632 TEST_F(GeolocationPermissionContextTests, InfoBarUsesCommittedEntry) { 614 TEST_F(GeolocationPermissionContextTests, InfoBarUsesCommittedEntry) {
633 GURL requesting_frame_0("http://www.example.com/geolocation"); 615 GURL requesting_frame_0("http://www.example.com/geolocation");
634 GURL requesting_frame_1("http://www.example-2.com/geolocation"); 616 GURL requesting_frame_1("http://www.example-2.com/geolocation");
635 NavigateAndCommit(requesting_frame_0); 617 NavigateAndCommit(requesting_frame_0);
636 NavigateAndCommit(requesting_frame_1); 618 NavigateAndCommit(requesting_frame_1);
637 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); 619 EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount());
638 // Go back: navigate to a pending entry before requesting geolocation 620 // Go back: navigate to a pending entry before requesting geolocation
639 // permission. 621 // permission.
640 web_contents()->GetController().GoBack(); 622 web_contents()->GetController().GoBack();
641 // Request permission for the committed frame (not the pending one). 623 // Request permission for the committed frame (not the pending one).
642 RequestGeolocationPermission( 624 RequestGeolocationPermission(RequestID(0), requesting_frame_1);
643 process_id(), render_id(), bridge_id(), requesting_frame_1);
644 // Ensure the infobar is created. 625 // Ensure the infobar is created.
645 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); 626 ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount());
646 InfoBarDelegate* infobar_0 = infobar_tab_helper()->GetInfoBarDelegateAt(0); 627 InfoBarDelegate* infobar_0 = infobar_tab_helper()->GetInfoBarDelegateAt(0);
647 ASSERT_TRUE(infobar_0); 628 ASSERT_TRUE(infobar_0);
648 // Ensure the infobar is not yet expired. 629 // Ensure the infobar is not yet expired.
649 content::LoadCommittedDetails details; 630 content::LoadCommittedDetails details;
650 details.entry = web_contents()->GetController().GetLastCommittedEntry(); 631 details.entry = web_contents()->GetController().GetLastCommittedEntry();
651 ASSERT_FALSE(infobar_0->ShouldExpire(details)); 632 ASSERT_FALSE(infobar_0->ShouldExpire(details));
652 // Commit the "GoBack()" above, and ensure the infobar is now expired. 633 // Commit the "GoBack()" above, and ensure the infobar is now expired.
653 WebContentsTester::For(web_contents())->CommitPendingNavigation(); 634 WebContentsTester::For(web_contents())->CommitPendingNavigation();
654 details.entry = web_contents()->GetController().GetLastCommittedEntry(); 635 details.entry = web_contents()->GetController().GetLastCommittedEntry();
655 ASSERT_TRUE(infobar_0->ShouldExpire(details)); 636 ASSERT_TRUE(infobar_0->ShouldExpire(details));
656 637
657 // Delete the tab contents. 638 // Delete the tab contents.
658 DeleteContents(); 639 DeleteContents();
659 infobar_0->InfoBarClosed(); 640 infobar_0->InfoBarClosed();
660 } 641 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698