diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-10-26 13:57:00 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-11-02 11:31:01 +0000 |
commit | 1943b3c2a1dcee36c233724fc4ee7613d71b9cf6 (patch) | |
tree | 8c1b5f12357025c197da5427ae02cfdc2f3570d6 /chromium/chrome/browser/share | |
parent | 21ba0c5d4bf8fba15dddd97cd693bad2358b77fd (diff) | |
download | qtwebengine-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')
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: + "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAA" + "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC" + "AAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACshmLzAAAGGUlEQVRYCc1Xa2xURRT+" + "7nYXedUWWgIFedgU00YpDZoQqEAtFgIFxICIBhHji4ckhEQNRmKjxpAYg0ZNAKMR" + "jZEoPlDABCz2IQ2BJg0SBWppS1NoSx+8ath2uzt+587O3rvbpaz+0UOmd/bMmfOd" + "850zcy/AfyzWP8FX85ANhQKOxdyXxzGaIwQLF6A8J6BCPyAJR61DaEjU7y0DUPfC" + "h1QUE+QZjvvhQQoDgD3cKI6nVqqP9Cns8h1Gudsk3tzZFmdVFWIaAd/imE9wDSrg" + "A4nYadtecrMHfXjNKkPjzbbcNACCryGdbxM8nY7+nSRxWxD13L/WKsXheE7iBqDm" + "Yj2B32Mm3n5Ux/MSqzMsiXcPh8LlYBCrvaXYH2vaLwBVgCdZ9Y8I7ksIXMDESx+H" + "YWqwjzov0HsDZFGvA11cX2b9jDJqIhIVAMHzCHuEDkckBB6gn/ylwEPrgaZaoK4a" + "6L4CrHgRGDwM2P4ccPa4DkKYCKIWPSiwKtFiIhC1LQT38t82UpYYuOyS7HPnAEe/" + "Baq+A0ZMAB59GZgyE5g8FZj7hMOKsJOEu3AbXuG2SOKRAAheTPB5ERoF4FYyiFUa" + "ORao+QU4UQp89jrw4UaolvNAZxtQfcgFRWcSsMXmfhD3GNcslK2XQJ7lopUQ9bIp" + "yDF2PCwPk2lrIOWipNRWw9o8m9myD1rOgYk5IgF4MJz98jRnm2RBM/AAJhN6VkLZ" + "ixNpOPYX0jKAjgvA9V6tkzVpuvYmDS7zeMJ7RRWz1BQdXxIKGcDt/bKXLKV2YiVP" + "AUhOBSaSwVETgekLgGEpwIJVZKEeOH+KwVzXaUmVpUklCJ0mJxTxA2QxgRw+qwxB" + "i2y1+4+Aj8sCpMZ1NQQcDxSvBWbSNH0cMGiQY51PXW8Pg2Dm5d8AB3cBPX8BmbnA" + "RZahtUEHYnZ4mFKI1zoDsLtRFfFlwoqadZtiHi+1aQesZDLVdIaB8L0jIxGRQAIs" + "y5g7oVgia9tq4Ldyw7duTIUD1mEs0uQo+62mXQvNPvLGs2ylEVAyzWImAh4ify3n" + "6Vy4jRH/Ddb+olaOngDcQfa8SbDGcL54Q3QZBCOEOWJsqkPPYRFOFC166NAtvEux" + "awuwjsxtX6czNOvXuoCS5cCGfGDfDqN1nv5uZ+7M/DLVAVhodvScBRnP528Al1zq" + "G3RS8TWzpK5iL3C109nS/CereRBobmQP7NFMmdX6P4C97+gGNjpJ0uKNSwmXwMPD" + "a1b5lM49Wc4LpsxRDk0GlrzAxswElvKZmu6sTbobKHqcp4NrC5+nV+3WNqjgDVn/" + "e3QT6gAqZN1rG6nQPj4fsefmjxi1S2+GRZyu3Aws38hdvGTcMnQ4sPULXRaf63SI" + "TUdT9G0ouhD8PNJVMtWhKvxKRVsUCxLAse/ZC3apxFbT2MH3iDRjrAR4DK+0R2u7" + "LpFJMi2MGtGIp3nSWLfwUkkDriHT/vqZErmMxLCNDHiZUZ7dsFSwOfd/DBzg6GVg" + "Vy/zVDTyiFUAX7LOHiJlTaUdRZp250v6faB51npJLISd1hH9gSI/beFHyCzyUcof" + "Dr/Es6u0kt3/GJ0J1SInKwlKBruv8QddpKRCTSuAlX2fvYwrncAnrzJYngjJ3qDI" + "U+GSP4DpQ8KfaWYJqoTwldjNrljFCB2RIPo4cmYAD/M85xXyVsxw1t2z1ibg+E88" + "iu/rxpPMIwicC6tBbOVHyZtmm3sZaiEm8v4uo+GkqCDEOhDekjGJ3Z4NZPAqTx3F" + "jEh1VxtLcRpo5JDLSLy6aZetAh5i4wUw3ypD5GKICkDsWIoiGn9FJ+RVNDFCPPtV" + "LGqz29gJqADFiugUznHfEn6c8mJwxLhwNJwxiEWs3acESOvHRJRlAj80eB39rCD1" + "NbE74sULRrmfES/jpjN2RnHDjHUV81v2SAOGeMQDWBoPXHYM6FrNQga/4bYwiDW0" + "5FVIcTeorYj5Y1JSaKXtB9z7Lv+rxndzfBkwALOFJcllAE9xzGO5cywPZ1J3U3vx" + "IiOEXj5P8fkjT85uNlsjtQNKQgEYD2oGRmII/4PqQT6xCxjAbK75LXmxKJQHFI75" + "vDg7UMbG1//m+Tcha8orAyvmWQAAAABJRU5ErkJggg==" + 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: + "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" +} + +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; +} |