API のサポート終了と削除(Chrome 50)

Chrome のほぼすべてのバージョンで、プロダクト、パフォーマンス、ウェブ プラットフォームの機能に対して、多数の更新と改善が行われています。

Chrome 50(ベータ版の予定日: 3 月 10 ~ 17 日)では、Chrome に複数の変更が加えられています。このリストは随時変更される可能性があります。

AppCache が安全でないコンテキストで非推奨に

要約: クロスサイト スクリプティングを妨げるため、安全でないオリジンでの AppCache のサポートを終了します。Chrome 52 では、HTTPS 経由でコンテンツを配信するオリジンでのみ動作する見込みです。

削除の目的 | Chromestatus Tracker | Chromium のバグ

AppCache は、オリジンへのオフラインおよび永続的アクセスを許可する機能です。クロスサイト スクリプティング攻撃に対する強力な権限昇格です。安全でないオリジンに対する強力な機能の削除に向けた大規模な取り組みの一環として。

Chrome は HTTPS 経由でのみこの攻撃ベクトルを許可し、この攻撃ベクトルをなくしています。HTTP サポートは Chrome 50 で終了し、Chrome 52 で完全に削除される予定です。

Document.defaultCharset を削除

要約: 仕様の遵守を改善するため、document.defaultCharset を削除しました。

削除の目的 | Chromestatus Tracker | CRBug の問題

document.defaultCharset(Chrome 49 でサポートが終了)は、ユーザーの地域設定に基づいて、ユーザーのシステムのデフォルト文字エンコードを返す読み取り専用のプロパティです。ブラウザでは、HTTP レスポンスやページに埋め込まれたメタタグ内の文字エンコード情報が使用されるため、この値を維持することに有用とは言えません。

代わりに、document.characterSet を使用して、HTTP ヘッダーに指定された最初の値を取得します。値が存在しない場合は、<meta> 要素の charset 属性で指定された値(例: <meta charset="utf-8">)が取得されます。値がいずれも利用できない場合は、document.characterSet がユーザーのシステム設定になります。

この仕様を指定しない理由の詳細については、こちらの GitHub の問題をご覧ください。

要約: HTMLLinkElementrel 属性の subresource 値のサポートを削除しました。

削除の目的 | Chromestatus Tracker | Chromium のバグ

<link> の subresource 属性の目的は、ブラウザのアイドル時間中にリソースをプリフェッチすることでした。ブラウザがページをダウンロードすると、他のページなどのリソースを事前にダウンロードしておくことができます。これにより、ユーザーがリクエストした際に、ブラウザ キャッシュから簡単にリソースを取得できます。

subresource 属性にはいくつかの問題がありました。まず 意図したとおりに機能しませんでした参照されたリソースは優先度が低くダウンロードされました。この属性は、Chrome 以外のブラウザに実装されたことはありません。Chrome の実装には、リソースが 2 回ダウンロードされるバグがありました。

コンテンツのプリロードによってユーザー エクスペリエンスを改善したいと考えているデベロッパーには、いくつかのオプションがあります。最もカスタマイズできるのは、Service Worker を構築して事前キャッシュと Caches API を利用することです。その他の解決策には、rel 属性のその他の値preconnectprefetchpreloadprerender など)が含まれます。これらのオプションの一部は試験運用版であり、広くサポートされていない場合があります。

安全でない TLS バージョンのフォールバックを削除

要約: サーバーに保護されていないバージョンの TLS または安全でないバージョンの TLS を使用してデータを返すように強制するメカニズムを削除します。

削除の目的 | Chromestatus Tracker | Chromium のバグ

Transport Layer Security(TLS)は、バージョンをネゴシエートするメカニズムをサポートしているため、互換性を損なうことなく新しい TLS バージョンを導入できます。一部のサーバーでは、ブラウザが安全でないエンドポイントを代替手段として使用する必要があるような方法で実装されていました。このため、攻撃者は、正しく構成されていないウェブサイトだけでなく、脆弱なバージョンの TLS のネゴシエーションを強制的に行う可能性があります。

影響を受けるサイトは ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION に接続できなくなります。管理者は、サーバー ソフトウェアが最新であることを確認する必要があります。それでも解決しない場合は、サーバー ソフトウェア ベンダーに問い合わせて、修正プログラムが利用可能かどうかを確認します。

KeyboardEvent.prototype.keyLocation を削除

要約: Keyboard.prototype.location 属性の不要なエイリアスを削除します。

削除の目的 | Chromestatus Tracker | Chromium のバグ

この属性は単に Keyboard.prototype.location 属性のエイリアスであるため、キーボード上の複数の場所にあるキーを区別できます。たとえば、デベロッパーはどちらの属性も拡張キーボードの 2 つの Enter キーを区別できます。

RTCPeerConnection メソッドに必要なエラーハンドラと成功ハンドラ

要約: WebRTC の RTCPeerConnection メソッド createOffer()createAnswer() には、成功ハンドラとエラーハンドラが必要になりました。以前は、成功ハンドラのみでこれらのメソッドを呼び出すことができました。この使用法は非推奨になりました。

削除の目的 | Chromestatus Tracker | Chromium のバグ

Chrome 49 では、エラーハンドラを指定せずに setLocalDescription() または setRemoteDescription() を呼び出した場合に警告が追加されました。Chrome 50 では、エラーハンドラの引数が必須です。

これは、WebRTC 仕様で要求されている、これらのメソッドに Promise を導入する方法をクリアする一環です。

WebRTC の RTCPeerConnection デモの例(main.js、126 行目)を以下に示します。

    function onCreateOfferSuccess(desc) {
      pc1.setLocalDescription(desc, function() {
         onSetLocalSuccess(pc1);
      }, onSetSessionDescriptionError);
      pc2.setRemoteDescription(desc, function() {
        onSetRemoteSuccess(pc2);
      }, onSetSessionDescriptionError);
      pc2.createAnswer(onCreateAnswerSuccess, onCreateSessionDescriptionError);
    }

setLocalDescription()setRemoteDescription() の両方にエラーハンドラがあります。成功ハンドラのみを想定している古いブラウザでは、エラーハンドラ引数が存在する場合は単純に無視されます。古いブラウザでこのコードを呼び出しても、例外は発生しません。

一般に、本番環境の WebRTC アプリケーションでは、WebRTC プロジェクトで管理されている shim である adapter.js を使用して、アプリを仕様の変更や接頭辞の違いから分離することをおすすめします。

XMLHttpRequestProgressEvent のサポートは終了しました

要約: XMLHttpRequestProgressEvent インターフェースは、position 属性と totalSize 属性とともに削除されます。

削除の目的 | Chromestatus Tracker | Chromium のバグ

このイベントは、Gecko 互換性プロパティ positiontotalSize をサポートするために存在しました。これら 3 つすべてのサポートは Mozilla 22 で終了し、ProgressEvent に置き換わりました。

     var progressBar = document.getElementById("p"),
          client = new XMLHttpRequest()
      client.open("GET", "magical-unicorns")
      client.onprogress = function(pe) {
        if(pe.lengthComputable) {
          progressBar.max = pe.total
          progressBar.value = pe.loaded
        }
      }

プレフィックス付きの Encrypted Media Extensions を削除

要約: プレフィックス付きの暗号化されたメディア拡張機能が削除され、仕様ベースのプレフィックスのない置き換えが採用されました。

削除の目的 | Chromestatus Tracker | Chromium のバグ

Chrome 42 では、暗号化されたメディア拡張機能の仕様ベースの接頭辞なしバージョンをリリースしました。この API は、HTMLMediaElement で使用するデジタル著作権管理システムを検出、選択、操作するために使用されます。

1 年近く前のことです。また、プレフィックスのないバージョンにはプレフィックス付きのバージョンよりも多くの機能があるため、プレフィックス付きのバージョンの API を削除します。

SVGElement.offset プロパティのサポートを削除

要約: SVGElement のオフセット プロパティが廃止され、HTMLElement でより広くサポートされているプロパティに置き換えられました。

削除の目的 | Chromestatus Tracker | Chromium のバグ

オフセット プロパティは、HTMLElementSVGElement の両方で長年サポートされていましたが、Gecko と Edge では HTMLElement でのみサポートされています。ブラウザ間の一貫性を高めるため、これらのプロパティは Chrome 48 で非推奨になり、現在は削除される予定です。

同等のプロパティは HTMLElement に含まれていますが、代わりとなるものを探しているデベロッパーは getBoundingClientRect() も使用できます。