1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef IOS_WEB_PUBLIC_WEB_STATE_OBSERVER_BRIDGE_H_
6 #define IOS_WEB_PUBLIC_WEB_STATE_OBSERVER_BRIDGE_H_
7 
8 #import <Foundation/Foundation.h>
9 
10 #include <string>
11 
12 #include "base/macros.h"
13 #include "ios/web/public/web_state_observer.h"
14 
15 // Observes page lifecyle events from Objective-C. To use as a
16 // web::WebStateObserver, wrap in a web::WebStateObserverBridge.
17 @protocol CRWWebStateObserver <NSObject>
18 @optional
19 
20 // Invoked by WebStateObserverBridge::WasShown.
21 - (void)webStateWasShown:(web::WebState*)webState;
22 
23 // Invoked by WebStateObserverBridge::WasHidden.
24 - (void)webStateWasHidden:(web::WebState*)webState;
25 
26 // Invoked by WebStateObserverBridge::DidStartNavigation.
27 - (void)webState:(web::WebState*)webState
28     didStartNavigation:(web::NavigationContext*)navigation;
29 
30 // Invoked by WebStateObserverBridge::DidFinishNavigation.
31 - (void)webState:(web::WebState*)webState
32     didFinishNavigation:(web::NavigationContext*)navigation;
33 
34 // Invoked by WebStateObserverBridge::PageLoaded.
35 - (void)webState:(web::WebState*)webState didLoadPageWithSuccess:(BOOL)success;
36 
37 // Invoked by WebStateObserverBridge::LoadProgressChanged.
38 - (void)webState:(web::WebState*)webState
39     didChangeLoadingProgress:(double)progress;
40 
41 // Invoked by WebStateObserverBridge::DidChangeBackForwardState.
42 - (void)webStateDidChangeBackForwardState:(web::WebState*)webState;
43 
44 // Invoked by WebStateObserverBridge::TitleWasSet.
45 - (void)webStateDidChangeTitle:(web::WebState*)webState;
46 
47 // Invoked by WebStateObserverBridge::DidChangeVisibleSecurityState.
48 - (void)webStateDidChangeVisibleSecurityState:(web::WebState*)webState;
49 
50 // Invoked by WebStateObserverBridge::FaviconUrlUpdated.
51 - (void)webState:(web::WebState*)webState
52     didUpdateFaviconURLCandidates:
53         (const std::vector<web::FaviconURL>&)candidates;
54 
55 // Invoked by WebStateObserverBridge::WebFrameDidBecomeAvailable.
56 - (void)webState:(web::WebState*)webState
57     frameDidBecomeAvailable:(web::WebFrame*)web_frame;
58 
59 // Invoked by WebStateObserverBridge::WebFrameWillBecomeUnavailable.
60 - (void)webState:(web::WebState*)webState
61     frameWillBecomeUnavailable:(web::WebFrame*)web_frame;
62 
63 // Invoked by WebStateObserverBridge::RenderProcessGone.
64 - (void)renderProcessGoneForWebState:(web::WebState*)webState;
65 
66 // Note: after |webStateDestroyed:| is invoked, the WebState being observed
67 // is no longer valid.
68 - (void)webStateDestroyed:(web::WebState*)webState;
69 
70 // Invoked by WebStateObserverBridge::DidStopLoading.
71 - (void)webStateDidStopLoading:(web::WebState*)webState;
72 
73 // Invoked by WebStateObserverBridge::DidStartLoading.
74 - (void)webStateDidStartLoading:(web::WebState*)webState;
75 
76 @end
77 
78 namespace web {
79 
80 // Bridge to use an id<CRWWebStateObserver> as a web::WebStateObserver.
81 class WebStateObserverBridge : public web::WebStateObserver {
82  public:
83   // It it the responsibility of calling code to add/remove the instance
84   // from the WebStates observer lists.
85   WebStateObserverBridge(id<CRWWebStateObserver> observer);
86   ~WebStateObserverBridge() override;
87 
88   // web::WebStateObserver methods.
89   void WasShown(web::WebState* web_state) override;
90   void WasHidden(web::WebState* web_state) override;
91   void DidStartNavigation(web::WebState* web_state,
92                           NavigationContext* navigation_context) override;
93   void DidFinishNavigation(web::WebState* web_state,
94                            NavigationContext* navigation_context) override;
95   void PageLoaded(
96       web::WebState* web_state,
97       web::PageLoadCompletionStatus load_completion_status) override;
98   void LoadProgressChanged(web::WebState* web_state, double progress) override;
99   void DidChangeBackForwardState(web::WebState* web_state) override;
100   void TitleWasSet(web::WebState* web_state) override;
101   void DidChangeVisibleSecurityState(web::WebState* web_state) override;
102   void FaviconUrlUpdated(web::WebState* web_state,
103                          const std::vector<FaviconURL>& candidates) override;
104   void WebFrameDidBecomeAvailable(WebState* web_state,
105                                   WebFrame* web_frame) override;
106   void WebFrameWillBecomeUnavailable(WebState* web_state,
107                                      WebFrame* web_frame) override;
108   void RenderProcessGone(web::WebState* web_state) override;
109   void WebStateDestroyed(web::WebState* web_state) override;
110   void DidStartLoading(web::WebState* web_state) override;
111   void DidStopLoading(web::WebState* web_state) override;
112 
113  private:
114   __weak id<CRWWebStateObserver> observer_ = nil;
115   DISALLOW_COPY_AND_ASSIGN(WebStateObserverBridge);
116 };
117 
118 }  // namespace web
119 
120 #endif  // IOS_WEB_PUBLIC_WEB_STATE_OBSERVER_BRIDGE_H_
121