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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/webshare/share_service_impl.cc
diff --git a/chrome/browser/webshare/share_service_impl.cc b/chrome/browser/webshare/share_service_impl.cc
index 9f8bb0b690e52854f780fdcc5373e8efd5062a3b..580f166c6ca08a7fa26dd5bc8a118f089c5c1588 100644
--- a/chrome/browser/webshare/share_service_impl.cc
+++ b/chrome/browser/webshare/share_service_impl.cc
@@ -4,7 +4,17 @@
#include "chrome/browser/webshare/share_service_impl.h"
+#include <algorithm>
+#include <functional>
+#include <utility>
+
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "net/base/escape.h"
// static
void ShareServiceImpl::Create(blink::mojom::ShareServiceRequest request) {
@@ -12,11 +22,88 @@ void ShareServiceImpl::Create(blink::mojom::ShareServiceRequest request) {
std::move(request));
}
+// static
+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.
+ const std::string url_template,
+ const std::string title,
+ const std::string text,
+ const GURL& share_url) {
+ std::string title_escaped = net::EscapeQueryParamValue(title, false);
+ std::string text_escaped = net::EscapeQueryParamValue(text, false);
+ std::string share_url_escaped =
+ net::EscapeQueryParamValue(share_url.spec(), false);
+
+ 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.
+ std::string text_placeholder = "%{text}";
+ std::string url_placeholder = "%{url}";
+
+ std::vector<std::string> placeholders;
+ placeholders.push_back(title_placeholder);
+ placeholders.push_back(text_placeholder);
+ placeholders.push_back(url_placeholder);
+
+ std::string url_template_filled = url_template;
+
+ // Fill placeholder_positions with pair of position of ith placeholder in
+ // |placeholders|, and ith placeholder in |placeholders|.
+ 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|.
+ 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.
+ std::size_t found = url_template_filled.find(placeholder);
+ while (found != std::string::npos) {
+ placeholder_positions.push_back(
+ std::pair<int, std::string>(found, placeholder));
+ found = url_template_filled.find(placeholder, found + 1);
+ }
+ }
+
+ // Sort placeholders by their index in the url template, in descending order.
+ // Processing in descending order means that when the latter placeholders are
+ // replaced, the positions of the earlier placeholders are not affected.
+ std::sort(placeholder_positions.begin(), placeholder_positions.end());
+ std::reverse(placeholder_positions.begin(), placeholder_positions.end());
+
+ 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.
+ int found = placeholder.first;
+ // Replace the placeholder with its corresponding share datum.
+ if (placeholder.second == title_placeholder) {
+ url_template_filled.replace(found, placeholder.second.size(),
+ title_escaped);
+ } else if (placeholder.second == text_placeholder) {
+ url_template_filled.replace(found, placeholder.second.size(),
+ text_escaped);
+ } else if (placeholder.second == url_placeholder) {
+ url_template_filled.replace(found, placeholder.second.size(),
+ share_url_escaped);
+ }
+ }
+ return url_template_filled;
+}
+
+void ShareServiceImpl::openTargetURL(GURL target_url) {
+ Browser* browser = BrowserList::GetInstance()->GetLastActive();
+ chrome::AddTabAt(browser, target_url,
+ browser->tab_strip_model()->active_index() + 1, true);
+}
+
void ShareServiceImpl::Share(const std::string& title,
const std::string& text,
- const GURL& url,
+ const GURL& share_url,
const ShareCallback& callback) {
- // TODO(constantina): Implement Web Share Target here.
- NOTIMPLEMENTED();
- callback.Run(base::Optional<std::string>("Not implemented: navigator.share"));
+ 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.
+ std::string url_template =
+ "demos/sharetarget.html?title=%{title}&text=%{text}&url=%{url}";
+
+ std::string url_template_filled =
+ replacePlaceholders(url_template, title, text, share_url);
+
+ GURL target_url(url_base + url_template_filled);
+ openTargetURL(target_url);
+
+ // 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.
+ bool error_occured = false;
+ if (error_occured) {
+ callback.Run(base::Optional<std::string>("Error"));
+ } else {
+ callback.Run(base::Optional<std::string>());
+ }
}

Powered by Google App Engine
This is Rietveld 408576698