// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Defines the Chrome Extensions Cookies API functions for accessing internet
// cookies, as specified in chrome/common/extensions/api/extension_api.json.
#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_COOKIES_API_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_COOKIES_API_H_
#pragma once
#include <string>
#include "base/memory/ref_counted.h"
#include "base/memory/singleton.h"
#include "base/time.h"
#include "chrome/browser/extensions/extension_function.h"
#include "chrome/browser/net/chrome_cookie_notification_details.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"
#include "googleurl/src/gurl.h"
#include "net/base/cookie_monster.h"
class DictionaryValue;
namespace net {
class URLRequestContextGetter;
}
// Observes CookieMonster notifications and routes them as events to the
// extension system.
class ExtensionCookiesEventRouter : public NotificationObserver {
public:
// Single instance of the event router.
static ExtensionCookiesEventRouter* GetInstance();
void Init();
private:
friend struct DefaultSingletonTraits<ExtensionCookiesEventRouter>;
ExtensionCookiesEventRouter() {}
virtual ~ExtensionCookiesEventRouter() {}
// NotificationObserver implementation.
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// Handler for the COOKIE_CHANGED event. The method takes the details of such
// an event and constructs a suitable JSON formatted extension event from it.
void CookieChanged(Profile* profile,
ChromeCookieDetails* details);
// This method dispatches events to the extension message service.
void DispatchEvent(Profile* context,
const char* event_name,
const std::string& json_args,
GURL& cookie_domain);
// Used for tracking registrations to CookieMonster notifications.
NotificationRegistrar registrar_;
DISALLOW_COPY_AND_ASSIGN(ExtensionCookiesEventRouter);
};
// Serves as a base class for all cookies API functions, and defines some
// common functionality for parsing cookies API function arguments.
// Note that all of the functions in this file derive from
// AsyncExtensionFunction, and are not threadsafe, so they should not be
// concurrently accessed from multiple threads. They modify |result_| and other
// member variables directly.
// See chrome/browser/extensions/extension_function.h for more information.
class CookiesFunction : public AsyncExtensionFunction {
protected:
// Looks for a 'url' value in the given details dictionary and constructs a
// GURL from it. Returns false and assigns the internal error_ value if the
// URL is invalid or isn't found in the dictionary. If check_host_permissions
// is true, the URL is also checked against the extension's host permissions,
// and if there is no permission for the URL, this function returns false.
bool ParseUrl(const DictionaryValue* details, GURL* url,
bool check_host_permissions);
// Checks the given details dictionary for a 'storeId' value, and retrieves
// the cookie store context and the store ID associated with it. If the
// 'storeId' value isn't found in the dictionary, the current execution
// context's cookie store context is retrieved. Returns false on error and
// assigns the internal error_ value if that occurs.
// At least one of the output parameters store and store_id should be
// non-NULL.
bool ParseStoreContext(const DictionaryValue* details,
net::URLRequestContextGetter** context,
std::string* store_id);
};
// Implements the cookies.get() extension function.
class GetCookieFunction : public CookiesFunction {
public:
GetCookieFunction();
virtual ~GetCookieFunction();
virtual bool RunImpl();
DECLARE_EXTENSION_FUNCTION_NAME("cookies.get")
private:
void GetCookieOnIOThread();
void RespondOnUIThread();
std::string name_;
GURL url_;
std::string store_id_;
scoped_refptr<net::URLRequestContextGetter> store_context_;
};
// Implements the cookies.getAll() extension function.
class GetAllCookiesFunction : public CookiesFunction {
public:
GetAllCookiesFunction();
virtual ~GetAllCookiesFunction();
virtual bool RunImpl();
DECLARE_EXTENSION_FUNCTION_NAME("cookies.getAll")
private:
void GetAllCookiesOnIOThread();
void RespondOnUIThread();
DictionaryValue* details_;
GURL url_;
std::string store_id_;
scoped_refptr<net::URLRequestContextGetter> store_context_;
};
// Implements the cookies.set() extension function.
class SetCookieFunction : public CookiesFunction {
public:
SetCookieFunction();
virtual ~SetCookieFunction();
virtual bool RunImpl();
DECLARE_EXTENSION_FUNCTION_NAME("cookies.set")
private:
void SetCookieOnIOThread();
void RespondOnUIThread();
GURL url_;
std::string name_;
std::string value_;
std::string domain_;
std::string path_;
bool secure_;
bool http_only_;
base::Time expiration_time_;
bool success_;
std::string store_id_;
scoped_refptr<net::URLRequestContextGetter> store_context_;
};
// Implements the cookies.remove() extension function.
class RemoveCookieFunction : public CookiesFunction {
public:
RemoveCookieFunction();
virtual ~RemoveCookieFunction();
virtual bool RunImpl();
DECLARE_EXTENSION_FUNCTION_NAME("cookies.remove")
private:
void RemoveCookieOnIOThread();
void RespondOnUIThread();
GURL url_;
std::string name_;
bool success_;
std::string store_id_;
scoped_refptr<net::URLRequestContextGetter> store_context_;
};
// Implements the cookies.getAllCookieStores() extension function.
class GetAllCookieStoresFunction : public CookiesFunction {
public:
virtual bool RunImpl();
// GetAllCookieStoresFunction is sync.
virtual void Run();
DECLARE_EXTENSION_FUNCTION_NAME("cookies.getAllCookieStores")
};
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_COOKIES_API_H_