Manage InspectableWebContents in CommonWebContentsDelegate
This commit is contained in:
parent
19d742de37
commit
92b15c81e9
7 changed files with 280 additions and 262 deletions
|
@ -8,7 +8,6 @@
|
||||||
|
|
||||||
#include "atom/browser/atom_browser_client.h"
|
#include "atom/browser/atom_browser_client.h"
|
||||||
#include "atom/browser/atom_browser_context.h"
|
#include "atom/browser/atom_browser_context.h"
|
||||||
#include "atom/browser/atom_javascript_dialog_manager.h"
|
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "atom/browser/web_dialog_helper.h"
|
#include "atom/browser/web_dialog_helper.h"
|
||||||
#include "atom/browser/web_view_manager.h"
|
#include "atom/browser/web_view_manager.h"
|
||||||
|
@ -201,14 +200,6 @@ content::WebContents* WebContents::OpenURLFromTab(
|
||||||
return web_contents();
|
return web_contents();
|
||||||
}
|
}
|
||||||
|
|
||||||
content::JavaScriptDialogManager* WebContents::GetJavaScriptDialogManager(
|
|
||||||
content::WebContents* source) {
|
|
||||||
if (!dialog_manager_)
|
|
||||||
dialog_manager_.reset(new AtomJavaScriptDialogManager);
|
|
||||||
|
|
||||||
return dialog_manager_.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebContents::RunFileChooser(content::WebContents* guest,
|
void WebContents::RunFileChooser(content::WebContents* guest,
|
||||||
const content::FileChooserParams& params) {
|
const content::FileChooserParams& params) {
|
||||||
if (!web_dialog_helper_)
|
if (!web_dialog_helper_)
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#include "atom/browser/common_web_contents_delegate.h"
|
#include "atom/browser/common_web_contents_delegate.h"
|
||||||
#include "content/public/browser/browser_plugin_guest_delegate.h"
|
#include "content/public/browser/browser_plugin_guest_delegate.h"
|
||||||
#include "content/public/common/favicon_url.h"
|
#include "content/public/common/favicon_url.h"
|
||||||
#include "content/public/browser/web_contents_delegate.h"
|
|
||||||
#include "content/public/browser/web_contents_observer.h"
|
#include "content/public/browser/web_contents_observer.h"
|
||||||
#include "content/public/browser/gpu_data_manager_observer.h"
|
#include "content/public/browser/gpu_data_manager_observer.h"
|
||||||
#include "native_mate/handle.h"
|
#include "native_mate/handle.h"
|
||||||
|
@ -28,7 +27,6 @@ class Dictionary;
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
class AtomJavaScriptDialogManager;
|
|
||||||
class WebDialogHelper;
|
class WebDialogHelper;
|
||||||
|
|
||||||
namespace api {
|
namespace api {
|
||||||
|
@ -150,8 +148,6 @@ class WebContents : public mate::EventEmitter,
|
||||||
content::WebContents* OpenURLFromTab(
|
content::WebContents* OpenURLFromTab(
|
||||||
content::WebContents* source,
|
content::WebContents* source,
|
||||||
const content::OpenURLParams& params) override;
|
const content::OpenURLParams& params) override;
|
||||||
content::JavaScriptDialogManager* GetJavaScriptDialogManager(
|
|
||||||
content::WebContents* source) override;
|
|
||||||
void RunFileChooser(content::WebContents* web_contents,
|
void RunFileChooser(content::WebContents* web_contents,
|
||||||
const content::FileChooserParams& params) override;
|
const content::FileChooserParams& params) override;
|
||||||
void EnumerateDirectory(content::WebContents* web_contents,
|
void EnumerateDirectory(content::WebContents* web_contents,
|
||||||
|
@ -236,7 +232,6 @@ class WebContents : public mate::EventEmitter,
|
||||||
gfx::Size GetDefaultSize() const;
|
gfx::Size GetDefaultSize() const;
|
||||||
|
|
||||||
scoped_ptr<WebDialogHelper> web_dialog_helper_;
|
scoped_ptr<WebDialogHelper> web_dialog_helper_;
|
||||||
scoped_ptr<AtomJavaScriptDialogManager> dialog_manager_;
|
|
||||||
|
|
||||||
// Unique ID for a guest WebContents.
|
// Unique ID for a guest WebContents.
|
||||||
int guest_instance_id_;
|
int guest_instance_id_;
|
||||||
|
|
|
@ -4,13 +4,225 @@
|
||||||
|
|
||||||
#include "atom/browser/common_web_contents_delegate.h"
|
#include "atom/browser/common_web_contents_delegate.h"
|
||||||
|
|
||||||
|
#include "atom/browser/atom_javascript_dialog_manager.h"
|
||||||
|
#include "atom/browser/native_window.h"
|
||||||
|
#include "atom/browser/ui/file_dialog.h"
|
||||||
|
#include "content/public/browser/child_process_security_policy.h"
|
||||||
|
#include "content/public/browser/render_process_host.h"
|
||||||
|
#include "content/public/browser/render_view_host.h"
|
||||||
|
#include "storage/browser/fileapi/isolated_context.h"
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct FileSystem {
|
||||||
|
FileSystem() {
|
||||||
|
}
|
||||||
|
FileSystem(const std::string& file_system_name,
|
||||||
|
const std::string& root_url,
|
||||||
|
const std::string& file_system_path)
|
||||||
|
: file_system_name(file_system_name),
|
||||||
|
root_url(root_url),
|
||||||
|
file_system_path(file_system_path) {
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string file_system_name;
|
||||||
|
std::string root_url;
|
||||||
|
std::string file_system_path;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string RegisterFileSystem(content::WebContents* web_contents,
|
||||||
|
const base::FilePath& path,
|
||||||
|
std::string* registered_name) {
|
||||||
|
auto isolated_context = storage::IsolatedContext::GetInstance();
|
||||||
|
std::string file_system_id = isolated_context->RegisterFileSystemForPath(
|
||||||
|
storage::kFileSystemTypeNativeLocal,
|
||||||
|
std::string(),
|
||||||
|
path,
|
||||||
|
registered_name);
|
||||||
|
|
||||||
|
content::ChildProcessSecurityPolicy* policy =
|
||||||
|
content::ChildProcessSecurityPolicy::GetInstance();
|
||||||
|
content::RenderViewHost* render_view_host = web_contents->GetRenderViewHost();
|
||||||
|
int renderer_id = render_view_host->GetProcess()->GetID();
|
||||||
|
policy->GrantReadFileSystem(renderer_id, file_system_id);
|
||||||
|
policy->GrantWriteFileSystem(renderer_id, file_system_id);
|
||||||
|
policy->GrantCreateFileForFileSystem(renderer_id, file_system_id);
|
||||||
|
policy->GrantDeleteFromFileSystem(renderer_id, file_system_id);
|
||||||
|
|
||||||
|
if (!policy->CanReadFile(renderer_id, path))
|
||||||
|
policy->GrantReadFile(renderer_id, path);
|
||||||
|
|
||||||
|
return file_system_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
FileSystem CreateFileSystemStruct(
|
||||||
|
content::WebContents* web_contents,
|
||||||
|
const std::string& file_system_id,
|
||||||
|
const std::string& registered_name,
|
||||||
|
const std::string& file_system_path) {
|
||||||
|
const GURL origin = web_contents->GetURL().GetOrigin();
|
||||||
|
std::string file_system_name =
|
||||||
|
storage::GetIsolatedFileSystemName(origin, file_system_id);
|
||||||
|
std::string root_url = storage::GetIsolatedFileSystemRootURIString(
|
||||||
|
origin, file_system_id, registered_name);
|
||||||
|
return FileSystem(file_system_name, root_url, file_system_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
base::DictionaryValue* CreateFileSystemValue(const FileSystem& file_system) {
|
||||||
|
base::DictionaryValue* file_system_value = new base::DictionaryValue();
|
||||||
|
file_system_value->SetString("fileSystemName", file_system.file_system_name);
|
||||||
|
file_system_value->SetString("rootURL", file_system.root_url);
|
||||||
|
file_system_value->SetString("fileSystemPath", file_system.file_system_path);
|
||||||
|
return file_system_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
CommonWebContentsDelegate::CommonWebContentsDelegate(bool is_guest)
|
CommonWebContentsDelegate::CommonWebContentsDelegate(bool is_guest)
|
||||||
: is_guest_(is_guest) {
|
: is_guest_(is_guest),
|
||||||
|
owner_window_(nullptr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
CommonWebContentsDelegate::~CommonWebContentsDelegate() {
|
CommonWebContentsDelegate::~CommonWebContentsDelegate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CommonWebContentsDelegate::InitWithWebContents(
|
||||||
|
content::WebContents* web_contents,
|
||||||
|
NativeWindow* owner_window) {
|
||||||
|
owner_window_ = owner_window;
|
||||||
|
web_contents->SetDelegate(this);
|
||||||
|
|
||||||
|
// Create InspectableWebContents.
|
||||||
|
web_contents_.reset(brightray::InspectableWebContents::Create(web_contents));
|
||||||
|
web_contents_->SetDelegate(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonWebContentsDelegate::DestroyWebContents() {
|
||||||
|
web_contents_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
content::JavaScriptDialogManager*
|
||||||
|
CommonWebContentsDelegate::GetJavaScriptDialogManager(
|
||||||
|
content::WebContents* source) {
|
||||||
|
if (!dialog_manager_)
|
||||||
|
dialog_manager_.reset(new AtomJavaScriptDialogManager);
|
||||||
|
|
||||||
|
return dialog_manager_.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
content::WebContents* CommonWebContentsDelegate::GetWebContents() const {
|
||||||
|
if (!web_contents_)
|
||||||
|
return nullptr;
|
||||||
|
return web_contents_->GetWebContents();
|
||||||
|
}
|
||||||
|
|
||||||
|
content::WebContents*
|
||||||
|
CommonWebContentsDelegate::GetDevToolsWebContents() const {
|
||||||
|
if (!web_contents_)
|
||||||
|
return nullptr;
|
||||||
|
return web_contents_->GetDevToolsWebContents();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonWebContentsDelegate::DevToolsSaveToFile(
|
||||||
|
const std::string& url, const std::string& content, bool save_as) {
|
||||||
|
base::FilePath path;
|
||||||
|
PathsMap::iterator it = saved_files_.find(url);
|
||||||
|
if (it != saved_files_.end() && !save_as) {
|
||||||
|
path = it->second;
|
||||||
|
} else {
|
||||||
|
file_dialog::Filters filters;
|
||||||
|
base::FilePath default_path(base::FilePath::FromUTF8Unsafe(url));
|
||||||
|
if (!file_dialog::ShowSaveDialog(owner_window_, url, default_path,
|
||||||
|
filters, &path)) {
|
||||||
|
base::StringValue url_value(url);
|
||||||
|
web_contents_->CallClientFunction(
|
||||||
|
"DevToolsAPI.canceledSaveURL", &url_value, nullptr, nullptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
saved_files_[url] = path;
|
||||||
|
base::WriteFile(path, content.data(), content.size());
|
||||||
|
|
||||||
|
// Notify devtools.
|
||||||
|
base::StringValue url_value(url);
|
||||||
|
web_contents_->CallClientFunction(
|
||||||
|
"DevToolsAPI.savedURL", &url_value, nullptr, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonWebContentsDelegate::DevToolsAppendToFile(
|
||||||
|
const std::string& url, const std::string& content) {
|
||||||
|
PathsMap::iterator it = saved_files_.find(url);
|
||||||
|
if (it == saved_files_.end())
|
||||||
|
return;
|
||||||
|
base::AppendToFile(it->second, content.data(), content.size());
|
||||||
|
|
||||||
|
// Notify devtools.
|
||||||
|
base::StringValue url_value(url);
|
||||||
|
web_contents_->CallClientFunction(
|
||||||
|
"DevToolsAPI.appendedToURL", &url_value, nullptr, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonWebContentsDelegate::DevToolsAddFileSystem() {
|
||||||
|
file_dialog::Filters filters;
|
||||||
|
base::FilePath default_path;
|
||||||
|
std::vector<base::FilePath> paths;
|
||||||
|
int flag = file_dialog::FILE_DIALOG_OPEN_DIRECTORY;
|
||||||
|
if (!file_dialog::ShowOpenDialog(owner_window_, "", default_path,
|
||||||
|
filters, flag, &paths))
|
||||||
|
return;
|
||||||
|
|
||||||
|
base::FilePath path = paths[0];
|
||||||
|
std::string registered_name;
|
||||||
|
std::string file_system_id = RegisterFileSystem(GetDevToolsWebContents(),
|
||||||
|
path,
|
||||||
|
®istered_name);
|
||||||
|
|
||||||
|
WorkspaceMap::iterator it = saved_paths_.find(file_system_id);
|
||||||
|
if (it != saved_paths_.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
saved_paths_[file_system_id] = path;
|
||||||
|
|
||||||
|
FileSystem file_system = CreateFileSystemStruct(GetDevToolsWebContents(),
|
||||||
|
file_system_id,
|
||||||
|
registered_name,
|
||||||
|
path.AsUTF8Unsafe());
|
||||||
|
|
||||||
|
scoped_ptr<base::StringValue> error_string_value(
|
||||||
|
new base::StringValue(std::string()));
|
||||||
|
scoped_ptr<base::DictionaryValue> file_system_value;
|
||||||
|
if (!file_system.file_system_path.empty())
|
||||||
|
file_system_value.reset(CreateFileSystemValue(file_system));
|
||||||
|
web_contents_->CallClientFunction(
|
||||||
|
"DevToolsAPI.fileSystemAdded",
|
||||||
|
error_string_value.get(),
|
||||||
|
file_system_value.get(),
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommonWebContentsDelegate::DevToolsRemoveFileSystem(
|
||||||
|
const std::string& file_system_path) {
|
||||||
|
if (!web_contents_)
|
||||||
|
return;
|
||||||
|
|
||||||
|
base::FilePath path = base::FilePath::FromUTF8Unsafe(file_system_path);
|
||||||
|
storage::IsolatedContext::GetInstance()->RevokeFileSystemByPath(path);
|
||||||
|
|
||||||
|
for (auto it = saved_paths_.begin(); it != saved_paths_.end(); ++it)
|
||||||
|
if (it->second == path) {
|
||||||
|
saved_paths_.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
base::StringValue file_system_path_value(file_system_path);
|
||||||
|
web_contents_->CallClientFunction(
|
||||||
|
"DevToolsAPI.fileSystemRemoved",
|
||||||
|
&file_system_path_value,
|
||||||
|
nullptr,
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace atom
|
} // namespace atom
|
||||||
|
|
|
@ -5,20 +5,82 @@
|
||||||
#ifndef ATOM_BROWSER_COMMON_WEB_CONTENTS_DELEGATE_H_
|
#ifndef ATOM_BROWSER_COMMON_WEB_CONTENTS_DELEGATE_H_
|
||||||
#define ATOM_BROWSER_COMMON_WEB_CONTENTS_DELEGATE_H_
|
#define ATOM_BROWSER_COMMON_WEB_CONTENTS_DELEGATE_H_
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#include "brightray/browser/default_web_contents_delegate.h"
|
#include "brightray/browser/default_web_contents_delegate.h"
|
||||||
|
#include "brightray/browser/inspectable_web_contents_impl.h"
|
||||||
|
#include "brightray/browser/inspectable_web_contents_delegate.h"
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
class CommonWebContentsDelegate : public brightray::DefaultWebContentsDelegate {
|
class AtomJavaScriptDialogManager;
|
||||||
|
class NativeWindow;
|
||||||
|
|
||||||
|
class CommonWebContentsDelegate
|
||||||
|
: public brightray::DefaultWebContentsDelegate,
|
||||||
|
public brightray::InspectableWebContentsDelegate {
|
||||||
public:
|
public:
|
||||||
explicit CommonWebContentsDelegate(bool is_guest);
|
explicit CommonWebContentsDelegate(bool is_guest);
|
||||||
virtual ~CommonWebContentsDelegate();
|
virtual ~CommonWebContentsDelegate();
|
||||||
|
|
||||||
|
// Create a InspectableWebContents object and takes onwership of
|
||||||
|
// |web_contents|.
|
||||||
|
void InitWithWebContents(content::WebContents* web_contents,
|
||||||
|
NativeWindow* owner_window);
|
||||||
|
|
||||||
|
// Destroy the managed InspectableWebContents object.
|
||||||
|
void DestroyWebContents();
|
||||||
|
|
||||||
|
// Returns the WebContents managed by this delegate.
|
||||||
|
content::WebContents* GetWebContents() const;
|
||||||
|
|
||||||
|
// Returns the WebContents of devtools.
|
||||||
|
content::WebContents* GetDevToolsWebContents() const;
|
||||||
|
|
||||||
|
brightray::InspectableWebContents* inspectable_web_contents() const {
|
||||||
|
return web_contents_.get();
|
||||||
|
}
|
||||||
|
|
||||||
bool is_guest() const { return is_guest_; };
|
bool is_guest() const { return is_guest_; };
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// content::WebContentsDelegate:
|
||||||
|
content::JavaScriptDialogManager* GetJavaScriptDialogManager(
|
||||||
|
content::WebContents* source) override;
|
||||||
|
|
||||||
|
// brightray::InspectableWebContentsDelegate:
|
||||||
|
void DevToolsSaveToFile(const std::string& url,
|
||||||
|
const std::string& content,
|
||||||
|
bool save_as) override;
|
||||||
|
void DevToolsAppendToFile(const std::string& url,
|
||||||
|
const std::string& content) override;
|
||||||
|
void DevToolsAddFileSystem() override;
|
||||||
|
void DevToolsRemoveFileSystem(const std::string& file_system_path) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// Whether this is guest WebContents or NativeWindow.
|
||||||
const bool is_guest_;
|
const bool is_guest_;
|
||||||
|
|
||||||
|
// The window that this WebContents belongs to.
|
||||||
|
NativeWindow* owner_window_;
|
||||||
|
|
||||||
|
scoped_ptr<AtomJavaScriptDialogManager> dialog_manager_;
|
||||||
|
|
||||||
|
// The stored InspectableWebContents object.
|
||||||
|
// Notice that web_contents_ must be placed after dialog_manager_, so we can
|
||||||
|
// make sure web_contents_ is destroyed before dialog_manager_, otherwise a
|
||||||
|
// crash would happen.
|
||||||
|
scoped_ptr<brightray::InspectableWebContents> web_contents_;
|
||||||
|
|
||||||
|
// Maps url to file path, used by the file requests sent from devtools.
|
||||||
|
typedef std::map<std::string, base::FilePath> PathsMap;
|
||||||
|
PathsMap saved_files_;
|
||||||
|
|
||||||
|
// Maps file system id to file path, used by the file system requests
|
||||||
|
// sent from devtools.
|
||||||
|
typedef std::map<std::string, base::FilePath> WorkspaceMap;
|
||||||
|
WorkspaceMap saved_paths_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(CommonWebContentsDelegate);
|
DISALLOW_COPY_AND_ASSIGN(CommonWebContentsDelegate);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "atom/browser/atom_browser_context.h"
|
#include "atom/browser/atom_browser_context.h"
|
||||||
#include "atom/browser/atom_javascript_dialog_manager.h"
|
|
||||||
#include "atom/browser/browser.h"
|
#include "atom/browser/browser.h"
|
||||||
#include "atom/browser/ui/file_dialog.h"
|
|
||||||
#include "atom/browser/web_dialog_helper.h"
|
#include "atom/browser/web_dialog_helper.h"
|
||||||
#include "atom/browser/window_list.h"
|
#include "atom/browser/window_list.h"
|
||||||
#include "atom/common/api/api_messages.h"
|
#include "atom/common/api/api_messages.h"
|
||||||
|
@ -33,7 +31,6 @@
|
||||||
#include "chrome/browser/printing/print_view_manager_basic.h"
|
#include "chrome/browser/printing/print_view_manager_basic.h"
|
||||||
#include "chrome/browser/ui/browser_dialogs.h"
|
#include "chrome/browser/ui/browser_dialogs.h"
|
||||||
#include "content/browser/renderer_host/render_widget_host_impl.h"
|
#include "content/browser/renderer_host/render_widget_host_impl.h"
|
||||||
#include "content/public/browser/child_process_security_policy.h"
|
|
||||||
#include "content/public/browser/devtools_agent_host.h"
|
#include "content/public/browser/devtools_agent_host.h"
|
||||||
#include "content/public/browser/invalidate_type.h"
|
#include "content/public/browser/invalidate_type.h"
|
||||||
#include "content/public/browser/navigation_entry.h"
|
#include "content/public/browser/navigation_entry.h"
|
||||||
|
@ -51,7 +48,6 @@
|
||||||
#include "content/public/common/web_preferences.h"
|
#include "content/public/common/web_preferences.h"
|
||||||
#include "ipc/ipc_message_macros.h"
|
#include "ipc/ipc_message_macros.h"
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "storage/browser/fileapi/isolated_context.h"
|
|
||||||
#include "ui/gfx/codec/png_codec.h"
|
#include "ui/gfx/codec/png_codec.h"
|
||||||
#include "ui/gfx/geometry/size_conversions.h"
|
#include "ui/gfx/geometry/size_conversions.h"
|
||||||
#include "ui/gfx/geometry/point.h"
|
#include "ui/gfx/geometry/point.h"
|
||||||
|
@ -91,62 +87,6 @@ std::string RemoveWhitespace(const std::string& str) {
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
storage::IsolatedContext* isolated_context() {
|
|
||||||
storage::IsolatedContext* context =
|
|
||||||
storage::IsolatedContext::GetInstance();
|
|
||||||
DCHECK(context);
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string RegisterFileSystem(content::WebContents* web_contents,
|
|
||||||
const base::FilePath& path,
|
|
||||||
std::string* registered_name) {
|
|
||||||
std::string file_system_id = isolated_context()->RegisterFileSystemForPath(
|
|
||||||
storage::kFileSystemTypeNativeLocal,
|
|
||||||
std::string(),
|
|
||||||
path,
|
|
||||||
registered_name);
|
|
||||||
|
|
||||||
content::ChildProcessSecurityPolicy* policy =
|
|
||||||
content::ChildProcessSecurityPolicy::GetInstance();
|
|
||||||
content::RenderViewHost* render_view_host = web_contents->GetRenderViewHost();
|
|
||||||
int renderer_id = render_view_host->GetProcess()->GetID();
|
|
||||||
policy->GrantReadFileSystem(renderer_id, file_system_id);
|
|
||||||
policy->GrantWriteFileSystem(renderer_id, file_system_id);
|
|
||||||
policy->GrantCreateFileForFileSystem(renderer_id, file_system_id);
|
|
||||||
policy->GrantDeleteFromFileSystem(renderer_id, file_system_id);
|
|
||||||
|
|
||||||
if (!policy->CanReadFile(renderer_id, path))
|
|
||||||
policy->GrantReadFile(renderer_id, path);
|
|
||||||
|
|
||||||
return file_system_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
NativeWindow::FileSystem CreateFileSystemStruct(
|
|
||||||
content::WebContents* web_contents,
|
|
||||||
const std::string& file_system_id,
|
|
||||||
const std::string& registered_name,
|
|
||||||
const std::string& file_system_path) {
|
|
||||||
const GURL origin = web_contents->GetURL().GetOrigin();
|
|
||||||
std::string file_system_name =
|
|
||||||
storage::GetIsolatedFileSystemName(origin, file_system_id);
|
|
||||||
std::string root_url = storage::GetIsolatedFileSystemRootURIString(
|
|
||||||
origin, file_system_id, registered_name);
|
|
||||||
|
|
||||||
return NativeWindow::FileSystem(file_system_name,
|
|
||||||
root_url,
|
|
||||||
file_system_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
base::DictionaryValue* CreateFileSystemValue(
|
|
||||||
NativeWindow::FileSystem file_system) {
|
|
||||||
base::DictionaryValue* file_system_value = new base::DictionaryValue();
|
|
||||||
file_system_value->SetString("fileSystemName", file_system.file_system_name);
|
|
||||||
file_system_value->SetString("rootURL", file_system.root_url);
|
|
||||||
file_system_value->SetString("fileSystemPath", file_system.file_system_path);
|
|
||||||
return file_system_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
NativeWindow::NativeWindow(content::WebContents* web_contents,
|
NativeWindow::NativeWindow(content::WebContents* web_contents,
|
||||||
|
@ -162,11 +102,11 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
|
||||||
html_fullscreen_(false),
|
html_fullscreen_(false),
|
||||||
native_fullscreen_(false),
|
native_fullscreen_(false),
|
||||||
zoom_factor_(1.0),
|
zoom_factor_(1.0),
|
||||||
weak_factory_(this),
|
weak_factory_(this) {
|
||||||
inspectable_web_contents_(
|
|
||||||
brightray::InspectableWebContents::Create(web_contents)) {
|
|
||||||
printing::PrintViewManagerBasic::CreateForWebContents(web_contents);
|
printing::PrintViewManagerBasic::CreateForWebContents(web_contents);
|
||||||
|
|
||||||
|
InitWithWebContents(web_contents, this);
|
||||||
|
|
||||||
options.Get(switches::kFrame, &has_frame_);
|
options.Get(switches::kFrame, &has_frame_);
|
||||||
options.Get(switches::kTransparent, &transparent_);
|
options.Get(switches::kTransparent, &transparent_);
|
||||||
options.Get(switches::kEnableLargerThanScreen, &enable_larger_than_screen_);
|
options.Get(switches::kEnableLargerThanScreen, &enable_larger_than_screen_);
|
||||||
|
@ -198,9 +138,6 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
|
||||||
// Read the zoom factor before any navigation.
|
// Read the zoom factor before any navigation.
|
||||||
options.Get(switches::kZoomFactor, &zoom_factor_);
|
options.Get(switches::kZoomFactor, &zoom_factor_);
|
||||||
|
|
||||||
web_contents->SetDelegate(this);
|
|
||||||
inspectable_web_contents()->SetDelegate(this);
|
|
||||||
|
|
||||||
WindowList::AddWindow(this);
|
WindowList::AddWindow(this);
|
||||||
|
|
||||||
// Override the user agent to contain application and atom-shell's version.
|
// Override the user agent to contain application and atom-shell's version.
|
||||||
|
@ -431,13 +368,6 @@ void NativeWindow::CapturePage(const gfx::Rect& rect,
|
||||||
kBGRA_8888_SkColorType);
|
kBGRA_8888_SkColorType);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::DestroyWebContents() {
|
|
||||||
if (!inspectable_web_contents_)
|
|
||||||
return;
|
|
||||||
|
|
||||||
inspectable_web_contents_.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void NativeWindow::CloseWebContents() {
|
void NativeWindow::CloseWebContents() {
|
||||||
bool prevent_default = false;
|
bool prevent_default = false;
|
||||||
FOR_EACH_OBSERVER(NativeWindowObserver,
|
FOR_EACH_OBSERVER(NativeWindowObserver,
|
||||||
|
@ -467,18 +397,6 @@ void NativeWindow::CloseWebContents() {
|
||||||
web_contents->Close();
|
web_contents->Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
content::WebContents* NativeWindow::GetWebContents() const {
|
|
||||||
if (!inspectable_web_contents_)
|
|
||||||
return nullptr;
|
|
||||||
return inspectable_web_contents()->GetWebContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
content::WebContents* NativeWindow::GetDevToolsWebContents() const {
|
|
||||||
if (!inspectable_web_contents_)
|
|
||||||
return nullptr;
|
|
||||||
return inspectable_web_contents()->devtools_web_contents();
|
|
||||||
}
|
|
||||||
|
|
||||||
void NativeWindow::AppendExtraCommandLineSwitches(
|
void NativeWindow::AppendExtraCommandLineSwitches(
|
||||||
base::CommandLine* command_line) {
|
base::CommandLine* command_line) {
|
||||||
// Append --node-integration to renderer process.
|
// Append --node-integration to renderer process.
|
||||||
|
@ -694,14 +612,6 @@ content::WebContents* NativeWindow::OpenURLFromTab(
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
content::JavaScriptDialogManager* NativeWindow::GetJavaScriptDialogManager(
|
|
||||||
content::WebContents* source) {
|
|
||||||
if (!dialog_manager_)
|
|
||||||
dialog_manager_.reset(new AtomJavaScriptDialogManager);
|
|
||||||
|
|
||||||
return dialog_manager_.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
void NativeWindow::RenderViewCreated(
|
void NativeWindow::RenderViewCreated(
|
||||||
content::RenderViewHost* render_view_host) {
|
content::RenderViewHost* render_view_host) {
|
||||||
if (!transparent_)
|
if (!transparent_)
|
||||||
|
@ -858,107 +768,10 @@ void NativeWindow::Observe(int type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::DevToolsSaveToFile(const std::string& url,
|
|
||||||
const std::string& content,
|
|
||||||
bool save_as) {
|
|
||||||
base::FilePath path;
|
|
||||||
PathsMap::iterator it = saved_files_.find(url);
|
|
||||||
if (it != saved_files_.end() && !save_as) {
|
|
||||||
path = it->second;
|
|
||||||
} else {
|
|
||||||
file_dialog::Filters filters;
|
|
||||||
base::FilePath default_path(base::FilePath::FromUTF8Unsafe(url));
|
|
||||||
if (!file_dialog::ShowSaveDialog(this, url, default_path, filters, &path)) {
|
|
||||||
base::StringValue url_value(url);
|
|
||||||
inspectable_web_contents()->CallClientFunction(
|
|
||||||
"DevToolsAPI.canceledSaveURL", &url_value, nullptr, nullptr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
saved_files_[url] = path;
|
|
||||||
base::WriteFile(path, content.data(), content.size());
|
|
||||||
|
|
||||||
// Notify devtools.
|
|
||||||
base::StringValue url_value(url);
|
|
||||||
inspectable_web_contents()->CallClientFunction(
|
|
||||||
"DevToolsAPI.savedURL", &url_value, nullptr, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NativeWindow::DevToolsAppendToFile(const std::string& url,
|
|
||||||
const std::string& content) {
|
|
||||||
PathsMap::iterator it = saved_files_.find(url);
|
|
||||||
if (it == saved_files_.end())
|
|
||||||
return;
|
|
||||||
base::AppendToFile(it->second, content.data(), content.size());
|
|
||||||
|
|
||||||
// Notify devtools.
|
|
||||||
base::StringValue url_value(url);
|
|
||||||
inspectable_web_contents()->CallClientFunction(
|
|
||||||
"DevToolsAPI.appendedToURL", &url_value, nullptr, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NativeWindow::DevToolsFocused() {
|
void NativeWindow::DevToolsFocused() {
|
||||||
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnDevToolsFocus());
|
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnDevToolsFocus());
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::DevToolsAddFileSystem() {
|
|
||||||
file_dialog::Filters filters;
|
|
||||||
base::FilePath default_path;
|
|
||||||
std::vector<base::FilePath> paths;
|
|
||||||
int flag = file_dialog::FILE_DIALOG_OPEN_DIRECTORY;
|
|
||||||
if (!file_dialog::ShowOpenDialog(this, "", default_path,
|
|
||||||
filters, flag, &paths))
|
|
||||||
return;
|
|
||||||
|
|
||||||
base::FilePath path = paths[0];
|
|
||||||
std::string registered_name;
|
|
||||||
std::string file_system_id = RegisterFileSystem(GetDevToolsWebContents(),
|
|
||||||
path,
|
|
||||||
®istered_name);
|
|
||||||
|
|
||||||
WorkspaceMap::iterator it = saved_paths_.find(file_system_id);
|
|
||||||
if (it != saved_paths_.end())
|
|
||||||
return;
|
|
||||||
|
|
||||||
saved_paths_[file_system_id] = path;
|
|
||||||
|
|
||||||
FileSystem file_system = CreateFileSystemStruct(GetDevToolsWebContents(),
|
|
||||||
file_system_id,
|
|
||||||
registered_name,
|
|
||||||
path.AsUTF8Unsafe());
|
|
||||||
|
|
||||||
scoped_ptr<base::StringValue> error_string_value(
|
|
||||||
new base::StringValue(std::string()));
|
|
||||||
scoped_ptr<base::DictionaryValue> file_system_value;
|
|
||||||
if (!file_system.file_system_path.empty())
|
|
||||||
file_system_value.reset(CreateFileSystemValue(file_system));
|
|
||||||
inspectable_web_contents()->CallClientFunction(
|
|
||||||
"DevToolsAPI.fileSystemAdded",
|
|
||||||
error_string_value.get(),
|
|
||||||
file_system_value.get(),
|
|
||||||
nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NativeWindow::DevToolsRemoveFileSystem(
|
|
||||||
const std::string& file_system_path) {
|
|
||||||
base::FilePath path = base::FilePath::FromUTF8Unsafe(file_system_path);
|
|
||||||
isolated_context()->RevokeFileSystemByPath(path);
|
|
||||||
|
|
||||||
for (auto it = saved_paths_.begin(); it != saved_paths_.end(); ++it)
|
|
||||||
if (it->second == path) {
|
|
||||||
saved_paths_.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
base::StringValue file_system_path_value(file_system_path);
|
|
||||||
inspectable_web_contents()->CallClientFunction(
|
|
||||||
"DevToolsAPI.fileSystemRemoved",
|
|
||||||
&file_system_path_value,
|
|
||||||
nullptr,
|
|
||||||
nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NativeWindow::ScheduleUnresponsiveEvent(int ms) {
|
void NativeWindow::ScheduleUnresponsiveEvent(int ms) {
|
||||||
if (!window_unresposive_closure_.IsCancelled())
|
if (!window_unresposive_closure_.IsCancelled())
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
#include "base/memory/scoped_ptr.h"
|
#include "base/memory/scoped_ptr.h"
|
||||||
#include "base/memory/weak_ptr.h"
|
#include "base/memory/weak_ptr.h"
|
||||||
#include "base/observer_list.h"
|
#include "base/observer_list.h"
|
||||||
#include "brightray/browser/inspectable_web_contents_delegate.h"
|
|
||||||
#include "brightray/browser/inspectable_web_contents_impl.h"
|
|
||||||
#include "content/public/browser/notification_registrar.h"
|
#include "content/public/browser/notification_registrar.h"
|
||||||
#include "content/public/browser/notification_observer.h"
|
#include "content/public/browser/notification_observer.h"
|
||||||
#include "content/public/browser/readback_types.h"
|
#include "content/public/browser/readback_types.h"
|
||||||
|
@ -50,33 +48,15 @@ class MenuModel;
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
class AtomJavaScriptDialogManager;
|
|
||||||
struct DraggableRegion;
|
struct DraggableRegion;
|
||||||
class WebDialogHelper;
|
class WebDialogHelper;
|
||||||
|
|
||||||
class NativeWindow : public CommonWebContentsDelegate,
|
class NativeWindow : public CommonWebContentsDelegate,
|
||||||
public brightray::InspectableWebContentsDelegate,
|
|
||||||
public content::WebContentsObserver,
|
public content::WebContentsObserver,
|
||||||
public content::NotificationObserver {
|
public content::NotificationObserver {
|
||||||
public:
|
public:
|
||||||
typedef base::Callback<void(const SkBitmap& bitmap)> CapturePageCallback;
|
typedef base::Callback<void(const SkBitmap& bitmap)> CapturePageCallback;
|
||||||
|
|
||||||
struct FileSystem {
|
|
||||||
FileSystem() {
|
|
||||||
}
|
|
||||||
FileSystem(const std::string& file_system_name,
|
|
||||||
const std::string& root_url,
|
|
||||||
const std::string& file_system_path)
|
|
||||||
: file_system_name(file_system_name),
|
|
||||||
root_url(root_url),
|
|
||||||
file_system_path(file_system_path) {
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string file_system_name;
|
|
||||||
std::string root_url;
|
|
||||||
std::string file_system_path;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DialogScope {
|
class DialogScope {
|
||||||
public:
|
public:
|
||||||
explicit DialogScope(NativeWindow* window)
|
explicit DialogScope(NativeWindow* window)
|
||||||
|
@ -197,16 +177,10 @@ class NativeWindow : public CommonWebContentsDelegate,
|
||||||
// Should be called by platform code when user want to close the window.
|
// Should be called by platform code when user want to close the window.
|
||||||
virtual void CloseWebContents();
|
virtual void CloseWebContents();
|
||||||
|
|
||||||
// Destroy the WebContents immediately.
|
|
||||||
virtual void DestroyWebContents();
|
|
||||||
|
|
||||||
base::WeakPtr<NativeWindow> GetWeakPtr() {
|
base::WeakPtr<NativeWindow> GetWeakPtr() {
|
||||||
return weak_factory_.GetWeakPtr();
|
return weak_factory_.GetWeakPtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
content::WebContents* GetWebContents() const;
|
|
||||||
content::WebContents* GetDevToolsWebContents() const;
|
|
||||||
|
|
||||||
// Called when renderer process is going to be started.
|
// Called when renderer process is going to be started.
|
||||||
void AppendExtraCommandLineSwitches(base::CommandLine* command_line);
|
void AppendExtraCommandLineSwitches(base::CommandLine* command_line);
|
||||||
void OverrideWebkitPrefs(content::WebPreferences* prefs);
|
void OverrideWebkitPrefs(content::WebPreferences* prefs);
|
||||||
|
@ -251,11 +225,6 @@ class NativeWindow : public CommonWebContentsDelegate,
|
||||||
explicit NativeWindow(content::WebContents* web_contents,
|
explicit NativeWindow(content::WebContents* web_contents,
|
||||||
const mate::Dictionary& options);
|
const mate::Dictionary& options);
|
||||||
|
|
||||||
brightray::InspectableWebContentsImpl* inspectable_web_contents() const {
|
|
||||||
return static_cast<brightray::InspectableWebContentsImpl*>(
|
|
||||||
inspectable_web_contents_.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called when the window needs to update its draggable region.
|
// Called when the window needs to update its draggable region.
|
||||||
virtual void UpdateDraggableRegions(
|
virtual void UpdateDraggableRegions(
|
||||||
const std::vector<DraggableRegion>& regions) = 0;
|
const std::vector<DraggableRegion>& regions) = 0;
|
||||||
|
@ -273,8 +242,6 @@ class NativeWindow : public CommonWebContentsDelegate,
|
||||||
content::WebContents* OpenURLFromTab(
|
content::WebContents* OpenURLFromTab(
|
||||||
content::WebContents* source,
|
content::WebContents* source,
|
||||||
const content::OpenURLParams& params) override;
|
const content::OpenURLParams& params) override;
|
||||||
content::JavaScriptDialogManager* GetJavaScriptDialogManager(
|
|
||||||
content::WebContents* source) override;
|
|
||||||
void BeforeUnloadFired(content::WebContents* tab,
|
void BeforeUnloadFired(content::WebContents* tab,
|
||||||
bool proceed,
|
bool proceed,
|
||||||
bool* proceed_to_fire_unload) override;
|
bool* proceed_to_fire_unload) override;
|
||||||
|
@ -317,14 +284,7 @@ class NativeWindow : public CommonWebContentsDelegate,
|
||||||
const content::NotificationDetails& details) override;
|
const content::NotificationDetails& details) override;
|
||||||
|
|
||||||
// Implementations of brightray::InspectableWebContentsDelegate.
|
// Implementations of brightray::InspectableWebContentsDelegate.
|
||||||
void DevToolsSaveToFile(const std::string& url,
|
|
||||||
const std::string& content,
|
|
||||||
bool save_as) override;
|
|
||||||
void DevToolsAppendToFile(const std::string& url,
|
|
||||||
const std::string& content) override;
|
|
||||||
void DevToolsFocused() override;
|
void DevToolsFocused() override;
|
||||||
void DevToolsAddFileSystem() override;
|
|
||||||
void DevToolsRemoveFileSystem(const std::string& file_system_path) override;
|
|
||||||
|
|
||||||
// Whether window has standard frame.
|
// Whether window has standard frame.
|
||||||
bool has_frame_;
|
bool has_frame_;
|
||||||
|
@ -387,21 +347,6 @@ class NativeWindow : public CommonWebContentsDelegate,
|
||||||
base::WeakPtrFactory<NativeWindow> weak_factory_;
|
base::WeakPtrFactory<NativeWindow> weak_factory_;
|
||||||
|
|
||||||
scoped_ptr<WebDialogHelper> web_dialog_helper_;
|
scoped_ptr<WebDialogHelper> web_dialog_helper_;
|
||||||
scoped_ptr<AtomJavaScriptDialogManager> dialog_manager_;
|
|
||||||
|
|
||||||
// Notice that inspectable_web_contents_ must be placed after dialog_manager_,
|
|
||||||
// so we can make sure inspectable_web_contents_ is destroyed before
|
|
||||||
// dialog_manager_, otherwise a crash would happen.
|
|
||||||
scoped_ptr<brightray::InspectableWebContents> inspectable_web_contents_;
|
|
||||||
|
|
||||||
// Maps url to file path, used by the file requests sent from devtools.
|
|
||||||
typedef std::map<std::string, base::FilePath> PathsMap;
|
|
||||||
PathsMap saved_files_;
|
|
||||||
|
|
||||||
// Maps file system id to file path, used by the file system requests
|
|
||||||
// sent from devtools.
|
|
||||||
typedef std::map<std::string, base::FilePath> WorkspaceMap;
|
|
||||||
WorkspaceMap saved_paths_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(NativeWindow);
|
DISALLOW_COPY_AND_ASSIGN(NativeWindow);
|
||||||
};
|
};
|
||||||
|
|
2
vendor/brightray
vendored
2
vendor/brightray
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit d888f67b75a387181475df4eef062fab1bffee72
|
Subproject commit 190c3dd1629141027f0962d0fab82c58853e7c85
|
Loading…
Add table
Add a link
Reference in a new issue