Commit 445c0b4c authored by John Z Wu's avatar John Z Wu Committed by Commit Bot

Add support for requesting translation offers

Translation are normally offered automatically if the translate internals
thinks translation is necessary according to page language and the user's
settings. But in cases where the user still wants to translate, this
method can be used to manually trigger translation offers.

Change-Id: I4f71ed0142a3fec6438b883c87b514c0749a8acf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2163036
Commit-Queue: John Wu <jzw@chromium.org>
Reviewed-by: default avatarHiroshi Ichikawa <ichikawa@chromium.org>
Cr-Commit-Position: refs/heads/master@{#762732}
parent e0c7f959
......@@ -188,6 +188,10 @@ CWVTranslationError CWVConvertTranslateError(
_translateClient->RevertTranslation();
}
- (BOOL)requestTranslationOffer {
return _translateClient->RequestTranslationOffer();
}
- (void)setTranslationPolicy:(CWVTranslationPolicy*)policy
forPageLanguage:(CWVTranslationLanguage*)pageLanguage {
std::string languageCode = base::SysNSStringToUTF8(pageLanguage.languageCode);
......
......@@ -18,6 +18,7 @@
#include "components/translate/core/browser/translate_pref_names.h"
#include "components/translate/core/browser/translate_prefs.h"
#import "ios/web/public/deprecated/crw_test_js_injection_receiver.h"
#include "ios/web/public/test/fakes/test_browser_state.h"
#import "ios/web/public/test/fakes/test_navigation_manager.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#include "ios/web/public/test/scoped_testing_web_client.h"
......@@ -33,6 +34,7 @@
#import "testing/gtest_mac.h"
#include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#include "third_party/ocmock/gtest_support.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
......@@ -40,6 +42,10 @@
namespace ios_web_view {
using testing::_;
using testing::Invoke;
using testing::Return;
namespace {
NSString* const kTestFromLangCode = @"ja";
NSString* const kTestToLangCode = @"en";
......@@ -62,6 +68,7 @@ class MockWebViewTranslateClient : public WebViewTranslateClient {
MOCK_METHOD3(TranslatePage,
void(const std::string&, const std::string&, bool));
MOCK_METHOD0(RevertTranslation, void());
MOCK_METHOD0(RequestTranslationOffer, bool());
};
class TestLanguageModel : public language::LanguageModel {
......@@ -73,6 +80,8 @@ class CWVTranslationControllerTest : public TestWithLocaleAndResources {
CWVTranslationControllerTest() {
auto test_navigation_manager =
std::make_unique<web::TestNavigationManager>();
test_navigation_manager->SetBrowserState(&browser_state_);
web_state_.SetBrowserState(&browser_state_);
web_state_.SetNavigationManager(std::move(test_navigation_manager));
CRWTestJSInjectionReceiver* injection_receiver =
[[CRWTestJSInjectionReceiver alloc] init];
......@@ -107,6 +116,10 @@ class CWVTranslationControllerTest : public TestWithLocaleAndResources {
translate::TranslatePrefs::kPrefTranslateTooOftenDeniedForLanguage);
pref_service_.registry()->RegisterStringPref(
translate::TranslatePrefs::kPrefTranslateRecentTarget, "");
// Using string literal here because kForceTriggerTranslateCount is private
// in translate::TranslatePrefs.
pref_service_.registry()->RegisterIntegerPref(
"translate_force_trigger_on_english_count_for_backoff_1", 0);
pref_service_.registry()->RegisterDictionaryPref(
translate::TranslatePrefs::kPrefTranslateAutoAlwaysCount);
pref_service_.registry()->RegisterDictionaryPref(
......@@ -144,6 +157,7 @@ class CWVTranslationControllerTest : public TestWithLocaleAndResources {
TestLanguageModel language_model_;
TestingPrefServiceSimple pref_service_;
std::unique_ptr<translate::TranslateAcceptLanguages> accept_languages_;
web::TestBrowserState browser_state_;
web::TestWebState web_state_;
MockWebViewTranslateClient* translate_client_;
CWVTranslationController* translation_controller_;
......@@ -155,16 +169,17 @@ TEST_F(CWVTranslationControllerTest, CanOfferCallback) {
id delegate = OCMProtocolMock(@protocol(CWVTranslationControllerDelegate));
translation_controller_.delegate = delegate;
[[delegate expect] translationController:translation_controller_
canOfferTranslationFromLanguage:CheckLanguageCode(kTestFromLangCode)
toLanguage:CheckLanguageCode(kTestToLangCode)];
OCMExpect([delegate
translationController:translation_controller_
canOfferTranslationFromLanguage:CheckLanguageCode(kTestFromLangCode)
toLanguage:CheckLanguageCode(kTestToLangCode)]);
translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
base::SysNSStringToUTF8(kTestFromLangCode),
base::SysNSStringToUTF8(kTestToLangCode),
translate::TranslateErrors::NONE,
/*triggered_from_menu=*/false);
[delegate verify];
EXPECT_OCMOCK_VERIFY(delegate);
}
// Tests CWVTranslationController invokes did start delegate method.
......@@ -172,17 +187,17 @@ TEST_F(CWVTranslationControllerTest, DidStartCallback) {
id delegate = OCMProtocolMock(@protocol(CWVTranslationControllerDelegate));
translation_controller_.delegate = delegate;
[[delegate expect] translationController:translation_controller_
didStartTranslationFromLanguage:CheckLanguageCode(kTestFromLangCode)
toLanguage:CheckLanguageCode(kTestToLangCode)
userInitiated:YES];
OCMExpect([delegate translationController:translation_controller_
didStartTranslationFromLanguage:CheckLanguageCode(kTestFromLangCode)
toLanguage:CheckLanguageCode(kTestToLangCode)
userInitiated:YES]);
translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_TRANSLATING,
base::SysNSStringToUTF8(kTestFromLangCode),
base::SysNSStringToUTF8(kTestToLangCode),
translate::TranslateErrors::NONE,
/*triggered_from_menu=*/true);
[delegate verify];
EXPECT_OCMOCK_VERIFY(delegate);
}
// Tests CWVTranslationController invokes did finish delegate method.
......@@ -193,10 +208,10 @@ TEST_F(CWVTranslationControllerTest, DidFinishCallback) {
id check_error_code = [OCMArg checkWithBlock:^BOOL(NSError* error) {
return error.code == CWVTranslationErrorInitializationError;
}];
[[delegate expect] translationController:translation_controller_
didFinishTranslationFromLanguage:CheckLanguageCode(kTestFromLangCode)
toLanguage:CheckLanguageCode(kTestToLangCode)
error:check_error_code];
OCMExpect([delegate translationController:translation_controller_
didFinishTranslationFromLanguage:CheckLanguageCode(kTestFromLangCode)
toLanguage:CheckLanguageCode(kTestToLangCode)
error:check_error_code]);
translate_client_->ShowTranslateUI(
translate::TRANSLATE_STEP_AFTER_TRANSLATE,
base::SysNSStringToUTF8(kTestFromLangCode),
......@@ -204,7 +219,7 @@ TEST_F(CWVTranslationControllerTest, DidFinishCallback) {
translate::TranslateErrors::INITIALIZATION_ERROR,
/*triggered_from_menu=*/false);
[delegate verify];
EXPECT_OCMOCK_VERIFY(delegate);
}
// Tests CWVTranslationController has at least one supported language.
......@@ -252,8 +267,8 @@ TEST_F(CWVTranslationControllerTest, ReadPageHostPolicy) {
EXPECT_NSEQ(nil, policy.language);
}
// Tests CWVTranslationController translate page and revert methods.
TEST_F(CWVTranslationControllerTest, TranslatePageAndRevert) {
// Tests CWVTranslationController translate page method.
TEST_F(CWVTranslationControllerTest, TranslatePage) {
NSArray* langs = translation_controller_.supportedLanguages.allObjects;
CWVTranslationLanguage* from_lang = langs.firstObject;
CWVTranslationLanguage* to_lang = langs.lastObject;
......@@ -265,9 +280,19 @@ TEST_F(CWVTranslationControllerTest, TranslatePageAndRevert) {
[translation_controller_ translatePageFromLanguage:from_lang
toLanguage:to_lang
userInitiated:YES];
}
// Tests CWVTranslationController revert method.
TEST_F(CWVTranslationControllerTest, Revert) {
EXPECT_CALL(*translate_client_, RevertTranslation);
[translation_controller_ revertTranslation];
}
// Tests CWVTranslationController request translation offer method.
TEST_F(CWVTranslationControllerTest, RequestTranslationOffer) {
EXPECT_CALL(*translate_client_, RequestTranslationOffer)
.WillOnce(Return(true));
EXPECT_TRUE([translation_controller_ requestTranslationOffer]);
}
} // namespace ios_web_view
......@@ -54,6 +54,11 @@ class WebViewTranslateClient : public translate::TranslateClient {
// Marked virtual to allow for testing.
virtual void RevertTranslation();
// Attempts to initiate a manual translation flow.
// Returns boolean indicating if translation can be offered.
// Marked virtual to allow for testing.
virtual bool RequestTranslationOffer();
// TranslateClient implementation.
translate::IOSTranslateDriver* GetTranslateDriver() override;
PrefService* GetPrefs() override;
......
......@@ -70,6 +70,15 @@ void WebViewTranslateClient::RevertTranslation() {
translate_manager_.RevertTranslation();
}
bool WebViewTranslateClient::RequestTranslationOffer() {
if (translate_manager_.CanManuallyTranslate()) {
translate_manager_.InitiateManualTranslation();
return true;
} else {
return false;
}
}
// TranslateClient implementation:
std::unique_ptr<infobars::InfoBar> WebViewTranslateClient::CreateInfoBar(
......
......@@ -74,6 +74,12 @@ CWV_EXPORT
// Results in No-op if the page was never translated.
- (void)revertTranslation;
// If the |delegate| was not offered to translate the page via the method
// |translationController:canOfferTranslationFromLanguage:toLanguage:|, this
// method may be called to manually trigger it.
// Returns boolean indicating if a translation can be offered.
- (BOOL)requestTranslationOffer;
// Sets or retrieves translation policies associated with a specified language.
// |pageLanguage| should be the language code of the language.
- (void)setTranslationPolicy:(CWVTranslationPolicy*)policy
......
......@@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN
@protocol CWVTranslationControllerDelegate<NSObject>
@optional
// Called if the current page is not automatically translated, but may need
// translation according to its language and the user's locale.
// |pageLanguage| is given as the detected language of the page and
......
......@@ -29,6 +29,7 @@
- (void)translationController:(CWVTranslationController*)controller
canOfferTranslationFromLanguage:(CWVTranslationLanguage*)pageLanguage
toLanguage:(CWVTranslationLanguage*)userLanguage {
NSLog(@"%@:%@:%@", NSStringFromSelector(_cmd), pageLanguage, userLanguage);
__weak ShellTranslationDelegate* weakSelf = self;
self.beforeTranslateActionSheet = [UIAlertController
......@@ -102,4 +103,20 @@
completion:nil];
}
- (void)translationController:(CWVTranslationController*)controller
didStartTranslationFromLanguage:(CWVTranslationLanguage*)sourceLanguage
toLanguage:(CWVTranslationLanguage*)targetLanguage
userInitiated:(BOOL)userInitiated {
NSLog(@"%@:%@:%@:%@", NSStringFromSelector(_cmd), sourceLanguage,
targetLanguage, @(userInitiated));
}
- (void)translationController:(CWVTranslationController*)controller
didFinishTranslationFromLanguage:(CWVTranslationLanguage*)sourceLanguage
toLanguage:(CWVTranslationLanguage*)targetLanguage
error:(nullable NSError*)error {
NSLog(@"%@:%@:%@:%@", NSStringFromSelector(_cmd), sourceLanguage,
targetLanguage, error);
}
@end
......@@ -640,6 +640,13 @@ NSString* const kWebViewShellJavaScriptDialogTextFieldAccessibilityIdentifier =
[weakSelf resetTranslateSettings];
}]];
[alertController
addAction:[UIAlertAction actionWithTitle:@"Request translation offer"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction* action) {
[weakSelf requestTranslationOffer];
}]];
// Shows sync menu.
[alertController
addAction:[UIAlertAction actionWithTitle:@"Sync menu"
......@@ -666,6 +673,11 @@ NSString* const kWebViewShellJavaScriptDialogTextFieldAccessibilityIdentifier =
[configuration.preferences resetTranslationSettings];
}
- (void)requestTranslationOffer {
BOOL offered = [_webView.translationController requestTranslationOffer];
NSLog(@"Manual translation was offered: %d", offered);
}
- (void)toggleIncognito {
BOOL wasPersistent = _webView.configuration.persistent;
[self removeWebView];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment