Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: chrome/browser/webshare/share_service_impl.cc

Issue 2564483003: Default share to Share Target: Partial impl. of Web Share for Desktop. (Closed)
Patch Set: Check the target_url opened by Share, in test Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/webshare/share_service_impl.h" 5 #include "chrome/browser/webshare/share_service_impl.h"
6 6
7 #include <algorithm>
8 #include <functional>
9 #include <utility>
10
11 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/browser_commands.h"
13 #include "chrome/browser/ui/browser_list.h"
14 #include "chrome/browser/ui/browser_tabstrip.h"
15 #include "chrome/browser/ui/tabs/tab_strip_model.h"
7 #include "mojo/public/cpp/bindings/strong_binding.h" 16 #include "mojo/public/cpp/bindings/strong_binding.h"
17 #include "net/base/escape.h"
8 18
9 // static 19 // static
10 void ShareServiceImpl::Create(blink::mojom::ShareServiceRequest request) { 20 void ShareServiceImpl::Create(blink::mojom::ShareServiceRequest request) {
11 mojo::MakeStrongBinding(base::MakeUnique<ShareServiceImpl>(), 21 mojo::MakeStrongBinding(base::MakeUnique<ShareServiceImpl>(),
12 std::move(request)); 22 std::move(request));
13 } 23 }
14 24
25 // static
26 std::string ShareServiceImpl::replacePlaceholders(
Matt Giuca 2016/12/21 07:13:49 As Sam suggested, you should just search (in one p
constantina 2017/01/04 07:01:44 Done.
27 const std::string url_template,
28 const std::string title,
29 const std::string text,
30 const GURL& share_url) {
31 std::string title_escaped = net::EscapeQueryParamValue(title, false);
32 std::string text_escaped = net::EscapeQueryParamValue(text, false);
33 std::string share_url_escaped =
34 net::EscapeQueryParamValue(share_url.spec(), false);
35
36 std::string title_placeholder = "%{title}";
Matt Giuca 2016/12/21 07:13:49 Nit: kTitlePlaceholder, kTextPlaceholder and kUrlP
Sam McNally 2016/12/22 07:03:50 Better yet, use constexpr char kTitlePlaceholder[]
constantina 2017/01/04 07:01:44 Done.
constantina 2017/01/04 07:01:44 Done.
Matt Giuca 2017/01/05 03:09:24 Sam: Is your advice just to always use constexpr i
Sam McNally 2017/01/05 04:08:37 Yes, if constexpr is supported for the type.
37 std::string text_placeholder = "%{text}";
38 std::string url_placeholder = "%{url}";
39
40 std::vector<std::string> placeholders;
41 placeholders.push_back(title_placeholder);
42 placeholders.push_back(text_placeholder);
43 placeholders.push_back(url_placeholder);
44
45 std::string url_template_filled = url_template;
46
47 // Fill placeholder_positions with pair of position of ith placeholder in
48 // |placeholders|, and ith placeholder in |placeholders|.
49 std::vector<std::pair<int, std::string>> placeholder_positions;
Sam McNally 2016/12/22 07:03:50 Prefer base::StringPiece when you can refer to par
constantina 2017/01/04 07:01:44 Done. Also changed |placeholders|.
50 for (std::string placeholder : placeholders) {
Matt Giuca 2016/12/21 07:13:49 const std::string& or const auto&
constantina 2017/01/04 07:01:44 Done.
51 std::size_t found = url_template_filled.find(placeholder);
52 while (found != std::string::npos) {
53 placeholder_positions.push_back(
54 std::pair<int, std::string>(found, placeholder));
55 found = url_template_filled.find(placeholder, found + 1);
56 }
57 }
58
59 // Sort placeholders by their index in the url template, in descending order.
60 // Processing in descending order means that when the latter placeholders are
61 // replaced, the positions of the earlier placeholders are not affected.
62 std::sort(placeholder_positions.begin(), placeholder_positions.end());
63 std::reverse(placeholder_positions.begin(), placeholder_positions.end());
64
65 for (std::pair<int, std::string> placeholder : placeholder_positions) {
Matt Giuca 2016/12/21 07:13:49 For the second pass, you can avoid doing replaceme
constantina 2017/01/04 07:01:44 Done.
66 int found = placeholder.first;
67 // Replace the placeholder with its corresponding share datum.
68 if (placeholder.second == title_placeholder) {
69 url_template_filled.replace(found, placeholder.second.size(),
70 title_escaped);
71 } else if (placeholder.second == text_placeholder) {
72 url_template_filled.replace(found, placeholder.second.size(),
73 text_escaped);
74 } else if (placeholder.second == url_placeholder) {
75 url_template_filled.replace(found, placeholder.second.size(),
76 share_url_escaped);
77 }
78 }
79 return url_template_filled;
80 }
81
82 void ShareServiceImpl::openTargetURL(GURL target_url) {
83 Browser* browser = BrowserList::GetInstance()->GetLastActive();
84 chrome::AddTabAt(browser, target_url,
85 browser->tab_strip_model()->active_index() + 1, true);
86 }
87
15 void ShareServiceImpl::Share(const std::string& title, 88 void ShareServiceImpl::Share(const std::string& title,
16 const std::string& text, 89 const std::string& text,
17 const GURL& url, 90 const GURL& share_url,
18 const ShareCallback& callback) { 91 const ShareCallback& callback) {
19 // TODO(constantina): Implement Web Share Target here. 92 std::string url_base = "https://wicg.github.io/web-share-target/";
Matt Giuca 2016/12/21 07:13:49 const char kUrlBase[]
constantina 2017/01/04 07:01:44 Done.
20 NOTIMPLEMENTED(); 93 std::string url_template =
21 callback.Run(base::Optional<std::string>("Not implemented: navigator.share")); 94 "demos/sharetarget.html?title=%{title}&text=%{text}&url=%{url}";
95
96 std::string url_template_filled =
97 replacePlaceholders(url_template, title, text, share_url);
98
99 GURL target_url(url_base + url_template_filled);
100 openTargetURL(target_url);
101
102 // TODO(constantina): Check for errors.
Matt Giuca 2016/12/21 07:13:49 You should do this in this CL. If you don't have a
constantina 2017/01/04 07:01:44 Done.
103 bool error_occured = false;
104 if (error_occured) {
105 callback.Run(base::Optional<std::string>("Error"));
106 } else {
107 callback.Run(base::Optional<std::string>());
108 }
22 } 109 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698