15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef COMPONENTS_TRANSLATE_CONTENT_BROWSER_CONTENT_TRANSLATE_DRIVER_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define COMPONENTS_TRANSLATE_CONTENT_BROWSER_CONTENT_TRANSLATE_DRIVER_H_
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/basictypes.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/weak_ptr.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/observer_list.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_driver.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/translate/core/common/translate_errors.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/web_contents_observer.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NavigationController;
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WebContents;
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace translate {
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct LanguageDetectionDetails;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TranslateManager;
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Content implementation of TranslateDriver.
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ContentTranslateDriver : public TranslateDriver,
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               public content::WebContentsObserver {
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The observer for the ContentTranslateDriver.
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class Observer {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   public:
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Handles when the value of IsPageTranslated is changed.
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual void OnIsPageTranslatedChanged(content::WebContents* source) {};
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Handles when the value of translate_enabled is changed.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual void OnTranslateEnabledChanged(content::WebContents* source) {};
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Called when the page language has been determined.
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual void OnLanguageDetermined(
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const translate::LanguageDetectionDetails& details) {};
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Called when the page has been translated.
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual void OnPageTranslated(
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const std::string& original_lang,
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const std::string& translated_lang,
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        translate::TranslateErrors::Type error_type) {};
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   protected:
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual ~Observer() {}
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentTranslateDriver(content::NavigationController* nav_controller);
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~ContentTranslateDriver();
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Adds or Removes observers.
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AddObserver(Observer* observer);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void RemoveObserver(Observer* observer);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Number of attempts before waiting for a page to be fully reloaded.
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_translate_max_reload_attempts(int attempts) {
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    max_reload_check_attempts_ = attempts;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Sets the TranslateManager associated with this driver.
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_translate_manager(TranslateManager* manager) {
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    translate_manager_ = manager;
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Initiates translation once the page is finished loading.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void InitiateTranslation(const std::string& page_lang, int attempt);
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // TranslateDriver methods.
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnIsPageTranslatedChanged() OVERRIDE;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnTranslateEnabledChanged() OVERRIDE;
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsLinkNavigation() OVERRIDE;
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void TranslatePage(int page_seq_no,
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             const std::string& translate_script,
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                             const std::string& source_lang,
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                             const std::string& target_lang) OVERRIDE;
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void RevertTranslation(int page_seq_no) OVERRIDE;
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool IsOffTheRecord() OVERRIDE;
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual const std::string& GetContentsMimeType() OVERRIDE;
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual const GURL& GetLastCommittedURL() OVERRIDE;
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual const GURL& GetActiveURL() OVERRIDE;
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual const GURL& GetVisibleURL() OVERRIDE;
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool HasCurrentPage() OVERRIDE;
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OpenUrlInNewTab(const GURL& url) OVERRIDE;
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // content::WebContentsObserver implementation.
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void NavigationEntryCommitted(
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const content::LoadCommittedDetails& load_details) OVERRIDE;
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void DidNavigateAnyFrame(
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const content::LoadCommittedDetails& details,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const content::FrameNavigateParams& params) OVERRIDE;
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // IPC handlers.
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnTranslateAssignedSequenceNumber(int page_seq_no);
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnLanguageDetermined(const LanguageDetectionDetails& details,
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            bool page_needs_translation);
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnPageTranslated(const std::string& original_lang,
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const std::string& translated_lang,
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        TranslateErrors::Type error_type);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private:
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The navigation controller of the tab we are associated with.
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::NavigationController* navigation_controller_;
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TranslateManager* translate_manager_;
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ObserverList<Observer, true> observer_list_;
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Max number of attempts before checking if a page has been reloaded.
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int max_reload_check_attempts_;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<ContentTranslateDriver> weak_pointer_factory_;
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ContentTranslateDriver);
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace translate
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // COMPONENTS_TRANSLATE_CONTENT_BROWSER_CONTENT_TRANSLATE_DRIVER_H_
125