1// Copyright 2014 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
5#include "components/translate/content/browser/content_translate_driver.h"
6
7#include "base/logging.h"
8#include "components/translate/content/common/translate_messages.h"
9#include "content/public/browser/browser_context.h"
10#include "content/public/browser/navigation_controller.h"
11#include "content/public/browser/navigation_entry.h"
12#include "content/public/browser/page_navigator.h"
13#include "content/public/browser/render_view_host.h"
14#include "content/public/browser/web_contents.h"
15#include "content/public/common/referrer.h"
16#include "url/gurl.h"
17
18ContentTranslateDriver::ContentTranslateDriver(
19    content::NavigationController* nav_controller)
20    : navigation_controller_(nav_controller),
21      observer_(NULL) {
22  DCHECK(navigation_controller_);
23}
24
25ContentTranslateDriver::~ContentTranslateDriver() {}
26
27// TranslateDriver methods
28
29bool ContentTranslateDriver::IsLinkNavigation() {
30  return navigation_controller_ && navigation_controller_->GetActiveEntry() &&
31         navigation_controller_->GetActiveEntry()->GetTransitionType() ==
32             content::PAGE_TRANSITION_LINK;
33}
34
35void ContentTranslateDriver::OnTranslateEnabledChanged() {
36  if (observer_) {
37    content::WebContents* web_contents =
38        navigation_controller_->GetWebContents();
39    observer_->OnTranslateEnabledChanged(web_contents);
40  }
41}
42
43void ContentTranslateDriver::OnIsPageTranslatedChanged() {
44  if (observer_) {
45    content::WebContents* web_contents =
46        navigation_controller_->GetWebContents();
47    observer_->OnIsPageTranslatedChanged(web_contents);
48  }
49}
50
51void ContentTranslateDriver::TranslatePage(const std::string& translate_script,
52                                           const std::string& source_lang,
53                                           const std::string& target_lang) {
54  content::NavigationEntry* entry = navigation_controller_->GetActiveEntry();
55  if (!entry) {
56    NOTREACHED();
57    return;
58  }
59
60  content::WebContents* web_contents = navigation_controller_->GetWebContents();
61  web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage(
62      web_contents->GetRenderViewHost()->GetRoutingID(),
63      entry->GetPageID(),
64      translate_script,
65      source_lang,
66      target_lang));
67}
68
69void ContentTranslateDriver::RevertTranslation() {
70  content::NavigationEntry* entry = navigation_controller_->GetActiveEntry();
71  if (!entry) {
72    NOTREACHED();
73    return;
74  }
75
76  content::WebContents* web_contents = navigation_controller_->GetWebContents();
77  web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation(
78      web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID()));
79}
80
81bool ContentTranslateDriver::IsOffTheRecord() {
82  return navigation_controller_->GetBrowserContext()->IsOffTheRecord();
83}
84
85const std::string& ContentTranslateDriver::GetContentsMimeType() {
86  return navigation_controller_->GetWebContents()->GetContentsMimeType();
87}
88
89const GURL& ContentTranslateDriver::GetLastCommittedURL() {
90  return navigation_controller_->GetWebContents()->GetLastCommittedURL();
91}
92
93const GURL& ContentTranslateDriver::GetActiveURL() {
94  content::NavigationEntry* entry = navigation_controller_->GetActiveEntry();
95  if (!entry)
96    return GURL::EmptyGURL();
97  return entry->GetURL();
98}
99
100const GURL& ContentTranslateDriver::GetVisibleURL() {
101  return navigation_controller_->GetWebContents()->GetVisibleURL();
102}
103
104bool ContentTranslateDriver::HasCurrentPage() {
105  return (navigation_controller_->GetActiveEntry() != NULL);
106}
107
108int ContentTranslateDriver::GetCurrentPageID() {
109  DCHECK(HasCurrentPage());
110  content::NavigationEntry* entry = navigation_controller_->GetActiveEntry();
111  return entry->GetPageID();
112}
113
114void ContentTranslateDriver::OpenUrlInNewTab(const GURL& url) {
115  content::OpenURLParams params(url,
116                                content::Referrer(),
117                                NEW_FOREGROUND_TAB,
118                                content::PAGE_TRANSITION_LINK,
119                                false);
120  navigation_controller_->GetWebContents()->OpenURL(params);
121}
122