| Index: chrome/browser/sync/sessions/sync_sessions_web_contents_router.h | 
| diff --git a/chrome/browser/sync/sessions/sync_sessions_web_contents_router.h b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..dc698f280ca2704828061d015f5c64af68173c63 | 
| --- /dev/null | 
| +++ b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.h | 
| @@ -0,0 +1,72 @@ | 
| +// Copyright 2017 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#ifndef CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_WEB_CONTENTS_ROUTER_H_ | 
| +#define CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_WEB_CONTENTS_ROUTER_H_ | 
| + | 
| +#include "base/callback_list.h" | 
| + | 
| +// Android has no BrowserList or TabStripModel, so we exclude code that refers | 
| +// to those two things. For non-android platforms, this code is used to | 
| +// ensure we are notified of tabs being added and moved between tab strips. | 
| + | 
| +#include "components/keyed_service/core/keyed_service.h" | 
| +#include "components/sync/model/syncable_service.h" | 
| +#include "components/sync_sessions/local_session_event_router.h" | 
| + | 
| +namespace content { | 
| +class WebContents; | 
| +}  // namespace content | 
| + | 
| +class Profile; | 
| + | 
| +namespace sync_sessions { | 
| + | 
| +class BrowserListRouterHelper; | 
| + | 
| +// WebContentsObserver-based implementation of LocalSessionEventRouter. This | 
| +// class is responsible for notifying Sessions Sync when local tabs are | 
| +// modified. It does this by forwarding the events pushed to it by individual | 
| +// WebContentsObservers, which are scoped to a single WebContents/tab. | 
| +class SyncSessionsWebContentsRouter : public LocalSessionEventRouter, | 
| +                                      public KeyedService { | 
| + public: | 
| +  explicit SyncSessionsWebContentsRouter(Profile* profile); | 
| + | 
| +  // Notify the router that the tab corresponding to |web_contents| has been | 
| +  // modified in some way. | 
| +  void NotifyTabModified(content::WebContents* web_contents); | 
| +  // Inject a flare that can be used to start sync. See the comment for | 
| +  // StartSyncFlare in syncable_service.h for more. | 
| +  void InjectStartSyncFlare(syncer::SyncableService::StartSyncFlare flare); | 
| + | 
| +  // SessionsSyncManager::LocalEventRouter implementation. | 
| +  void StartRoutingTo(LocalSessionEventHandler* handler) override; | 
| +  void Stop() override; | 
| + | 
| +  // KeyedService implementation. | 
| +  void Shutdown() override; | 
| + | 
| + protected: | 
| +  ~SyncSessionsWebContentsRouter() override; | 
| + | 
| + private: | 
| +  void OnFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url); | 
| + | 
| +  std::unique_ptr<base::CallbackList<void(const std::set<GURL>&, | 
| +                                          const GURL&)>::Subscription> | 
| +      favicon_changed_subscription_; | 
| +  syncer::SyncableService::StartSyncFlare flare_; | 
| +  LocalSessionEventHandler* handler_ = nullptr; | 
| + | 
| +#if !defined(OS_ANDROID) | 
| +  std::unique_ptr<BrowserListRouterHelper> browser_list_helper_; | 
| +#endif  // !defined(OS_ANDROID) | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(SyncSessionsWebContentsRouter); | 
| +}; | 
| + | 
| +}  // namespace sync_sessions | 
| + | 
| +#endif  // CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_WEB_CONTENTS_ROUTER_H_ | 
|  |