blob: bd26a429c7a66802bf3e952cd9ab7a86059b43bf [file] [log] [blame]
// 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.
#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_DOWNLOADS_API_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_DOWNLOADS_API_H_
#pragma once
#include <map>
#include <set>
#include <string>
#include "base/memory/singleton.h"
#include "chrome/browser/extensions/extension_function.h"
#include "content/browser/download/download_item.h"
#include "content/browser/download/download_manager.h"
namespace base {
class DictionaryValue;
}
class ResourceDispatcherHost;
class TabContents;
namespace content {
class ResourceContext;
}
// Functions in the chrome.experimental.downloads namespace facilitate
// controlling downloads from extensions. See the full API doc at
// http://goo.gl/6hO1n
class DownloadsFunctionInterface {
public:
enum DownloadsFunctionName {
DOWNLOADS_FUNCTION_DOWNLOAD = 0,
DOWNLOADS_FUNCTION_SEARCH = 1,
DOWNLOADS_FUNCTION_PAUSE = 2,
DOWNLOADS_FUNCTION_RESUME = 3,
DOWNLOADS_FUNCTION_CANCEL = 4,
DOWNLOADS_FUNCTION_ERASE = 5,
DOWNLOADS_FUNCTION_SET_DESTINATION = 6,
DOWNLOADS_FUNCTION_ACCEPT_DANGER = 7,
DOWNLOADS_FUNCTION_SHOW = 8,
DOWNLOADS_FUNCTION_DRAG = 9,
// Insert new values here, not at the beginning.
DOWNLOADS_FUNCTION_LAST
};
protected:
// Return true if args_ is well-formed, otherwise set error_ and return false.
virtual bool ParseArgs() = 0;
// Implementation-specific logic. "Do the thing that you do."
virtual void RunInternal() = 0;
// Which subclass is this.
virtual DownloadsFunctionName function() const = 0;
// Wrap ParseArgs(), RunInternal().
static bool RunImplImpl(DownloadsFunctionInterface* pimpl);
};
class SyncDownloadsFunction : public SyncExtensionFunction,
public DownloadsFunctionInterface {
public:
virtual bool RunImpl() OVERRIDE;
protected:
explicit SyncDownloadsFunction(DownloadsFunctionName function);
virtual ~SyncDownloadsFunction();
virtual DownloadsFunctionName function() const OVERRIDE;
private:
DownloadsFunctionName function_;
DISALLOW_COPY_AND_ASSIGN(SyncDownloadsFunction);
};
class AsyncDownloadsFunction : public AsyncExtensionFunction,
public DownloadsFunctionInterface {
public:
virtual bool RunImpl() OVERRIDE;
protected:
explicit AsyncDownloadsFunction(DownloadsFunctionName function);
virtual ~AsyncDownloadsFunction();
virtual DownloadsFunctionName function() const OVERRIDE;
private:
DownloadsFunctionName function_;
DISALLOW_COPY_AND_ASSIGN(AsyncDownloadsFunction);
};
class DownloadsDownloadFunction : public AsyncDownloadsFunction {
public:
DownloadsDownloadFunction();
virtual ~DownloadsDownloadFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.download");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
std::string url_;
std::string filename_;
bool save_as_;
base::DictionaryValue* extra_headers_;
std::string method_;
std::string post_body_;
ResourceDispatcherHost* rdh_;
const content::ResourceContext* resource_context_;
int render_process_host_id_;
int render_view_host_routing_id_;
DISALLOW_COPY_AND_ASSIGN(DownloadsDownloadFunction);
};
class DownloadsSearchFunction : public SyncDownloadsFunction {
public:
DownloadsSearchFunction();
virtual ~DownloadsSearchFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.search");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsSearchFunction);
};
class DownloadsPauseFunction : public SyncDownloadsFunction {
public:
DownloadsPauseFunction();
virtual ~DownloadsPauseFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.pause");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsPauseFunction);
};
class DownloadsResumeFunction : public AsyncDownloadsFunction {
public:
DownloadsResumeFunction();
virtual ~DownloadsResumeFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.resume");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsResumeFunction);
};
class DownloadsCancelFunction : public AsyncDownloadsFunction {
public:
DownloadsCancelFunction();
virtual ~DownloadsCancelFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.cancel");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsCancelFunction);
};
class DownloadsEraseFunction : public AsyncDownloadsFunction {
public:
DownloadsEraseFunction();
virtual ~DownloadsEraseFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.erase");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsEraseFunction);
};
class DownloadsSetDestinationFunction : public AsyncDownloadsFunction {
public:
DownloadsSetDestinationFunction();
virtual ~DownloadsSetDestinationFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.setDestination");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsSetDestinationFunction);
};
class DownloadsAcceptDangerFunction : public AsyncDownloadsFunction {
public:
DownloadsAcceptDangerFunction();
virtual ~DownloadsAcceptDangerFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.acceptDanger");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsAcceptDangerFunction);
};
class DownloadsShowFunction : public AsyncDownloadsFunction {
public:
DownloadsShowFunction();
virtual ~DownloadsShowFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.show");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsShowFunction);
};
class DownloadsDragFunction : public AsyncDownloadsFunction {
public:
DownloadsDragFunction();
virtual ~DownloadsDragFunction();
DECLARE_EXTENSION_FUNCTION_NAME("experimental.downloads.drag");
protected:
virtual bool ParseArgs() OVERRIDE;
virtual void RunInternal() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsDragFunction);
};
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_DOWNLOADS_API_H_