blob: 8ba7c836222b470254d5ac52cd234f6042348905 [file] [log] [blame]
// Copyright 2019 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/manifest_web_app_browser_controller.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ssl/security_state_tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/common/origin_util.h"
#include "content/public/common/url_constants.h"
#include "extensions/common/constants.h"
#include "ui/gfx/favicon_size.h"
#include "ui/gfx/image/image_skia.h"
#include "url/gurl.h"
ManifestWebAppBrowserController::ManifestWebAppBrowserController(
Browser* browser)
: AppBrowserController(browser), app_launch_url_(GURL()) {}
ManifestWebAppBrowserController::~ManifestWebAppBrowserController() = default;
base::Optional<std::string> ManifestWebAppBrowserController::GetAppId() const {
return base::nullopt;
}
bool ManifestWebAppBrowserController::ShouldShowToolbar() const {
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
// Don't show a toolbar until a navigation has occurred.
if (!web_contents || web_contents->GetLastCommittedURL().is_empty())
return false;
// Show toolbar if the web_contents is not on a secure origin.
if (!content::IsOriginSecure(app_launch_url_))
return true;
// Show toolbar if web_contents is not on the same origin as it was originally
// launched on.
if (!url::IsSameOriginWith(app_launch_url_,
web_contents->GetLastCommittedURL()) ||
!url::IsSameOriginWith(app_launch_url_, web_contents->GetVisibleURL())) {
return true;
}
// Show toolbar if on a insecure external website. This checks the security
// level, different from IsOriginSecure which just checks the origin itself.
if (!IsSiteSecure(web_contents))
return true;
return false;
}
bool ManifestWebAppBrowserController::ShouldShowHostedAppButtonContainer()
const {
return true;
}
gfx::ImageSkia ManifestWebAppBrowserController::GetWindowAppIcon() const {
gfx::ImageSkia page_icon = browser()->GetCurrentPageIcon().AsImageSkia();
if (!page_icon.isNull())
return page_icon;
// The extension icon may be loading still. Return a transparent icon rather
// than using a placeholder to avoid flickering.
SkBitmap bitmap;
bitmap.allocN32Pixels(gfx::kFaviconSize, gfx::kFaviconSize);
bitmap.eraseColor(SK_ColorTRANSPARENT);
return gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
}
gfx::ImageSkia ManifestWebAppBrowserController::GetWindowIcon() const {
return browser()->GetCurrentPageIcon().AsImageSkia();
}
std::string ManifestWebAppBrowserController::GetAppShortName() const {
return std::string();
}
base::string16 ManifestWebAppBrowserController::GetFormattedUrlOrigin() const {
return FormatUrlOrigin(GetAppLaunchURL());
}
GURL ManifestWebAppBrowserController::GetAppLaunchURL() const {
return app_launch_url_;
}
void ManifestWebAppBrowserController::OnTabInserted(
content::WebContents* contents) {
if (app_launch_url_.is_empty())
app_launch_url_ = contents->GetURL();
AppBrowserController::OnTabInserted(contents);
}