[ LiveTabContext ] Add function to retrieve saved id from tab group

Adds a function which retrieves a tab group's SavedTabGroupID. This functionality should be used when creating historical groups / tabs for tab restoring.

Bug: 330769406, 324275068
Change-Id: I7be678643a48a41d560497e5a33316424a7b8c76
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5393879
Reviewed-by: Gauthier Ambard <[email protected]>
Reviewed-by: Scott Violet <[email protected]>
Commit-Queue: Darryl James <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1278621}
diff --git a/chrome/browser/sessions/tab_restore_service_unittest.cc b/chrome/browser/sessions/tab_restore_service_unittest.cc
index 395516c..81f49bfe 100644
--- a/chrome/browser/sessions/tab_restore_service_unittest.cc
+++ b/chrome/browser/sessions/tab_restore_service_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
 #include "base/time/time.h"
+#include "base/uuid.h"
 #include "chrome/browser/sessions/chrome_tab_restore_service_client.h"
 #include "chrome/browser/sessions/exit_type_service.h"
 #include "chrome/browser/sessions/session_service.h"
@@ -105,6 +106,9 @@
   MOCK_CONST_METHOD1(GetVisualDataForGroup,
                      const tab_groups::TabGroupVisualData*(
                          const tab_groups::TabGroupId& group));
+  MOCK_CONST_METHOD1(
+      GetSavedTabGroupIdForGroup,
+      const std::optional<base::Uuid>(const tab_groups::TabGroupId& group));
   MOCK_CONST_METHOD1(IsTabPinned, bool(int index));
   MOCK_METHOD2(SetVisualDataForGroup,
                void(const tab_groups::TabGroupId& group,
diff --git a/chrome/browser/ui/android/tab_model/android_live_tab_context.cc b/chrome/browser/ui/android/tab_model/android_live_tab_context.cc
index 41ee2bd..49770978 100644
--- a/chrome/browser/ui/android/tab_model/android_live_tab_context.cc
+++ b/chrome/browser/ui/android/tab_model/android_live_tab_context.cc
@@ -5,7 +5,9 @@
 #include "chrome/browser/ui/android/tab_model/android_live_tab_context.h"
 
 #include <memory>
+#include <optional>
 
+#include "base/uuid.h"
 #include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sessions/session_restore.h"
@@ -95,6 +97,14 @@
   return nullptr;
 }
 
+const std::optional<base::Uuid>
+AndroidLiveTabContext::GetSavedTabGroupIdForGroup(
+    const tab_groups::TabGroupId& group) const {
+  // Not applicable to android... yet.
+  NOTREACHED();
+  return std::nullopt;
+}
+
 bool AndroidLiveTabContext::IsTabPinned(int index) const {
   // Not applicable to android.
   return false;
diff --git a/chrome/browser/ui/android/tab_model/android_live_tab_context.h b/chrome/browser/ui/android/tab_model/android_live_tab_context.h
index d91155f1..b95cec1 100644
--- a/chrome/browser/ui/android/tab_model/android_live_tab_context.h
+++ b/chrome/browser/ui/android/tab_model/android_live_tab_context.h
@@ -14,6 +14,10 @@
 #include "components/tab_groups/tab_group_id.h"
 #include "components/tab_groups/tab_group_visual_data.h"
 
+namespace base {
+class Uuid;
+}
+
 namespace content {
 class WebContents;
 }
@@ -47,6 +51,8 @@
       int index) const override;
   const tab_groups::TabGroupVisualData* GetVisualDataForGroup(
       const tab_groups::TabGroupId& group) const override;
+  const std::optional<base::Uuid> GetSavedTabGroupIdForGroup(
+      const tab_groups::TabGroupId& group) const override;
   bool IsTabPinned(int index) const override;
   void SetVisualDataForGroup(
       const tab_groups::TabGroupId& group,
diff --git a/chrome/browser/ui/browser_live_tab_context.cc b/chrome/browser/ui/browser_live_tab_context.cc
index 10f4df2..71c1dc4 100644
--- a/chrome/browser/ui/browser_live_tab_context.cc
+++ b/chrome/browser/ui/browser_live_tab_context.cc
@@ -5,11 +5,13 @@
 #include "chrome/browser/ui/browser_live_tab_context.h"
 
 #include <memory>
+#include <optional>
 #include <utility>
 
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/token.h"
+#include "base/uuid.h"
 #include "base/values.h"
 #include "chrome/browser/apps/app_service/web_contents_app_id_utils.h"
 #include "chrome/browser/browser_features.h"
@@ -23,12 +25,15 @@
 #include "chrome/browser/ui/browser_tab_strip_model_delegate.h"
 #include "chrome/browser/ui/browser_tabrestore.h"
 #include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.h"
+#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_service_factory.h"
 #include "chrome/browser/ui/tabs/tab_group.h"
 #include "chrome/browser/ui/tabs/tab_group_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/common/buildflags.h"
+#include "components/saved_tab_groups/saved_tab_group.h"
 #include "components/sessions/content/content_live_tab.h"
 #include "components/sessions/content/content_platform_specific_tab_data.h"
 #include "components/sessions/core/session_types.h"
@@ -146,6 +151,27 @@
       ->visual_data();
 }
 
+const std::optional<base::Uuid>
+BrowserLiveTabContext::GetSavedTabGroupIdForGroup(
+    const tab_groups::TabGroupId& group) const {
+  if (!base::FeatureList::IsEnabled(features::kTabGroupsSaveV2)) {
+    return std::nullopt;
+  }
+
+  Profile* profile = browser_->profile();
+  tab_groups::SavedTabGroupKeyedService* const service =
+      tab_groups::SavedTabGroupServiceFactory::GetForProfile(profile);
+
+  const tab_groups::SavedTabGroup* const saved_group =
+      service->model()->Get(group);
+
+  if (!saved_group) {
+    return std::nullopt;
+  }
+
+  return saved_group->saved_guid();
+}
+
 bool BrowserLiveTabContext::IsTabPinned(int index) const {
   return browser_->tab_strip_model()->IsTabPinned(index);
 }
diff --git a/chrome/browser/ui/browser_live_tab_context.h b/chrome/browser/ui/browser_live_tab_context.h
index 73b5567..522c5fc 100644
--- a/chrome/browser/ui/browser_live_tab_context.h
+++ b/chrome/browser/ui/browser_live_tab_context.h
@@ -18,6 +18,10 @@
 class Browser;
 class Profile;
 
+namespace base {
+class Uuid;
+}
+
 namespace content {
 class WebContents;
 }
@@ -54,6 +58,8 @@
       int index) const override;
   const tab_groups::TabGroupVisualData* GetVisualDataForGroup(
       const tab_groups::TabGroupId& group) const override;
+  const std::optional<base::Uuid> GetSavedTabGroupIdForGroup(
+      const tab_groups::TabGroupId& group) const override;
   bool IsTabPinned(int index) const override;
   void SetVisualDataForGroup(
       const tab_groups::TabGroupId& group,
diff --git a/components/sessions/core/live_tab_context.h b/components/sessions/core/live_tab_context.h
index 27d4c3c..1ccb180 100644
--- a/components/sessions/core/live_tab_context.h
+++ b/components/sessions/core/live_tab_context.h
@@ -18,6 +18,10 @@
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/ui_base_types.h"
 
+namespace base {
+class Uuid;
+}
+
 namespace gfx {
 class Rect;
 }
@@ -52,6 +56,8 @@
   // |group|.
   virtual const tab_groups::TabGroupVisualData* GetVisualDataForGroup(
       const tab_groups::TabGroupId& group) const = 0;
+  virtual const std::optional<base::Uuid> GetSavedTabGroupIdForGroup(
+      const tab_groups::TabGroupId& group) const = 0;
   virtual bool IsTabPinned(int index) const = 0;
   // Update |group|'s metadata. Should only be called for |group| if a tab has
   // been restored in |group| via AddRestoredTab() or ReplaceRestoredTab().
diff --git a/ios/chrome/browser/sessions/live_tab_context_browser_agent.h b/ios/chrome/browser/sessions/live_tab_context_browser_agent.h
index c0f61ba3..09dcd9c 100644
--- a/ios/chrome/browser/sessions/live_tab_context_browser_agent.h
+++ b/ios/chrome/browser/sessions/live_tab_context_browser_agent.h
@@ -16,6 +16,10 @@
 #import "ios/chrome/browser/shared/model/browser/browser_observer.h"
 #import "ios/chrome/browser/shared/model/browser/browser_user_data.h"
 
+namespace base {
+class Uuid;
+}
+
 class WebStateList;
 
 // Implementation of sessions::LiveTabContext which uses a WebStateList
@@ -47,6 +51,8 @@
       int index) const override;
   const tab_groups::TabGroupVisualData* GetVisualDataForGroup(
       const tab_groups::TabGroupId& group) const override;
+  const std::optional<base::Uuid> GetSavedTabGroupIdForGroup(
+      const tab_groups::TabGroupId& group) const override;
   bool IsTabPinned(int index) const override;
   void SetVisualDataForGroup(
       const tab_groups::TabGroupId& group,
diff --git a/ios/chrome/browser/sessions/live_tab_context_browser_agent.mm b/ios/chrome/browser/sessions/live_tab_context_browser_agent.mm
index 6831745..4c95115 100644
--- a/ios/chrome/browser/sessions/live_tab_context_browser_agent.mm
+++ b/ios/chrome/browser/sessions/live_tab_context_browser_agent.mm
@@ -10,6 +10,7 @@
 
 #import "base/notreached.h"
 #import "base/strings/sys_string_conversions.h"
+#import "base/uuid.h"
 #import "components/sessions/core/session_types.h"
 #import "components/tab_groups/tab_group_id.h"
 #import "components/tab_groups/tab_group_visual_data.h"
@@ -97,6 +98,14 @@
   return false;
 }
 
+const std::optional<base::Uuid>
+LiveTabContextBrowserAgent::GetSavedTabGroupIdForGroup(
+    const tab_groups::TabGroupId& group) const {
+  // Not supported by iOS... yet.
+  NOTREACHED();
+  return std::nullopt;
+}
+
 void LiveTabContextBrowserAgent::SetVisualDataForGroup(
     const tab_groups::TabGroupId& group,
     const tab_groups::TabGroupVisualData& visual_data) {