Index: chrome/browser/android/foreign_session_helper.cc |
diff --git a/chrome/browser/android/foreign_session_helper.cc b/chrome/browser/android/foreign_session_helper.cc |
index 0c8f0d9483bea7f5ebb0d7883c6d2540de1cc761..fa7ff24901b014aed880ac2357b326486a553b52 100644 |
--- a/chrome/browser/android/foreign_session_helper.cc |
+++ b/chrome/browser/android/foreign_session_helper.cc |
@@ -43,47 +43,84 @@ SessionModelAssociator* GetSessionModelAssociator(Profile* profile) { |
return service->GetSessionModelAssociator(); |
} |
+bool ShouldSkipTab(const SessionTab& tab) { |
+ if (tab.navigations.empty()) |
+ return true; |
+ |
+ int selected_index = tab.current_navigation_index; |
+ if (selected_index < 0 || |
+ selected_index >= static_cast<int>(tab.navigations.size())) |
+ return true; |
+ |
+ return false; |
+} |
+ |
+bool ShouldSkipWindow(const SessionWindow& window) { |
+ for (std::vector<SessionTab*>::const_iterator tab_it = window.tabs.begin(); |
+ tab_it != window.tabs.end(); ++tab_it) { |
+ const SessionTab &tab = **tab_it; |
+ if (!ShouldSkipTab(tab)) |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+bool ShouldSkipSession(const browser_sync::SyncedSession& session) { |
+ for (SyncedSession::SyncedWindowMap::const_iterator it = |
+ session.windows.begin(); it != session.windows.end(); ++it) { |
+ const SessionWindow &window = *(it->second); |
+ if (!ShouldSkipWindow(window)) |
+ return false; |
+ } |
+ return true; |
+} |
+ |
void CopyTabsToJava( |
JNIEnv* env, |
- const SessionWindow* window, |
+ const SessionWindow& window, |
ScopedJavaLocalRef<jobject>& j_window) { |
- for (std::vector<SessionTab*>::const_iterator tab_it = window->tabs.begin(); |
- tab_it != window->tabs.end(); ++tab_it) { |
+ for (std::vector<SessionTab*>::const_iterator tab_it = window.tabs.begin(); |
+ tab_it != window.tabs.end(); ++tab_it) { |
const SessionTab &tab = **tab_it; |
- if (tab.navigations.empty()) |
+ if (ShouldSkipTab(tab)) |
continue; |
+ int selected_index = tab.current_navigation_index; |
+ DCHECK(selected_index >= 0); |
+ DCHECK(selected_index < static_cast<int>(tab.navigations.size())); |
+ |
const ::sessions::SerializedNavigationEntry& current_navigation = |
- tab.navigations.at(tab.current_navigation_index); |
+ tab.navigations.at(selected_index); |
GURL tab_url = current_navigation.virtual_url(); |
- if (tab_url.SchemeIs(chrome::kChromeNativeScheme) || |
- (tab_url.SchemeIs(chrome::kChromeUIScheme) && |
- tab_url.host() == chrome::kChromeUINewTabHost)) |
- continue; |
Java_ForeignSessionHelper_pushTab( |
env, j_window.obj(), |
ConvertUTF8ToJavaString(env, tab_url.spec()).Release(), |
ConvertUTF16ToJavaString(env, current_navigation.title()).Release(), |
- tab.timestamp.ToInternalValue(), tab.tab_id.id()); |
+ tab.timestamp.ToJavaTime(), |
+ tab.tab_id.id()); |
} |
} |
void CopyWindowsToJava( |
JNIEnv* env, |
- const SyncedSession* session, |
+ const SyncedSession& session, |
ScopedJavaLocalRef<jobject>& j_session) { |
for (SyncedSession::SyncedWindowMap::const_iterator it = |
- session->windows.begin(); it != session->windows.end(); ++it) { |
- const SessionWindow* window = it->second; |
+ session.windows.begin(); it != session.windows.end(); ++it) { |
+ const SessionWindow &window = *(it->second); |
+ |
+ if (ShouldSkipWindow(window)) |
+ continue; |
ScopedJavaLocalRef<jobject> last_pushed_window; |
last_pushed_window.Reset( |
Java_ForeignSessionHelper_pushWindow( |
- env, j_session.obj(), window->timestamp.ToInternalValue(), |
- window->window_id.id())); |
+ env, j_session.obj(), |
+ window.timestamp.ToJavaTime(), |
+ window.window_id.id())); |
CopyTabsToJava(env, window, last_pushed_window); |
} |
@@ -101,7 +138,6 @@ ForeignSessionHelper::ForeignSessionHelper(Profile* profile) |
: profile_(profile) { |
ProfileSyncService* service = ProfileSyncServiceFactory::GetInstance()-> |
GetForProfile(profile); |
- |
registrar_.Add(this, chrome::NOTIFICATION_SYNC_CONFIGURE_DONE, |
content::Source<ProfileSyncService>(service)); |
registrar_.Add(this, chrome::NOTIFICATION_FOREIGN_SESSION_UPDATED, |
@@ -178,22 +214,23 @@ jboolean ForeignSessionHelper::GetForeignSessions(JNIEnv* env, |
// Note: we don't own the SyncedSessions themselves. |
for (size_t i = 0; i < sessions.size(); ++i) { |
- const browser_sync::SyncedSession* session = sessions[i]; |
+ const browser_sync::SyncedSession &session = *(sessions[i]); |
+ if (ShouldSkipSession(session)) |
+ continue; |
- const bool is_collapsed = collapsed_sessions->HasKey(session->session_tag); |
+ const bool is_collapsed = collapsed_sessions->HasKey(session.session_tag); |
if (is_collapsed) |
- pref_collapsed_sessions->SetBoolean(session->session_tag, true); |
+ pref_collapsed_sessions->SetBoolean(session.session_tag, true); |
last_pushed_session.Reset( |
Java_ForeignSessionHelper_pushSession( |
env, |
result, |
- ConvertUTF8ToJavaString(env, session->session_tag).Release(), |
- ConvertUTF8ToJavaString(env, session->session_name).Release(), |
- ConvertUTF8ToJavaString(env, |
- session->DeviceTypeAsString()).Release(), |
- session->modified_time.ToInternalValue())); |
+ ConvertUTF8ToJavaString(env, session.session_tag).Release(), |
+ ConvertUTF8ToJavaString(env, session.session_name).Release(), |
+ session.device_type, |
+ session.modified_time.ToJavaTime())); |
CopyWindowsToJava(env, session, last_pushed_session); |
} |
@@ -257,6 +294,14 @@ void ForeignSessionHelper::SetForeignSessionCollapsed(JNIEnv* env, jobject obj, |
update.Get()->Remove(ConvertJavaStringToUTF8(env, session_tag), NULL); |
} |
+jboolean ForeignSessionHelper::GetForeignSessionCollapsed(JNIEnv* env, |
+ jobject obj, |
+ jstring session_tag) { |
+ const DictionaryValue* dict = profile_->GetPrefs()->GetDictionary( |
+ prefs::kNtpCollapsedForeignSessions); |
+ return dict && dict->HasKey(ConvertJavaStringToUTF8(env, session_tag)); |
+} |
+ |
void ForeignSessionHelper::DeleteForeignSession(JNIEnv* env, jobject obj, |
jstring session_tag) { |
SessionModelAssociator* associator = GetSessionModelAssociator(profile_); |