| Index: services/service_manager/public/cpp/service.h
 | 
| diff --git a/services/service_manager/public/cpp/service.h b/services/service_manager/public/cpp/service.h
 | 
| index 2b8e780d0b815c9bfad0241c168def0431467a70..958f10f16bb9971ce42c0729cdffd37dda03c3fe 100644
 | 
| --- a/services/service_manager/public/cpp/service.h
 | 
| +++ b/services/service_manager/public/cpp/service.h
 | 
| @@ -12,26 +12,33 @@
 | 
|  struct ServiceInfo;
 | 
|  
 | 
|  // The primary contract between a Service and the Service Manager, receiving
 | 
| -// lifecycle notifications and connection requests.
 | 
| +// lifecycle notifications and connection requests. Every Service must minimally
 | 
| +// implement OnConnect().
 | 
|  class Service {
 | 
|   public:
 | 
| -  Service();
 | 
|    virtual ~Service();
 | 
|  
 | 
| -  // Called exactly once, when a bidirectional connection with the Service
 | 
| -  // Manager has been established. No calls to OnConnect() will be received
 | 
| -  // before this.
 | 
| -  virtual void OnStart();
 | 
| +  // Called once a bidirectional connection with the Service Manager has been
 | 
| +  // established.
 | 
| +  //
 | 
| +  // |context| is the ServiceContext for this instance of the service. It's
 | 
| +  // guaranteed to outlive the Service instance and therefore may be retained by
 | 
| +  // it.
 | 
| +  //
 | 
| +  // Use the context to retrieve information about the service instance, make
 | 
| +  // outgoing service connections, and issue other requests to the Service
 | 
| +  // Manager on behalf of this instance.
 | 
| +  //
 | 
| +  // Called exactly once before any calls to OnConnect().
 | 
| +  virtual void OnStart(ServiceContext* context);
 | 
|  
 | 
|    // Called each time a connection to this service is brokered by the Service
 | 
|    // Manager. Implement this to expose interfaces to other services.
 | 
|    //
 | 
|    // Return true if the connection should succeed or false if the connection
 | 
|    // should be rejected.
 | 
| -  //
 | 
| -  // The default implementation returns false.
 | 
|    virtual bool OnConnect(const ServiceInfo& remote_info,
 | 
| -                         InterfaceRegistry* registry);
 | 
| +                         InterfaceRegistry* registry) = 0;
 | 
|  
 | 
|    // Called when the Service Manager has stopped tracking this instance. The
 | 
|    // service should use this as a signal to shut down, and in fact its process
 | 
| @@ -49,40 +56,6 @@
 | 
|    // OnConnect() is invoked, neither will be invoked at any point after this
 | 
|    // OnStop().
 | 
|    virtual bool OnStop();
 | 
| -
 | 
| - protected:
 | 
| -  // Access the ServiceContext associated with this Service. Note that this is
 | 
| -  // only valid to call during or after OnStart(), but never before! As such,
 | 
| -  // it's always safe to call in OnStart() and OnConnect(), but should generally
 | 
| -  // be avoided in OnStop().
 | 
| -  ServiceContext* context() const;
 | 
| -
 | 
| - private:
 | 
| -  friend class ForwardingService;
 | 
| -  friend class ServiceContext;
 | 
| -
 | 
| -  // NOTE: This is guaranteed to be called before OnStart().
 | 
| -  void set_context(ServiceContext* context) { service_context_ = context; }
 | 
| -
 | 
| -  ServiceContext* service_context_ = nullptr;
 | 
| -};
 | 
| -
 | 
| -// TODO(rockot): Remove this. It's here to satisfy a few remaining use cases
 | 
| -// where a Service impl is owned by something other than its ServiceContext.
 | 
| -class ForwardingService : public Service {
 | 
| - public:
 | 
| -  // |target| must outlive this object.
 | 
| -  explicit ForwardingService(Service* target);
 | 
| -  ~ForwardingService() override;
 | 
| -
 | 
| - private:
 | 
| -  // Service:
 | 
| -  void OnStart() override;
 | 
| -  bool OnConnect(const ServiceInfo& remote_info,
 | 
| -                 InterfaceRegistry* registry) override;
 | 
| -  bool OnStop() override;
 | 
| -
 | 
| -  Service* const target_ = nullptr;
 | 
|  };
 | 
|  
 | 
|  }  // namespace service_manager
 | 
| 
 |