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 |
index 8ae4962c07eb3141a760777cf400f6621656aafd..8ffacdfcbddcedc8bdfd58374cbbabd3db14747e 100644 |
--- a/components/dom_distiller/ios/distiller_page_ios.mm |
+++ b/components/dom_distiller/ios/distiller_page_ios.mm |
@@ -13,10 +13,14 @@ |
#include "base/mac/foundation_util.h" |
#include "base/memory/ptr_util.h" |
#include "base/strings/sys_string_conversions.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "base/values.h" |
-#include "ios/public/provider/web/web_controller_provider.h" |
-#include "ios/public/provider/web/web_controller_provider_factory.h" |
+#include "components/favicon/ios/web_favicon_driver.h" |
#include "ios/web/public/browser_state.h" |
+#import "ios/web/public/navigation_manager.h" |
+#import "ios/web/public/web_state/js/crw_js_injection_manager.h" |
+#import "ios/web/public/web_state/js/crw_js_injection_receiver.h" |
+#import "ios/web/public/web_state/web_state.h" |
namespace { |
@@ -105,6 +109,7 @@ class DistillerWebStateObserver : public web::WebStateObserver { |
// WebStateObserver implementation: |
void PageLoaded( |
web::PageLoadCompletionStatus load_completion_status) override; |
+ void WebStateDestroyed() override; |
private: |
DistillerPageIOS* distiller_page_; // weak, owns this object. |
@@ -123,11 +128,15 @@ void DistillerWebStateObserver::PageLoaded( |
distiller_page_->OnLoadURLDone(load_completion_status); |
} |
+void DistillerWebStateObserver::WebStateDestroyed() { |
+ distiller_page_->web_state_ = nullptr; |
+} |
+ |
#pragma mark - |
-DistillerPageIOS::DistillerPageIOS(web::BrowserState* browser_state) |
- : browser_state_(browser_state), weak_ptr_factory_(this) { |
-} |
+DistillerPageIOS::DistillerPageIOS( |
+ FaviconWebStateDispatcher* web_state_dispatcher) |
+ : web_state_dispatcher_(web_state_dispatcher), weak_ptr_factory_(this) {} |
DistillerPageIOS::~DistillerPageIOS() { |
} |
@@ -143,44 +152,56 @@ void DistillerPageIOS::DistillPageImpl(const GURL& url, |
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)); |
- } |
- } |
+ web_state_ = web_state_dispatcher_->RequestWebState(); |
- // Load page using provider. |
- if (provider_) |
- provider_->LoadURL(url_); |
- else |
+ if (!web_state_) { |
OnLoadURLDone(web::PageLoadCompletionStatus::FAILURE); |
+ return; |
+ } |
+ |
+ web_state_observer_ = |
+ base::MakeUnique<DistillerWebStateObserver>(web_state_, this); |
+ |
+ // The favicon driver needs to know which URL is currently fetched. |
+ favicon::WebFaviconDriver* favicon_driver = |
+ favicon::WebFaviconDriver::FromWebState(web_state_); |
+ favicon_driver->FetchFavicon(url_); |
+ |
+ // Load page using WebState. |
+ web::NavigationManager::WebLoadParams params(url_); |
+ web_state_->SetWebUsageEnabled(true); |
+ web_state_->GetNavigationManager()->LoadURLWithParams(params); |
+ // GetView is needed because the view is not created (but needed) when |
+ // loading the page. |
+ web_state_->GetView(); |
} |
void DistillerPageIOS::OnLoadURLDone( |
web::PageLoadCompletionStatus load_completion_status) { |
// Don't attempt to distill if the page load failed or if there is no |
- // provider. |
+ // WebState. |
if (load_completion_status == web::PageLoadCompletionStatus::FAILURE || |
- !provider_) { |
+ !web_state_) { |
HandleJavaScriptResult(nil); |
return; |
} |
// Inject the script. |
base::WeakPtr<DistillerPageIOS> weak_this = weak_ptr_factory_.GetWeakPtr(); |
- provider_->InjectScript(script_, ^(id result, NSError* error) { |
- DistillerPageIOS* distiller_page = weak_this.get(); |
- if (distiller_page) |
- distiller_page->HandleJavaScriptResult(result); |
- }); |
+ |
+ [[web_state_->GetJSInjectionReceiver() |
+ instanceOfClass:[CRWJSInjectionManager class]] |
+ executeJavaScript:base::SysUTF8ToNSString(script_) |
+ completionHandler:^(id result, NSError* error) { |
+ DistillerPageIOS* distiller_page = weak_this.get(); |
+ if (distiller_page) |
+ distiller_page->HandleJavaScriptResult(result); |
+ }]; |
} |
void DistillerPageIOS::HandleJavaScriptResult(id result) { |
+ web_state_dispatcher_->ReturnWebState(web_state_); |
+ web_state_ = nullptr; |
std::unique_ptr<base::Value> resultValue = base::Value::CreateNullValue(); |
if (result) { |
resultValue = ValueResultFromScriptResult(result); |