From 5e099c6c479889e82ec84463bdb1ea22d3e0e8ad Mon Sep 17 00:00:00 2001 From: "rouslan@chromium.org" Date: Sat, 8 Jun 2013 05:46:23 +0000 Subject: [PATCH] Hide spelling service feedback behind a flag and a field trial This CL hides spelling service feedback behind a command-line flag --enable-spelling-service-feedback, so that users can choose whether to send feedback. The flag can also be flipped from chrome://flags. Even with the flag enabled, only field-trial participants will be sending feedback. BUG=170514,247444 Review URL: https://chromiumcodereview.appspot.com/16206020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@205042 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/app/generated_resources.grd | 8 + chrome/browser/about_flags.cc | 7 + chrome/browser/spellchecker/feedback_sender.cc | 22 ++- chrome/browser/spellchecker/feedback_sender.h | 4 + .../spellchecker/feedback_sender_unittest.cc | 177 ++++++++++++--------- chrome/common/chrome_switches.cc | 4 + chrome/common/chrome_switches.h | 1 + 7 files changed, 147 insertions(+), 76 deletions(-) diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 953d23197689..14d2b345be46 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -15107,6 +15107,14 @@ To configure restrictions for this limited user, please sign into your account a The Simple Cache for HTTP is a new cache. It relies on the filesystem for disk space allocation. + + + Spelling Service Feedback. + + + Send user feedback to spelling service. For example, if spelling service marks a misspelled word, but the user adds it to the custom dictionary, then Chrome will send a feedback message to spelling service. Spelling service uses this feedback to improve spelling suggestions. + + Make it my default browser diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 9beac9083f24..1732d8c2049f 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -1510,6 +1510,13 @@ const Experiment kExperiments[] = { }, #endif { + "enable-spelling-service-feedback", + IDS_FLAGS_ENABLE_SPELLING_SERVICE_FEEDBACK_NAME, + IDS_FLAGS_ENABLE_SPELLING_SERVICE_FEEDBACK_DESCRIPTION, + kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableSpellingServiceFeedback) + }, + { "enable-webgl-draft-extensions", IDS_FLAGS_ENABLE_WEBGL_DRAFT_EXTENSIONS_NAME, IDS_FLAGS_ENABLE_WEBGL_DRAFT_EXTENSIONS_DESCRIPTION, diff --git a/chrome/browser/spellchecker/feedback_sender.cc b/chrome/browser/spellchecker/feedback_sender.cc index 7191df967c29..3b72c69a2402 100644 --- a/chrome/browser/spellchecker/feedback_sender.cc +++ b/chrome/browser/spellchecker/feedback_sender.cc @@ -10,6 +10,7 @@ #include "base/command_line.h" #include "base/hash.h" #include "base/json/json_writer.h" +#include "base/metrics/field_trial.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/values.h" @@ -111,9 +112,18 @@ FeedbackSender::FeedbackSender(net::URLRequestContextGetter* request_context, misspelling_counter_(0), session_start_(base::Time::Now()), feedback_service_url_(kFeedbackServiceURL) { + // This guard is temporary. + // TODO(rouslan): Remove the guard. http://crbug.com/247726 + if (!CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableSpellingServiceFeedback) || + base::FieldTrialList::FindFullName(kFeedbackFieldTrialName) != + kFeedbackFieldTrialEnabledGroupName) { + return; + } + // The command-line switch is for testing and temporary. - // TODO(rouslan): Remove the command-line switch when testing is complete by - // August 2013. + // TODO(rouslan): Remove the command-line switch when testing is complete. + // http://crbug.com/247726 if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kSpellingServiceFeedbackUrl)) { feedback_service_url_ = @@ -123,8 +133,8 @@ FeedbackSender::FeedbackSender(net::URLRequestContextGetter* request_context, int interval_seconds = chrome::spellcheck_common::kFeedbackIntervalSeconds; // This command-line switch is for testing and temporary. - // TODO(rouslan): Remove the command-line switch when testing is complete by - // August 2013. + // TODO(rouslan): Remove the command-line switch when testing is complete. + // http://crbug.com/247726 if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kSpellingServiceFeedbackIntervalSeconds)) { base::StringToInt(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( @@ -213,6 +223,10 @@ void FeedbackSender::OnSpellcheckResults( int renderer_process_id, const string16& text, const std::vector& markers) { + // Don't collect feedback if not going to send it. + if (!timer_.IsRunning()) + return; + // Generate a map of marker offsets to marker hashes. This map helps to // efficiently lookup feedback data based on the position of the misspelling // in text diff --git a/chrome/browser/spellchecker/feedback_sender.h b/chrome/browser/spellchecker/feedback_sender.h index 73a1cda6fddb..dbcaba2a12ce 100644 --- a/chrome/browser/spellchecker/feedback_sender.h +++ b/chrome/browser/spellchecker/feedback_sender.h @@ -28,6 +28,10 @@ class URLRequestContextGetter; namespace spellcheck { +// Constants for the feedback field trial. +static const char kFeedbackFieldTrialName[] = "SpellingServiceFeedback"; +static const char kFeedbackFieldTrialEnabledGroupName[] = "Enabled"; + // Manages sending feedback to the spelling service. class FeedbackSender : public base::SupportsWeakPtr, public net::URLFetcherDelegate { diff --git a/chrome/browser/spellchecker/feedback_sender_unittest.cc b/chrome/browser/spellchecker/feedback_sender_unittest.cc index 2961a9e83499..141f848ec156 100644 --- a/chrome/browser/spellchecker/feedback_sender_unittest.cc +++ b/chrome/browser/spellchecker/feedback_sender_unittest.cc @@ -6,12 +6,16 @@ #include #include "base/bind.h" +#include "base/command_line.h" #include "base/json/json_reader.h" #include "base/message_loop.h" +#include "base/metrics/field_trial.h" #include "base/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/spellchecker/feedback_sender.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/common/metrics/entropy_provider.h" #include "chrome/common/spellcheck_common.h" #include "chrome/common/spellcheck_marker.h" #include "chrome/common/spellcheck_result.h" @@ -43,26 +47,40 @@ SpellCheckResult BuildSpellCheckResult() { class FeedbackSenderTest : public testing::Test { public: - FeedbackSenderTest() - : ui_thread_(content::BrowserThread::UI, &loop_), - feedback_(NULL, kLanguage, kCountry) {} + FeedbackSenderTest() : ui_thread_(content::BrowserThread::UI, &loop_) { + + // The command-line switch and the field trial are temporary. + // TODO(rouslan): Remove the command-line switch and the field trial. + // http://crbug.com/247726 + CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnableSpellingServiceFeedback); + field_trial_list_.reset( + new base::FieldTrialList(new metrics::SHA1EntropyProvider("foo"))); + field_trial_ = base::FieldTrialList::CreateFieldTrial( + kFeedbackFieldTrialName, kFeedbackFieldTrialEnabledGroupName); + field_trial_->group(); + + feedback_.reset(new FeedbackSender(NULL, kLanguage, kCountry)); + } virtual ~FeedbackSenderTest() {} private: TestingProfile profile_; base::MessageLoop loop_; content::TestBrowserThread ui_thread_; + scoped_ptr field_trial_list_; + scoped_refptr field_trial_; protected: uint32 AddPendingFeedback() { std::vector results(1, BuildSpellCheckResult()); - feedback_.OnSpellcheckResults( + feedback_->OnSpellcheckResults( &results, kRendererProcessId, kText, std::vector()); return results[0].hash; } void ExpireSession() { - feedback_.session_start_ = + feedback_->session_start_ = base::Time::Now() - base::TimeDelta::FromHours(chrome::spellcheck_common::kSessionHours); } @@ -72,14 +90,14 @@ class FeedbackSenderTest : public testing::Test { } net::TestURLFetcherFactory fetchers_; - spellcheck::FeedbackSender feedback_; + scoped_ptr feedback_; }; // Do not send data if there's no feedback. TEST_F(FeedbackSenderTest, NoFeedback) { EXPECT_EQ(NULL, GetFetcher()); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, - std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); EXPECT_EQ(NULL, GetFetcher()); } @@ -89,7 +107,7 @@ TEST_F(FeedbackSenderTest, NoDocumentMarkersReceived) { uint32 hash = AddPendingFeedback(); EXPECT_EQ(NULL, GetFetcher()); static const int kSuggestionIndex = 1; - feedback_.SelectedSuggestion(hash, kSuggestionIndex); + feedback_->SelectedSuggestion(hash, kSuggestionIndex); EXPECT_EQ(NULL, GetFetcher()); } @@ -97,8 +115,8 @@ TEST_F(FeedbackSenderTest, NoDocumentMarkersReceived) { // user has not performed any action on it. TEST_F(FeedbackSenderTest, PendingFeedback) { uint32 hash = AddPendingFeedback(); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, - std::vector(1, hash)); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector(1, hash)); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"PENDING\"")) @@ -109,7 +127,8 @@ TEST_F(FeedbackSenderTest, PendingFeedback) { // document. TEST_F(FeedbackSenderTest, NoActionFeedback) { AddPendingFeedback(); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"NO_ACTION\"")) @@ -120,8 +139,9 @@ TEST_F(FeedbackSenderTest, NoActionFeedback) { TEST_F(FeedbackSenderTest, SelectFeedback) { uint32 hash = AddPendingFeedback(); static const int kSuggestion = 0; - feedback_.SelectedSuggestion(hash, kSuggestion); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->SelectedSuggestion(hash, kSuggestion); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"SELECT\"")) @@ -135,8 +155,9 @@ TEST_F(FeedbackSenderTest, SelectFeedback) { // to the custom dictionary. TEST_F(FeedbackSenderTest, AddToDictFeedback) { uint32 hash = AddPendingFeedback(); - feedback_.AddedToDictionary(hash); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->AddedToDictionary(hash); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"ADD_TO_DICT\"")) @@ -147,9 +168,9 @@ TEST_F(FeedbackSenderTest, AddToDictFeedback) { // decided to not select it, and the marker is still in the document. TEST_F(FeedbackSenderTest, IgnoreFeedbackMarkerInDocument) { uint32 hash = AddPendingFeedback(); - feedback_.IgnoredSuggestions(hash); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, - std::vector(1, hash)); + feedback_->IgnoredSuggestions(hash); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector(1, hash)); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"PENDING\"")) @@ -160,8 +181,9 @@ TEST_F(FeedbackSenderTest, IgnoreFeedbackMarkerInDocument) { // decided to not select it, and the marker is no longer in the document. TEST_F(FeedbackSenderTest, IgnoreFeedbackMarkerNotInDocument) { uint32 hash = AddPendingFeedback(); - feedback_.IgnoredSuggestions(hash); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->IgnoredSuggestions(hash); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"IGNORE\"")) @@ -173,8 +195,9 @@ TEST_F(FeedbackSenderTest, IgnoreFeedbackMarkerNotInDocument) { TEST_F(FeedbackSenderTest, ManuallyCorrectedFeedback) { uint32 hash = AddPendingFeedback(); static const std::string kManualCorrection = "Howdy"; - feedback_.ManuallyCorrected(hash, ASCIIToUTF16(kManualCorrection)); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->ManuallyCorrected(hash, ASCIIToUTF16(kManualCorrection)); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE( std::string::npos, @@ -199,9 +222,10 @@ TEST_F(FeedbackSenderTest, BatchFeedback) { kSecondMisspellingStart, kSecondMisspellingLength, ASCIIToUTF16("world"))); - feedback_.OnSpellcheckResults( + feedback_->OnSpellcheckResults( &results, kRendererProcessId, kText, std::vector()); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); net::TestURLFetcher* fetcher = GetFetcher(); size_t pos = fetcher->upload_data().find("\"actionType\":\"NO_ACTION\""); EXPECT_NE(std::string::npos, pos) << fetcher->upload_data(); @@ -215,7 +239,7 @@ TEST_F(FeedbackSenderTest, SameHashFeedback) { uint32 hash = AddPendingFeedback(); std::vector remaining_markers(1, hash); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"PENDING\"")) @@ -225,7 +249,7 @@ TEST_F(FeedbackSenderTest, SameHashFeedback) { << fetcher->upload_data(); fetchers_.RemoveFetcherFromMap(kUrlFetcherId); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"PENDING\"")) @@ -234,7 +258,8 @@ TEST_F(FeedbackSenderTest, SameHashFeedback) { << fetcher->upload_data(); fetchers_.RemoveFetcherFromMap(kUrlFetcherId); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"NO_ACTION\"")) @@ -243,7 +268,8 @@ TEST_F(FeedbackSenderTest, SameHashFeedback) { << fetcher->upload_data(); fetchers_.RemoveFetcherFromMap(kUrlFetcherId); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); EXPECT_EQ(NULL, GetFetcher()); } @@ -253,17 +279,18 @@ TEST_F(FeedbackSenderTest, SameHashFeedback) { // 2) No feedback is sent until a spellcheck request happens. // 3) Existing markers get new hash identifiers. TEST_F(FeedbackSenderTest, SessionExpirationFeedback) { - std::vector results(1, SpellCheckResult( - SpellCheckResult::SPELLING, - kMisspellingStart, - kMisspellingLength, - ASCIIToUTF16("Hello"))); - feedback_.OnSpellcheckResults( + std::vector results( + 1, + SpellCheckResult(SpellCheckResult::SPELLING, + kMisspellingStart, + kMisspellingLength, + ASCIIToUTF16("Hello"))); + feedback_->OnSpellcheckResults( &results, kRendererProcessId, kText, std::vector()); uint32 original_hash = results[0].hash; std::vector remaining_markers(1, original_hash); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_EQ(std::string::npos, fetcher->upload_data().find("\"actionType\":\"NO_ACTION\"")) @@ -281,7 +308,7 @@ TEST_F(FeedbackSenderTest, SessionExpirationFeedback) { ExpireSession(); // Last message batch in the current session has only finalized messages. - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"actionType\":\"NO_ACTION\"")) @@ -296,7 +323,7 @@ TEST_F(FeedbackSenderTest, SessionExpirationFeedback) { // The next session starts on the next spellchecker request. Until then, // there's no more feedback sent. - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); EXPECT_EQ(NULL, GetFetcher()); // The first spellcheck request after session expiration creates different @@ -307,7 +334,7 @@ TEST_F(FeedbackSenderTest, SessionExpirationFeedback) { kMisspellingStart, kMisspellingLength, ASCIIToUTF16("Hello")); - feedback_.OnSpellcheckResults( + feedback_->OnSpellcheckResults( &results, kRendererProcessId, kText, original_markers); uint32 updated_hash = results[0].hash; EXPECT_NE(updated_hash, original_hash); @@ -315,7 +342,7 @@ TEST_F(FeedbackSenderTest, SessionExpirationFeedback) { // The first feedback message batch in session |i + 1| has the new document // marker hash identifiers. - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, remaining_markers); fetcher = GetFetcher(); EXPECT_EQ(std::string::npos, fetcher->upload_data().find("\"actionType\":\"NO_ACTION\"")) @@ -336,7 +363,8 @@ TEST_F(FeedbackSenderTest, SessionExpirationFeedback) { TEST_F(FeedbackSenderTest, FirstMessageInSessionIndicator) { // Session 1, message 1 AddPendingFeedback(); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"isFirstInSession\":true")) @@ -344,7 +372,8 @@ TEST_F(FeedbackSenderTest, FirstMessageInSessionIndicator) { // Session 1, message 2 AddPendingFeedback(); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"isFirstInSession\":false")) @@ -354,7 +383,8 @@ TEST_F(FeedbackSenderTest, FirstMessageInSessionIndicator) { // Session 1, message 3 (last) AddPendingFeedback(); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"isFirstInSession\":false")) @@ -362,7 +392,8 @@ TEST_F(FeedbackSenderTest, FirstMessageInSessionIndicator) { // Session 2, message 1 AddPendingFeedback(); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"isFirstInSession\":true")) @@ -370,7 +401,8 @@ TEST_F(FeedbackSenderTest, FirstMessageInSessionIndicator) { // Session 2, message 2 AddPendingFeedback(); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"isFirstInSession\":false")) @@ -380,14 +412,14 @@ TEST_F(FeedbackSenderTest, FirstMessageInSessionIndicator) { // Flush all feedback when the spellcheck language and country change. TEST_F(FeedbackSenderTest, OnLanguageCountryChange) { AddPendingFeedback(); - feedback_.OnLanguageCountryChange("pt", "BR"); + feedback_->OnLanguageCountryChange("pt", "BR"); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"language\":\"en\"")) << fetcher->upload_data(); AddPendingFeedback(); - feedback_.OnLanguageCountryChange("en", "US"); + feedback_->OnLanguageCountryChange("en", "US"); fetcher = GetFetcher(); EXPECT_NE(std::string::npos, fetcher->upload_data().find("\"language\":\"pt\"")) @@ -397,11 +429,11 @@ TEST_F(FeedbackSenderTest, OnLanguageCountryChange) { // The field names and types should correspond to the API. TEST_F(FeedbackSenderTest, FeedbackAPI) { AddPendingFeedback(); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, - std::vector()); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); std::string actual_data = GetFetcher()->upload_data(); - scoped_ptr actual(static_cast( - base::JSONReader::Read(actual_data))); + scoped_ptr actual( + static_cast(base::JSONReader::Read(actual_data))); actual->SetString("params.key", "TestDummyKey"); base::ListValue* suggestions = NULL; actual->GetList("params.suggestionInfo", &suggestions); @@ -436,15 +468,16 @@ TEST_F(FeedbackSenderTest, FeedbackAPI) { // Duplicate spellcheck results should be matched to the existing markers. TEST_F(FeedbackSenderTest, MatchDupliateResultsWithExistingMarkers) { uint32 hash = AddPendingFeedback(); - std::vector results(1, SpellCheckResult( - SpellCheckResult::SPELLING, - kMisspellingStart + 10, - kMisspellingLength, - ASCIIToUTF16("Hello"))); - std::vector markers(1, SpellCheckMarker( - hash, results[0].location)); + std::vector results( + 1, + SpellCheckResult(SpellCheckResult::SPELLING, + kMisspellingStart + 10, + kMisspellingLength, + ASCIIToUTF16("Hello"))); + std::vector markers( + 1, SpellCheckMarker(hash, results[0].location)); EXPECT_EQ(static_cast(0), results[0].hash); - feedback_.OnSpellcheckResults(&results, kRendererProcessId, kText, markers); + feedback_->OnSpellcheckResults(&results, kRendererProcessId, kText, markers); EXPECT_EQ(hash, results[0].hash); } @@ -481,26 +514,26 @@ TEST_F(FeedbackSenderTest, MultipleAddToDictFeedback) { static const int kNumberOfRenderers = 2; int last_renderer_process_id = -1; for (int i = 0; i < kNumberOfRenderers; ++i) { - feedback_.OnSpellcheckResults(&results, - kRendererProcessId + i, - kTextWithDuplicates, - std::vector()); + feedback_->OnSpellcheckResults(&results, + kRendererProcessId + i, + kTextWithDuplicates, + std::vector()); last_renderer_process_id = kRendererProcessId + i; } std::vector remaining_markers; for (size_t i = 0; i < results.size(); ++i) remaining_markers.push_back(results[i].hash); - feedback_.OnReceiveDocumentMarkers(last_renderer_process_id, - remaining_markers); + feedback_->OnReceiveDocumentMarkers(last_renderer_process_id, + remaining_markers); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_EQ(2, CountOccurences(fetcher->upload_data(), "PENDING")) << fetcher->upload_data(); EXPECT_EQ(0, CountOccurences(fetcher->upload_data(), "ADD_TO_DICT")) << fetcher->upload_data(); - feedback_.AddedToDictionary(results[0].hash); - feedback_.OnReceiveDocumentMarkers(last_renderer_process_id, - remaining_markers); + feedback_->AddedToDictionary(results[0].hash); + feedback_->OnReceiveDocumentMarkers(last_renderer_process_id, + remaining_markers); fetcher = GetFetcher(); EXPECT_EQ(0, CountOccurences(fetcher->upload_data(), "PENDING")) << fetcher->upload_data(); @@ -514,10 +547,10 @@ TEST_F(FeedbackSenderTest, AddToDictOnlyPending) { AddPendingFeedback(); uint32 add_to_dict_hash = AddPendingFeedback(); uint32 select_hash = AddPendingFeedback(); - feedback_.SelectedSuggestion(select_hash, 0); - feedback_.AddedToDictionary(add_to_dict_hash); - feedback_.OnReceiveDocumentMarkers(kRendererProcessId, - std::vector()); + feedback_->SelectedSuggestion(select_hash, 0); + feedback_->AddedToDictionary(add_to_dict_hash); + feedback_->OnReceiveDocumentMarkers(kRendererProcessId, + std::vector()); net::TestURLFetcher* fetcher = GetFetcher(); EXPECT_EQ(1, CountOccurences(fetcher->upload_data(), "SELECT")) << fetcher->upload_data(); diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 93a192373a08..7fa46b35de75 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -664,6 +664,10 @@ const char kEnableSpdyCredentialFrames[] = "enable-spdy-credential-frames"; // Enables auto correction for misspelled words. const char kEnableSpellingAutoCorrect[] = "enable-spelling-auto-correct"; +// Enables sending user feedback to spelling service. +const char kEnableSpellingServiceFeedback[] = + "enable-spelling-service-feedback"; + // Enables the stacked tabstrip. const char kEnableStackedTabStrip[] = "enable-stacked-tab-strip"; diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index a8efff8ba5bf..8c3bca1e52c2 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -187,6 +187,7 @@ extern const char kEnableSdch[]; extern const char kDisableSpdy31[]; extern const char kEnableSpdyCredentialFrames[]; extern const char kEnableSpellingAutoCorrect[]; +extern const char kEnableSpellingServiceFeedback[]; extern const char kEnableStackedTabStrip[]; extern const char kEnableSuggestionsTabPage[]; extern const char kEnableSyncFavicons[]; -- 2.11.4.GIT