blob: 01df75e77de70e8d02145075adb3ec92434b81f4 [file] [log] [blame]
// Copyright (c) 2012 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.
#include "chrome/browser/ui/tabs/tab_renderer_data.h"
#include "base/process/kill.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/favicon/favicon_utils.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/tab_ui_helper.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model_delegate.h"
#include "chrome/browser/ui/thumbnails/thumbnail_tab_helper.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/url_constants.h"
// static
TabRendererData TabRendererData::FromTabInModel(TabStripModel* model,
int index) {
content::WebContents* const contents = model->GetWebContentsAt(index);
TabRendererData data;
TabUIHelper* const tab_ui_helper = TabUIHelper::FromWebContents(contents);
data.favicon = tab_ui_helper->GetFavicon().AsImageSkia();
ThumbnailTabHelper* const thumbnail_tab_helper =
ThumbnailTabHelper::FromWebContents(contents);
if (thumbnail_tab_helper)
data.thumbnail = thumbnail_tab_helper->thumbnail();
data.network_state = TabNetworkStateForWebContents(contents);
data.title = tab_ui_helper->GetTitle();
data.visible_url = contents->GetVisibleURL();
// Allow empty title for chrome-untrusted:// URLs.
if (data.title.empty() &&
data.visible_url.SchemeIs(content::kChromeUIUntrustedScheme)) {
data.should_render_empty_title = true;
}
data.last_committed_url = contents->GetLastCommittedURL();
data.crashed_status = contents->GetCrashedStatus();
data.incognito = contents->GetBrowserContext()->IsOffTheRecord();
data.pinned = model->IsTabPinned(index);
data.show_icon =
data.pinned || model->delegate()->ShouldDisplayFavicon(contents);
data.blocked = model->IsTabBlocked(index);
data.should_hide_throbber = tab_ui_helper->ShouldHideThrobber();
data.alert_state = chrome::GetTabAlertStatesForContents(contents);
return data;
}
TabRendererData::TabRendererData() = default;
TabRendererData::TabRendererData(const TabRendererData& other) = default;
TabRendererData::TabRendererData(TabRendererData&& other) = default;
TabRendererData& TabRendererData::operator=(const TabRendererData& other) =
default;
TabRendererData& TabRendererData::operator=(TabRendererData&& other) = default;
TabRendererData::~TabRendererData() = default;
bool TabRendererData::operator==(const TabRendererData& other) const {
return favicon.BackedBySameObjectAs(other.favicon) &&
thumbnail == other.thumbnail && network_state == other.network_state &&
title == other.title && visible_url == other.visible_url &&
last_committed_url == other.last_committed_url &&
crashed_status == other.crashed_status &&
incognito == other.incognito && show_icon == other.show_icon &&
pinned == other.pinned && blocked == other.blocked &&
alert_state == other.alert_state &&
should_hide_throbber == other.should_hide_throbber;
}
bool TabRendererData::IsCrashed() const {
return (crashed_status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED ||
#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
crashed_status ==
base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM ||
#endif
crashed_status == base::TERMINATION_STATUS_PROCESS_CRASHED ||
crashed_status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION ||
crashed_status == base::TERMINATION_STATUS_LAUNCH_FAILED);
}