chromium/ios/chrome/browser/context_menu/ui_bundled/context_menu_utils.mm

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/context_menu/ui_bundled/context_menu_utils.h"

#import "base/strings/sys_string_conversions.h"
#import "base/values.h"
#import "components/url_formatter/url_formatter.h"
#import "ios/web/common/features.h"
#import "ios/web/public/ui/context_menu_params.h"
#import "url/gurl.h"

namespace {

// Enum for identifying how the menu title was constructed.
enum class ContextMenuTitleOrigin {
  kUnknown = 0,
  kURL = 1,           // the menu title is a URL (href or image src).
  kImageTitle = 2,    // the menu title is an image's title text
  kImageAltText = 3,  // the menu title is an image's alt text and src
};

typedef std::pair<NSString*, ContextMenuTitleOrigin> TitleAndOrigin;

// Returns the title and origin for `params`.
TitleAndOrigin GetContextMenuTitleAndOrigin(web::ContextMenuParams params) {
  NSString* title = nil;
  ContextMenuTitleOrigin origin = ContextMenuTitleOrigin::kUnknown;

  if (params.link_url.is_valid()) {
    origin = ContextMenuTitleOrigin::kURL;
    if (params.link_url.SchemeIs(url::kJavaScriptScheme)) {
      title = @"JavaScript";
    } else {
      std::u16string URLText = url_formatter::FormatUrl(params.link_url);
      title = base::SysUTF16ToNSString(URLText);
    }
  }

  if (!title && params.src_url.is_valid()) {
    title = base::SysUTF8ToNSString(params.src_url.spec());
    origin = ContextMenuTitleOrigin::kURL;
  }

  if ([title hasPrefix:base::SysUTF8ToNSString(url::kDataScheme)]) {
    title = nil;
    origin = ContextMenuTitleOrigin::kURL;
  }

  if (params.title_attribute) {
    title = params.title_attribute;
    origin = ContextMenuTitleOrigin::kImageTitle;
  }

  // Prepend the alt text attribute if element is an image without a link.
  if (params.alt_text && params.src_url.is_valid() &&
      !params.link_url.is_valid()) {
    title = [NSString stringWithFormat:@"%@ – %@", params.alt_text, title];
    // If there was a title attribute, then the title origin is still "image
    // title", even though the alt text was prepended. Otherwise, set the title
    // origin to be "alt text".
    if (!params.title_attribute) {
      origin = ContextMenuTitleOrigin::kImageAltText;
    }
  }

  return TitleAndOrigin(title, origin);
}

}  // namespace

NSString* GetContextMenuTitle(web::ContextMenuParams params) {
  return GetContextMenuTitleAndOrigin(params).first;
}

NSString* GetContextMenuSubtitle(web::ContextMenuParams params) {
  return base::SysUTF8ToNSString(params.link_url.spec());
}

bool IsImageTitle(web::ContextMenuParams params) {
  return GetContextMenuTitleAndOrigin(params).second ==
         ContextMenuTitleOrigin::kImageTitle;
}