Commit 29571ef0 authored by tfarina@chromium.org's avatar tfarina@chromium.org

Move RenderViewHostObserver to content/public/browser/ and put it into the content namespace.

BUG=98716
R=jam@chromium.org

Review URL: http://codereview.chromium.org/8676032

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111604 0039d316-1c4b-4281-b951-d872f2087c98
parent 406af397
......@@ -20,8 +20,8 @@
#include "chrome/browser/ui/views/dom_view.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chrome/common/render_messages.h"
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "content/public/browser/render_view_host_observer.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/size.h"
#include "ui/views/widget/widget.h"
......@@ -46,10 +46,10 @@ const char kAccelNameEnrollment[] = "enrollment";
// Observes IPC messages from the FrameSniffer and notifies JS if error
// appears.
class SnifferObserver : public RenderViewHostObserver {
class SnifferObserver : public content::RenderViewHostObserver {
public:
SnifferObserver(RenderViewHost* host, WebUI* webui)
: RenderViewHostObserver(host), webui_(webui) {
: content::RenderViewHostObserver(host), webui_(webui) {
DCHECK(webui_);
Send(new ChromeViewMsg_StartFrameSniffer(routing_id(),
UTF8ToUTF16("gaia-frame")));
......
......@@ -164,7 +164,7 @@ DevToolsWindow::DevToolsWindow(TabContentsWrapper* tab_contents,
Profile* profile,
RenderViewHost* inspected_rvh,
bool docked)
: RenderViewHostObserver(tab_contents->render_view_host()),
: content::RenderViewHostObserver(tab_contents->render_view_host()),
profile_(profile),
inspected_tab_(NULL),
tab_contents_(tab_contents),
......
......@@ -13,10 +13,10 @@
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/debugger/devtools_toggle_action.h"
#include "content/browser/debugger/devtools_client_host.h"
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/browser/tab_contents/tab_contents_delegate.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/render_view_host_observer.h"
namespace IPC {
class Message;
......@@ -34,11 +34,10 @@ namespace base {
class Value;
}
class DevToolsWindow
: public DevToolsClientHost,
private content::NotificationObserver,
private TabContentsDelegate,
private RenderViewHostObserver {
class DevToolsWindow : public DevToolsClientHost,
private content::NotificationObserver,
private TabContentsDelegate,
private content::RenderViewHostObserver {
public:
static const char kDevToolsApp[];
static void RegisterUserPrefs(PrefService* prefs);
......@@ -125,7 +124,7 @@ class DevToolsWindow
DevToolsToggleAction action);
static DevToolsWindow* AsDevToolsWindow(DevToolsClientHost*);
// RenderViewHostObserver overrides.
// content::RenderViewHostObserver overrides.
virtual void RenderViewHostDestroyed(RenderViewHost* rvh) OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
......
......@@ -28,7 +28,7 @@ void ExtensionFunctionDeleteTraits::Destruct(const ExtensionFunction* x) {
UIThreadExtensionFunction::RenderViewHostTracker::RenderViewHostTracker(
UIThreadExtensionFunction* function,
RenderViewHost* render_view_host)
: RenderViewHostObserver(render_view_host),
: content::RenderViewHostObserver(render_view_host),
function_(function) {
registrar_.Add(this,
content::NOTIFICATION_RENDER_VIEW_HOST_DELETED,
......
......@@ -16,10 +16,10 @@
#include "base/process.h"
#include "chrome/browser/extensions/extension_info_map.h"
#include "chrome/common/extensions/extension.h"
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/render_view_host_observer.h"
#include "ipc/ipc_message.h"
class Browser;
......@@ -289,7 +289,7 @@ class UIThreadExtensionFunction : public ExtensionFunction {
// NotificationObservers, and it would be an easy error to forget to call the
// base class's Observe() method.
class RenderViewHostTracker : public content::NotificationObserver,
public RenderViewHostObserver {
public content::RenderViewHostObserver {
public:
RenderViewHostTracker(UIThreadExtensionFunction* function,
RenderViewHost* render_view_host);
......
......@@ -14,7 +14,7 @@
ExtensionMessageHandler::ExtensionMessageHandler(
RenderViewHost* render_view_host)
: RenderViewHostObserver(render_view_host) {
: content::RenderViewHostObserver(render_view_host) {
}
ExtensionMessageHandler::~ExtensionMessageHandler() {
......
......@@ -8,7 +8,7 @@
#include <string>
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/public/browser/render_view_host_observer.h"
// Filters and dispatches extension-related IPC messages that arrive from
// renderers. There is one of these objects for each RenderViewHost in Chrome.
......@@ -19,7 +19,7 @@
// could eliminate this class. Right now, we don't end up with an EFD for tab
// contents unless that tab contents is hosting chrome-extension:// URLs. That
// still leaves content scripts. See also: crbug.com/80307.
class ExtensionMessageHandler : public RenderViewHostObserver {
class ExtensionMessageHandler : public content::RenderViewHostObserver {
public:
// |sender| is guaranteed to outlive this object.
explicit ExtensionMessageHandler(RenderViewHost* render_view_host);
......
......@@ -13,7 +13,7 @@ namespace prerender {
PrerenderRenderViewHostObserver::PrerenderRenderViewHostObserver(
PrerenderContents* prerender_contents,
RenderViewHost* render_view_host)
: RenderViewHostObserver(render_view_host),
: content::RenderViewHostObserver(render_view_host),
prerender_contents_(prerender_contents) {
}
......@@ -27,7 +27,7 @@ void PrerenderRenderViewHostObserver::RenderViewHostDestroyed(
bool PrerenderRenderViewHostObserver::OnMessageReceived(
const IPC::Message& message) {
if (!prerender_contents_)
return RenderViewHostObserver::OnMessageReceived(message);
return content::RenderViewHostObserver::OnMessageReceived(message);
bool handled = true;
// The following messages we do want to consume.
......@@ -42,7 +42,7 @@ bool PrerenderRenderViewHostObserver::OnMessageReceived(
// Pass the message through.
if (!handled)
handled = RenderViewHostObserver::OnMessageReceived(message);
handled = content::RenderViewHostObserver::OnMessageReceived(message);
return handled;
}
......@@ -50,7 +50,7 @@ bool PrerenderRenderViewHostObserver::OnMessageReceived(
// The base class declares this as protected so this is just here to make it
// public so it is visible to the caller.
bool PrerenderRenderViewHostObserver::Send(IPC::Message* message) {
return RenderViewHostObserver::Send(message);
return content::RenderViewHostObserver::Send(message);
}
void PrerenderRenderViewHostObserver::OnUpdateFaviconURL(
......
......@@ -7,7 +7,7 @@
#include <vector>
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/public/browser/render_view_host_observer.h"
struct FaviconURL;
class RenderViewHost;
......@@ -21,7 +21,7 @@ namespace prerender {
class PrerenderContents;
// Observer for RenderViewHost messages.
class PrerenderRenderViewHostObserver : public RenderViewHostObserver {
class PrerenderRenderViewHostObserver : public content::RenderViewHostObserver {
public:
PrerenderRenderViewHostObserver(PrerenderContents* prerender_contents,
RenderViewHost* render_view_host);
......
......@@ -23,7 +23,7 @@
ChromeRenderViewHostObserver::ChromeRenderViewHostObserver(
RenderViewHost* render_view_host, chrome_browser_net::Predictor* predictor)
: RenderViewHostObserver(render_view_host),
: content::RenderViewHostObserver(render_view_host),
predictor_(predictor) {
SiteInstance* site_instance = render_view_host->site_instance();
profile_ = Profile::FromBrowserContext(
......
......@@ -6,7 +6,7 @@
#define CHROME_BROWSER_RENDERER_HOST_CHROME_RENDER_VIEW_HOST_OBSERVER_H_
#pragma once
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/public/browser/render_view_host_observer.h"
namespace chrome_browser_net {
class Predictor;
......@@ -17,13 +17,13 @@ class Profile;
// This class holds the Chrome specific parts of RenderViewHost, and has the
// same lifetime.
class ChromeRenderViewHostObserver : public RenderViewHostObserver {
class ChromeRenderViewHostObserver : public content::RenderViewHostObserver {
public:
ChromeRenderViewHostObserver(RenderViewHost* render_view_host,
chrome_browser_net::Predictor* predictor);
virtual ~ChromeRenderViewHostObserver();
// RenderViewHostObserver overrides.
// content::RenderViewHostObserver overrides.
virtual void RenderViewHostInitialized() OVERRIDE;
virtual void RenderViewHostDestroyed(RenderViewHost* rvh) OVERRIDE;
virtual void Navigate(const GURL& url) OVERRIDE;
......
......@@ -16,9 +16,9 @@
#include "chrome/common/spellcheck_messages.h"
#include "content/browser/mac/closure_blocks_leopard_compat.h"
#include "content/browser/renderer_host/render_view_host.h"
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/browser/renderer_host/render_widget_host.h"
#include "content/browser/renderer_host/render_widget_host_view.h"
#include "content/public/browser/render_view_host_observer.h"
// Declare things that are part of the 10.7 SDK.
#if !defined(MAC_OS_X_VERSION_10_7) || \
......@@ -64,12 +64,12 @@ namespace ChromeRenderWidgetHostViewMacDelegateInternal {
// Filters the message sent to RenderViewHost to know if spellchecking is
// enabled or not for the currently focused element.
class SpellCheckRenderViewObserver : public RenderViewHostObserver {
class SpellCheckRenderViewObserver : public content::RenderViewHostObserver {
public:
SpellCheckRenderViewObserver(
RenderViewHost* host,
ChromeRenderWidgetHostViewMacDelegate* view_delegate)
: RenderViewHostObserver(host),
: content::RenderViewHostObserver(host),
view_delegate_(view_delegate) {
}
......@@ -77,7 +77,7 @@ class SpellCheckRenderViewObserver : public RenderViewHostObserver {
}
private:
// RenderViewHostObserver implementation.
// content::RenderViewHostObserver implementation.
virtual void RenderViewHostDestroyed(RenderViewHost* rvh) OVERRIDE {
// The parent implementation destroys the observer, scoping the lifetime of
// the observer to the RenderViewHost. Since this class is acting as a
......
......@@ -32,9 +32,9 @@
#include "chrome/common/pref_names.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/url_constants.h"
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_view_host_observer.h"
#include "googleurl/src/gurl.h"
#include "grit/browser_resources.h"
#include "grit/chromium_strings.h"
......@@ -126,10 +126,10 @@ chromeos::CellularNetwork* GetCellularNetwork(
// Observes IPC messages from the rederer and notifies JS if frame loading error
// appears.
class PortalFrameLoadObserver : public RenderViewHostObserver {
class PortalFrameLoadObserver : public content::RenderViewHostObserver {
public:
PortalFrameLoadObserver(RenderViewHost* host, WebUI* webui)
: RenderViewHostObserver(host), webui_(webui) {
: content::RenderViewHostObserver(host), webui_(webui) {
DCHECK(webui_);
Send(new ChromeViewMsg_StartFrameSniffer(routing_id(),
UTF8ToUTF16("paymentForm")));
......
......@@ -5,24 +5,25 @@
#include "chrome/test/test_navigation_observer.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
#include "content/public/browser/render_view_host_observer.h"
#include "testing/gtest/include/gtest/gtest.h"
// This class observes |rvh| and calls OnJsInjectionReady() of
// |js_injection_ready_observer| when the time is right to inject
// JavaScript into the page.
class TestNavigationObserver::RVHOSendJS : public RenderViewHostObserver {
class TestNavigationObserver::RVHOSendJS
: public content::RenderViewHostObserver {
public:
RVHOSendJS(RenderViewHost* rvh,
JsInjectionReadyObserver* js_injection_ready_observer)
: RenderViewHostObserver(rvh),
: content::RenderViewHostObserver(rvh),
js_injection_ready_observer_(js_injection_ready_observer) {
}
private:
// RenderViewHostObserver implementation.
// content::RenderViewHostObserver implementation.
virtual void RenderViewHostInitialized() OVERRIDE {
if (js_injection_ready_observer_)
js_injection_ready_observer_->OnJsInjectionReady(render_view_host());
......
......@@ -50,7 +50,7 @@ bool RenderViewDevToolsAgentHost::IsDebuggerAttached(
}
RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(RenderViewHost* rvh)
: RenderViewHostObserver(rvh),
: content::RenderViewHostObserver(rvh),
render_view_host_(rvh) {
g_instances.Get()[rvh] = this;
}
......
......@@ -10,14 +10,15 @@
#include "base/basictypes.h"
#include "content/browser/debugger/devtools_agent_host.h"
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/common/content_export.h"
#include "content/public/browser/render_view_host_observer.h"
class RenderViewHost;
class TabContents;
class CONTENT_EXPORT RenderViewDevToolsAgentHost
: public DevToolsAgentHost, private RenderViewHostObserver {
: public DevToolsAgentHost,
private content::RenderViewHostObserver {
public:
static DevToolsAgentHost* FindFor(RenderViewHost*);
static bool IsDebuggerAttached(TabContents*);
......@@ -31,7 +32,7 @@ class CONTENT_EXPORT RenderViewDevToolsAgentHost
virtual void NotifyClientClosing() OVERRIDE;
virtual int GetRenderProcessId() OVERRIDE;
// RenderViewHostObserver overrides.
// content::RenderViewHostObserver overrides.
virtual void RenderViewHostDestroyed(RenderViewHost* rvh) OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
......
......@@ -25,7 +25,6 @@
#include "content/browser/power_save_blocker.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/browser/renderer_host/render_widget_host.h"
#include "content/browser/renderer_host/render_widget_host_view.h"
#include "content/browser/site_instance.h"
......@@ -40,6 +39,7 @@
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
#include "content/public/browser/render_view_host_observer.h"
#include "content/public/common/bindings_policy.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/result_codes.h"
......@@ -141,7 +141,7 @@ RenderViewHost::RenderViewHost(SiteInstance* instance,
RenderViewHost::~RenderViewHost() {
FOR_EACH_OBSERVER(
RenderViewHostObserver, observers_, RenderViewHostDestruction());
content::RenderViewHostObserver, observers_, RenderViewHostDestruction());
content::NotificationService::current()->Notify(
content::NOTIFICATION_RENDER_VIEW_HOST_DELETED,
......@@ -191,7 +191,7 @@ bool RenderViewHost::CreateRenderView(const string16& frame_name) {
delegate_->RenderViewCreated(this);
FOR_EACH_OBSERVER(
RenderViewHostObserver, observers_, RenderViewHostInitialized());
content::RenderViewHostObserver, observers_, RenderViewHostInitialized());
return true;
}
......@@ -247,7 +247,8 @@ void RenderViewHost::Navigate(const ViewMsg_Navigate_Params& params) {
if (!params.url.SchemeIs(chrome::kJavaScriptScheme))
delegate_->DidStartLoading();
FOR_EACH_OBSERVER(RenderViewHostObserver, observers_, Navigate(params.url));
FOR_EACH_OBSERVER(content::RenderViewHostObserver,
observers_, Navigate(params.url));
}
void RenderViewHost::NavigateToURL(const GURL& url) {
......@@ -653,8 +654,8 @@ bool RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
if (!content::SwappedOutMessages::CanHandleWhileSwappedOut(msg))
return true;
ObserverListBase<RenderViewHostObserver>::Iterator it(observers_);
RenderViewHostObserver* observer;
ObserverListBase<content::RenderViewHostObserver>::Iterator it(observers_);
content::RenderViewHostObserver* observer;
while ((observer = it.GetNext()) != NULL) {
if (observer->OnMessageReceived(msg))
return true;
......@@ -1137,11 +1138,11 @@ void RenderViewHost::OnAddMessageToConsole(int32 level,
message << "\", source: " << source_id << " (" << line_no << ")";
}
void RenderViewHost::AddObserver(RenderViewHostObserver* observer) {
void RenderViewHost::AddObserver(content::RenderViewHostObserver* observer) {
observers_.AddObserver(observer);
}
void RenderViewHost::RemoveObserver(RenderViewHostObserver* observer) {
void RenderViewHost::RemoveObserver(content::RenderViewHostObserver* observer) {
observers_.RemoveObserver(observer);
}
......
......@@ -33,7 +33,6 @@ class FilePath;
class GURL;
class PowerSaveBlocker;
class RenderViewHostDelegate;
class RenderViewHostObserver;
class SessionStorageNamespace;
class SiteInstance;
class SkBitmap;
......@@ -53,6 +52,7 @@ class ListValue;
}
namespace content {
class RenderViewHostObserver;
struct FileChooserParams;
struct ShowDesktopNotificationHostMsgParams;
}
......@@ -480,12 +480,12 @@ class CONTENT_EXPORT RenderViewHost : public RenderWidgetHost {
// one or two places. Have the caller send the IPC message directly.
protected:
friend class RenderViewHostObserver;
friend class content::RenderViewHostObserver;
// Add and remove observers for filtering IPC messages. Clients must be sure
// to remove the observer before they go away.
void AddObserver(RenderViewHostObserver* observer);
void RemoveObserver(RenderViewHostObserver* observer);
void AddObserver(content::RenderViewHostObserver* observer);
void RemoveObserver(content::RenderViewHostObserver* observer);
// RenderWidgetHost protected overrides.
virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
......@@ -676,7 +676,7 @@ class CONTENT_EXPORT RenderViewHost : public RenderWidgetHost {
PowerSaveBlockerMap power_save_blockers_;
// A list of observers that filter messages. Weak references.
ObserverList<RenderViewHostObserver> observers_;
ObserverList<content::RenderViewHostObserver> observers_;
DISALLOW_COPY_AND_ASSIGN(RenderViewHost);
};
......
......@@ -9,13 +9,13 @@
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/browser/renderer_host/render_view_host.h"
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/browser/site_instance.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/notification_types.h"
#include "content/public/browser/render_view_host_observer.h"
#include "content/public/common/url_constants.h"
#include "net/base/net_util.h"
#include "net/test/test_server.h"
......@@ -270,16 +270,16 @@ class RenderViewHostObserverArray {
}
private:
friend class RVHObserver;
class RVHObserver : public RenderViewHostObserver {
class RVHObserver : public content::RenderViewHostObserver {
public:
RVHObserver(RenderViewHostObserverArray* parent, RenderViewHost* rvh)
: RenderViewHostObserver(rvh),
: content::RenderViewHostObserver(rvh),
parent_(parent) {
}
virtual void RenderViewHostDestroyed(RenderViewHost* rvh) OVERRIDE {
if (parent_)
parent_->RemoveObserver(this);
RenderViewHostObserver::RenderViewHostDestroyed(rvh);
content::RenderViewHostObserver::RenderViewHostDestroyed(rvh);
};
void ClearParent() {
parent_ = NULL;
......
......@@ -43,6 +43,8 @@
'public/browser/plugin_data_remover.h',
'public/browser/render_process_host.h',
'public/browser/render_process_host_factory.h',
'public/browser/render_view_host_observer.cc',
'public/browser/render_view_host_observer.h',
'public/browser/resource_dispatcher_host_delegate.h',
'public/browser/resource_response.h',
'public/browser/sensors.h',
......@@ -444,8 +446,6 @@
'browser/renderer_host/render_view_host_factory.cc',
'browser/renderer_host/render_view_host_factory.h',
'browser/renderer_host/render_view_host_notification_task.h',
'browser/renderer_host/render_view_host_observer.cc',
'browser/renderer_host/render_view_host_observer.h',
'browser/renderer_host/render_widget_fullscreen_host.cc',
'browser/renderer_host/render_widget_fullscreen_host.h',
'browser/renderer_host/render_widget_helper.cc',
......
include_rules = [
"+content/browser/notification_service_impl.h",
"+content/browser/renderer_host/render_view_host.h",
]
......@@ -2,10 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/renderer_host/render_view_host_observer.h"
#include "content/public/browser/render_view_host_observer.h"
#include "content/browser/renderer_host/render_view_host.h"
namespace content {
RenderViewHostObserver::RenderViewHostObserver(RenderViewHost* render_view_host)
: render_view_host_(render_view_host),
routing_id_(render_view_host->routing_id()) {
......@@ -46,3 +48,5 @@ void RenderViewHostObserver::RenderViewHostDestruction() {
render_view_host_ = NULL;
RenderViewHostDestroyed(rvh);
}
} // namespace content
......@@ -2,8 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_OBSERVER_H_
#define CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_OBSERVER_H_
#ifndef CONTENT_PUBLIC_BROWSER_RENDER_VIEW_HOST_OBSERVER_H_
#define CONTENT_PUBLIC_BROWSER_RENDER_VIEW_HOST_OBSERVER_H_
#pragma once
#include "ipc/ipc_channel.h"
#include "content/common/content_export.h"
......@@ -11,6 +12,8 @@
class GURL;
class RenderViewHost;
namespace content {
// An observer API implemented by classes which want to filter IPC messages from
// RenderViewHost.
class CONTENT_EXPORT RenderViewHostObserver : public IPC::Channel::Listener,
......@@ -45,7 +48,7 @@ class CONTENT_EXPORT RenderViewHostObserver : public IPC::Channel::Listener,
int routing_id() { return routing_id_; }
private:
friend class RenderViewHost;
friend class ::RenderViewHost;
// Invoked from RenderViewHost. Invokes RenderViewHostDestroyed and NULL out
// |render_view_host_|.
......@@ -59,4 +62,6 @@ class CONTENT_EXPORT RenderViewHostObserver : public IPC::Channel::Listener,
DISALLOW_COPY_AND_ASSIGN(RenderViewHostObserver);
};
#endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_OBSERVER_H_
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_RENDER_VIEW_HOST_OBSERVER_H_
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