Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(212)

Unified Diff: components/dom_distiller/ios/distiller_page_ios.mm

Issue 936843002: Upstream iOS implementation of dom_distiller (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@web_controller_provider
Patch Set: Add blank lines Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « components/dom_distiller/ios/distiller_page_ios.h ('k') | components/dom_distiller/ios/javascript/domdistiller.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698