blob: 54a8cab5ae7eba90205b9a1f425b1d80c2414dfd [file] [log] [blame]
clamy1e5574e2016-09-29 16:48:441// Copyright 2016 The Chromium Authors. All rights reserved.
2// 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
Giovanni Ortuño Urquidi640873402018-02-08 23:01:447#include <tuple>
8
clamy1e5574e2016-09-29 16:48:449#include "base/memory/ptr_util.h"
John Abd-El-Malekd2377982018-01-08 22:23:1210#include "chrome/browser/prerender/prerender_contents.h"
11#include "chrome/browser/prerender/prerender_histograms.h"
clamy1e5574e2016-09-29 16:48:4412#include "chrome/browser/sessions/session_tab_helper.h"
13#include "content/public/browser/navigation_handle.h"
brettw00899e62016-11-12 02:10:1714#include "extensions/features/features.h"
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4415#include "ui/base/window_open_disposition.h"
clamy1e5574e2016-09-29 16:48:4416
brettw00899e62016-11-12 02:10:1717#if BUILDFLAG(ENABLE_EXTENSIONS)
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4418namespace {
19std::pair<int, int> GetTabIdAndWindowId(content::WebContents* web_contents) {
clamy1e5574e2016-09-29 16:48:4420 SessionTabHelper* session_tab_helper =
John Abd-El-Malekd2377982018-01-08 22:23:1221 SessionTabHelper::FromWebContents(web_contents);
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4422 if (!session_tab_helper)
23 return std::make_pair(-1, -1);
24
25 return std::make_pair(session_tab_helper->session_id().id(),
26 session_tab_helper->window_id().id());
27}
28} // namespace
29#endif // BUILDFLAG(ENABLE_EXTENSIONS)
30
31ChromeNavigationUIData::ChromeNavigationUIData()
32 : disposition_(WindowOpenDisposition::CURRENT_TAB) {}
33
34ChromeNavigationUIData::ChromeNavigationUIData(
35 content::NavigationHandle* navigation_handle)
36 : disposition_(WindowOpenDisposition::CURRENT_TAB) {
37 auto* web_contents = navigation_handle->GetWebContents();
38#if BUILDFLAG(ENABLE_EXTENSIONS)
39 int tab_id;
40 int window_id;
41 std::tie(tab_id, window_id) = GetTabIdAndWindowId(web_contents);
Jeremy Romanec48d7a2018-03-01 17:35:0942 extension_data_ = std::make_unique<extensions::ExtensionNavigationUIData>(
clamy1e5574e2016-09-29 16:48:4443 navigation_handle, tab_id, window_id);
44#endif
John Abd-El-Malekd2377982018-01-08 22:23:1245
46 auto* prerender_contents =
47 prerender::PrerenderContents::FromWebContents(web_contents);
48 if (prerender_contents) {
49 prerender_mode_ = prerender_contents->prerender_mode();
50 prerender_histogram_prefix_ =
51 prerender::PrerenderHistograms::GetHistogramPrefix(
52 prerender_contents->origin());
53 }
clamy1e5574e2016-09-29 16:48:4454}
55
56ChromeNavigationUIData::~ChromeNavigationUIData() {}
57
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4458// static
59std::unique_ptr<ChromeNavigationUIData>
60ChromeNavigationUIData::CreateForMainFrameNavigation(
61 content::WebContents* web_contents,
62 WindowOpenDisposition disposition) {
63 auto navigation_ui_data = std::make_unique<ChromeNavigationUIData>();
64 navigation_ui_data->disposition_ = disposition;
65
66#if BUILDFLAG(ENABLE_EXTENSIONS)
67 int tab_id;
68 int window_id;
69 std::tie(tab_id, window_id) = GetTabIdAndWindowId(web_contents);
70
71 navigation_ui_data->extension_data_ =
72 extensions::ExtensionNavigationUIData::CreateForMainFrameNavigation(
73 web_contents, tab_id, window_id);
74#endif
75
76 return navigation_ui_data;
77}
78
clamy1e5574e2016-09-29 16:48:4479std::unique_ptr<content::NavigationUIData> ChromeNavigationUIData::Clone()
80 const {
81 std::unique_ptr<ChromeNavigationUIData> copy =
Jeremy Romanec48d7a2018-03-01 17:35:0982 std::make_unique<ChromeNavigationUIData>();
clamy1e5574e2016-09-29 16:48:4483
Giovanni Ortuño Urquidi640873402018-02-08 23:01:4484 copy->disposition_ = disposition_;
85
brettw00899e62016-11-12 02:10:1786#if BUILDFLAG(ENABLE_EXTENSIONS)
clamy1e5574e2016-09-29 16:48:4487 if (extension_data_)
88 copy->SetExtensionNavigationUIData(extension_data_->DeepCopy());
89#endif
90
Jian Li18173422017-11-08 03:00:0291#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
92 if (offline_page_data_)
93 copy->SetOfflinePageNavigationUIData(offline_page_data_->DeepCopy());
94#endif
95
John Abd-El-Malekd2377982018-01-08 22:23:1296 copy->prerender_mode_ = prerender_mode_;
97 copy->prerender_histogram_prefix_ = prerender_histogram_prefix_;
98
clamy1e5574e2016-09-29 16:48:4499 return std::move(copy);
100}
101
brettw00899e62016-11-12 02:10:17102#if BUILDFLAG(ENABLE_EXTENSIONS)
clamy1e5574e2016-09-29 16:48:44103void ChromeNavigationUIData::SetExtensionNavigationUIData(
104 std::unique_ptr<extensions::ExtensionNavigationUIData> extension_data) {
105 extension_data_ = std::move(extension_data);
106}
107#endif
Jian Li18173422017-11-08 03:00:02108
109#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
110void ChromeNavigationUIData::SetOfflinePageNavigationUIData(
111 std::unique_ptr<offline_pages::OfflinePageNavigationUIData>
112 offline_page_data) {
113 offline_page_data_ = std::move(offline_page_data);
114}
115#endif