summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/share
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-10-26 13:57:00 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-11-02 11:31:01 +0000
commit1943b3c2a1dcee36c233724fc4ee7613d71b9cf6 (patch)
tree8c1b5f12357025c197da5427ae02cfdc2f3570d6 /chromium/chrome/browser/share
parent21ba0c5d4bf8fba15dddd97cd693bad2358b77fd (diff)
downloadqtwebengine-chromium-1943b3c2a1dcee36c233724fc4ee7613d71b9cf6.tar.gz
BASELINE: Update Chromium to 94.0.4606.111
Change-Id: I924781584def20fc800bedf6ff41fdb96c438193 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/chrome/browser/share')
-rw-r--r--chromium/chrome/browser/share/BUILD.gn26
-rw-r--r--chromium/chrome/browser/share/android/java_sources.gni4
-rw-r--r--chromium/chrome/browser/share/android/test_java_sources.gni6
-rw-r--r--chromium/chrome/browser/share/core/BUILD.gn37
-rw-r--r--chromium/chrome/browser/share/core/resources/.style.yapf2
-rw-r--r--chromium/chrome/browser/share/core/resources/BUILD.gn39
-rw-r--r--chromium/chrome/browser/share/core/resources/PRESUBMIT.py27
-rwxr-xr-xchromium/chrome/browser/share/core/resources/gen_share_targets_proto.py101
-rw-r--r--chromium/chrome/browser/share/core/resources/share_targets.asciipb872
-rw-r--r--chromium/chrome/browser/share/core/share_targets.cc167
-rw-r--r--chromium/chrome/browser/share/core/share_targets.h101
-rw-r--r--chromium/chrome/browser/share/core/share_targets_observer.h27
-rw-r--r--chromium/chrome/browser/share/core/share_targets_unittest.cc85
-rw-r--r--chromium/chrome/browser/share/proto/BUILD.gn7
-rw-r--r--chromium/chrome/browser/share/proto/share_history_message.proto40
-rw-r--r--chromium/chrome/browser/share/proto/share_ranking_message.proto16
-rw-r--r--chromium/chrome/browser/share/proto/share_target.proto46
17 files changed, 1599 insertions, 4 deletions
diff --git a/chromium/chrome/browser/share/BUILD.gn b/chromium/chrome/browser/share/BUILD.gn
index f203366f307..6b3ab347a6a 100644
--- a/chromium/chrome/browser/share/BUILD.gn
+++ b/chromium/chrome/browser/share/BUILD.gn
@@ -9,14 +9,24 @@ import("//chrome/browser/buildflags.gni")
source_set("share") {
sources = [
"bitmap_download_request.cc",
+ "default_ranking.cc",
+ "default_ranking.h",
"editor_screenshot_task.cc",
"link_to_text_bridge.cc",
"qr_code_generation_request.cc",
"qr_code_generation_request.h",
"share_history.cc",
"share_history.h",
+ "share_ranking.cc",
+ "share_ranking.h",
]
+
+ if (is_android) {
+ sources += [ "default_ranking_android.cc" ]
+ }
+
deps = [
+ ":jni_headers",
"//base",
"//chrome/browser/profiles:profile",
"//chrome/browser/share/android:jni_headers",
@@ -38,13 +48,29 @@ android_library("java") {
sources = [
"android/java/src/org/chromium/chrome/browser/share/ChromeShareExtras.java",
"android/java/src/org/chromium/chrome/browser/share/ShareDelegate.java",
+ "android/java/src/org/chromium/chrome/browser/share/ShareHistoryBridge.java",
+ "android/java/src/org/chromium/chrome/browser/share/ShareRankingBridge.java",
"android/java/src/org/chromium/chrome/browser/share/share_sheet/ChromeOptionShareCallback.java",
]
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+
deps = [
+ ":jni_headers",
+ "//base:base_java",
+ "//chrome/browser/preferences:java",
+ "//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//components/browser_ui/share/android:java",
+ "//content/public/android:content_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//url:gurl_java",
]
}
+
+generate_jni("jni_headers") {
+ sources = [
+ "android/java/src/org/chromium/chrome/browser/share/ShareHistoryBridge.java",
+ "android/java/src/org/chromium/chrome/browser/share/ShareRankingBridge.java",
+ ]
+}
diff --git a/chromium/chrome/browser/share/android/java_sources.gni b/chromium/chrome/browser/share/android/java_sources.gni
index 6ffd7d0cd87..407a96db791 100644
--- a/chromium/chrome/browser/share/android/java_sources.gni
+++ b/chromium/chrome/browser/share/android/java_sources.gni
@@ -6,7 +6,6 @@
# dependencies are removed.
share_java_sources = [
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/BitmapDownloadRequest.java",
- "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProvider.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextBridge.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextMetricsHelper.java",
@@ -52,6 +51,8 @@ share_java_sources = [
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetView.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetViewBinder.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetViewProperties.java",
+ "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/scroll_capture/ScrollCaptureCallbackImpl.java",
+ "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/scroll_capture/ScrollCaptureManager.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/send_tab_to_self/DevicePickerBottomSheetAdapter.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/send_tab_to_self/DevicePickerBottomSheetContent.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/send_tab_to_self/MetricsRecorder.java",
@@ -68,6 +69,7 @@ share_java_sources = [
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetItemViewProperties.java",
+ "//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinator.java",
"//chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilder.java",
]
diff --git a/chromium/chrome/browser/share/android/test_java_sources.gni b/chromium/chrome/browser/share/android/test_java_sources.gni
index 425204efa7f..e4ce9a0467a 100644
--- a/chromium/chrome/browser/share/android/test_java_sources.gni
+++ b/chromium/chrome/browser/share/android/test_java_sources.gni
@@ -10,15 +10,15 @@ share_test_java_sources = [
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsTabServiceTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetSaveDelegateTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetViewTest.java",
+ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/scroll_capture/ScrollCaptureCallbackImplTest.java",
+ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/scroll_capture/ScrollCaptureManagerTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/SendTabToSelfCoordinatorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContentTest.java",
- "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilderTest.java",
]
share_junit_test_java_sources = [
- "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProviderUnitTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinatorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCoordinatorTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositorTest.java",
@@ -28,6 +28,8 @@ share_junit_test_java_sources = [
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediatorUnitTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/NotificationSharedPrefManagerTest.java",
"//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/SendTabToSelfAndroidBridgeTest.java",
+ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java",
+ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinatorTest.java",
]
share_junit_test_java_deps = [
diff --git a/chromium/chrome/browser/share/core/BUILD.gn b/chromium/chrome/browser/share/core/BUILD.gn
new file mode 100644
index 00000000000..ebe6a47d490
--- /dev/null
+++ b/chromium/chrome/browser/share/core/BUILD.gn
@@ -0,0 +1,37 @@
+# Copyright 2021 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.
+
+import("//chrome/browser/buildflags.gni")
+
+source_set("share_targets") {
+ sources = [
+ "share_targets.cc",
+ "share_targets.h",
+ "share_targets_observer.h",
+ ]
+ deps = [
+ "//base",
+ "//chrome/browser:browser_process",
+ "//chrome/browser:resources_grit",
+ "//chrome/browser/share/core/resources:make_share_targets_protobuf",
+ "//chrome/browser/share/proto:proto",
+ "//components/country_codes",
+ "//components/resources:components_resources",
+ "//ui/base:base",
+ ]
+}
+
+source_set("share_targets_unittest") {
+ testonly = true
+ sources = [ "share_targets_unittest.cc" ]
+
+ deps = [
+ ":share_targets",
+ "//base:base",
+ "//build:chromeos_buildflags",
+ "//components/country_codes",
+ "//testing/gmock:gmock",
+ "//testing/gtest:gtest",
+ ]
+}
diff --git a/chromium/chrome/browser/share/core/resources/.style.yapf b/chromium/chrome/browser/share/core/resources/.style.yapf
new file mode 100644
index 00000000000..3d8b70f3efb
--- /dev/null
+++ b/chromium/chrome/browser/share/core/resources/.style.yapf
@@ -0,0 +1,2 @@
+[style]
+based_on_style = pep8 \ No newline at end of file
diff --git a/chromium/chrome/browser/share/core/resources/BUILD.gn b/chromium/chrome/browser/share/core/resources/BUILD.gn
new file mode 100644
index 00000000000..dbbb115bd68
--- /dev/null
+++ b/chromium/chrome/browser/share/core/resources/BUILD.gn
@@ -0,0 +1,39 @@
+# Copyright 2021 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.
+
+# Generate the binary proto form of "share_targets" from the ascii proto.
+action("make_share_targets_protobuf") {
+ script = "gen_share_targets_proto.py"
+
+ # The output goes in $target_gen_dir since that's where
+ # chrome/browser/browser_resources.grd will look for it.
+
+ input_filename = "share_targets.asciipb"
+ output_dir = target_gen_dir
+ output_basename = "desktop_sharing_hub.pb"
+ python_path_root = "$root_out_dir/pyproto"
+ python_path_share_proto = "$python_path_root/chrome/browser/share/proto"
+ inputs = [ input_filename ]
+
+ deps = [
+ "//chrome/browser/share/proto:proto",
+ "//third_party/protobuf:py_proto",
+ ]
+
+ outputs = [ "$output_dir/$output_basename" ]
+
+ args = [
+ "-w",
+ "-i",
+ rebase_path(input_filename, root_build_dir),
+ "-d",
+ rebase_path(output_dir, root_build_dir),
+ "-o",
+ output_basename,
+ "-p",
+ rebase_path(python_path_root, root_build_dir),
+ "-p",
+ rebase_path(python_path_share_proto, root_build_dir),
+ ]
+}
diff --git a/chromium/chrome/browser/share/core/resources/PRESUBMIT.py b/chromium/chrome/browser/share/core/resources/PRESUBMIT.py
new file mode 100644
index 00000000000..47646c6a9e5
--- /dev/null
+++ b/chromium/chrome/browser/share/core/resources/PRESUBMIT.py
@@ -0,0 +1,27 @@
+# Copyright 2021 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.
+"""Presubmit checks for Share share_targets."""
+
+
+def CheckVersionUpdatedInShareTargetList(input_api, output_api):
+ def IsShareTargetList(x):
+ return (input_api.os_path.basename(
+ x.LocalPath()) == 'share_targets.asciipb')
+
+ share_targets = input_api.AffectedFiles(file_filter=IsShareTargetList)
+ if not share_targets:
+ return []
+ for _, line in share_targets[0].ChangedContents():
+ if line.strip().startswith('version_id: '):
+ return []
+
+ return [
+ output_api.PresubmitError(
+ 'Increment |version_id| in share_targets.asciipb if you are '
+ 'updating the share_targets proto.')
+ ]
+
+
+def CheckChangeOnUpload(input_api, output_api):
+ return CheckVersionUpdatedInShareTargetList(input_api, output_api)
diff --git a/chromium/chrome/browser/share/core/resources/gen_share_targets_proto.py b/chromium/chrome/browser/share/core/resources/gen_share_targets_proto.py
new file mode 100755
index 00000000000..0fa95435ac3
--- /dev/null
+++ b/chromium/chrome/browser/share/core/resources/gen_share_targets_proto.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+# Copyright 2021 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.
+"""
+ Convert the ASCII share_targets.asciipb proto into a binary resource.
+"""
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import sys
+
+# Import the binary proto generator. Walks up to the root of the source tree
+# which is six directories above, and the finds the protobufs directory from
+# there.
+proto_generator_path = os.path.normpath(
+ os.path.join(os.path.abspath(__file__),
+ *[os.path.pardir] * 6 + ['components/resources/protobufs']))
+sys.path.insert(0, proto_generator_path)
+from binary_proto_generator import BinaryProtoGenerator
+
+
+def ParseInputPb(input_pb):
+ """ Return a protobuf based on input pb """
+
+ new_pb = share_target_pb2.MapLocaleTargets()
+
+ temp_pb = share_target_pb2.TargetLocalesForParsing()
+ temp_pb.CopyFrom(input_pb)
+
+ new_pb.version_id = temp_pb.version_id
+
+ all_targets_pb = share_target_pb2.TmpShareTargetMap()
+
+ for s in temp_pb.targets:
+ all_targets_pb.all_targets[s.nickname].nickname = s.nickname
+ all_targets_pb.all_targets[s.nickname].url = s.url
+ all_targets_pb.all_targets[s.nickname].icon = s.icon
+ all_targets_pb.all_targets[s.nickname].icon_2x = s.icon_2x
+ all_targets_pb.all_targets[s.nickname].icon_3x = s.icon_3x
+
+ for s in temp_pb.locale_mapping:
+ tmp_share_targets = share_target_pb2.ShareTargets()
+ for target in s.targets:
+ added = tmp_share_targets.targets.add()
+ added.nickname = all_targets_pb.all_targets[target].nickname
+ added.url = all_targets_pb.all_targets[target].url
+ added.icon = all_targets_pb.all_targets[target].icon
+ added.icon_2x = all_targets_pb.all_targets[target].icon_2x
+ added.icon_3x = all_targets_pb.all_targets[target].icon_3x
+
+ for locale in s.locale_keys:
+ for target in tmp_share_targets.targets:
+ added = new_pb.map_target_locale_map[locale].targets.add()
+ added.nickname = target.nickname
+ added.url = target.url
+ added.icon = target.icon
+ added.icon_2x = target.icon_2x
+ added.icon_3x = target.icon_3x
+
+ return new_pb
+
+
+def ParsePbAndWrite(input_pb, outfile):
+ parsed_pb = ParseInputPb(input_pb)
+
+ binary_pb_str = parsed_pb.SerializeToString()
+
+ open(outfile, 'wb').write(binary_pb_str)
+
+
+class ShareTargetProtoGenerator(BinaryProtoGenerator):
+ def ImportProtoModule(self):
+ import share_target_pb2
+ globals()['share_target_pb2'] = share_target_pb2
+
+ def EmptyProtoInstance(self):
+ return share_target_pb2.TargetLocalesForParsing()
+
+ def ValidatePb(self, opts, pb):
+ """ Validate the basic values of the protobuf."""
+ assert pb.version_id > 0
+ assert len(pb.locale_mapping) > 1
+ assert len(pb.targets) > 1
+
+ def ProcessPb(self, opts, pb):
+ """ Generate one or more binary protos using the parsed proto. """
+ outfile = os.path.join(opts.outdir, opts.outbasename)
+ ParsePbAndWrite(pb, outfile)
+
+ def VerifyArgs(self, opts):
+ return True
+
+
+def main():
+ return ShareTargetProtoGenerator().Run()
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/chrome/browser/share/core/resources/share_targets.asciipb b/chromium/chrome/browser/share/core/resources/share_targets.asciipb
new file mode 100644
index 00000000000..b34058fd22d
--- /dev/null
+++ b/chromium/chrome/browser/share/core/resources/share_targets.asciipb
@@ -0,0 +1,872 @@
+# Copyright 2021 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.
+#
+# To generate the base64-encoded images in this file from source PNGs, you can:
+# base64 < file.png | fold -w 64 | sed -e 's/^/ "/' -e 's/$/"/'
+
+##
+## Top level settings
+##
+version_id: 8
+
+##
+## Share Targets
+##
+
+targets {
+ nickname: "reddit"
+ url: "http://reddit.com/submit?url=%(escaped_url)&title=%(escaped_title)"
+ icon:
+ "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAACpElEQVQ4EV2SS09TYRCG"
+ "n9MWighiRIoiETQqEKmaAEZXXhKjuDIkunfj7/CXmLjSvQsFLyFEoyIqxgXhKsWI"
+ "Ahq8ALUt7fE5RYw66fR8l5l33nnnC/jPwl62UaKdkLTfXQQUXM/qo1SSCe6S+zsl"
+ "2NyE16jIT9BWWck5E8+aeMykRu/X9Xeuh/UB10PBIz5s5pUBomSm6SbOVYMumrzb"
+ "gNjGLwFhKYrPeTch3i1+cjsYElRLhBg+S1s5GS672x5dUNTrdkJDM1TXwY7GJEtz"
+ "aaZGakrJfD48zc1gkM8xeqk1+LzhF/XtVsEWrKrXNmx41VZoOiTInui8VWqXLNgd"
+ "XiaeMLlDsme82P0nuaJSKKs3HRRFKpm3MD8N2VW361HbnTI9wRLPEialPThKRXWM"
+ "5g5ItUK92u07DLsOyKaghAJkxuHrEnysgoUpeyodJ0G7CpGySCP1KTh9BXp6YWUZ"
+ "klugpR1Wv8NW44+cUi37GrgJD9473GxaFp2245iiWRetFFFvksHqNxh/BT++Wi0D"
+ "EyPKba0dDifSp+RfyIrrlaiFWQEyfFvoYPI1fJ6Xk8pXVW8A1lh9r63VyXBuDGbe"
+ "QCFXUERRGY3lirwR4Dml9RyTnr28L2UnmWoRbMFg31EEkF+DkX7FnIoGv2jyC5LM"
+ "JZJVMsjT7yS6mJ9Mc+8GLEo7tc93FDdOy5k8q5CvH9nel5yxz2z8cTDAWiJ62+E5"
+ "huxnv+VqeDfayqeZgPq9voF6+5XB8kfd1grZnNWH9VtksZ+IjKa2ARdocRp9bvs8"
+ "6BRwW/m+HKHIsTLtp8WQ2/F1HgaDqPBvgGgRmc9zp7PtcnlSyB6Bj5i/4n5E0GGF"
+ "e8J3xoKn1v9tG/ibO7/hdWsNWt1HUnTOcUdl4mgkWHAHxfjXfgG4PPFHr7OHJAAA"
+ "AABJRU5ErkJggg=="
+ icon_2x:
+ "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"
+ icon_3x:
+ "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"
+}
+
+targets {
+ nickname: "WhatsApp"
+ url: "https://web.whatsapp.com/send?text=%(escaped_url)"
+ icon:
+ "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAADNklEQVQ4EV1TW2hURxj+"
+ "ZnbPOZvdKGp0g7oxFxNbNg+NClIkaqBWqAV9qJRSXwoWWqJ9aEmRIK0+Ceqrl5eW"
+ "9MEHH2zFxkvTIChISyVoU9h4wSbajehmV9e9nj0zc2b6n2PigzP8c/nn/79//hvw"
+ "xjDGrDbSDBth7hmfbpJO0twwnvmUbok3xMEWGPTI4WMfcb4rsXJbpjSFZ14OURZF"
+ "R6IdbyV64EhnAha+ZozdXNALAUiZQeO44WboQn4Ul3PjKKsKDM1gMJptzmrsXfMx"
+ "NsbfeUmyn7Mo+/nVG61KmM+4ZUZOPf4BV/LXYJHVCIuALAUy4VBGEd/Cgc59GFjU"
+ "/1z4ot9xnHu8UqkkI8CRS4Xf8Ouz37Ft6WYc7DyABE/A8yWk74dkNEPDFzg9PYIs"
+ "ZlvsiD0UuM3jTvyjhuW1/5K9Qu5Z2LtqDzYvexebFq+HpwR8AlggCiqeeyWc/28U"
+ "4NhBX2uLcsY/eViZRrb+FHbEIj6HNhqGyPcVJJ/3YX4jq5gsZuB2uCt4nX8YPK/L"
+ "uXMQWqIsqhjLXQuD96g2i7ryIAikLhshBWdf+yg0XqAm645Ucj8nU/VYxIGirwbo"
+ "52Yv4m7pPr7p/hLrmjpI0MXbibUhSQJQRBRiWBGLFHCf0zdvdi/ugsNsKK1DH7+f"
+ "Oo6acnFmwwkMdw/iaO8hnOo7RvHZjaqsI9W0CosizS7hnOSu8kZaraTY2rKJgtYA"
+ "o5KYrmXx1Z1hXHoyhoHkFiRjK8AppWVZhVI+dqbeB/PwoFAo3GaZTMZOd6f/uPpy"
+ "fOO3t49S7jkBMypKCqLxkYq1Ym1zJyqqioniP9i1cjuO9R2GqHuDsUTsTDSdTi8h"
+ "yZZbhUkYbbDESiAvisTSYTH9W32CqfI0YtzGntQHONw3BC380fyL/E9BYpiUcjuZ"
+ "HP+rOIFkUxJJZzlGs2O4/vRP5BuFsBfWNKewu30HBpb3Q3nqYraU/aKrtSsXAJBP"
+ "6iwVikcdN0l996NoiNPG04+19o2rXWpCz2gKvRH671qlNhi4HCrOL9FisVizbXvr"
+ "3Nzc3Z6ennLAzz/Kr4wvjfcJJd6ja8lpcsZmZmament7q/N6r7f/AQ4stfnSawjA"
+ "AAAAAElFTkSuQmCC"
+ icon_2x:
+ "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"
+ icon_3x:
+ "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"
+}
+
+targets {
+ nickname: "Facebook"
+ url: "https://www.facebook.com/sharer/sharer.php?u=%(escaped_url)"
+ icon:
+ "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABTUlEQVQ4EWNkAALf2NmK"
+ "//7+FgKxiQWsbIxvNyzIfMAI0vz77+97xGpEqGP8z8TAqshEis1MjIwI/Qz/Gf+z"
+ "/BZiQRLByfRy1mKIDDBmEBHiYfj67SdDSOo8uFqCBqgqijLkJNoxMEJtZ2ZmgmsG"
+ "MQgaoKclBdb8+u0XhsyKlUAX/EIxANU4FCkIh5uTDcx48vwDhmaQBE4XqCmJMdhb"
+ "qjBoqUmADZCW4GdIjbZi+PDpO8PqzefBYiACpwsU5YQYgrz0GTRUxMGKxUR4wXwT"
+ "PVm4ZhADpwuePP/IsOvgDQYVBREGJXkRhrfvvzKcvfSY4cadl8QZcPXmcwYQjgsx"
+ "BRvw6Ol7hv5Z+1E0gzg4vYChEofAIDAAlKsYGBj/43AhHmHG/4x/WN+Bc4dX1Bx5"
+ "UMbAptrBSlVEVV5U+P2Hz9/WbL/8GKYGpHnbspSHALYfYb0Z1/IbAAAAAElFTkSu"
+ "QmCC"
+ icon_2x:
+ "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACshmLzAAACIUlEQVRYCWNgGGDACLPf"
+ "M266IcNfBhOG///hYjA5qtKMjP8Z/zOf3rYs7QLIXLBlEMv/n/n/n4GJqpbhMIyR"
+ "gfHvfxYWox2LUi9BLAT6nF6Wg9z0n+E/M+PfPyYgNsQBtA52kE1oAGglOPRpFuSs"
+ "LEwMzMyEjWdBcxhFXGUFEYaYIBMGRTkRBjERHgZGoCf//fvP8OzlR4bUkuVYzaaa"
+ "AwI99RiSoywZmJlQfc3ExMjAw82O1XKQIKpqnMrwSyjICjEkRVhgWI5fF0SWKg4I"
+ "9zNiYGFhJsY+DDVUiQJQCCCDd++/MrRO2sVw+/5rht+//yJLYbApdgAoM0lLCqAY"
+ "vPfILYZrt16giOHiUBwFoETHihb8n778wGUfhjjFDviPYSRpAmRFAR8PBzDRQdyO"
+ "LfFxc7ExCAlwwV3y588/BlyhQpYDGko8GTRVJeAWoDMi/I0ZQBgGjp+5z9DUvwPG"
+ "RaEpjgIU03BwXrz+hEOGSgURTtOhEi9ef8aphC4h8PIV7hAgKw1MnneIgYuTDewr"
+ "FmCN11Hth+LDrXuuMuw/dhsudu/hGzgbnUGWA+4/egs3B1uVC4rzqzefw9XgY9Al"
+ "CkYdMBoCoyFAOASA3SV8imghB7QSbCe4HAD11UDdJVpYhM1MkF2MDEynQXLgkhDU"
+ "UfSJmWH89z+DMazHgk0jNjGQ+t0Hb1kjy719//0BsJ57giwGY4N8DrJ829L0yzCx"
+ "AaUBa3eI2ze0RaUAAAAASUVORK5CYII="
+ icon_3x:
+ "iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAMKADAAQAAAABAAAAMAAAAADbN2wMAAACzklEQVRoBe1ZzU8TQRR/"
+ "s122pQtKs3rQRPyIB0yk0VANePHkxY+LGhWQAzE18WrCH0C8ezXx5EfUePBADBFP"
+ "ntEDIhJORkVThZYUdanU7oczTXZZujNhjLvTbbJzmdnfe33z+72Zt9npAMStuRlA"
+ "3ulPD909YiNzEGy7y4tHZozQqp2QH009yL9zOLkC6uTBnLbBVhxjFHtMuColUG7y"
+ "4Y33hJ/kkCSZjzp5wtUGSFomDDq8XQGR3TYOU0+PELhbfEOAx6GVhi0vQI5CtlNJ"
+ "GWQ5AYZhQvWPgXczP6umCMhsb4ezpw5DX7Yb9ndroLQlXMY2Zl/5XYOPiyUYuzXh"
+ "4qyBcAGEeH5oABSFPjXCFaqmFdipdbI4b8LpUTa5BPcwfD4HVy8cCy4gjiSsiHt7"
+ "dgEREHQTJmDk4nEg2yPoJkRApisNvYd2B829Hk9IDWR72OTXqzW493QaXs98huUV"
+ "HSzLqhPjfZUKEbBDU5nZfzY5CxMv55j2rQxCtlCnmmLymFsoMG08BiECJIldvHql"
+ "ysOT6SNEwD98GTCJsgxCBLAmDwJveQGBvoW0jAr54RO+xB7Yq/kwBxi93A/6mr8O"
+ "3s5/halXC44bsw9UQLq9DU4OHGRORjP0ZffQYPhSKFPxRjCyW+j78s9GrtTn6Aoo"
+ "/qISbgQjK2Cp2MIrUMNHy5XyWmOyqc+BFrFhWFBY+uGbaFtHCjrUpA8nQBF/wBHC"
+ "3lYs6dzn4kAFfMOFd+3mYy+X+nj0Sj9cOnfUhxNg/PYL+PCpRLXxgJGtAR7yxCcW"
+ "wJupsPziFQgrs7xx4xXgzVRYfvEKhJVZ3rjxCvBmKiy/eAXCyixv3I0VwJfIvD9q"
+ "th/+n8k9MLsCyA04uURuNrkt50doHd+nPXH83PMAub4/M3InRy6RvfewjuP/9OXV"
+ "yr43s4vUvx9s05qRENJ54pPME/LP71+f5/GPfURk4C+jh6kHrjxSFAAAAABJRU5E"
+ "rkJggg=="
+
+}
+
+targets {
+ nickname: "LinkedIn"
+ url: "http://www.linkedin.com/shareArticle?url=%(escaped_url)&title=%(escaped_title)"
+ icon:
+ "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAACQUlEQVQ4EX2Ty2oUURCG"
+ "/zqn50YaMxPIqAkGskhUjEEEo+DClQs3ikIexoUbH8OnUFBEd4HsJOLGpQHRTNTR"
+ "GDUGeqZPlX+1jtFocmj6Ul311V1w+9F8VLliJlPwE0L1OPSmChHppZBWMjdWCXfE"
+ "bBKCbbMkAukQUD8EYgbboO3dzD0L7KgJVk3xMIg0+X5dgCVAGI79y6EHiqcNMpV5"
+ "yKZamNkK3sV7OpO1w7DoWowLYshBX/89DiE/858iFk2kWz+BWRsWeQpxAopIFR4G"
+ "QRI9MnF/0srlv8AVgMIGE18qFf0gzN1sgdRP1NqifdN1abXlRiqeMrr813T8TwBI"
+ "p4KovtUQaqLoQctnarUnyIbj0GApWt+f0LTIOi2TeW4PICEJ0noq49NGo2wNQ5hH"
+ "wivkVx8Aj3N8kS5qaYjGZH9ssPG8KGsdpjy3B/A3r4hkdMFotYzVd28t1iZ0LrXq"
+ "yyo1YPfD/e/b02ux/fEli94Xtu3gqZFgZz63RC2ethBvsX43CV1Ett5AsB3W4Nu+"
+ "CKow/roVx14L1Jr0VGdkYF+aiHnVd2+dj8jBEYxQkdlU1t5D1nrf+QPA2mdqkpSK"
+ "kZqm48UbRelNrAaAIuqk1ohSYTNwMRhHYFFOsoo3imB1jtgpVrP9ojPzlfKLQMqr"
+ "wTNckCO7O0lxlsvUIdcy3yqFvReE82blLFmeXIfYAV1epnfOgbZZBzLkGuO5xOkf"
+ "YwMGImEz85XkVjFNOU6IO+LFzDwy/xitN7v8W0bX1Nx02x+dpgQ1I29TpAAAAABJ"
+ "RU5ErkJggg=="
+ icon_2x:
+ "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACshmLzAAAEiUlEQVRYCe1XTYhcRRCu"
+ "6n4zszO7IwkqhETcqBddNgjBv5uJeNmNoqgJrmfxJIFo2A2o8PCYuAcVFRIRRURQ"
+ "EEXzg5fVk7cQRdCIRoILYjaQuD8zm/fT5Vf95s2+NxMl2V3JJTW86e7q6qqvq6ur"
+ "u4muMbHabz43c9PChuU3KiSPp2zqRPI/wWKy4tox8efNiwN7Fw7vPB+oJTVumCZS"
+ "UjxF4x5fD09HrJaEUua6IZqATVXyDOpEOnMtu8TesAOYRXxLpMAyXldkrZXcpvdA"
+ "v9vdvJDMCNO3JFxnoSeZzShwVEmKHlo9jMwmkQfQdTtmKSJLktI0Hdr1aq5eXjz6"
+ "kbAcYRM8xJLanL+2MpuIX4KuIngaM/+FBusHuzytTO86WyX7HqfpHHF5SEluFY2y"
+ "NieIUv6Lwp0+Qor6ojg9LcwX1jsWygAMmkwbaPcn1aJxXzd0C9an2cdfI6MMAAGG"
+ "ldkWbG2+QhSu9O3/apQtv8CGN5PD5lhH6gRhR6NGOPOgGNlbnbxv1NGxk45tlcWN"
+ "wf13QyoDZXri0KWZAt2q2pfHiYJFRP/XzikDUDXAIMRNYtkOMLeTOA3NrSwSiNoX"
+ "aBWeRX8MxUyOLBkeZhhGkBLF8anUmrPQlKD/Niu0XSrYvUmUgez5LwPQGYgsOyfv"
+ "k0tfT+wAcqeTirhmIvQW1wbvddHfb5OYd8lJFqgcVCmNpwBwuObkZbLVPxKTtCmu"
+ "IaKXGnUXbFlMoinYHWMkk15vlAEoOqYI36/R9KM/52BjZR84foEs3OuC3+j3+R/p"
+ "0z0dv8MLk19/IJL+tHxofDYfk5cLRGeG9n92ejGoHwHIR7L1yXKAyqwEWj5CS8av"
+ "SKEAeScXa7lpqAAcefLijd/QwX7juYrF1544V4kkhHtnsVw525eXB1ASuYLG4Xvg"
+ "JHginAmyD4B7KJ4eO2VEfqAUyaZAfYKFviuv7hZrp46OV9ut74NW+09qHX+n8fwX"
+ "m0sKmCVh/g7B21YX51RwZc5aRTn85a0pVT4UNhthAOrl2Vaj0oKmfWVt9gyCMMLC"
+ "N3S3Ka3dAzvCwHLlQRPUNmKL6i4iDmoGET9CYVjWH7t5AOwE77oBGNHUc4c3nukE"
+ "CFSEanRupJGzfFnF1sVxW+SVERZ7rqKeWJ9ACiN8yqKbCxxfdQbuwRoVaF0AFPRd"
+ "dfU6gOseuLwHUhylBZKQ9TDAJkcGMxzRm+OXut3hnshRWpL3fUzp3A5C1itQklz6"
+ "l9NQUyN2hyYRkqGA6alk6hjeA7DLNsWJvAXG76II+iR9miZPVMhIC5hwH8Bx7OQx"
+ "HJMrlnBBQetOOtmcpAMn5jDGkg1im7iHcWI0MxBZOvapWJ9L+mJRDYBgYPZ+uGab"
+ "v4DqLY3xdiEZIFwqcJg9gLrejlQUHvEXlkE9i7oEAGhtwo5/CbwEcvCHw/VFYIP9"
+ "fVNtKmQPQN9qUDXRVaB85ht82zvH/6Hpc4j2rVxO867C4E4VKnlQkfil65FTm9oD"
+ "ITxO8VDEIfmxlcJJpRkz/zLDKppRzs/LnN9XFnSoLNCoDbWlNvvErwXjHyxByTmA"
+ "lpoMAAAAAElFTkSuQmCC"
+ icon_3x:
+ "iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAMKADAAQAAAABAAAAMAAAAADbN2wMAAAHdElEQVRoBe1a3W9URRQ/"
+ "Z2Y/uu3WpqmUr5YWlZq0gMqDqIQgiURFxMQoRgL6ZCQxGF/U8LYvRhN9MPHBPwBN"
+ "TDViCBACJEBIIIhg/EiIECyF8FE+DALd7ted42/u3V327t67QcRbSJh09+7MnLnz"
+ "+50zc865c0t0lxeu4h8e1slfu/pLxeJCYekjUolq353ww5gCM486TD/SgqsjtGqV"
+ "Y2F5BDK7Y/GJ/JCj1BsiZgWJ9KPjziJAlBdSp0Bis1H0FSXiv1NmaUlZFslcvt8h"
+ "flNE1qA6wMR3GngXJjPNEZK1yjFrLWbb6BIoCT2OjhVM0s0iaLafO7CIwZKRbnyt"
+ "sJgtQpeAt+ZpVihuUCcIQd7B8jIuNdtWXoFuPaovq2ChvjJminnzqgSTSTZiAEjm"
+ "CXxGSMlvJOY8s7u5HxDiecQyDQIKpBqH/q8tAqyekykTCJoN4JW6AoXvFTKbqCiH"
+ "KJEbo1IyHoup2WLMMuHYKzDpIFSig+4QRVs4AVZF7ItDIvpLaontpY+X5iqASkTn"
+ "6f2tI0pJAZZZB6Z9sE6lO9KruwcaZnTXt1wRI3soVTwAd1UFX5X99IXz2pS2w639"
+ "BAtMDnqACSZgN6eiMeA6RpnlV6ug634UY/nT4jh/oHncboXJKKGzsnBOi27UfC3K"
+ "6y1FCx5buFDbHOXvcAJGOigmnfTqcPgGbUm1wlRTQBbXqD2Rp6YQAvA7LFPZyGPU"
+ "k4KrDCjInYhzQ6LoUbjT1CThD9kDrl/ndiO8jBKJlymzYwYo2MjllofWb0vGD7Yv"
+ "UMyrwfQRr3VyLBDuRsUw4sDDAPmWyTq9tGHb/liRx6DtxIjWD2KDPytMSxEHOqMP"
+ "ZGVN4hJOwMqIxPE9V+lYL2LCMicBAkj0WEwvse5B3tTiX/tu5LYj6wqs44vWNXKu"
+ "XfHl9pet6F5uzqLNCdjch+gCwJ9VrBC0+D4XmVEXxTjwQNKDidstBqQWOfSfwYa+"
+ "CJKoWkkbHuBfjZkirOwytITzuJ5HamwD4QURhguGvJKUOGYqxvVDQTPRlvT2VXMi"
+ "4QQ8vz5mjPlOx9UuLhULLh3MjkhsEfew5teAc6mIgqcyx41DX8eU/AJS4GyFIGuQ"
+ "PTHNw3JcjfZuOIc95Dj7SNRRxxQuECfHKTdB1JpqIac4VbMeEKUWQwNPM2Ppgpp3"
+ "p+DvpgTwXHCGpLTT+ej5rRjuV8WGXV0shTlE+inrhaD5E6TMjtIny3+un8p8uPUM"
+ "rNBNmvJU4G8of+I4ffGutUR9OeZkhg9StnO/UiUESJAmGcLHtWe9sK2HE7C9iovE"
+ "MTuRH7ztS6aLlP2rAFDQtk21TRHPTK5xbLevpFov0tXxTeSYc/TZyhFfX30ls8oG"
+ "xaPmve1XVKKENFG/zRKeazU1j3tvwVNoUJm4Bi9V04HFDJdb0+D7eYlOz/6J0kdG"
+ "fa3NKp8/dy7GejMsuw/6y2NPBEo3t0DgkFtoxLOrO+rbfze2kEqeUNnCAVG8BPB7"
+ "gxZCNAQquDMZlaYn789nC/1ax5O5grlM7alTyHavV0R8V2TB5oPtR5Hx/gkHAAKN"
+ "JToCSD0SB9oGs0m1UqnkwiJJm4rrs2Z8YieeLXYQ0vNGeGgRc4oNYenZfXYjG6jI"
+ "RkfgSGtfKaHXIMtag+gwDRtfAU5eKzWAB+0CZXb/EPjc0Za6TNkCMgA46QCnU7sN"
+ "K6Ru/zUznNCkF8K/L8daRkBDCigWDyXhZeYjXVlCE6XukIlzcOV4JmF4w8aNHA2B"
+ "fLoDUXY+1nGfi6GSVlilIh1h1v2IIdODCVw0CIJZYUT6Rvw+Rxg8/ja0JkV1kFYA"
+ "aNoA2H9Hr94Bi3T4O2pqwjY22E9DicQCEtNxJH8pm94GhEQoVuJajE0cG8t0nOAg"
+ "IbGmmrwl5BRhfPsXsAaqkJv4E1ZYQa4XqkpXfkRigcpk/+Vat/Cqt7prCFQR1/24"
+ "R6BOIZFX71kgcpXXTXjPAnUKibx66xZI4fS9triBJjDa42wjbmX98rVjvVTZ11Kt"
+ "HD6MAKhCxzYJf8YG705kS320ftsU6inmaCLuhdLLeIWZp56S6BkQiruJsVAXIu10"
+ "yI5CVlxZyHW2XudrWmbgibMrNA7bPEhkJr3zfRfN0oXaeXC8n8a5zAxjVGtQMhdO"
+ "wKYe4vRi0jWc4rl0Ke6p12o6ZZCd6KkiziKE+IQYHJwwDWpH1klKP0OXylPhrOJv"
+ "SSspObNJ85B3uFCnTLxaMDgzwm1fV+mWQYy1J95ewXgcJbUZMU8ATPuNw4kbaYVH"
+ "AC+RYUUArHm96mWJaSRgiwFnkZ+9XXl4UkXxZrK5Fk1Dy0vIOHGk49O1reEVnD0a"
+ "qQNfxomnrjQGLYHYYhxwVVq9K+NQwX34scPLfQKs9oPiEgCOUbzAPInrAG7mv4FH"
+ "O/yI3S8dsKd8ZPzSvpp79tM4j9sMwQp4q0mlRnF6N2qHuxPa1/fQ9BbUcVJ2sxPa"
+ "4VEXF7x9vNxiMdvZvSXUkjxpxrMbldb2UPBFLOg+UA547Ro14Mp8WPN2ySgaxVHn"
+ "FjLORmprPWl7b6j7Lv1njwrFu/b6D/Xx2oFjOHBbAAAAAElFTkSuQmCC"
+}
+
+targets {
+ nickname: "Pinterest"
+ url: "http://pinterest.com/pin/create/button/?url=%(escaped_url)&description=%(escaped_title)"
+ icon:
+ "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAADLElEQVQ4EVVTW2iURxg9"
+ "M/9l/91t6kMSyY1cdL1AKwSCYryhT0Jb8ClYbUUELyilfW3VaPCCKHh7KbRQbV/E"
+ "PrWFFnwQjauktgT6Fom72ay7hjXJbtxNava/zYzf/CHFDgxzPd93vnNmGP7fWLol"
+ "1ZR02MdCYbdirBsMARQbk6H6TSTZk23j4wvvQtjyYrSvzxKV6n7OjZMQaq0MCSdl"
+ "dMw4BzNN0HjfD4PzW4uT6WVcFGC0D1ZYTh01DX6d+4EV2jbiqdWwmpsBRhRmy3An"
+ "crDcOoRllTzl79uSzz/SQZgaGuKjP9353GD4Tri+k+zvR+vxI4ivWwu/9ArS9xFr"
+ "b4NXKKJ06zbq9x9C2mZRSbVn44vsPyydSjXHBBsxgzCV2LEdXefOQnoepq5cgzuZ"
+ "A6RCrKsTnWdOg8Vs5AeH4D0chm+aP4Zh/QR3QvYJlyolE0nKfCyqNXviK0ghsGLn"
+ "TgRzr1ElQP7rU3Ao0MrP9sHnBqDUXps5bSYk2y1FgOT6biQ//ABTV28CIkTq25vg"
+ "lo36+Dhqj9IRG396BrGOdphNjQjL5bhgxjbODHRTNDAnBh534JVKsNvoUkMDwkoF"
+ "ITEAuaAdidwgX2miGdA+evQs0BZ5hQLcXB6tRw9DzNcilxafP0c9kwGn81hnF7nS"
+ "BH9mBkF5FswwwJkIuJDsmV4ElTkULlyCm50gmh1RgLBag1j4F4xsbSF9pOuiSuUo"
+ "Eplpe6Uxxp52rPrIsMzfiRCDZkVKt335BVqOHYE3NYXakxHEe3rwXu8GVP64h/zp"
+ "QXDPJ+kwnVRBL2/wFigkhmMUUZenszRs3YI6MSkSI5toi8U3KF68jPypQYDAJmlC"
+ "knxfb2ysEAT4u2fNDqrorgHVGsQT6H38ALU//0Lm4KHIVn0nespUikOJ6ko9VYYc"
+ "2JzNviQRgU2TmbSvxH4hReH91hYo+gezd38GTyT+6waBNUtPqpEQwacarLH0Ipba"
+ "D9W5/AHLeRxfvcoRi+66uV9+NTU93XUWCTVN3+sGM+Q3/blcYQm1dL48j8biwEB8"
+ "fna+fWEis53E7VJKUUKMJU17ZKa7ubxreDh8F/AWWDttEb+4tj4AAAAASUVORK5C"
+ "YII="
+ icon_2x:
+ "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"
+ icon_3x:
+ "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"
+ "QmCC"
+}
+
+targets {
+ nickname: "Twitter"
+ url: "https://twitter.com/intent/tweet?url=%(escaped_url)&text=%(escaped_title)"
+ icon:
+ "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAACCElEQVQ4EYVSTWtTQRQ9"
+ "d/JeW1LbUPxcGJ8oLmxNWhWKbmwRwSy6kvb9BwU34g/wP3QrLnRTW+lC/GhWxW7a"
+ "hUhMRJQiNM0TFRU1kqdt38v1zpjRF1vJhWHmnvsxZ85cwg42MhuMMOICE3k6TMxV"
+ "Qmqh5B8s/ZtOSeDUvVo+avI0g88lcXsm0JKj6OqzyWz5L9Y6Dc8FE4zmXWZO2+BO"
+ "OxGFipUvbB7quGFgbmZe7lRsGwqTBoPOVvxsxdFgi3b6SL+DMGK8D2ObiwkvjWv5"
+ "AXzbbOJBtYHnnzfw9ONGryRMyxpXJ+eDYfvm0b09mLlwAKP7uk2D7hThxund2NOT"
+ "wtF+F1eGMuh1VKs5j+laJ4rjQgtBSbq7inBzbD9eftnEm/oWuqSJtaAR4cm7H9ZF"
+ "FPNFh5g8YWDAw30udjm/CwYHuqBX0la/biVdEZA9y8cEirUQd1a/Q8RsS7TOUuJ2"
+ "iykZljXr6DItkui4zcqC3xcR24xpTTkpKibB5Q8/cetVPQlBF19f+dSGaUf0LJoH"
+ "5+bWF4X3+LGMi8uDGRyXt/e5Cm9FtGIQ4vbr+jZWUrhY9r3zpkF+fv0EIqyImPp/"
+ "O5oeJDg4U7506IUR0RwU+SbQodxMIdGUrtGpf36hNJl9pLtqav/rYWKSU5nKPrY5"
+ "5gnWsXtutpaTQIGIPY0xU1U+ZkHPvs2x+y+3rMbpBcjbwwAAAABJRU5ErkJggg=="
+ icon_2x:
+ "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACshmLzAAAEtUlEQVRYCbVXXUwcVRT+"
+ "7szusgIFXKB0EVmDVUIp25oS+Sv+JZpojWCQjdGYmBh98MW3vhgT44OaNhpffDBq"
+ "44N/AZEuRh6aGKulKWoIZUltjU0pC+zSEii/u+yys9dzJ8w4O+zMgsWTTO6553zn"
+ "595z75kZhv9Aj/zM3fML4UpJQSWTHVxBKlrqqY6cfZSt79Qd267BAz3TLSmmdDCO"
+ "Tg7UZrVjuELyIJPk06GuquGsGJMwZwINfeGHWBonOOdNJlvbKQMbBsPxUHf1OTug"
+ "ZQJtwbk9K4nYKVrtc3YOcuoYeotc+a+c7yhfyYbNmkBD32QNFPxABgeyGe1Uxhi7"
+ "xCX+zHiX75rZdksCIjhT2G8cvMwMvp05lWQOcDWFAvsmjH4k40RsO0uzgd0OLmKQ"
+ "z3IgOSBiGGNmJKDWnPN6I2A3eUri4HIy/pnRp14Cf2+4nU76r0alW2ZYV+gY5qAD"
+ "d7rwen0xxDi/ruBsJI5PLi/BJTE8XpWPM1MxxA1+aNXtYwHfkHDr0H1znND5TeaD"
+ "ljJ8P7GKn2biZpU+b6lw4+Oj5XBQMEFlbhm1JS4cqy6Axy2hf2INA9fXdLxg0lBj"
+ "tQpeLYH/u6km2p5mITDSodI8nGwuQ3dNoVGcwb/d6NGDGxVVhQ4kaNV30+gvdRlV"
+ "gm851DP1oGDUBHganWJiprVUWnX+1hEPPn14L+4rdmZAhHNv/r+bmKGkSaFTwrdX"
+ "VzA2nzSrwBnvEEI1AdoUdWJGidpp1LTXjb4nvPjysQq8sL8QjeV58FECdvTnrSSG"
+ "ZrO/Hui8qYt2PDnI86ZXw3XZHP0SjaPe46Jgbl3tp7KIZzu0lKRqWxFjdd093OWI"
+ "Jma9Vph3GktRkS9bqXPKo7GUNYZzdlWOeiWk0pVWqB/Da3Bunm4rjJ38j5sJOzV1"
+ "+7RXYlQMK9TnV5Zx4Yb1FbSyE/Ik3YDhG9nrb7STIEsRo8DIiyb0/ugtuserUKzz"
+ "NJrofD/ZLG/YnAFCOhUpIu1XvFHdKgsjuuExXwFkpjfNLKhMUYyu7ynaPVti9GlT"
+ "441KvQGWFK9LK/DlxQ28+fs8hNPt0nu0a9GYYgun8JdGGtnGZh9A0A49GI7hqcGI"
+ "uqp0jlJ88dcygqbWa+FbjakmwDizTeDeIifeaCjBy7V7IFmUQpyRj8YX8WFo0SJe"
+ "pliWcFpI9ML6eyaH6Dq0abBKuv8v3V+Ep335KHbZ94KRuXW8S9v+99KGZm470sfJ"
+ "UChQ3S5AegKHe2daFZ46b7asK3FSEgVq96u4Q0YeHUrxyr0ZV3BxPoEz0zFcW7Zp"
+ "OGaHNHdAbh0NVF0QKj0BMaFvgm+oLTwv+P+LaPVf0+pf1Pxrh1Cde7j7VTAW0pS7"
+ "P7IxqudrRr8ZOyAUh/uj9ygbSfFTUWEE7gI/65CdzaNdlZNGXxk7IBQXn/VeJ2DT"
+ "7u4EG8sWXMTbkoAQiixZkatV1EvMb4sYvmLFrjbzyjWfW0qgKbTR3zfdDCV9kj7Z"
+ "jmqy7YzUXc9Bko7n+kfMmYAWrKFn8gg1oU7qNx2c4SDofa7p1FH0dmCcniDpguMB"
+ "30iG3mKS6cQCZBbT77ljYWFmH1O4+i3BZRbxeO6apd/znTUEcvwPdVaTvKq4RdgA"
+ "AAAASUVORK5CYII="
+ icon_3x:
+ "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"
+ "bf8DF/dxzoUTKEwAAAAASUVORK5CYII="
+}
+
+targets {
+ nickname: "Vkontakte"
+ url: "http://vkontakte.ru/share.php?url=%(escaped_url)"
+ icon:
+ "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAACTklEQVQ4EY1TTWgTURD+"
+ "9r23SRO7gWJtqdWKHipYg2ALShBBtAcpHjyUUpFcFG8iIsWr51z0qhcPEdR4ESGV"
+ "ghRUQov40xpDWn9am1grtv5Lmia7b523m10qmOAXlszsm/nmezOzGgiDl1KB0qrV"
+ "B7NqKL8ReFBIyzQ/pBPxvIrTBs+nQmW+dg2cn2SMw6ZfI2jQIKX1w7LNs6OJeFIb"
+ "uJiMMfCMbUvAbpzsEXMRgGlWpmT5234GMEOjyv9KrkdnS4t0aE16aFtAMEllmRtq"
+ "SenwcMagC0a2DUu6Z6ZFCglM00DHBFeu8MxQUGDocNQJuDE2jUO923H84C7cn3yN"
+ "O+M5DMS60d3Viuy7T3g4VSQFLhwCIkWpXMWWTRHs69mK4uefeL/0HZ3kd2w06N/A"
+ "6WN9CDfpeJpfhBLNawyOGMVlWTZuPsiiXDExdGQ39u7scEq0GCE/+RadZ14WILif"
+ "Bt8SdOeZhRXcfZRHe0szTvTvcQhi0S6oR/VgtrBMPZG+fBXgEyhHkK7U+Cs8nl5Q"
+ "roP5pa+YyLpVLwwfcJSZROLB6YHnaNSMNbrC5dsZPJ9dRM+Odjyb+YjJXBHD/VF0"
+ "tkbQRuow/4VS3On8RaCIGNNQqVoYnXiDsSdv1bxpX4Hr6RfOhJQtuKBtdMsKKaXG"
+ "1RjWQSkJ6LRc68C8ttfeUQYLhiO2AEdBmtXftJ7NasP+B0wPolIuzSG3vOqUPjqS"
+ "jJOKc3StsLdhdYlIHSXNyYocSV+J533tvWeu6m2bN4T0klHvE6hxruBe4tQvr8Af"
+ "4aHXugdzpJQAAAAASUVORK5CYII="
+ icon_2x:
+ "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAA"
+ "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
+ "AAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACshmLzAAAEgUlEQVRYCcVXWUxcVRj+"
+ "7rkzw7ANA3TCUiNIbdJSsRqxPkiLKXVJFO2LNqlLtUmNr4YH06QmJkZflPhiWhMe"
+ "GtSk0cY02lobU9oS29JQTDQ20IIBRKagwGDZZpi7+f9nem/ubCiRqX8y3HPOv33n"
+ "3y4X+J9Jcft/5s3ObYpX3WdZ1hY6F27ef19by0JVL+kajp5uf/E3254D4Om2z15X"
+ "vWq7ItQiAmDz1/SpKAKmro3CMF4+2f7KRTYuAbS2ff4wVHRDEfmWaayp01RjqscH"
+ "XYv3C0ttPtm+dzoRZmG9JjzenDtnMIYeh+r11puKvov3EgAFvD5XYWcnmUmp53O7"
+ "0OxnZtkcnFqwPG4AOXCxsklFUWSl3/Gbp8KSYUg9ZGiGYcpjXjNKVU1gNU0Lupng"
+ "SQHmCUE/p6NhkIy7phRisUwmSgPAI8DnFaiuLJFKgrQXonFMzMyD7OLuihI89chG"
+ "lBb7ZRPPLS7jzJUhjEz8JUGYZKCirBDF+XkgGGD9xZiGPyILmfwjDYBJtwsFi/Hu"
+ "gV0oyveBcoXZ+Sje7ujCyM1ZLGsG6taX4f4NFY5BjsrhE700VARKA368s38nKsuL"
+ "QP4hKDL9I1M41HHWkXcv0uLCoQpPz2Pw9xl4PSo8FPpQsBBPbrtX6o3/eQunL99w"
+ "23DWmmHg0YYa1FQGkef1IM/nkTb6roeh6ZkHXBoAno06CX/9w4BTB+yhpbEO91SV"
+ "gm8bXdYcp7zgqHDey0sK8GzTpiTeL8OT+PbyIF1ETTq3N+kAiMM3//nXSfQOjNty"
+ "CBT6sfeJBkoJpZ7/uEinmzPo5x/bgvWhgMOJzEXxyYmrWIprUs9huBYZATCfb/rl"
+ "uWuIxXVHvGlrLfbsbMCmmpBzxou7QiXYvX0zWl2355B3fHMVQ+OUytsdlKR0e5NW"
+ "hLYQ535gdApnegaxu1lOTVnRB55rpHAnt+H2rTXY8UCtrSqfnPeuH4dlLSQxUjZZ"
+ "I8Byggryi/PXMDoxm6SW2tOpKWHhqvKAjEy24rMNrgiAh0vkVhRHqMWWqJdXIvfg"
+ "YbnaqiAOvdos54amJ0fMbWdFACzo86r4aWgSH391Jake3EaGwxEcPPK9TJn7vK66"
+ "DG+9tAMVpYWyS9w8e/2PAFiQQZyjfL7feQHsLJWuj02jp38cHxy7mJauDTS09rc+"
+ "RCo81NMpaxGminJr9g6EcWNsBo2bq/HgxmqsCxZIsT5q14I8L25Oz+G9zm7sabkP"
+ "VesCspNYIDw1RwWc+a7/GgAbYhALsTi6+oZxln42ca1w1zDxFP3w2CU5K7gu+N5c"
+ "pNlacVUA2AG/XAQByUYMRhXZ+al6meOSKpXDfQKAlfjvOId+0kxbVmKeJwAoSixN"
+ "IqcHlEbFXGIXEgAVSw9/NNwpsuhFQxB6HQAC1lH+YuGPhtwSdYvPD9PQvtNjkW72"
+ "5bxXW9s+baJeOiyEpyHRPGsLRSFXJn11WZZ5CprxxqmP9oWTAPCm5WBnuV9THqcE"
+ "1Vum5aH+zTy+VolN4YoTYtE0zL6CMf/548dfiK/SRO7E/wbLA4wm9K/NvgAAAABJ"
+ "RU5ErkJggg=="
+ icon_3x:
+ "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"
+ "gg=="
+}
+
+## Temporary versions of the sharing targets per locale.
+
+locale_mapping {
+ locale_keys: "US"
+ locale_keys: "CA"
+ targets: "Facebook"
+ targets: "Twitter"
+ targets: "reddit"
+ targets: "LinkedIn"
+ targets: "Pinterest"
+}
+
+locale_mapping {
+ locale_keys: "JP"
+ locale_keys: "KR"
+ targets: "Twitter"
+ targets: "Facebook"
+}
+
+locale_mapping {
+ locale_keys: "IN"
+ targets: "WhatsApp"
+ targets: "Facebook"
+ targets: "LinkedIn"
+ targets: "Twitter"
+}
+
+locale_mapping {
+ locale_keys: "BR"
+ targets: "Facebook"
+ targets: "WhatsApp"
+ targets: "LinkedIn"
+ targets: "Twitter"
+}
+
+locale_mapping {
+ locale_keys: "GB"
+ targets: "Facebook"
+ targets: "Twitter"
+ targets: "LinkedIn"
+ targets: "WhatsApp"
+}
+
+locale_mapping {
+ locale_keys: "FR"
+ targets: "Facebook"
+ targets: "Twitter"
+ targets: "LinkedIn"
+
+}
+locale_mapping {
+ locale_keys: "RU"
+ targets: "Vkontakte"
+ targets: "Facebook"
+ targets: "WhatsApp"
+ targets: "Twitter"
+ targets: "LinkedIn"
+}
+
+locale_mapping {
+ locale_keys: "GLOBAL"
+ targets: "Facebook"
+ targets: "WhatsApp"
+ targets: "Twitter"
+ targets: "LinkedIn"
+}
+
+locale_mapping {
+ locale_keys: "ALL"
+ targets: "Facebook"
+ targets: "LinkedIn"
+ targets: "Pinterest"
+ targets: "reddit"
+ targets: "Twitter"
+ targets: "Vkontakte"
+ targets: "WhatsApp"
+}
+
diff --git a/chromium/chrome/browser/share/core/share_targets.cc b/chromium/chrome/browser/share/core/share_targets.cc
new file mode 100644
index 00000000000..d19790914b0
--- /dev/null
+++ b/chromium/chrome/browser/share/core/share_targets.cc
@@ -0,0 +1,167 @@
+// Copyright 2021 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/share/core/share_targets.h"
+
+#include <string>
+
+#include "base/check_op.h"
+#include "base/files/file_util.h"
+#include "base/memory/singleton.h"
+#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/share/core/share_targets_observer.h"
+#include "chrome/browser/share/proto/share_target.pb.h"
+#include "chrome/grit/browser_resources.h"
+#include "components/country_codes/country_codes.h"
+#include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h"
+#include "ui/base/resource/resource_bundle.h"
+
+namespace sharing {
+
+using base::AutoLock;
+
+static const char GLOBAL[] = "GLOBAL";
+
+// Our Singleton needs to populate itself when first constructed.
+// This is left out of the constructor to make testing simpler.
+struct ShareTargetsSingletonTrait
+ : public base::DefaultSingletonTraits<ShareTargets> {
+ static ShareTargets* New() {
+ ShareTargets* instance = new ShareTargets();
+ instance->PopulateFromResourceBundle();
+ return instance;
+ }
+};
+
+// --- ShareTargets methods ---
+
+// static
+ShareTargets* ShareTargets::GetInstance() {
+ return base::Singleton<ShareTargets, ShareTargetsSingletonTrait>::get();
+}
+
+ShareTargets::ShareTargets() = default;
+
+ShareTargets::~ShareTargets() {
+ AutoLock lock(lock_); // DCHECK fail if the lock is held.
+}
+
+void ShareTargets::RecordUpdateMetrics(UpdateResult result, UpdateOrigin src) {
+ lock_.AssertAcquired();
+
+ // src_name should be "ResourceBundle" or "DynamicUpdate".
+ if (src == UpdateOrigin::DYNAMIC_UPDATE) {
+ UMA_HISTOGRAM_ENUMERATION("Sharing.ShareTargetUpdate.DynamicUpdateResult",
+ result);
+ if (result == UpdateResult::SUCCESS) {
+ UMA_HISTOGRAM_COUNTS_1000(
+ "Sharing.ShareTargetUpdate.DynamicUpdateVersion",
+ targets_->version_id());
+ }
+ } else if (src == UpdateOrigin::RESOURCE_BUNDLE) {
+ UMA_HISTOGRAM_ENUMERATION("Sharing.ShareTargetUpdate.ResourceBundleResult",
+ result);
+ }
+}
+
+void ShareTargets::PopulateFromDynamicUpdate(const std::string& binary_pb) {
+ AutoLock lock(lock_);
+ UpdateResult result = PopulateFromBinaryPb(binary_pb);
+ RecordUpdateMetrics(result, UpdateOrigin::DYNAMIC_UPDATE);
+}
+
+void ShareTargets::PopulateFromResourceBundle() {
+ AutoLock lock(lock_);
+
+ ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
+ std::string binary_pb =
+ bundle.LoadDataResourceString(IDR_DESKTOP_SHARING_HUB_PB);
+ UpdateResult result = PopulateFromBinaryPb(binary_pb);
+ RecordUpdateMetrics(result, UpdateOrigin::RESOURCE_BUNDLE);
+}
+
+ShareTargets::UpdateResult ShareTargets::PopulateFromBinaryPb(
+ const std::string& binary_pb) {
+ lock_.AssertAcquired();
+
+ // Parse the proto and do some validation on it.
+ if (binary_pb.empty()) {
+ return UpdateResult::FAILED_EMPTY;
+ }
+
+ std::unique_ptr<mojom::MapLocaleTargets> new_targets(
+ new mojom::MapLocaleTargets);
+
+ if (!new_targets->ParseFromString(binary_pb)) {
+ return UpdateResult::FAILED_PROTO_PARSE;
+ }
+
+ // Compare against existing targets, if we have one.
+ if (targets_) {
+ // If versions are equal, we skip the update but it's not really
+ // a failure.
+ if (new_targets->version_id() == targets_->version_id())
+ return UpdateResult::SKIPPED_VERSION_CHECK_EQUAL;
+
+ // Check that version number increases
+ if (new_targets->version_id() <= targets_->version_id())
+ return UpdateResult::FAILED_VERSION_CHECK;
+ }
+
+ // Looks good. Update our internal list.
+ SwapTargetsLocked(new_targets);
+ NotifyShareTargetUpdated();
+ return UpdateResult::SUCCESS;
+}
+
+void ShareTargets::SwapTargetsLocked(
+ std::unique_ptr<mojom::MapLocaleTargets>& new_targets) {
+ lock_.AssertAcquired();
+ targets_.swap(new_targets);
+}
+
+void ShareTargets::AddObserver(ShareTargetsObserver* observer) {
+ observers_.AddObserver(observer);
+ if (targets_) {
+ NotifyObserver(observer);
+ }
+}
+
+void ShareTargets::RemoveObserver(ShareTargetsObserver* observer) {
+ observers_.RemoveObserver(observer);
+}
+
+std::string ShareTargets::GetCountryStringFromID(int countryID) {
+ // Decode the country code string from the provided integer.
+ unsigned char mask = 0xFF;
+ char c2 = static_cast<char>(mask & countryID);
+ char c1 = static_cast<char>(countryID >> 8);
+ return std::string() + static_cast<char>(toupper(c1)) +
+ static_cast<char>(toupper(c2));
+}
+
+void ShareTargets::NotifyObserver(ShareTargetsObserver* observer) {
+ std::string locale =
+ GetCountryStringFromID(country_codes::GetCurrentCountryID());
+
+ auto it = targets_->map_target_locale_map().find(locale);
+
+ if (it == targets_->map_target_locale_map().end()) {
+ it = targets_->map_target_locale_map().find(GLOBAL);
+ }
+ std::unique_ptr<mojom::ShareTargets> to_return(new mojom::ShareTargets());
+ to_return->CopyFrom(it->second);
+ observer->OnShareTargetsUpdated(std::move(to_return));
+}
+
+void ShareTargets::NotifyShareTargetUpdated() {
+ if (!targets_)
+ return;
+ for (ShareTargetsObserver& observer : observers_) {
+ NotifyObserver(&observer);
+ }
+}
+
+} // namespace sharing
diff --git a/chromium/chrome/browser/share/core/share_targets.h b/chromium/chrome/browser/share/core/share_targets.h
new file mode 100644
index 00000000000..c5e547135aa
--- /dev/null
+++ b/chromium/chrome/browser/share/core/share_targets.h
@@ -0,0 +1,101 @@
+// Copyright 2021 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.
+
+#ifndef CHROME_BROWSER_SHARE_CORE_SHARE_TARGETS_H_
+#define CHROME_BROWSER_SHARE_CORE_SHARE_TARGETS_H_
+
+#include "chrome/browser/share/proto/share_target.pb.h"
+
+#include "base/observer_list.h"
+#include "base/synchronization/lock.h"
+
+namespace sharing {
+
+struct ShareTargetsSingletonTrait;
+class ShareTargetsObserver;
+
+class ShareTargets {
+ public:
+ ShareTargets(const ShareTargets&) = delete;
+ ShareTargets& operator=(const ShareTargets&) = delete;
+ virtual ~ShareTargets();
+
+ static ShareTargets* GetInstance(); // Singleton
+
+ // Update the internal list from a binary proto fetched from the network.
+ // Same integrity checks apply. This can be called multiple times with new
+ // protos.
+ void PopulateFromDynamicUpdate(const std::string& binary_pb);
+
+ // Observers -----------------------------------------------------------------
+
+ // Adds/Removes an Observer.
+ void AddObserver(ShareTargetsObserver* observer);
+ void RemoveObserver(ShareTargetsObserver* observer);
+
+ protected:
+ // Creator must call one of Populate* before calling other methods.
+ ShareTargets();
+
+ // Used in metrics, do not reorder.
+ enum class UpdateResult {
+ SUCCESS = 1,
+ FAILED_EMPTY = 2,
+ FAILED_PROTO_PARSE = 3,
+ FAILED_VERSION_CHECK = 4,
+ SKIPPED_VERSION_CHECK_EQUAL = 5,
+ kMaxValue = 5,
+ };
+
+ // Used in metrics, do not reorder.
+ enum class UpdateOrigin {
+ RESOURCE_BUNDLE = 1,
+ DYNAMIC_UPDATE = 2,
+ };
+
+ // Visible for testing.
+ std::string GetCountryStringFromID(int countryID);
+
+ private:
+ // Read data from an serialized protobuf and update the internal list
+ // only if it passes integrity checks.
+ UpdateResult PopulateFromBinaryPb(const std::string& binary_pb);
+
+ // Read data from the main ResourceBundle. This updates the internal list
+ // only if the data passes integrity checks. This is normally called once
+ // after construction.
+ void PopulateFromResourceBundle();
+
+ // Record the result of an update attempt.
+ virtual void RecordUpdateMetrics(UpdateResult result, UpdateOrigin src_name);
+
+ // Swap in a different targets. This will rebuild file_type_by_ext_ index.
+ void SwapTargetsLocked(std::unique_ptr<mojom::MapLocaleTargets>& new_targets);
+
+ // The latest targets we've committed. Starts out null.
+ // Protected by lock_.
+ std::unique_ptr<mojom::MapLocaleTargets> targets_;
+
+ mutable base::Lock lock_;
+
+ // Observers ----------------------------------------------------------------
+
+ // Notify all ShareTargetsObservers registered that the ShareTargets have been
+ // updated.
+ void NotifyObserver(ShareTargetsObserver* observer);
+ void NotifyShareTargetUpdated();
+
+ base::ObserverList<ShareTargetsObserver>::Unchecked observers_;
+
+ FRIEND_TEST_ALL_PREFIXES(ShareTargetsTest, UnpackResourceBundle);
+ FRIEND_TEST_ALL_PREFIXES(ShareTargetsTest, BadProto);
+ FRIEND_TEST_ALL_PREFIXES(ShareTargetsTest, BadUpdateFromExisting);
+ FRIEND_TEST_ALL_PREFIXES(ShareTargetsTest, CountryCodeMatches);
+
+ friend struct ShareTargetsSingletonTrait;
+};
+
+} // namespace sharing
+
+#endif // CHROME_BROWSER_SHARE_CORE_SHARE_TARGETS_H_
diff --git a/chromium/chrome/browser/share/core/share_targets_observer.h b/chromium/chrome/browser/share/core/share_targets_observer.h
new file mode 100644
index 00000000000..213c3fb87f2
--- /dev/null
+++ b/chromium/chrome/browser/share/core/share_targets_observer.h
@@ -0,0 +1,27 @@
+// Copyright 2021 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.
+
+#ifndef CHROME_BROWSER_SHARE_CORE_SHARE_TARGETS_OBSERVER_H_
+#define CHROME_BROWSER_SHARE_CORE_SHARE_TARGETS_OBSERVER_H_
+
+#include "chrome/browser/share/proto/share_target.pb.h"
+
+namespace sharing {
+
+class ShareTargetsObserver {
+ public:
+ ShareTargetsObserver() = default;
+ virtual ~ShareTargetsObserver() = default;
+
+ ShareTargetsObserver(const ShareTargetsObserver& other) = delete;
+ ShareTargetsObserver& operator=(const ShareTargetsObserver& other) = delete;
+
+ // Called when the data model is updated
+ virtual void OnShareTargetsUpdated(
+ std::unique_ptr<mojom::ShareTargets> ShareTarget) {}
+};
+
+} // namespace sharing
+
+#endif // CHROME_BROWSER_SHARE_CORE_SHARE_TARGETS_OBSERVER_H_
diff --git a/chromium/chrome/browser/share/core/share_targets_unittest.cc b/chromium/chrome/browser/share/core/share_targets_unittest.cc
new file mode 100644
index 00000000000..4b0b576c352
--- /dev/null
+++ b/chromium/chrome/browser/share/core/share_targets_unittest.cc
@@ -0,0 +1,85 @@
+// Copyright 2021 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/share/core/share_targets.h"
+
+#include <string.h>
+
+#include <memory>
+
+#include "base/files/file_path.h"
+#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
+#include "components/country_codes/country_codes.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::NiceMock;
+
+namespace sharing {
+
+class MockShareTargets : public ShareTargets {
+ public:
+ MockShareTargets() = default;
+ ~MockShareTargets() override = default;
+
+ MOCK_METHOD2(RecordUpdateMetrics, void(UpdateResult, UpdateOrigin));
+};
+
+class ShareTargetsTest : public testing::Test {
+ protected:
+ ShareTargetsTest() = default;
+ ~ShareTargetsTest() override = default;
+
+ protected:
+ NiceMock<MockShareTargets> targets_;
+};
+
+TEST_F(ShareTargetsTest, UnpackResourceBundle) {
+ EXPECT_CALL(targets_,
+ RecordUpdateMetrics(ShareTargets::UpdateResult::SUCCESS,
+ ShareTargets::UpdateOrigin::RESOURCE_BUNDLE));
+ targets_.PopulateFromResourceBundle();
+}
+
+TEST_F(ShareTargetsTest, BadProto) {
+ base::AutoLock lock(targets_.lock_);
+ EXPECT_EQ(ShareTargets::UpdateResult::FAILED_EMPTY,
+ targets_.PopulateFromBinaryPb(std::string()));
+
+ EXPECT_EQ(ShareTargets::UpdateResult::FAILED_PROTO_PARSE,
+ targets_.PopulateFromBinaryPb("foobar"));
+}
+
+TEST_F(ShareTargetsTest, BadUpdateFromExisting) {
+ base::AutoLock lock(targets_.lock_);
+ // Make a minimum viable config.
+ mojom::MapLocaleTargets mlt;
+ mlt.set_version_id(2);
+ EXPECT_EQ(ShareTargets::UpdateResult::SUCCESS,
+ targets_.PopulateFromBinaryPb(mlt.SerializeAsString()));
+
+ // Can't update to the same version.
+ EXPECT_EQ(ShareTargets::UpdateResult::SKIPPED_VERSION_CHECK_EQUAL,
+ targets_.PopulateFromBinaryPb(mlt.SerializeAsString()));
+
+ // Can't update to an older version.
+ mlt.set_version_id(1);
+ EXPECT_EQ(ShareTargets::UpdateResult::FAILED_VERSION_CHECK,
+ targets_.PopulateFromBinaryPb(mlt.SerializeAsString()));
+}
+
+TEST_F(ShareTargetsTest, CountryCodeMatches) {
+ EXPECT_EQ("US", targets_.GetCountryStringFromID(
+ country_codes::CountryStringToCountryID("US")));
+ EXPECT_EQ("CA", targets_.GetCountryStringFromID(
+ country_codes::CountryStringToCountryID("CA")));
+ EXPECT_EQ("RU", targets_.GetCountryStringFromID(
+ country_codes::CountryStringToCountryID("RU")));
+ EXPECT_EQ("JP", targets_.GetCountryStringFromID(
+ country_codes::CountryStringToCountryID("JP")));
+ EXPECT_NE("JP", targets_.GetCountryStringFromID(
+ country_codes::CountryStringToCountryID("US")));
+}
+} // namespace sharing
diff --git a/chromium/chrome/browser/share/proto/BUILD.gn b/chromium/chrome/browser/share/proto/BUILD.gn
index c1982c31f51..288b12b5cbf 100644
--- a/chromium/chrome/browser/share/proto/BUILD.gn
+++ b/chromium/chrome/browser/share/proto/BUILD.gn
@@ -5,5 +5,10 @@
import("//third_party/protobuf/proto_library.gni")
proto_library("proto") {
- sources = [ "share_history_message.proto" ]
+ sources = [
+ "share_history_message.proto",
+ "share_ranking_message.proto",
+ "share_target.proto",
+ ]
+ cc_generator_options = "lite=true:"
}
diff --git a/chromium/chrome/browser/share/proto/share_history_message.proto b/chromium/chrome/browser/share/proto/share_history_message.proto
new file mode 100644
index 00000000000..188514f629f
--- /dev/null
+++ b/chromium/chrome/browser/share/proto/share_history_message.proto
@@ -0,0 +1,40 @@
+// Copyright 2021 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.
+
+syntax = "proto3";
+
+package sharing.mojom;
+
+option optimize_for = LITE_RUNTIME;
+
+message Target {
+ string component_name = 1;
+}
+
+message ShareHistory {
+ // There are at most WINDOW entries in this list, representing days within
+ // the last WINDOW days for which there is any history.
+ repeated DayShareHistory day_histories = 1;
+}
+
+message DayShareHistory {
+ // Which day this DayShareHistory is for. This is needed in case the app
+ // isn't run for >1 day - we can't always rely on the WINDOW entries
+ // being the most recent WINDOW days.
+ //
+ // This is stored as a number of days since the Unix epoch, and a day in this
+ // context runs from UTC midnight to UTC midnight.
+ int32 day = 1;
+
+ // All of the apps that were shared to on this day.
+ repeated TargetShareHistory target_histories = 2;
+}
+
+message TargetShareHistory {
+ // The actual target is identified by a component name.
+ Target target = 1;
+
+ // How many shares this target received.
+ int32 count = 2;
+}
diff --git a/chromium/chrome/browser/share/proto/share_ranking_message.proto b/chromium/chrome/browser/share/proto/share_ranking_message.proto
new file mode 100644
index 00000000000..5ec3d189baa
--- /dev/null
+++ b/chromium/chrome/browser/share/proto/share_ranking_message.proto
@@ -0,0 +1,16 @@
+// Copyright 2021 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.
+
+syntax = "proto3";
+
+package sharing.proto;
+
+option optimize_for = LITE_RUNTIME;
+
+// A ShareRanking represents an ordered list of share targets for a specific
+// share type. There is a ShareRanking for text shares, a ShareRanking for image
+// shares, and so on.
+message ShareRanking {
+ repeated string targets = 1;
+}
diff --git a/chromium/chrome/browser/share/proto/share_target.proto b/chromium/chrome/browser/share/proto/share_target.proto
new file mode 100644
index 00000000000..cd781c93c9d
--- /dev/null
+++ b/chromium/chrome/browser/share/proto/share_target.proto
@@ -0,0 +1,46 @@
+// Copyright 2021 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.
+
+syntax = "proto3";
+
+package sharing.mojom;
+
+option optimize_for = LITE_RUNTIME;
+
+// An identical copy of this proto is maintained in the server code base.
+message ShareTarget {
+ string nickname = 1; // share target nickname , eg "reddit"
+ string url =
+ 2; // string share API, e.g.
+ // 'http://reddit.com/submit?url=%(escaped_url)s&title=%(escaped_title)s'
+ string icon = 3; // target icon as an base64 png at 1x resolution
+ string icon_2x = 4; // target icon at 2x resolution.
+ string icon_3x = 5; // target icon at 3x resolution.
+}
+
+message ShareTargets {
+ repeated ShareTarget targets = 1; // Share targets for the above locale
+}
+
+message MapLocaleTargets {
+ map<string, ShareTargets> map_target_locale_map = 1;
+ uint32 version_id = 2;
+}
+
+// Intermediary types to store targets per locale for build time.
+
+message TmpShareTargetMap {
+ map<string, ShareTarget> all_targets = 1;
+}
+
+message ShareTargetLocalesForParsing {
+ repeated string targets = 1;
+ repeated string locale_keys = 2;
+}
+
+message TargetLocalesForParsing {
+ repeated ShareTarget targets = 1;
+ repeated ShareTargetLocalesForParsing locale_mapping = 2;
+ uint32 version_id = 3;
+}