Index: chrome/browser/geolocation/chrome_geolocation_permission_context_unittest.cc |
=================================================================== |
--- chrome/browser/geolocation/chrome_geolocation_permission_context_unittest.cc (revision 163741) |
+++ chrome/browser/geolocation/chrome_geolocation_permission_context_unittest.cc (working copy) |
@@ -15,6 +15,7 @@ |
#include "chrome/browser/content_settings/tab_specific_content_settings.h" |
#include "chrome/browser/geolocation/chrome_geolocation_permission_context.h" |
#include "chrome/browser/geolocation/chrome_geolocation_permission_context_factory.h" |
+#include "chrome/browser/geolocation/geolocation_permission_request_id.h" |
#include "chrome/browser/infobars/infobar.h" |
#include "chrome/browser/infobars/infobar_tab_helper.h" |
#include "chrome/browser/view_type_utils.h" |
@@ -36,12 +37,9 @@ |
#include "chrome/common/pref_names.h" |
#endif |
-using content::BrowserThread; |
using content::MockRenderProcessHost; |
-using content::RenderViewHostTester; |
-using content::WebContents; |
-using content::WebContentsTester; |
+ |
// ClosedDelegateTracker ------------------------------------------------------ |
// We need to track which infobars were closed. |
@@ -93,6 +91,7 @@ |
removed_infobar_delegates_.clear(); |
} |
+ |
// GeolocationPermissionContextTests ------------------------------------------ |
// This class sets up GeolocationArbitrator. |
@@ -104,19 +103,8 @@ |
protected: |
virtual ~GeolocationPermissionContextTests(); |
- int process_id() { |
- return web_contents()->GetRenderProcessHost()->GetID(); |
- } |
- int process_id_for_tab(int tab) { |
- return extra_tabs_[tab]->GetRenderProcessHost()->GetID(); |
- } |
- int render_id() { |
- return web_contents()->GetRenderViewHost()->GetRoutingID(); |
- } |
- int render_id_for_tab(int tab) { |
- return extra_tabs_[tab]->GetRenderViewHost()->GetRoutingID(); |
- } |
- int bridge_id() const { return 42; } // Not relevant at this level. |
+ GeolocationPermissionRequestID RequestID(int bridge_id); |
+ GeolocationPermissionRequestID RequestIDForTab(int tab, int bridge_id); |
InfoBarTabHelper* infobar_tab_helper() { |
return InfoBarTabHelper::FromWebContents(web_contents()); |
} |
@@ -124,13 +112,12 @@ |
return InfoBarTabHelper::FromWebContents(extra_tabs_[tab]); |
} |
- void RequestGeolocationPermission(int render_process_id, |
- int render_view_id, |
- int bridge_id, |
+ void RequestGeolocationPermission(const GeolocationPermissionRequestID& id, |
const GURL& requesting_frame); |
- void PermissionResponse(int render_process_id, |
- int render_view_id, |
- int bridge_id, |
+ void CancelGeolocationPermissionRequest( |
+ const GeolocationPermissionRequestID& id, |
+ const GURL& requesting_frame); |
+ void PermissionResponse(const GeolocationPermissionRequestID& id, |
bool allowed); |
void CheckPermissionMessageSent(int bridge_id, bool allowed); |
void CheckPermissionMessageSentForTab(int tab, int bridge_id, bool allowed); |
@@ -144,7 +131,7 @@ |
scoped_refptr<ChromeGeolocationPermissionContext> |
geolocation_permission_context_; |
ClosedDelegateTracker closed_delegate_tracker_; |
- ScopedVector<WebContents> extra_tabs_; |
+ ScopedVector<content::WebContents> extra_tabs_; |
private: |
// ChromeRenderViewHostTestHarness: |
@@ -161,33 +148,51 @@ |
GeolocationPermissionContextTests::GeolocationPermissionContextTests() |
: ChromeRenderViewHostTestHarness(), |
- ui_thread_(BrowserThread::UI, MessageLoop::current()), |
- db_thread_(BrowserThread::DB) { |
+ ui_thread_(content::BrowserThread::UI, MessageLoop::current()), |
+ db_thread_(content::BrowserThread::DB) { |
} |
GeolocationPermissionContextTests::~GeolocationPermissionContextTests() { |
} |
+GeolocationPermissionRequestID GeolocationPermissionContextTests::RequestID( |
+ int bridge_id) { |
+ return GeolocationPermissionRequestID( |
+ web_contents()->GetRenderProcessHost()->GetID(), |
+ web_contents()->GetRenderViewHost()->GetRoutingID(), |
+ bridge_id); |
+} |
+ |
+GeolocationPermissionRequestID |
+ GeolocationPermissionContextTests::RequestIDForTab(int tab, int bridge_id) { |
+ return GeolocationPermissionRequestID( |
+ extra_tabs_[tab]->GetRenderProcessHost()->GetID(), |
+ extra_tabs_[tab]->GetRenderViewHost()->GetRoutingID(), |
+ bridge_id); |
+} |
+ |
void GeolocationPermissionContextTests::RequestGeolocationPermission( |
- int render_process_id, |
- int render_view_id, |
- int bridge_id, |
+ const GeolocationPermissionRequestID& id, |
const GURL& requesting_frame) { |
geolocation_permission_context_->RequestGeolocationPermission( |
- render_process_id, render_view_id, bridge_id, requesting_frame, |
+ id.render_process_id(), id.render_view_id(), id.bridge_id(), |
+ requesting_frame, |
base::Bind(&GeolocationPermissionContextTests::PermissionResponse, |
- base::Unretained(this), |
- render_process_id, |
- render_view_id, |
- bridge_id)); |
+ base::Unretained(this), id)); |
} |
+void GeolocationPermissionContextTests::CancelGeolocationPermissionRequest( |
+ const GeolocationPermissionRequestID& id, |
+ const GURL& requesting_frame) { |
+ geolocation_permission_context_->CancelGeolocationPermissionRequest( |
+ id.render_process_id(), id.render_view_id(), id.bridge_id(), |
+ requesting_frame); |
+} |
+ |
void GeolocationPermissionContextTests::PermissionResponse( |
- int render_process_id, |
- int render_view_id, |
- int bridge_id, |
+ const GeolocationPermissionRequestID& id, |
bool allowed) { |
- responses_[render_process_id] = std::make_pair(bridge_id, allowed); |
+ responses_[id.render_process_id()] = std::make_pair(id.bridge_id(), allowed); |
} |
void GeolocationPermissionContextTests::CheckPermissionMessageSent( |
@@ -216,11 +221,11 @@ |
} |
void GeolocationPermissionContextTests::AddNewTab(const GURL& url) { |
- WebContents* new_tab = |
- WebContents::Create(profile(), NULL, MSG_ROUTING_NONE, NULL); |
+ content::WebContents* new_tab = |
+ content::WebContents::Create(profile(), NULL, MSG_ROUTING_NONE, NULL); |
new_tab->GetController().LoadURL( |
url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- RenderViewHostTester::For(new_tab->GetRenderViewHost())-> |
+ content::RenderViewHostTester::For(new_tab->GetRenderViewHost())-> |
SendNavigate(extra_tabs_.size() + 1, url); |
// Set up required helpers, and make this be as "tabby" as the code requires. |
@@ -265,7 +270,8 @@ |
// Schedule another task on the DB thread to notify us that it's safe to |
// carry on with the test. |
base::WaitableEvent done(false, false); |
- BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::DB, FROM_HERE, |
base::Bind(&base::WaitableEvent::Signal, base::Unretained(&done))); |
done.Wait(); |
db_thread_.Stop(); |
@@ -278,11 +284,10 @@ |
GURL requesting_frame("http://www.example.com/geolocation"); |
NavigateAndCommit(requesting_frame); |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id(), requesting_frame); |
+ RequestGeolocationPermission(RequestID(0), requesting_frame); |
ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); |
- ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> |
- GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
+ ConfirmInfoBarDelegate* infobar_0 = |
+ infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
infobar_0->Cancel(); |
infobar_tab_helper()->RemoveInfoBar(infobar_0); |
EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
@@ -302,17 +307,15 @@ |
NavigateAndCommit(requesting_frame); |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
profile()->GetPrefs()->SetBoolean(prefs::kGeolocationEnabled, false); |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id(), requesting_frame); |
+ RequestGeolocationPermission(RequestID(0), requesting_frame); |
ASSERT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
- CheckPermissionMessageSent(bridge_id(), false); |
+ CheckPermissionMessageSent(0, false); |
// Reenable the preference and check that the request now goes though. |
profile()->GetPrefs()->SetBoolean(prefs::kGeolocationEnabled, true); |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id() + 1, requesting_frame); |
+ RequestGeolocationPermission(RequestID(1), requesting_frame); |
ASSERT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
- CheckPermissionMessageSent(bridge_id() + 1, true); |
+ CheckPermissionMessageSent(1, true); |
} |
#endif |
@@ -336,21 +339,19 @@ |
NavigateAndCommit(requesting_frame_0); |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
// Request permission for two frames. |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id(), requesting_frame_0); |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id() + 1, requesting_frame_1); |
+ RequestGeolocationPermission(RequestID(0), requesting_frame_0); |
+ RequestGeolocationPermission(RequestID(1), requesting_frame_1); |
// Ensure only one infobar is created. |
ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); |
- ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> |
- GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
+ ConfirmInfoBarDelegate* infobar_0 = |
+ infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
ASSERT_TRUE(infobar_0); |
string16 text_0 = infobar_0->GetMessageText(); |
// Accept the first frame. |
infobar_0->Accept(); |
CheckTabContentsState(requesting_frame_0, CONTENT_SETTING_ALLOW); |
- CheckPermissionMessageSent(bridge_id(), true); |
+ CheckPermissionMessageSent(0, true); |
infobar_tab_helper()->RemoveInfoBar(infobar_0); |
EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
@@ -360,8 +361,8 @@ |
// Now we should have a new infobar for the second frame. |
ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); |
- ConfirmInfoBarDelegate* infobar_1 = infobar_tab_helper()-> |
- GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
+ ConfirmInfoBarDelegate* infobar_1 = |
+ infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
ASSERT_TRUE(infobar_1); |
string16 text_1 = infobar_1->GetMessageText(); |
EXPECT_NE(text_0, text_1); |
@@ -369,7 +370,7 @@ |
// Cancel (block) this frame. |
infobar_1->Cancel(); |
CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_BLOCK); |
- CheckPermissionMessageSent(bridge_id() + 1, false); |
+ CheckPermissionMessageSent(1, false); |
infobar_tab_helper()->RemoveInfoBar(infobar_1); |
EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); |
@@ -412,29 +413,26 @@ |
NavigateAndCommit(requesting_frame_0); |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
// Request permission for two frames. |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id(), requesting_frame_0); |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id() + 1, requesting_frame_1); |
+ RequestGeolocationPermission(RequestID(0), requesting_frame_0); |
+ RequestGeolocationPermission(RequestID(1), requesting_frame_1); |
ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); |
- ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> |
- GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
+ ConfirmInfoBarDelegate* infobar_0 = |
+ infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
ASSERT_TRUE(infobar_0); |
string16 text_0 = infobar_0->GetMessageText(); |
// Simulate the frame going away, ensure the infobar for this frame |
// is removed and the next pending infobar is created. |
- geolocation_permission_context_->CancelGeolocationPermissionRequest( |
- process_id(), render_id(), bridge_id(), requesting_frame_0); |
+ CancelGeolocationPermissionRequest(RequestID(0), requesting_frame_0); |
EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); |
closed_delegate_tracker_.Clear(); |
infobar_0->InfoBarClosed(); |
ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); |
- ConfirmInfoBarDelegate* infobar_1 = infobar_tab_helper()-> |
- GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
+ ConfirmInfoBarDelegate* infobar_1 = |
+ infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
ASSERT_TRUE(infobar_1); |
string16 text_1 = infobar_1->GetMessageText(); |
EXPECT_NE(text_0, text_1); |
@@ -442,7 +440,7 @@ |
// Allow this frame. |
infobar_1->Accept(); |
CheckTabContentsState(requesting_frame_1, CONTENT_SETTING_ALLOW); |
- CheckPermissionMessageSent(bridge_id() + 1, true); |
+ CheckPermissionMessageSent(1, true); |
infobar_tab_helper()->RemoveInfoBar(infobar_1); |
EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); |
@@ -469,10 +467,9 @@ |
GURL requesting_frame; |
NavigateAndCommit(invalid_embedder); |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id(), requesting_frame); |
+ RequestGeolocationPermission(RequestID(0), requesting_frame); |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
- CheckPermissionMessageSent(bridge_id(), false); |
+ CheckPermissionMessageSent(0, false); |
} |
TEST_F(GeolocationPermissionContextTests, SameOriginMultipleTabs) { |
@@ -483,34 +480,31 @@ |
AddNewTab(url_a); |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id(), url_a); |
+ RequestGeolocationPermission(RequestID(0), url_a); |
ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); |
- RequestGeolocationPermission( |
- process_id_for_tab(0), render_id_for_tab(0), bridge_id(), url_b); |
+ RequestGeolocationPermission(RequestIDForTab(0, 0), url_b); |
EXPECT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount()); |
- RequestGeolocationPermission( |
- process_id_for_tab(1), render_id_for_tab(1), bridge_id(), url_a); |
+ RequestGeolocationPermission(RequestIDForTab(1, 0), url_a); |
ASSERT_EQ(1U, infobar_tab_helper_for_tab(1)->GetInfoBarCount()); |
ConfirmInfoBarDelegate* removed_infobar = infobar_tab_helper_for_tab(1)-> |
GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
// Accept the first tab. |
- ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> |
- GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
+ ConfirmInfoBarDelegate* infobar_0 = |
+ infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
ASSERT_TRUE(infobar_0); |
infobar_0->Accept(); |
- CheckPermissionMessageSent(bridge_id(), true); |
+ CheckPermissionMessageSent(0, true); |
infobar_tab_helper()->RemoveInfoBar(infobar_0); |
EXPECT_EQ(2U, closed_delegate_tracker_.size()); |
EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); |
infobar_0->InfoBarClosed(); |
// Now the infobar for the tab with the same origin should have gone. |
EXPECT_EQ(0U, infobar_tab_helper_for_tab(1)->GetInfoBarCount()); |
- CheckPermissionMessageSentForTab(1, bridge_id(), true); |
+ CheckPermissionMessageSentForTab(1, 0, true); |
EXPECT_TRUE(closed_delegate_tracker_.Contains(removed_infobar)); |
closed_delegate_tracker_.Clear(); |
// Destroy the infobar that has just been removed. |
@@ -534,16 +528,13 @@ |
AddNewTab(url_a); |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id(), url_a); |
+ RequestGeolocationPermission(RequestID(0), url_a); |
ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); |
- RequestGeolocationPermission( |
- process_id_for_tab(0), render_id_for_tab(0), bridge_id(), url_a); |
+ RequestGeolocationPermission(RequestIDForTab(0, 0), url_a); |
EXPECT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount()); |
- RequestGeolocationPermission( |
- process_id_for_tab(0), render_id_for_tab(0), bridge_id() + 1, url_b); |
+ RequestGeolocationPermission(RequestIDForTab(0, 1), url_b); |
ASSERT_EQ(1U, infobar_tab_helper_for_tab(0)->GetInfoBarCount()); |
ConfirmInfoBarDelegate* removed_infobar = |
@@ -554,14 +545,14 @@ |
GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
ASSERT_TRUE(infobar_0); |
infobar_0->Accept(); |
- CheckPermissionMessageSentForTab(0, bridge_id(), true); |
+ CheckPermissionMessageSentForTab(0, 0, true); |
infobar_tab_helper_for_tab(0)->RemoveInfoBar(infobar_0); |
EXPECT_EQ(2U, closed_delegate_tracker_.size()); |
EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); |
infobar_0->InfoBarClosed(); |
// Now the infobar for the tab with the same origin should have gone. |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
- CheckPermissionMessageSent(bridge_id(), true); |
+ CheckPermissionMessageSent(0, true); |
EXPECT_TRUE(closed_delegate_tracker_.Contains(removed_infobar)); |
closed_delegate_tracker_.Clear(); |
// Destroy the infobar that has just been removed. |
@@ -575,7 +566,7 @@ |
GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
ASSERT_TRUE(infobar_1); |
infobar_1->Accept(); |
- CheckPermissionMessageSentForTab(0, bridge_id() + 1, true); |
+ CheckPermissionMessageSentForTab(0, 1, true); |
infobar_tab_helper_for_tab(0)->RemoveInfoBar(infobar_1); |
EXPECT_EQ(1U, closed_delegate_tracker_.size()); |
EXPECT_TRUE(closed_delegate_tracker_.Contains(infobar_1)); |
@@ -604,29 +595,22 @@ |
NavigateAndCommit(requesting_frame_0); |
EXPECT_EQ(0U, infobar_tab_helper()->GetInfoBarCount()); |
// Request permission for two frames. |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id(), requesting_frame_0); |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id() + 1, requesting_frame_1); |
+ RequestGeolocationPermission(RequestID(0), requesting_frame_0); |
+ RequestGeolocationPermission(RequestID(1), requesting_frame_1); |
// Ensure only one infobar is created. |
ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); |
- ConfirmInfoBarDelegate* infobar_0 = infobar_tab_helper()-> |
- GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
+ ConfirmInfoBarDelegate* infobar_0 = |
+ infobar_tab_helper()->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate(); |
ASSERT_TRUE(infobar_0); |
// Delete the tab contents. |
DeleteContents(); |
infobar_0->InfoBarClosed(); |
- // During contents destruction, the infobar will have been closed, and a |
- // second (with it's own new delegate) will have been created. In Chromium, |
- // this would be properly deleted by the InfoBarContainer, but in this unit |
- // test, the closest thing we have to that is the ClosedDelegateTracker. |
- ASSERT_EQ(2U, closed_delegate_tracker_.size()); |
+ // During contents destruction, the infobar will have been closed, and the |
+ // pending request should have been cleared without an infobar being created. |
+ ASSERT_EQ(1U, closed_delegate_tracker_.size()); |
ASSERT_TRUE(closed_delegate_tracker_.Contains(infobar_0)); |
- closed_delegate_tracker_.removed_infobar_delegates_.erase(infobar_0); |
- (*closed_delegate_tracker_.removed_infobar_delegates_.begin())-> |
- InfoBarClosed(); |
} |
TEST_F(GeolocationPermissionContextTests, InfoBarUsesCommittedEntry) { |
@@ -639,8 +623,7 @@ |
// permission. |
web_contents()->GetController().GoBack(); |
// Request permission for the committed frame (not the pending one). |
- RequestGeolocationPermission( |
- process_id(), render_id(), bridge_id(), requesting_frame_1); |
+ RequestGeolocationPermission(RequestID(0), requesting_frame_1); |
// Ensure the infobar is created. |
ASSERT_EQ(1U, infobar_tab_helper()->GetInfoBarCount()); |
InfoBarDelegate* infobar_0 = infobar_tab_helper()->GetInfoBarDelegateAt(0); |
@@ -650,7 +633,7 @@ |
details.entry = web_contents()->GetController().GetLastCommittedEntry(); |
ASSERT_FALSE(infobar_0->ShouldExpire(details)); |
// Commit the "GoBack()" above, and ensure the infobar is now expired. |
- WebContentsTester::For(web_contents())->CommitPendingNavigation(); |
+ content::WebContentsTester::For(web_contents())->CommitPendingNavigation(); |
details.entry = web_contents()->GetController().GetLastCommittedEntry(); |
ASSERT_TRUE(infobar_0->ShouldExpire(details)); |