// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_WEB_PUBLIC_JS_MESSAGING_WEB_FRAMES_MANAGER_H_
#define IOS_WEB_PUBLIC_JS_MESSAGING_WEB_FRAMES_MANAGER_H_
#import <set>
#import <string>
#import "base/observer_list_types.h"
namespace web {
class WebFrame;
// Stores and provides access to all WebFrame objects associated with a
// particular WebState.
class WebFramesManager {
public:
// Observer class to notify objects when WebFrames are added or removed.
class Observer : public base::CheckedObserver {
public:
Observer() = default;
~Observer() override = default;
// Called when a frame is created or the user navigates to a new document.
// Receivers can keep references to `web_frame` only until
// `WebFrameBecameUnavailable` at which point the pointer will become
// invalid.
// TODO(crbug.com/40276017): This should pass a WeakPtr instead.
virtual void WebFrameBecameAvailable(WebFramesManager* web_frames_manager,
WebFrame* web_frame) {}
// Called when a frame is deleted or the user navigates away from
// `web_frame` before it is removed from the WebFramesManager. Receivers of
// this callback must clear any stored references to the `web_frame` with
// `frame_id`.
virtual void WebFrameBecameUnavailable(WebFramesManager* web_frames_manager,
const std::string& frame_id) {}
};
WebFramesManager(const WebFramesManager&) = delete;
WebFramesManager& operator=(const WebFramesManager&) = delete;
virtual ~WebFramesManager() {}
// Adds and removes observers of WebFrame availability.
virtual void AddObserver(Observer* observer) = 0;
virtual void RemoveObserver(Observer* observer) = 0;
// TODO(crbug.com/40276017): Transition the below functions to return
// WeakPtrs.
// Returns a list of all the web frames associated with WebState.
// NOTE: Due to the asynchronous nature of renderer, this list may be
// outdated.
virtual std::set<WebFrame*> GetAllWebFrames() = 0;
// Returns the web frame for the main frame associated with WebState or null
// if unknown.
// NOTE: Due to the asynchronous nature of JavaScript to native messsaging,
// this object may be outdated.
virtual WebFrame* GetMainWebFrame() = 0;
// Returns the web frame with `frame_id`, if one exists.
// NOTE: Due to the asynchronous nature of JavaScript to native messsaging,
// this object may be outdated and the WebFrame returned by this method may
// not back a real frame in the web page.
virtual WebFrame* GetFrameWithId(const std::string& frame_id) = 0;
protected:
WebFramesManager() {}
};
} // namespace web
#endif // IOS_WEB_PUBLIC_JS_MESSAGING_WEB_FRAMES_MANAGER_H_