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
|
// Copyright 2024 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/ui/shortcuts/desktop_shortcuts_utils.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "components/tabs/public/tab_interface.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/page_type.h"
#include "content/public/common/url_constants.h"
#include "extensions/buildflags/buildflags.h"
#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "extensions/common/constants.h"
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
namespace shortcuts {
bool CanCreateDesktopShortcut(content::WebContents* web_contents) {
// Do not allow if the web_contents appear to be crashing.
if (!web_contents || web_contents->IsCrashed()) {
return false;
}
auto* const tab = tabs::TabInterface::MaybeGetFromContents(web_contents);
if (!tab || !tab->GetBrowserWindowInterface()) {
return false;
}
auto* browser_window_interface = tab->GetBrowserWindowInterface();
Profile* profile = browser_window_interface->GetProfile();
// Do not allow for Guest or OTR profiles.
// System profiles have not been introduced here because they do not have a
// browser.
if (!profile || profile->IsGuestSession() || profile->IsOffTheRecord()) {
return false;
}
// Do not allow for error pages (like network errors etc).
content::NavigationEntry* entry =
web_contents->GetController().GetLastCommittedEntry();
if (entry && entry->GetPageType() == content::PAGE_TYPE_ERROR) {
return false;
}
// Do not allow if the site_url is invalid.
const GURL site_url = web_contents->GetLastCommittedURL();
if (!site_url.is_valid()) {
return false;
}
// Only URLs that have a scheme of `HTTP/HTTPs` or `chrome-extension` is
// allowed.
bool is_valid_for_shortcuts = site_url.SchemeIsHTTPOrHTTPS();
#if BUILDFLAG(ENABLE_EXTENSIONS)
is_valid_for_shortcuts =
is_valid_for_shortcuts || site_url.SchemeIs(extensions::kExtensionScheme);
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
return is_valid_for_shortcuts;
}
} // namespace shortcuts
|