File: sync_sessions_router_tab_helper.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (130 lines) | stat: -rw-r--r-- 4,519 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h"

#include "base/feature_list.h"
#include "base/memory/ptr_util.h"
#include "build/build_config.h"
#include "chrome/browser/sync/sessions/sync_sessions_web_contents_router.h"
#include "components/favicon/content/content_favicon_driver.h"
#include "components/language/core/common/language_experiments.h"
#include "components/sessions/content/session_tab_helper.h"
#include "components/sync/base/features.h"
#include "components/sync_sessions/synced_tab_delegate.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/page.h"
#include "content/public/browser/render_frame_host.h"
#include "ui/gfx/image/image_skia.h"

namespace sync_sessions {

SyncSessionsRouterTabHelper::SyncSessionsRouterTabHelper(
    content::WebContents* web_contents,
    SyncSessionsWebContentsRouter* router,
    ChromeTranslateClient* chrome_translate_client,
    favicon::FaviconDriver* favicon_driver)
    : content::WebContentsObserver(web_contents),
      router_(router),
      chrome_translate_client_(chrome_translate_client),
      favicon_driver_(favicon_driver) {
  // A translate client is not always attached to web contents (e.g. tests).
  if (chrome_translate_client_) {
    chrome_translate_client_->GetTranslateDriver()
        ->AddLanguageDetectionObserver(this);
  }

  if (favicon_driver_) {
    favicon_driver_->AddObserver(this);
  }
}

SyncSessionsRouterTabHelper::~SyncSessionsRouterTabHelper() {
  // Android and desktop intentionally have divergent behavior. The core
  // requirement is that NotifyTabClosed() is called when the list of tabs that
  // will be synced has been updated to no longer include the close tab. On
  // Desktop the TabFeatures are destroyed first. Thus NotifyTabClosed() must be
  // called by another class (see BrowserListRouterHelper). On Android the list
  // is updated first, thus it's safe to call NotifyTabClosed() here.
#if BUILDFLAG(IS_ANDROID)
  if (router_) {
    router_->NotifyTabClosed();
  }
#endif
  if (chrome_translate_client_) {
    chrome_translate_client_->GetTranslateDriver()
        ->RemoveLanguageDetectionObserver(this);
  }
  if (favicon_driver_) {
    favicon_driver_->RemoveObserver(this);
  }
}

void SyncSessionsRouterTabHelper::DidFinishNavigation(
    content::NavigationHandle* navigation_handle) {
  if (navigation_handle && navigation_handle->IsInPrimaryMainFrame()) {
    NotifyRouter();
  }
}

void SyncSessionsRouterTabHelper::TitleWasSet(content::NavigationEntry* entry) {
  NotifyRouter();
}

void SyncSessionsRouterTabHelper::DidFinishLoad(
    content::RenderFrameHost* render_frame_host,
    const GURL& validated_url) {
  // Only notify when the primary main frame finishes loading.
  if (render_frame_host && render_frame_host->IsInPrimaryMainFrame()) {
    NotifyRouter(true);
  }
}

void SyncSessionsRouterTabHelper::DidOpenRequestedURL(
    content::WebContents* new_contents,
    content::RenderFrameHost* source_render_frame_host,
    const GURL& url,
    const content::Referrer& referrer,
    WindowOpenDisposition disposition,
    ui::PageTransition transition,
    bool started_from_context_menu,
    bool renderer_initiated) {
  // TODO(crbug.com/40649749): This is a relic from when we actually did change
  // something about the tab here. It should be safe to remove now.
  NotifyRouter();
}

void SyncSessionsRouterTabHelper::OnVisibilityChanged(
    content::Visibility visibility) {
  // Only notify a notification when the tab becomes visible. This is necessary
  // to sync the last active time field.
  if (visibility == content::Visibility::VISIBLE) {
    NotifyRouter();
  }
}

void SyncSessionsRouterTabHelper::OnLanguageDetermined(
    const translate::LanguageDetectionDetails& details) {
  NotifyRouter();
}

void SyncSessionsRouterTabHelper::NotifyRouter(bool page_load_completed) {
  if (router_) {
    router_->NotifyTabModified(web_contents(), page_load_completed);
  }
}

void SyncSessionsRouterTabHelper::OnFaviconUpdated(
    favicon::FaviconDriver* favicon_driver,
    FaviconDriverObserver::NotificationIconType notification_icon_type,
    const GURL& icon_url,
    bool icon_url_changed,
    const gfx::Image& image) {
  if (icon_url_changed) {
    NotifyRouter();
  }
}

}  // namespace sync_sessions