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

Unified Diff: chrome/browser/android/foreign_session_helper.cc

Issue 36473002: Foreign session pages now load into current tab. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: sky Created 7 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 side-by-side diff with in-line comments
Download patch
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 971a49b038dae2cec3e92f8e5750965679c84fed..58a46759c461a3bd14e4c85c498af3c61311e520 100644
--- a/chrome/browser/android/foreign_session_helper.cc
+++ b/chrome/browser/android/foreign_session_helper.cc
@@ -7,9 +7,12 @@
#include <jni.h>
#include "base/android/jni_string.h"
+#include "base/prefs/pref_service.h"
#include "base/prefs/scoped_user_pref_update.h"
+#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile_android.h"
+#include "chrome/browser/sessions/session_restore.h"
#include "chrome/browser/sync/glue/session_model_associator.h"
#include "chrome/browser/sync/profile_sync_service.h"
#include "chrome/browser/sync/profile_sync_service_factory.h"
@@ -43,17 +46,17 @@ SessionModelAssociator* GetSessionModelAssociator(Profile* profile) {
return service->GetSessionModelAssociator();
}
-bool ShouldSkipTab(const SessionTab& tab) {
- if (tab.navigations.empty())
+bool ShouldSkipTab(const SessionTab& session_tab) {
+ if (session_tab.navigations.empty())
return true;
- int selected_index = tab.current_navigation_index;
+ int selected_index = session_tab.current_navigation_index;
if (selected_index < 0 ||
- selected_index >= static_cast<int>(tab.navigations.size()))
+ selected_index >= static_cast<int>(session_tab.navigations.size()))
return true;
const ::sessions::SerializedNavigationEntry& current_navigation =
- tab.navigations.at(selected_index);
+ session_tab.navigations.at(selected_index);
if (current_navigation.virtual_url().is_empty())
return true;
@@ -64,8 +67,8 @@ bool ShouldSkipTab(const SessionTab& tab) {
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))
+ const SessionTab &session_tab = **tab_it;
+ if (!ShouldSkipTab(session_tab))
return false;
}
return true;
@@ -87,17 +90,17 @@ void CopyTabsToJava(
ScopedJavaLocalRef<jobject>& j_window) {
for (std::vector<SessionTab*>::const_iterator tab_it = window.tabs.begin();
tab_it != window.tabs.end(); ++tab_it) {
- const SessionTab &tab = **tab_it;
+ const SessionTab &session_tab = **tab_it;
- if (ShouldSkipTab(tab))
+ if (ShouldSkipTab(session_tab))
continue;
- int selected_index = tab.current_navigation_index;
+ int selected_index = session_tab.current_navigation_index;
DCHECK(selected_index >= 0);
- DCHECK(selected_index < static_cast<int>(tab.navigations.size()));
+ DCHECK(selected_index < static_cast<int>(session_tab.navigations.size()));
const ::sessions::SerializedNavigationEntry& current_navigation =
- tab.navigations.at(selected_index);
+ session_tab.navigations.at(selected_index);
GURL tab_url = current_navigation.virtual_url();
@@ -105,8 +108,8 @@ void CopyTabsToJava(
env, j_window.obj(),
ConvertUTF8ToJavaString(env, tab_url.spec()).Release(),
ConvertUTF16ToJavaString(env, current_navigation.title()).Release(),
- tab.timestamp.ToJavaTime(),
- tab.tab_id.id());
+ session_tab.timestamp.ToJavaTime(),
+ session_tab.tab_id.id());
}
}
@@ -244,25 +247,27 @@ jboolean ForeignSessionHelper::GetForeignSessions(JNIEnv* env,
return true;
}
-jboolean ForeignSessionHelper::OpenForeignSessionTab(JNIEnv* env,
- jobject obj,
- jstring session_tag,
- jint tab_id) {
+// TODO(apiccion): Remvoe this method once downstream CL Lands.
+// See: http://crbug.com/257102
+jboolean ForeignSessionHelper::OpenForeignSessionTabOld(JNIEnv* env,
+ jobject obj,
+ jstring session_tag,
+ jint session_tab_id) {
SessionModelAssociator* associator = GetSessionModelAssociator(profile_);
if (!associator) {
LOG(ERROR) << "Null SessionModelAssociator returned.";
return false;
}
- const SessionTab* tab;
+ const SessionTab* session_tab;
if (!associator->GetForeignTab(ConvertJavaStringToUTF8(env, session_tag),
- tab_id, &tab)) {
+ session_tab_id, &session_tab)) {
LOG(ERROR) << "Failed to load foreign tab.";
return false;
}
- if (tab->navigations.empty()) {
+ if (session_tab->navigations.empty()) {
LOG(ERROR) << "Foreign tab no longer has valid navigations.";
return false;
}
@@ -274,10 +279,10 @@ jboolean ForeignSessionHelper::OpenForeignSessionTab(JNIEnv* env,
std::vector<content::NavigationEntry*> entries =
sessions::SerializedNavigationEntry::ToNavigationEntries(
- tab->navigations, profile_);
+ session_tab->navigations, profile_);
content::WebContents* new_web_contents = content::WebContents::Create(
content::WebContents::CreateParams(profile_));
- int selected_index = tab->normalized_navigation_index();
+ int selected_index = session_tab->normalized_navigation_index();
new_web_contents->GetController().Restore(
selected_index,
content::NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY,
@@ -287,6 +292,48 @@ jboolean ForeignSessionHelper::OpenForeignSessionTab(JNIEnv* env,
return true;
}
+jboolean ForeignSessionHelper::OpenForeignSessionTab(JNIEnv* env,
+ jobject obj,
+ jobject j_tab,
+ jstring session_tag,
+ jint session_tab_id,
+ jint j_disposition) {
+ SessionModelAssociator* associator = GetSessionModelAssociator(profile_);
+ if (!associator) {
+ LOG(ERROR) << "Null SessionModelAssociator returned.";
+ return false;
+ }
+
+ const SessionTab* session_tab;
+
+ if (!associator->GetForeignTab(ConvertJavaStringToUTF8(env, session_tag),
+ session_tab_id,
+ &session_tab)) {
+ LOG(ERROR) << "Failed to load foreign tab.";
+ return false;
+ }
+
+ if (session_tab->navigations.empty()) {
+ LOG(ERROR) << "Foreign tab no longer has valid navigations.";
+ return false;
+ }
+
+ TabAndroid* tab_android = TabAndroid::GetNativeTab(env, j_tab);
+ if (!tab_android)
+ return false;
+ content::WebContents* web_contents = tab_android->web_contents();
+ if (!web_contents)
+ return false;
+
+ WindowOpenDisposition disposition =
+ static_cast<WindowOpenDisposition>(j_disposition);
+ SessionRestore::RestoreForeignSessionTab(web_contents,
+ *session_tab,
+ disposition);
+
+ return true;
+}
+
void ForeignSessionHelper::DeleteForeignSession(JNIEnv* env, jobject obj,
jstring session_tag) {
SessionModelAssociator* associator = GetSessionModelAssociator(profile_);
« no previous file with comments | « chrome/browser/android/foreign_session_helper.h ('k') | chrome/browser/android/recently_closed_tabs_bridge.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698