summaryrefslogtreecommitdiffstats
path: root/components/translate/ios/browser/js_translate_manager.mm
blob: 0431a93f8268ab49f18f4ba55d299b9b0adfdba9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "components/translate/ios/browser/js_translate_manager.h"

#import <Foundation/Foundation.h>

#include "base/logging.h"
#include "base/mac/bundle_locations.h"
#import "base/mac/scoped_nsobject.h"
#include "base/memory/scoped_ptr.h"

@implementation JsTranslateManager {
  base::scoped_nsobject<NSString> _translationScript;
}

- (NSString*)script {
  return _translationScript.get();
}

- (void)setScript:(NSString*)script {
  // The translation script uses performance.now() for metrics, which is not
  // supported except on iOS 8.0. To make the translation script work on these
  // iOS versions, add some JavaScript to |script| that defines an
  // implementation of performance.now().
  NSString* const kPerformancePlaceholder =
      @"var performance = window['performance'] || {};"
      @"performance.now = performance['now'] ||"
      @"(function () { return Date.now(); });\n";
  script = [kPerformancePlaceholder stringByAppendingString:script];
  // TODO(shreyasv): This leads to some duplicate code from
  // CRWJSInjectionManager. Consider refactoring this to its own js injection
  // manager.
  NSString* path =
      [base::mac::FrameworkBundle() pathForResource:@"translate_ios"
                                             ofType:@"js"];
  DCHECK(path);
  NSError* error = nil;
  NSString* content = [NSString stringWithContentsOfFile:path
                                                encoding:NSUTF8StringEncoding
                                                   error:&error];
  DCHECK(!error && [content length]);
  script = [script stringByAppendingString:content];
  _translationScript.reset([script copy]);
}

- (void)injectWaitUntilTranslateReadyScript {
  [self.receiver evaluateJavaScript:@"__gCrWeb.translate.checkTranslateReady()"
                stringResultHandler:nil];
}

- (void)injectTranslateStatusScript {
  [self.receiver evaluateJavaScript:@"__gCrWeb.translate.checkTranslateStatus()"
                stringResultHandler:nil];
}

- (void)startTranslationFrom:(const std::string&)source
                          to:(const std::string&)target {
  NSString* js =
      [NSString stringWithFormat:@"cr.googleTranslate.translate('%s','%s')",
                                 source.c_str(), target.c_str()];
  [self.receiver evaluateJavaScript:js stringResultHandler:nil];
}

- (void)revertTranslation {
  DCHECK([self hasBeenInjected]);
  [self.receiver evaluateJavaScript:@"cr.googleTranslate.revert()"
                stringResultHandler:nil];
}

#pragma mark -
#pragma mark CRWJSInjectionManager methods

- (NSString*)injectionContent {
  DCHECK(_translationScript);
  return _translationScript.autorelease();
}

- (NSString*)presenceBeacon {
  return @"cr.googleTranslate";
}

@end