Commit 0b3bb45c authored by Sylvain Defresne's avatar Sylvain Defresne Committed by Commit Bot

Allow WebStateObserver to observe N WebStates [27/N].

Convert TextToSpeechListener to directly track the
registration with the observed WebState instead of
relying on the deprecated code in WebStateObserver.

Remove TextToSpeechWebStateObserver and convert the
TextToSpeechListener to implement CRWWebStateObserver.

Bug: 775684
Change-Id: I40592a8cd9e5819168e1a65b9b0738b54d429b38
Cq-Include-Trybots: master.tryserver.chromium.mac:ios-simulator-cronet;master.tryserver.chromium.mac:ios-simulator-full-configs
Reviewed-on: https://chromium-review.googlesource.com/768715
Commit-Queue: Sylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Cr-Commit-Position: refs/heads/master@{#517055}
parent dd5153eb
...@@ -7,13 +7,12 @@ ...@@ -7,13 +7,12 @@
#include <memory> #include <memory>
#include "base/logging.h" #include "base/logging.h"
#include "base/mac/scoped_nsobject.h" #import "ios/chrome/browser/voice/text_to_speech_parser.h"
#include "base/memory/ptr_util.h" #import "ios/chrome/browser/voice/voice_search_url_rewriter.h"
#include "ios/web/public/navigation_manager.h" #include "ios/web/public/navigation_manager.h"
#include "ios/web/public/web_state/web_state.h" #include "ios/web/public/web_state/web_state.h"
#include "ios/web/public/web_state/web_state_observer.h" #include "ios/web/public/web_state/web_state_observer.h"
#import "ios/chrome/browser/voice/text_to_speech_parser.h" #import "ios/web/public/web_state/web_state_observer_bridge.h"
#import "ios/chrome/browser/voice/voice_search_url_rewriter.h"
#include "url/gurl.h" #include "url/gurl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
...@@ -22,72 +21,21 @@ ...@@ -22,72 +21,21 @@
#pragma mark - TextToSpeechListener Private Interface #pragma mark - TextToSpeechListener Private Interface
class TextToSpeechWebStateObserver; @interface TextToSpeechListener ()<CRWWebStateObserver>
@interface TextToSpeechListener ()
// The TextToSpeechListenerDelegate passed on initialization. // The TextToSpeechListenerDelegate passed on initialization.
@property(weak, nonatomic, readonly) id<TextToSpeechListenerDelegate> delegate; @property(weak, nonatomic, readonly) id<TextToSpeechListenerDelegate> delegate;
@end @end
#pragma mark - TextToSpeechWebStateObserver
class TextToSpeechWebStateObserver : public web::WebStateObserver {
public:
TextToSpeechWebStateObserver(web::WebState* web_state,
TextToSpeechListener* listener);
~TextToSpeechWebStateObserver() override;
// web::WebStateObserver implementation:
void PageLoaded(
web::WebState* web_state,
web::PageLoadCompletionStatus load_completion_status) override;
void WebStateDestroyed(web::WebState* web_state) override;
private:
TextToSpeechListener* listener_;
};
TextToSpeechWebStateObserver::TextToSpeechWebStateObserver(
web::WebState* web_state,
TextToSpeechListener* listener)
: web::WebStateObserver(web_state), listener_(listener) {
DCHECK(web_state);
DCHECK(listener);
// Rewrite the next loaded URL to have the voice search flags.
web_state->GetNavigationManager()->AddTransientURLRewriter(
&VoiceSearchURLRewriter);
}
TextToSpeechWebStateObserver::~TextToSpeechWebStateObserver() {}
void TextToSpeechWebStateObserver::PageLoaded(
web::WebState* web_state,
web::PageLoadCompletionStatus load_completion_status) {
const GURL& url = web_state->GetLastCommittedURL();
BOOL shouldParse = [listener_.delegate shouldTextToSpeechListener:listener_
parseDataFromURL:url];
if (shouldParse) {
__weak TextToSpeechListener* weakListener = listener_;
ExtractVoiceSearchAudioDataFromWebState(web_state, ^(NSData* audioData) {
[[weakListener delegate] textToSpeechListener:weakListener
didReceiveResult:audioData];
});
} else {
[listener_.delegate textToSpeechListener:listener_ didReceiveResult:nil];
}
}
void TextToSpeechWebStateObserver::WebStateDestroyed(web::WebState* web_state) {
[listener_.delegate textToSpeechListenerWebStateWasDestroyed:listener_];
}
#pragma mark - TextToSpeechListener #pragma mark - TextToSpeechListener
@implementation TextToSpeechListener { @implementation TextToSpeechListener {
// The TextToSpeechWebStateObserver that listens for Text-To-Speech data. // The WebStateObserverBridge that listens for WebState events.
std::unique_ptr<TextToSpeechWebStateObserver> _webStateObserver; std::unique_ptr<web::WebStateObserverBridge> _webStateObserver;
} }
@synthesize webState = _webState;
@synthesize delegate = _delegate; @synthesize delegate = _delegate;
- (instancetype)initWithWebState:(web::WebState*)webState - (instancetype)initWithWebState:(web::WebState*)webState
...@@ -95,17 +43,49 @@ void TextToSpeechWebStateObserver::WebStateDestroyed(web::WebState* web_state) { ...@@ -95,17 +43,49 @@ void TextToSpeechWebStateObserver::WebStateDestroyed(web::WebState* web_state) {
if ((self = [super init])) { if ((self = [super init])) {
DCHECK(webState); DCHECK(webState);
DCHECK(delegate); DCHECK(delegate);
_webStateObserver = _webState = webState;
base::MakeUnique<TextToSpeechWebStateObserver>(webState, self);
_delegate = delegate; _delegate = delegate;
_webStateObserver = std::make_unique<web::WebStateObserverBridge>(self);
_webState->AddObserver(_webStateObserver.get());
_webState->GetNavigationManager()->AddTransientURLRewriter(
&VoiceSearchURLRewriter);
} }
return self; return self;
} }
#pragma mark Accessors - (void)dealloc {
if (_webState) {
_webState->RemoveObserver(_webStateObserver.get());
_webStateObserver.reset();
_webState = nullptr;
}
}
#pragma mark - CRWWebStateObserver
- (web::WebState*)webState { - (void)webState:(web::WebState*)webState didLoadPageWithSuccess:(BOOL)success {
return _webStateObserver->web_state(); DCHECK_EQ(_webState, webState);
const GURL& URL = webState->GetLastCommittedURL();
if ([_delegate shouldTextToSpeechListener:self parseDataFromURL:URL]) {
__weak TextToSpeechListener* weakSelf = self;
ExtractVoiceSearchAudioDataFromWebState(webState, ^(NSData* audioData) {
[weakSelf.delegate textToSpeechListener:weakSelf
didReceiveResult:audioData];
});
} else {
[self.delegate textToSpeechListener:self didReceiveResult:nil];
}
}
- (void)webStateDestroyed:(web::WebState*)webState {
DCHECK_EQ(_webState, webState);
if (_webState) {
_webState->RemoveObserver(_webStateObserver.get());
_webStateObserver.reset();
_webState = nullptr;
}
[self.delegate textToSpeechListenerWebStateWasDestroyed:self];
} }
@end @end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment