Index: ios/chrome/browser/ui/reader_mode/reader_mode_checker.h |
diff --git a/ios/chrome/browser/ui/reader_mode/reader_mode_checker.h b/ios/chrome/browser/ui/reader_mode/reader_mode_checker.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bb715a94a951e4b31b74852b6c5562658af53a54 |
--- /dev/null |
+++ b/ios/chrome/browser/ui/reader_mode/reader_mode_checker.h |
@@ -0,0 +1,78 @@ |
+// Copyright 2015 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. |
+ |
+#ifndef IOS_CHROME_BROWSER_UI_READER_MODE_READER_MODE_CHECKER_H_ |
+#define IOS_CHROME_BROWSER_UI_READER_MODE_READER_MODE_CHECKER_H_ |
+ |
+#import <Foundation/Foundation.h> |
+ |
+#include "base/memory/weak_ptr.h" |
+#include "base/observer_list.h" |
+#include "ios/web/public/web_state/web_state_observer.h" |
+ |
+namespace web { |
+class WebState; |
+} |
+ |
+class ReaderModeChecker; |
+ |
+@class CRWJSInjectionReceiver; |
+ |
+class ReaderModeCheckerObserver { |
+ public: |
+ explicit ReaderModeCheckerObserver(ReaderModeChecker* readerModeChecker); |
+ virtual ~ReaderModeCheckerObserver(); |
+ |
+ // Called when the content of the page is known to be distillable. |
+ virtual void PageIsDistillable() = 0; |
+ |
+ // Invoked when the ReaderModeChecker is being destroyed. Gives subclasses a |
+ // chance to cleanup. |
+ virtual void ReaderModeCheckerDestroyed() {} |
+ |
+ private: |
+ ReaderModeChecker* readerModeChecker_; |
+ DISALLOW_COPY_AND_ASSIGN(ReaderModeCheckerObserver); |
+}; |
+ |
+// Checks if a page loaded in a container that allows javascript execution is |
+// suitable for reader mode. |
+class ReaderModeChecker : web::WebStateObserver { |
+ public: |
+ explicit ReaderModeChecker(web::WebState* web_state); |
+ ~ReaderModeChecker() override; |
+ |
+ // Returns the switch status of the current page. |
+ bool CanSwitchToReaderMode(); |
+ |
+ // web::WebStateObserver. |
+ void NavigationItemCommitted( |
+ const web::LoadCommittedDetails& load_details) override; |
+ void PageLoaded( |
+ web::PageLoadCompletionStatus load_completion_status) override; |
+ void WebStateDestroyed() override; |
+ |
+ // Adds and removes observers for page navigation notifications. The order in |
+ // which notifications are sent to observers is undefined. Clients must be |
+ // sure to remove the observer before they go away. |
+ void AddObserver(ReaderModeCheckerObserver* observer); |
+ void RemoveObserver(ReaderModeCheckerObserver* observer); |
+ |
+ private: |
+ // Checks if the current webstate is distillable. |
+ void CheckIsDistillable(); |
+ // Does a simple check, Just checking OpenGraph properties. |
+ void CheckIsDistillableOG(CRWJSInjectionReceiver* receiver); |
+ // Does a more involved check. |
+ void CheckIsDistillableDetector(CRWJSInjectionReceiver* receiver); |
+ // Stores if the current webstate URL is suitable for reader mode. |
+ enum class Status; |
+ Status is_distillable_; |
+ // A list of observers notified when page state changes. Weak references. |
+ base::ObserverList<ReaderModeCheckerObserver, true> observers_; |
+ base::WeakPtrFactory<ReaderModeChecker> weak_factory_; |
+ DISALLOW_COPY_AND_ASSIGN(ReaderModeChecker); |
+}; |
+ |
+#endif // IOS_CHROME_BROWSER_UI_READER_MODE_READER_MODE_CHECKER_H_ |