Merge pull request #641 from atom/web-runtime-flags

Add options for web runtime features
This commit is contained in:
Cheng Zhao 2014-09-09 14:43:08 +08:00
commit ab2714fda9
9 changed files with 95 additions and 15 deletions

View file

@ -23,7 +23,7 @@ struct Converter<file_dialog::Filter> {
static bool FromV8(v8::Isolate* isolate, static bool FromV8(v8::Isolate* isolate,
v8::Handle<v8::Value> val, v8::Handle<v8::Value> val,
file_dialog::Filter* out) { file_dialog::Filter* out) {
mate::Dictionary dict(isolate); mate::Dictionary dict;
if (!ConvertFromV8(isolate, val, &dict)) if (!ConvertFromV8(isolate, val, &dict))
return false; return false;
if (!dict.Get("name", &(out->first))) if (!dict.Get("name", &(out->first)))

View file

@ -55,6 +55,20 @@ using content::NavigationEntry;
namespace atom { namespace atom {
namespace {
// Array of available web runtime features.
const char* kWebRuntimeFeatures[] = {
switches::kExperimentalFeatures,
switches::kExperimentalCanvasFeatures,
switches::kSubpixelFontScaling,
switches::kOverlayScrollbars,
switches::kOverlayFullscreenVideo,
switches::kSharedWorker,
};
} // namespace
NativeWindow::NativeWindow(content::WebContents* web_contents, NativeWindow::NativeWindow(content::WebContents* web_contents,
const mate::Dictionary& options) const mate::Dictionary& options)
: content::WebContentsObserver(web_contents), : content::WebContentsObserver(web_contents),
@ -325,6 +339,18 @@ void NativeWindow::AppendExtraCommandLineSwitches(
if (zoom_factor_ != 1.0) if (zoom_factor_ != 1.0)
command_line->AppendSwitchASCII(switches::kZoomFactor, command_line->AppendSwitchASCII(switches::kZoomFactor,
base::DoubleToString(zoom_factor_)); base::DoubleToString(zoom_factor_));
if (web_preferences_.IsEmpty())
return;
// This set of options are not availabe in WebPreferences, so we have to pass
// them via command line and enable them in renderer procss.
bool b;
for (size_t i = 0; i < arraysize(kWebRuntimeFeatures); ++i) {
const char* feature = kWebRuntimeFeatures[i];
if (web_preferences_.Get(feature, &b))
command_line->AppendSwitchASCII(feature, b ? "true" : "false");
}
} }
void NativeWindow::OverrideWebkitPrefs(const GURL& url, WebPreferences* prefs) { void NativeWindow::OverrideWebkitPrefs(const GURL& url, WebPreferences* prefs) {
@ -333,25 +359,23 @@ void NativeWindow::OverrideWebkitPrefs(const GURL& url, WebPreferences* prefs) {
bool b; bool b;
std::vector<base::FilePath> list; std::vector<base::FilePath> list;
mate::Dictionary web_preferences(web_preferences_.isolate(), if (web_preferences_.Get("javascript", &b))
web_preferences_.NewHandle());
if (web_preferences.Get("javascript", &b))
prefs->javascript_enabled = b; prefs->javascript_enabled = b;
if (web_preferences.Get("web-security", &b)) if (web_preferences_.Get("web-security", &b))
prefs->web_security_enabled = b; prefs->web_security_enabled = b;
if (web_preferences.Get("images", &b)) if (web_preferences_.Get("images", &b))
prefs->images_enabled = b; prefs->images_enabled = b;
if (web_preferences.Get("java", &b)) if (web_preferences_.Get("java", &b))
prefs->java_enabled = b; prefs->java_enabled = b;
if (web_preferences.Get("text-areas-are-resizable", &b)) if (web_preferences_.Get("text-areas-are-resizable", &b))
prefs->text_areas_are_resizable = b; prefs->text_areas_are_resizable = b;
if (web_preferences.Get("webgl", &b)) if (web_preferences_.Get("webgl", &b))
prefs->experimental_webgl_enabled = b; prefs->experimental_webgl_enabled = b;
if (web_preferences.Get("webaudio", &b)) if (web_preferences_.Get("webaudio", &b))
prefs->webaudio_enabled = b; prefs->webaudio_enabled = b;
if (web_preferences.Get("plugins", &b)) if (web_preferences_.Get("plugins", &b))
prefs->plugins_enabled = b; prefs->plugins_enabled = b;
if (web_preferences.Get("extra-plugin-dirs", &list)) if (web_preferences_.Get("extra-plugin-dirs", &list))
for (size_t i = 0; i < list.size(); ++i) for (size_t i = 0; i < list.size(); ++i)
content::PluginService::GetInstance()->AddExtraPluginDir(list[i]); content::PluginService::GetInstance()->AddExtraPluginDir(list[i]);
} }

View file

@ -20,7 +20,7 @@
#include "brightray/browser/inspectable_web_contents_impl.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 "native_mate/scoped_persistent.h" #include "native_mate/persistent_dictionary.h"
#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia.h"
struct WebPreferences; struct WebPreferences;
@ -298,7 +298,7 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
base::CancelableClosure window_unresposive_closure_; base::CancelableClosure window_unresposive_closure_;
// Web preferences. // Web preferences.
mate::ScopedPersistent<v8::Object> web_preferences_; mate::PersistentDictionary web_preferences_;
// Page's default zoom factor. // Page's default zoom factor.
double zoom_factor_; double zoom_factor_;

View file

@ -57,6 +57,14 @@ const char kEnableLargerThanScreen[] = "enable-larger-than-screen";
// Forces to use dark theme on Linux. // Forces to use dark theme on Linux.
const char kDarkTheme[] = "dark-theme"; const char kDarkTheme[] = "dark-theme";
// Web runtime features.
const char kExperimentalFeatures[] = "experimental-features";
const char kExperimentalCanvasFeatures[] = "experimental-canvas-features";
const char kSubpixelFontScaling[] = "subpixel-font-scaling";
const char kOverlayScrollbars[] = "overlay-scrollbars";
const char kOverlayFullscreenVideo[] = "overlay-fullscreen-video";
const char kSharedWorker[] = "shared-worker";
} // namespace switches } // namespace switches
} // namespace atom } // namespace atom

View file

@ -36,6 +36,13 @@ extern const char kAutoHideMenuBar[];
extern const char kEnableLargerThanScreen[]; extern const char kEnableLargerThanScreen[];
extern const char kDarkTheme[]; extern const char kDarkTheme[];
extern const char kExperimentalFeatures[];
extern const char kExperimentalCanvasFeatures[];
extern const char kSubpixelFontScaling[];
extern const char kOverlayScrollbars[];
extern const char kOverlayFullscreenVideo[];
extern const char kSharedWorker[];
} // namespace switches } // namespace switches
} // namespace atom } // namespace atom

View file

@ -20,6 +20,7 @@
#include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/public/web/WebFrame.h" #include "third_party/WebKit/public/web/WebFrame.h"
#include "third_party/WebKit/public/web/WebKit.h" #include "third_party/WebKit/public/web/WebKit.h"
#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
#include "atom/common/node_includes.h" #include "atom/common/node_includes.h"
@ -34,6 +35,19 @@ const char* kSecurityManualEnableIframe = "manual-enable-iframe";
const char* kSecurityDisable = "disable"; const char* kSecurityDisable = "disable";
const char* kSecurityEnableNodeIntegration = "enable-node-integration"; const char* kSecurityEnableNodeIntegration = "enable-node-integration";
bool IsSwitchEnabled(base::CommandLine* command_line,
const char* switch_string,
bool* enabled) {
std::string value = command_line->GetSwitchValueASCII(switch_string);
if (value == "true")
*enabled = true;
else if (value == "false")
*enabled = false;
else
return false;
return true;
}
// Helper class to forward the WillReleaseScriptContext message to the client. // Helper class to forward the WillReleaseScriptContext message to the client.
class AtomRenderFrameObserver : public content::RenderFrameObserver { class AtomRenderFrameObserver : public content::RenderFrameObserver {
public: public:
@ -86,6 +100,8 @@ AtomRendererClient::~AtomRendererClient() {
} }
void AtomRendererClient::WebKitInitialized() { void AtomRendererClient::WebKitInitialized() {
EnableWebRuntimeFeatures();
if (!IsNodeBindingEnabled()) if (!IsNodeBindingEnabled())
return; return;
@ -220,4 +236,21 @@ bool AtomRendererClient::IsNodeBindingEnabled(blink::WebFrame* frame) {
return true; return true;
} }
void AtomRendererClient::EnableWebRuntimeFeatures() {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
bool b;
if (IsSwitchEnabled(command_line, switches::kExperimentalFeatures, &b))
blink::WebRuntimeFeatures::enableExperimentalFeatures(b);
if (IsSwitchEnabled(command_line, switches::kExperimentalCanvasFeatures, &b))
blink::WebRuntimeFeatures::enableExperimentalCanvasFeatures(b);
if (IsSwitchEnabled(command_line, switches::kSubpixelFontScaling, &b))
blink::WebRuntimeFeatures::enableSubpixelFontScaling(b);
if (IsSwitchEnabled(command_line, switches::kOverlayScrollbars, &b))
blink::WebRuntimeFeatures::enableOverlayScrollbars(b);
if (IsSwitchEnabled(command_line, switches::kOverlayFullscreenVideo, &b))
blink::WebRuntimeFeatures::enableOverlayFullscreenVideo(b);
if (IsSwitchEnabled(command_line, switches::kSharedWorker, &b))
blink::WebRuntimeFeatures::enableSharedWorker(b);
}
} // namespace atom } // namespace atom

View file

@ -61,6 +61,8 @@ class AtomRendererClient : public content::ContentRendererClient,
bool is_server_redirect, bool is_server_redirect,
bool* send_referrer) OVERRIDE; bool* send_referrer) OVERRIDE;
void EnableWebRuntimeFeatures();
std::vector<node::Environment*> web_page_envs_; std::vector<node::Environment*> web_page_envs_;
scoped_ptr<NodeBindings> node_bindings_; scoped_ptr<NodeBindings> node_bindings_;

View file

@ -80,6 +80,12 @@ normal browsers, see [Web Security](web-security.md) for more.
should use `__dirname` or `process.resourcesPath` to join the paths to should use `__dirname` or `process.resourcesPath` to join the paths to
make them absolute, using relative paths would make atom-shell search make them absolute, using relative paths would make atom-shell search
under current working directory. under current working directory.
* `experimental-features` Boolean
* `experimental-canvas-features` Boolean
* `subpixel-font-scaling` Boolean
* `overlay-scrollbars` Boolean
* `overlay-fullscreen-video` Boolean
* `shared-worker` Boolean
Creates a new `BrowserWindow` with native properties set by the `options`. Creates a new `BrowserWindow` with native properties set by the `options`.
Usually you only need to set the `width` and `height`, other properties will Usually you only need to set the `width` and `height`, other properties will

2
vendor/native_mate vendored

@ -1 +1 @@
Subproject commit 980036b78a132ab820ed1d7866a06aac9a5c95a8 Subproject commit 12f4e9b7ea0038e58e52839142eff0a4d17069bf