ChromeのExperimental WebKit/JavaScript Features

追記(2018年4月16日):現在はWebKitではなくBlinkになったため“Experimental Web Platform features”というセクションになっている。さらにはもっと簡単に、runtime_enabled_features.json5というファイルを見ればどんな機能があるのかがわかるようになっている。


chrome://flagsにはいろんなランタイムフラグがある。CSS ShadersやらVP9 playbackやら、実験中の機能を有効にできるようになっている(動くかどうかはしらない)。

その中にこんなフラグがある。

Enable experimental WebKit features.

Enable experimental WebKit features that are in development.

Enable Experimental JavaScript

Enable web pages to use experimental JavaScript features.

気になる。けど何の機能が入ってるのかわからない。
というわけで探してみる。

Experimental WebKit Features

WebKitの方は、検索したらそのフラグの誕生経緯が見つかった。

WebKitで実装中の機能を試すための仕組みがほしい→WebKitの機能ごとにランタイムフラグつくってちゃしょうがない、という流れでこのフラグができたらしい。

フラグの導入時にはRegions, Exclusions, Scoped stylesheets, Shadow DOM, CSS Variablesが含まれている。ただShadow DOMなんかはM25で有効にされたはずだ。今は何がどうなっているのか。

導入された時点のソースを読むと、switches::kEnableExperimentalWebKitFeatures というスイッチが導入されて、それを元に処理の有効無効が切り分けられているように読めた。というわけで、それをキーに検索してみたところ、ふたつのファイルが引っかかった。content/renderer/render_thread_impl.cccontent/browser/web_contents/web_contents_impl.cc

ファイルを開いて kEnableExperimentalWebKitFeaturesを検索して…見つかった。
いまのところ、Chromium trunkでExperimental WebKit Featuresとされているのはこれらしい。

  • Scoped Stylesheets
  • Custom DOM Elements
  • Experimental Content Security Policy
  • HTML <dialog> Element
  • HTML <iframe seamless> Attribute
  • CSS Regions
  • CSS Exclusions
  • CSS Grid Layout
  • CSS Sticky Positioning (position: -webkit-sticky)
  • CSS Variables

ちなみにランタイムフラグで制御できる(?)機能の一覧は、WebKit側の WebRuntimeFeatures.h にまとまっているみたい。

Experimental JavaScript Features

JavaScriptの機能はV8を参照することになる。とりあえずフラグから辿ることにする。

{
  "enable-javascript-harmony",
  IDS_FLAGS_ENABLE_JAVASCRIPT_HARMONY_NAME,
  IDS_FLAGS_ENABLE_JAVASCRIPT_HARMONY_DESCRIPTION,
  kOsAll,
  SINGLE_VALUE_TYPE_AND_VALUE(switches::kJavaScriptFlags, "--harmony")
},

どうやら --harmony フラグをつけて起動するようになっているらしい。じゃあ、そのフラグを定義するV8のファイルを見つければいい。

てきとーな単語で検索したらすぐ見つかった。

このなかで “harmony” を検索すると、それっぽい行が。

DEFINE_bool(harmony_typeof, false, "enable harmony semantics for typeof")
DEFINE_bool(harmony_scoping, false, "enable harmony block scoping")
DEFINE_bool(harmony_modules, false,
            "enable harmony modules (implies block scoping)")
DEFINE_bool(harmony_symbols, false,
            "enable harmony symbols (a.k.a. private names)")
DEFINE_bool(harmony_proxies, false, "enable harmony proxies")
DEFINE_bool(harmony_collections, false,
            "enable harmony collections (sets, maps, and weak maps)")
DEFINE_bool(harmony_observation, false,
            "enable harmony object observation (implies harmony collections")
DEFINE_bool(harmony, false, "enable all harmony features (except typeof)")
DEFINE_implication(harmony, harmony_scoping)
DEFINE_implication(harmony, harmony_modules)
DEFINE_implication(harmony, harmony_symbols)
DEFINE_implication(harmony, harmony_proxies)
DEFINE_implication(harmony, harmony_collections)
DEFINE_implication(harmony, harmony_observation)
DEFINE_implication(harmony_modules, harmony_scoping)
DEFINE_implication(harmony_observation, harmony_collections)

DEFINEなんたらの読み方がわからないけれど、harmony フラグでは次のが有効になるのかな?

  • Block scoping (let)
  • Modules
  • Symbols
  • Proxies
  • Collections (Set, Map, WeakMap)
  • Observation (object.observe)

Rest paramsやDefault paramsほしいんだけどな。まあそれはおいとこう。