blob: dafef6b748f56b8da3e95e6282bba09621546da7 [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2016 The Chromium Authors
clamy1e5574e2016-09-29 16:48:442// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
6
Sreeja Kamishettyab9948ab2022-07-20 23:20:237#include "chrome/browser/preloading/prefetch/no_state_prefetch/chrome_no_state_prefetch_contents_delegate.h"
Hiroki Nakagawa7230e3412021-01-22 10:08:298#include "components/no_state_prefetch/browser/no_state_prefetch_contents.h"
clamy1e5574e2016-09-29 16:48:449#include "content/public/browser/navigation_handle.h"
Scott Violetc8240b02018-03-08 22:03:5910#include "extensions/buildflags/buildflags.h"
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4411#include "ui/base/window_open_disposition.h"
clamy1e5574e2016-09-29 16:48:4412
brettw00899e62016-11-12 02:10:1713#if BUILDFLAG(ENABLE_EXTENSIONS)
Clark DuVall8f4c7522019-07-30 03:54:0014#include "extensions/browser/extensions_browser_client.h"
Karan Bhatia8418c662018-03-02 00:39:2615#include "extensions/common/constants.h"
16#endif
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4417
18ChromeNavigationUIData::ChromeNavigationUIData()
19 : disposition_(WindowOpenDisposition::CURRENT_TAB) {}
20
21ChromeNavigationUIData::ChromeNavigationUIData(
22 content::NavigationHandle* navigation_handle)
23 : disposition_(WindowOpenDisposition::CURRENT_TAB) {
24 auto* web_contents = navigation_handle->GetWebContents();
25#if BUILDFLAG(ENABLE_EXTENSIONS)
Karan Bhatia8418c662018-03-02 00:39:2626 int tab_id = extension_misc::kUnknownTabId;
27 int window_id = extension_misc::kUnknownWindowId;
Clark DuVall8f4c7522019-07-30 03:54:0028 // The browser client can be null in unittests.
29 if (extensions::ExtensionsBrowserClient::Get()) {
30 extensions::ExtensionsBrowserClient::Get()->GetTabAndWindowIdForWebContents(
31 web_contents, &tab_id, &window_id);
32 }
Jeremy Romanec48d7a2018-03-01 17:35:0933 extension_data_ = std::make_unique<extensions::ExtensionNavigationUIData>(
clamy1e5574e2016-09-29 16:48:4434 navigation_handle, tab_id, window_id);
35#endif
John Abd-El-Malekd2377982018-01-08 22:23:1236
Hiroki Nakagawa7230e3412021-01-22 10:08:2937 auto* no_state_prefetch_contents =
38 prerender::ChromeNoStatePrefetchContentsDelegate::FromWebContents(
39 web_contents);
40 if (no_state_prefetch_contents) {
Hiroki Nakagawa78ebf062021-01-20 16:23:5341 is_no_state_prefetching_ = true;
John Abd-El-Malekd2377982018-01-08 22:23:1242 }
clamy1e5574e2016-09-29 16:48:4443}
44
Sorin Jianu0cd458172024-11-28 15:29:2445ChromeNavigationUIData::~ChromeNavigationUIData() = default;
clamy1e5574e2016-09-29 16:48:4446
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4447// static
48std::unique_ptr<ChromeNavigationUIData>
49ChromeNavigationUIData::CreateForMainFrameNavigation(
50 content::WebContents* web_contents,
Mustafa Emre Acer06028d792021-01-05 19:48:5151 WindowOpenDisposition disposition,
Carlos IL67cf5a912023-05-25 20:40:5852 bool is_using_https_as_default_scheme,
Mustafa Emre Acer6a80cd702024-06-27 19:57:2953 bool force_no_https_upgrade) {
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4454 auto navigation_ui_data = std::make_unique<ChromeNavigationUIData>();
55 navigation_ui_data->disposition_ = disposition;
Mustafa Emre Acer06028d792021-01-05 19:48:5156 navigation_ui_data->is_using_https_as_default_scheme_ =
57 is_using_https_as_default_scheme;
Mustafa Emre Acer6a80cd702024-06-27 19:57:2958 navigation_ui_data->force_no_https_upgrade_ = force_no_https_upgrade;
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4459
60#if BUILDFLAG(ENABLE_EXTENSIONS)
Karan Bhatia8418c662018-03-02 00:39:2661 int tab_id = extension_misc::kUnknownTabId;
62 int window_id = extension_misc::kUnknownWindowId;
Clark DuVall8f4c7522019-07-30 03:54:0063 // The browser client can be null in unittests.
64 if (extensions::ExtensionsBrowserClient::Get()) {
65 extensions::ExtensionsBrowserClient::Get()->GetTabAndWindowIdForWebContents(
66 web_contents, &tab_id, &window_id);
67 }
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4468
69 navigation_ui_data->extension_data_ =
70 extensions::ExtensionNavigationUIData::CreateForMainFrameNavigation(
71 web_contents, tab_id, window_id);
72#endif
73
74 return navigation_ui_data;
75}
76
Lucas Furukawa Gadanid726e1e2019-05-08 16:20:0377std::unique_ptr<content::NavigationUIData> ChromeNavigationUIData::Clone() {
Karan Bhatia8418c662018-03-02 00:39:2678 auto copy = std::make_unique<ChromeNavigationUIData>();
clamy1e5574e2016-09-29 16:48:4479
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4480 copy->disposition_ = disposition_;
Mustafa Emre Acer06028d792021-01-05 19:48:5181 copy->is_using_https_as_default_scheme_ = is_using_https_as_default_scheme_;
Mustafa Emre Acer6a80cd702024-06-27 19:57:2982 copy->force_no_https_upgrade_ = force_no_https_upgrade_;
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4483
brettw00899e62016-11-12 02:10:1784#if BUILDFLAG(ENABLE_EXTENSIONS)
clamy1e5574e2016-09-29 16:48:4485 if (extension_data_)
86 copy->SetExtensionNavigationUIData(extension_data_->DeepCopy());
87#endif
88
Jian Li18173422017-11-08 03:00:0289#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
90 if (offline_page_data_)
91 copy->SetOfflinePageNavigationUIData(offline_page_data_->DeepCopy());
92#endif
93
Hiroki Nakagawa78ebf062021-01-20 16:23:5394 copy->is_no_state_prefetching_ = is_no_state_prefetching_;
Brandon Wyliea20e67ae2022-07-26 22:01:2095 copy->bookmark_id_ = bookmark_id_;
Shakti Sahua14249922024-10-31 22:54:0896 copy->navigation_initiated_from_sync_ = navigation_initiated_from_sync_;
John Abd-El-Malekd2377982018-01-08 22:23:1297
clamy1e5574e2016-09-29 16:48:4498 return std::move(copy);
99}
100
brettw00899e62016-11-12 02:10:17101#if BUILDFLAG(ENABLE_EXTENSIONS)
clamy1e5574e2016-09-29 16:48:44102void ChromeNavigationUIData::SetExtensionNavigationUIData(
103 std::unique_ptr<extensions::ExtensionNavigationUIData> extension_data) {
104 extension_data_ = std::move(extension_data);
105}
106#endif
Jian Li18173422017-11-08 03:00:02107
108#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
109void ChromeNavigationUIData::SetOfflinePageNavigationUIData(
110 std::unique_ptr<offline_pages::OfflinePageNavigationUIData>
111 offline_page_data) {
112 offline_page_data_ = std::move(offline_page_data);
113}
114#endif