Index: components/dom_distiller/ios/distiller_page_ios.mm |
diff --git a/components/dom_distiller/ios/distiller_page_ios.mm b/components/dom_distiller/ios/distiller_page_ios.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4d04aa66a24c55cc5a4a188aa785d7a9edbe5b6e |
--- /dev/null |
+++ b/components/dom_distiller/ios/distiller_page_ios.mm |
@@ -0,0 +1,111 @@ |
+// Copyright 2014 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. |
+ |
+#include "components/dom_distiller/ios/distiller_page_ios.h" |
+ |
+#import <UIKit/UIKit.h> |
+ |
+#include "base/json/json_reader.h" |
+#include "base/logging.h" |
+#include "base/strings/sys_string_conversions.h" |
+#include "base/values.h" |
+#include "ios/public/provider/web/web_controller_provider.h" |
+#include "ios/web/public/browser_state.h" |
+ |
+namespace dom_distiller { |
+ |
+// Helper class for observing the loading of URLs to distill. |
+class DistillerWebStateObserver : public web::WebStateObserver { |
+ public: |
+ DistillerWebStateObserver(web::WebState* web_state, |
+ DistillerPageIOS* distiller_page); |
+ |
+ // WebStateObserver implementation: |
+ void PageLoaded( |
+ web::PageLoadCompletionStatus load_completion_status) override; |
+ |
+ private: |
+ DistillerPageIOS* distiller_page_; // weak, owns this object. |
+}; |
+ |
+DistillerWebStateObserver::DistillerWebStateObserver( |
+ web::WebState* web_state, |
+ DistillerPageIOS* distiller_page) |
+ : web::WebStateObserver(web_state), distiller_page_(distiller_page) { |
+ DCHECK(web_state); |
+ DCHECK(distiller_page_); |
+} |
+ |
+void DistillerWebStateObserver::PageLoaded( |
+ web::PageLoadCompletionStatus load_completion_status) { |
+ distiller_page_->OnLoadURLDone(load_completion_status); |
+} |
+ |
+#pragma mark - |
+ |
+DistillerPageIOS::DistillerPageIOS(web::BrowserState* browser_state) |
+ : browser_state_(browser_state), weak_ptr_factory_(this) { |
+} |
+ |
+DistillerPageIOS::~DistillerPageIOS() { |
+} |
+ |
+void DistillerPageIOS::DistillPageImpl(const GURL& url, |
+ const std::string& script) { |
+ if (!url.is_valid() || !script.length()) |
+ return; |
+ url_ = url; |
+ script_ = script; |
+ |
+ // Lazily create provider. |
+ if (!provider_) { |
+ if (ios::GetWebControllerProviderFactory()) { |
+ provider_ = |
+ ios::GetWebControllerProviderFactory()->CreateWebControllerProvider( |
+ browser_state_); |
+ web_state_observer_.reset( |
+ new DistillerWebStateObserver(provider_->GetWebState(), this)); |
+ } |
+ } |
+ |
+ // Load page using provider. |
+ if (provider_) |
+ provider_->LoadURL(url_); |
+ else |
+ OnLoadURLDone(web::PageLoadCompletionStatus::FAILURE); |
+} |
+ |
+void DistillerPageIOS::OnLoadURLDone( |
+ web::PageLoadCompletionStatus load_completion_status) { |
+ // Don't attempt to distill if the page load failed or if there is no |
+ // provider. |
+ if (load_completion_status == web::PageLoadCompletionStatus::FAILURE || |
+ !provider_) { |
+ HandleJavaScriptResultString(@""); |
+ return; |
+ } |
+ |
+ // Inject the script. |
+ base::WeakPtr<DistillerPageIOS> weak_this = weak_ptr_factory_.GetWeakPtr(); |
+ provider_->InjectScript(script_, ^(NSString* string, NSError* error) { |
+ DistillerPageIOS* distiller_page = weak_this.get(); |
+ if (distiller_page) |
+ distiller_page->HandleJavaScriptResultString(string); |
+ }); |
+} |
+ |
+void DistillerPageIOS::HandleJavaScriptResultString(NSString* result) { |
+ scoped_ptr<base::Value> resultValue(base::Value::CreateNullValue()); |
+ if (result.length) { |
+ scoped_ptr<base::Value> dictionaryValue( |
+ base::JSONReader::Read(base::SysNSStringToUTF8(result))); |
+ if (dictionaryValue && |
+ dictionaryValue->IsType(base::Value::TYPE_DICTIONARY)) { |
+ resultValue = dictionaryValue.Pass(); |
+ } |
+ } |
+ OnDistillationDone(url_, resultValue.get()); |
+} |
+ |
+} // namespace dom_distiller |