Chromium Code Reviews| Index: ios/chrome/browser/reading_list/reading_list_web_state_observer.mm |
| diff --git a/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm b/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm |
| index b4aa9c0983e0990ab5f7f49a9064cd8bef3b5f2b..016ee6f40a7352af0aa4872aa27648fb61468029 100644 |
| --- a/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm |
| +++ b/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm |
| @@ -9,7 +9,7 @@ |
| #include "base/memory/ptr_util.h" |
| #include "components/reading_list/ios/reading_list_model.h" |
| #include "ios/chrome/browser/browser_state/chrome_browser_state.h" |
| -#include "ios/chrome/browser/reading_list/reading_list_entry_loading_util.h" |
| +#include "ios/chrome/browser/reading_list/offline_url_utils.h" |
| #include "ios/chrome/browser/reading_list/reading_list_model_factory.h" |
| #include "ios/web/public/navigation_item.h" |
| #include "ios/web/public/navigation_manager.h" |
| @@ -34,7 +34,8 @@ class ReadingListWebStateObserverUserDataWrapper |
| public: |
| static ReadingListWebStateObserverUserDataWrapper* FromWebState( |
| web::WebState* web_state, |
| - ReadingListModel* reading_list_model) { |
| + ReadingListModel* reading_list_model, |
| + ReadingListWebStateObserverDelegateType delegate) { |
| DCHECK(web_state); |
| ReadingListWebStateObserverUserDataWrapper* wrapper = |
| static_cast<ReadingListWebStateObserverUserDataWrapper*>( |
| @@ -42,7 +43,7 @@ class ReadingListWebStateObserverUserDataWrapper |
| if (!wrapper) { |
| auto newDataWrapper = |
| base::MakeUnique<ReadingListWebStateObserverUserDataWrapper>( |
| - web_state, reading_list_model); |
| + web_state, reading_list_model, delegate); |
| wrapper = newDataWrapper.get(); |
| web_state->SetUserData(kObserverKey, newDataWrapper.release()); |
| } |
| @@ -51,8 +52,9 @@ class ReadingListWebStateObserverUserDataWrapper |
| ReadingListWebStateObserverUserDataWrapper( |
| web::WebState* web_state, |
| - ReadingListModel* reading_list_model) |
| - : observer_(web_state, reading_list_model) { |
| + ReadingListModel* reading_list_model, |
| + ReadingListWebStateObserverDelegateType delegate) |
| + : observer_(web_state, reading_list_model, delegate) { |
| DCHECK(web_state); |
| } |
| @@ -66,9 +68,10 @@ class ReadingListWebStateObserverUserDataWrapper |
| ReadingListWebStateObserver* ReadingListWebStateObserver::FromWebState( |
| web::WebState* web_state, |
| - ReadingListModel* reading_list_model) { |
| + ReadingListModel* reading_list_model, |
| + ReadingListWebStateObserverDelegateType delegate) { |
| return ReadingListWebStateObserverUserDataWrapper::FromWebState( |
| - web_state, reading_list_model) |
| + web_state, reading_list_model, delegate) |
| ->observer(); |
| } |
| @@ -76,22 +79,50 @@ ReadingListWebStateObserver::~ReadingListWebStateObserver() {} |
| ReadingListWebStateObserver::ReadingListWebStateObserver( |
| web::WebState* web_state, |
| - ReadingListModel* reading_list_model) |
| + ReadingListModel* reading_list_model, |
| + ReadingListWebStateObserverDelegateType delegate) |
| : web::WebStateObserver(web_state), |
| - reading_list_model_(reading_list_model) { |
| + reading_list_model_(reading_list_model), |
| + delegate_(delegate) { |
| DCHECK(web_state); |
| DCHECK(reading_list_model_); |
| } |
| -void ReadingListWebStateObserver::DidStopLoading() { |
| - StopCheckingProgress(); |
| +void ReadingListWebStateObserver::DidStartLoading() { |
| + if (!reading_list_model_->loaded() || !web_state() || |
| + !web_state()->GetNavigationManager() || |
| + !web_state()->GetNavigationManager()->GetPendingItem()) { |
| + StopCheckingProgress(); |
| + return; |
| + } |
| + GURL url = |
| + web_state()->GetNavigationManager()->GetPendingItem()->GetVirtualURL(); |
| + const ReadingListEntry* entry = reading_list_model_->GetEntryByURL(url); |
| + if (!entry || (entry->DistilledState() != ReadingListEntry::PROCESSED)) { |
| + StopCheckingProgress(); |
| + return; |
| + } |
| + StartCheckingProgress(url); |
| } |
| void ReadingListWebStateObserver::PageLoaded( |
| web::PageLoadCompletionStatus load_completion_status) { |
| - if (load_completion_status == web::PageLoadCompletionStatus::SUCCESS && |
| - pending_url_.is_valid()) { |
| + if (!reading_list_model_->loaded() || !web_state() || |
| + !web_state()->GetNavigationManager() || |
| + !web_state()->GetNavigationManager()->GetLastCommittedItem() || |
| + !pending_url_.is_valid()) { |
| + StopCheckingProgress(); |
| + return; |
| + } |
| + |
| + if (load_completion_status == web::PageLoadCompletionStatus::SUCCESS) { |
| reading_list_model_->SetReadStatus(pending_url_, true); |
| + } else { |
| + const ReadingListEntry* entry = |
| + reading_list_model_->GetEntryByURL(pending_url_); |
| + if (entry) { |
| + LoadReadingListDistilled(); |
| + } |
| } |
| StopCheckingProgress(); |
| } |
| @@ -133,11 +164,20 @@ void ReadingListWebStateObserver::VerifyIfReadingListEntryStartedLoading() { |
| double progress = web_state()->GetLoadingProgress(); |
| const double kMinimumExpectedProgressPerStep = 0.25; |
| if (progress < try_number_ * kMinimumExpectedProgressPerStep) { |
| - reading_list::LoadReadingListDistilled(*entry, reading_list_model_, |
| - web_state()); |
| + LoadReadingListDistilled(); |
| } |
| if (try_number_ >= 3) { |
| // Loading reached 75%, let the page finish normal loading. |
| timer_->Stop(); |
| } |
| } |
| + |
| +void ReadingListWebStateObserver::LoadReadingListDistilled() { |
| + const ReadingListEntry* entry = |
| + reading_list_model_->GetEntryByURL(pending_url_); |
| + DCHECK(entry->DistilledState() == ReadingListEntry::PROCESSED); |
| + GURL url = |
| + reading_list::DistilledURLForPath(entry->DistilledPath(), entry->URL()); |
| + [delegate_ displayOfflineVersionForURL:url]; |
|
Eugene But (OOO till 7-30)
2016/12/15 19:10:03
Is this a call of CRWWebController method?
|
| + reading_list_model_->SetReadStatus(entry->URL(), true); |
| +} |