blob: 549535f1a869728a1c5e56a978c39aee635001ec [file] [log] [blame]
[email protected]65d988362012-02-03 11:20:071// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
timvolodine0eec9ec2016-08-17 16:18:485#ifndef COMPONENTS_SPELLCHECK_BROWSER_SPELLING_SERVICE_CLIENT_H_
6#define COMPONENTS_SPELLCHECK_BROWSER_SPELLING_SERVICE_CLIENT_H_
[email protected]65d988362012-02-03 11:20:077
Mark Pilgrim6f6e54e82018-06-14 17:30:458#include <list>
dcheng4d0d72ef2016-04-14 01:11:339#include <memory>
[email protected]65d988362012-02-03 11:20:0710#include <string>
11#include <vector>
12
13#include "base/callback.h"
14#include "base/compiler_specific.h"
[email protected]24a555b62013-06-10 22:01:1715#include "base/strings/string16.h"
rhalavatia9b551d2017-02-09 12:03:0016#include "net/traffic_annotation/network_traffic_annotation.h"
Guillaume Jenkinsa51cc2402019-04-04 15:26:3717#include "url/gurl.h"
[email protected]65d988362012-02-03 11:20:0718
[email protected]7ed49c22012-02-17 02:14:5319struct SpellCheckResult;
[email protected]65d988362012-02-03 11:20:0720
[email protected]ee9cda5a2013-09-17 21:29:1421namespace content {
22class BrowserContext;
23}
24
Mark Pilgrim6f6e54e82018-06-14 17:30:4525namespace network {
26class SharedURLLoaderFactory;
27class SimpleURLLoader;
28} // namespace network
[email protected]15fb2aa2012-05-22 22:52:5929
[email protected]65d988362012-02-03 11:20:0730// A class that encapsulates a JSON-RPC call to the Spelling service to check
31// text there. This class creates a JSON-RPC request, sends the request to the
32// service with URLFetcher, parses a response from the service, and calls a
33// provided callback method. When a user deletes this object before it finishes
34// a JSON-RPC call, this class cancels the JSON-RPC call without calling the
35// callback method. A simple usage is creating a SpellingServiceClient and
36// calling its RequestTextCheck method as listed in the following snippet.
37//
38// class MyClient {
39// public:
40// MyClient();
41// virtual ~MyClient();
42//
43// void OnTextCheckComplete(
44// int tag,
[email protected]80fe2b362012-05-02 04:19:3845// bool success,
[email protected]7ed49c22012-02-17 02:14:5346// const std::vector<SpellCheckResult>& results) {
[email protected]65d988362012-02-03 11:20:0747// ...
48// }
49//
[email protected]a04db822013-12-11 19:14:4050// void MyTextCheck(BrowserContext* context, const base::string16& text) {
[email protected]65d988362012-02-03 11:20:0751// client_.reset(new SpellingServiceClient);
[email protected]ee9cda5a2013-09-17 21:29:1452// client_->RequestTextCheck(context, 0, text,
Xiaocheng Hu3e37c3a2018-01-10 19:54:4153// base::BindOnce(&MyClient::OnTextCheckComplete,
54// base::Unretained(this));
[email protected]65d988362012-02-03 11:20:0755// }
56// private:
dcheng4d0d72ef2016-04-14 01:11:3357// std::unique_ptr<SpellingServiceClient> client_;
[email protected]65d988362012-02-03 11:20:0758// };
59//
Mark Pilgrim6f6e54e82018-06-14 17:30:4560class SpellingServiceClient {
[email protected]65d988362012-02-03 11:20:0761 public:
[email protected]182bdf02012-04-07 01:40:4162 // Service types provided by the Spelling service. The Spelling service
63 // consists of a couple of backends:
64 // * SUGGEST: Retrieving suggestions for a word (used by Google Search), and;
65 // * SPELLCHECK: Spellchecking text (used by Google Docs).
66 // This type is used for choosing a backend when sending a JSON-RPC request to
67 // the service.
68 enum ServiceType {
69 SUGGEST = 1,
70 SPELLCHECK = 2,
71 };
Guillaume Jenkins7f34b922019-03-26 14:32:0572 // An enum to classify request responses. This is only used for metrics.
73 // * REQUEST_FAILURE: The server returned an error.
74 // * SUCCESS_EMPTY: The server returned an empty list of suggestions.
75 // * SUCCESS_WITH_SUGGESTIONS: The server returned some suggestions.
76 // These values are persisted to logs. Entries should not be renumbered and
77 // numeric values should never be reused.
78 enum class ServiceRequestResultType : int {
79 kRequestFailure = 0,
80 kSuccessEmpty = 1,
81 kSuccessWithSuggestions = 2,
82 kMaxValue = kSuccessWithSuggestions,
83 };
Xiaocheng Hu3e37c3a2018-01-10 19:54:4184 typedef base::OnceCallback<void(
[email protected]80fe2b362012-05-02 04:19:3885 bool /* success */,
[email protected]a04db822013-12-11 19:14:4086 const base::string16& /* text */,
[email protected]7ed49c22012-02-17 02:14:5387 const std::vector<SpellCheckResult>& /* results */)>
Xiaocheng Hu3e37c3a2018-01-10 19:54:4188 TextCheckCompleteCallback;
[email protected]65d988362012-02-03 11:20:0789
90 SpellingServiceClient();
Mark Pilgrim6f6e54e82018-06-14 17:30:4591 ~SpellingServiceClient();
[email protected]65d988362012-02-03 11:20:0792
[email protected]65d988362012-02-03 11:20:0793 // Sends a text-check request to the Spelling service. When we send a request
94 // to the Spelling service successfully, this function returns true. (This
95 // does not mean the service finishes checking text successfully.) We will
96 // call |callback| when we receive a text-check response from the service.
[email protected]ee9cda5a2013-09-17 21:29:1497 bool RequestTextCheck(content::BrowserContext* context,
[email protected]182bdf02012-04-07 01:40:4198 ServiceType type,
[email protected]a04db822013-12-11 19:14:4099 const base::string16& text,
Xiaocheng Hu3e37c3a2018-01-10 19:54:41100 TextCheckCompleteCallback callback);
[email protected]65d988362012-02-03 11:20:07101
[email protected]ee9cda5a2013-09-17 21:29:14102 // Returns whether the specified service is available for the given context.
103 static bool IsAvailable(content::BrowserContext* context, ServiceType type);
[email protected]12cc36532012-06-14 05:38:04104
Mark Pilgrim6f6e54e82018-06-14 17:30:45105 // Set the URL loader factory for tests.
106 void SetURLLoaderFactoryForTesting(
107 scoped_refptr<network::SharedURLLoaderFactory>
108 url_loader_factory_for_testing);
109
Guillaume Jenkinsa51cc2402019-04-04 15:26:37110 // Builds the endpoint URL to use for the service request.
111 GURL BuildEndpointUrl(int type);
112
[email protected]427276ee2013-05-31 20:27:03113 protected:
114 // Parses a JSON-RPC response from the Spelling service.
115 bool ParseResponse(const std::string& data,
116 std::vector<SpellCheckResult>* results);
117
[email protected]65d988362012-02-03 11:20:07118 private:
[email protected]5cc8fb22013-03-06 00:24:58119 struct TextCheckCallbackData {
Xiaocheng Huef2b9b642018-02-09 20:29:49120 public:
Mark Pilgrim6f6e54e82018-06-14 17:30:45121 TextCheckCallbackData(
122 std::unique_ptr<network::SimpleURLLoader> simple_url_loader,
123 TextCheckCompleteCallback callback,
124 base::string16 text);
[email protected]5cc8fb22013-03-06 00:24:58125 ~TextCheckCallbackData();
126
Mark Pilgrim6f6e54e82018-06-14 17:30:45127 // The URL loader used.
128 std::unique_ptr<network::SimpleURLLoader> simple_url_loader;
avid99bd1a2016-08-17 22:44:06129
[email protected]5cc8fb22013-03-06 00:24:58130 // The callback function to be called when we receive a response from the
131 // Spelling service and parse it.
132 TextCheckCompleteCallback callback;
133
134 // The text checked by the Spelling service.
[email protected]a04db822013-12-11 19:14:40135 base::string16 text;
Xiaocheng Huef2b9b642018-02-09 20:29:49136
137 private:
138 DISALLOW_COPY_AND_ASSIGN(TextCheckCallbackData);
[email protected]5cc8fb22013-03-06 00:24:58139 };
140
Mark Pilgrim6f6e54e82018-06-14 17:30:45141 using SpellCheckLoaderList =
142 std::list<std::unique_ptr<TextCheckCallbackData>>;
[email protected]5cc8fb22013-03-06 00:24:58143
Mark Pilgrim6f6e54e82018-06-14 17:30:45144 void OnSimpleLoaderComplete(SpellCheckLoaderList::iterator it,
Guillaume Jenkins7f34b922019-03-26 14:32:05145 base::TimeTicks request_start,
Mark Pilgrim6f6e54e82018-06-14 17:30:45146 std::unique_ptr<std::string> response_body);
[email protected]80fe2b362012-05-02 04:19:38147
Mark Pilgrim6f6e54e82018-06-14 17:30:45148 // List of loaders in use.
149 SpellCheckLoaderList spellcheck_loaders_;
150
151 // URL loader factory to use for fake network requests during testing.
152 scoped_refptr<network::SharedURLLoaderFactory>
153 url_loader_factory_for_testing_;
[email protected]65d988362012-02-03 11:20:07154};
155
timvolodine0eec9ec2016-08-17 16:18:48156#endif // COMPONENTS_SPELLCHECK_BROWSER_SPELLING_SERVICE_CLIENT_H_