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

ほぼすべてのバージョンの Chrome で、プロダクト、パフォーマンス、ウェブ プラットフォームの機能に多数の更新と改善が加えられています。この記事では、9 月 15 日時点でベータ版の Chrome 54 での非推奨と削除について説明します。このリストは随時変更される可能性があります。

アンロード ハンドラでナビゲーションを無効にする

要約: Chrome を HTML 仕様、Firefox、Safari に準拠させるため、window.onunload イベント ハンドラですべてのクロスオリジン ナビゲーションが禁止されます。

削除の意図 | Chromestatus トラッカー | Chromium バグ

以前のバージョンの Chrome では、window.onunload 内でクロスオリジン ナビゲーションを中断することができました。window.location.href = '#fragment' を設定します。HTML 仕様によると、unload ハンドラで許可されるのはページ内ナビゲーションのみです。以前のバージョンの Chrome では、仕様で求められるとおり、他のナビゲーション メソッドはブロックされていました。Chrome 54 以降では、仕様と Firefox、Safari に準拠するため、このようなナビゲーションは許可されなくなります。

HTTP/0.9 の非推奨

要約: HTTP/0.9 は非推奨になりました。デベロッパーは、より新しいバージョン(できれば HTTP/2)に移行する必要があります。

削除の意図 | Chromestatus トラッカー | Chromium バグ

HTTP/0.9 は HTTP/1.x の前身です。後継機種の多くの機能が搭載されていません。最新のウェブで特に懸念されるのは、レスポンス ヘッダーがないことです。これらがないと、HTTP/0.9 レスポンスが実際に HTTP/0.9 レスポンスであることを確認できません。これにより、いくつかの問題が発生する可能性があります。たとえば、次のような問題があります。

  • 特定のエラー レスポンスを有効な HTTP/0.9 レスポンスとして扱うクライアント。
  • リクエスト ソケットを閉じることができず、クライアントがレスポンスをハングした GET として扱うサーバー。この GET は、永遠に存続するか、ユーザーがリクエストを行ったページから移動するまで存続します。
  • リクエストが失敗したことをブラウザに通知できないサーバー。キャッシュ保存のヒューリスティックに問題が生じる可能性があります。

HTTP/0.9 の問題を解決する唯一の確実な方法は、サポートを完全に削除することです。そのため、Chrome 54 では HTTP/0.9 のサポートが削除されています。

initTouchEvent の使用を削除しました

要約: initTouchEvent は、仕様への準拠を改善するために TouchEvent constructor に置き換えられ、Chrome 54 で完全に削除されます。

削除の意図 | Chromestatus トラッカー | Chromium バグ

デベロッパーは、initTouchEvent API を使用して、Chrome で合成タッチイベントを長らく作成してきました。これらは、サイトのテストや一部の UI の自動化のために、タッチイベントをシミュレートする目的でよく使用されます。Chrome 49 以降、この非推奨の API では次の警告が表示されています。

タッチイベントに関する警告
TouchEvent.initTouchEvent は非推奨となり、2016 年 9 月頃の M53 で削除されます。代わりに TouchEvent コンストラクタを使用してください。詳しくは、 https://www.chromestatus.com/features/5730982598541312 をご覧ください。

Touch Events 仕様に含まれていない以外にも、この変更が望ましい理由はいくつかあります。Chrome の initTouchEvent の実装は、Safari の initTouchEvent API とはまったく互換性がなく、Android 版 Firefox とも異なっていました。最後に、TouchEvent コンストラクタが使いやすくなっています。

このような理由から、仕様に準拠することにしました。仕様に準拠せず、唯一の他の実装とも互換性のない API を維持することはしません。代替が必要なデベロッパーは、TouchEvent コンストラクタを使用する必要があります。

initTouchEvent API の iOS と Android/Chrome の実装は大きく異なっていたため、サイトでは 次のようなコードがよく使用されていました(Firefox を忘れることがよくありました)。

    var event = document.createEvent('TouchEvent');
    
    if(ua === 'Android') {
      event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
        300, 300, 200, 200, false, false, false, false);
    } else {
      event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
        200, false, false, false, false, touches, targetTouches, changedTouches, 0, 0);
    }
    
    document.body.dispatchEvent(touchEvent);

これは、ユーザー エージェントで「Android」を探すため、Android 版 Chrome が一致してこの非推奨に該当してしまうため、好ましくありません。ただし、古い API をサポートする必要がある WebKit ベースや古い Blink ベースのブラウザが Android にしばらく残るため、まだ削除できません。

ウェブで TouchEvent を正しく処理するには、window オブジェクトで TouchEvent の存在を確認し、正の「length」がある(引数を取るコンストラクタであることを示す)場合はそれを使用することで、Firefox、IE Edge、Chrome をサポートするようにコードを変更する必要があります。

    if('TouchEvent' in window && TouchEvent.length > 0) {
      var touch = new Touch({
        identifier: 42,
        target: document.body,
        clientX: 200,
        clientY: 200,
        screenX: 300,
        screenY: 300,
        pageX: 200,
        pageY: 200,
        radiusX: 5,
        radiusY: 5
      });
    
      event = new TouchEvent("touchstart", {
        cancelable: true,
        bubbles: true,
        touches: [touch],
        targetTouches: [touch],
        changedTouches: [touch]
      });
    }
    else {
      event = document.createEvent('TouchEvent');
    
      if(ua === 'Android') {
        event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
          300, 300, 200, 200, false, false, false, false);
      } else {
        event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
          200, false, false, false, false, touches, targetTouches, 
          changedTouches, 0, 0);
      }
    }
    
    document.body.dispatchEvent(touchEvent);

KeyboardEvent.keyIdentifier 属性を削除

要約: ほとんどサポートされていない keyboardEvent.keyIdentifier プロパティが削除され、標準ベースの KeyboardEvent.key プロパティが採用されます。

削除の意図 | Chromestatus トラッカー | Chromium バグ

keyboardEvent.keyIdentifier 属性は、2009 年と 2010 年に W3C 仕様の一部として短期間存在していました。ただし、WebKit でのみ実装されました。

この属性を置き換える必要があるデベロッパーは、標準ベースの KeyboardEvent.key プロパティまたは KeyboardEvent.code プロパティ(昨年の春に公開した記事を参照)を使用できます。前者は、Safari を除くすべての主要なパソコン用ブラウザでサポートされており、最も幅広い実装ベースを備えています。後者は現在、Chrome、Firefox、Opera でサポートされています。この機能を削除することで、KeyboardEvent.key プロパティの採用を促進することを目的としています。Apple がこれをサポートするかどうかは不明ですが、非推奨(Chrome からはまだ削除されていない)の KeyboardEvent.keyCode プロパティと KeyboardEvent.charCode プロパティは Safari で引き続き使用できます。

MediaStream の ended イベント、属性、onended 属性を削除

要約: ended イベントと属性、および onended イベント ハンドラは、メディア キャプチャとストリームの仕様から削除されたため、削除されます。

削除の意図 | Chromestatus トラッカー | Chromium バグ

ended イベントも onended イベント ハンドラも、約 3 年間 WebRTC 仕様の一部ではありません。イベントを監視したいデベロッパーは、MediaStreams ではなく MediaStreamTracks を使用する必要があります。

SVGSVGElement.viewPort を非推奨に

この実装は 2012 年から Chrome で動作していません。この属性は他のブラウザにはまったく存在せず、仕様から削除されています。そのため、このプロパティは非推奨となります。Chrome 55 で削除される予定です。

削除の意図 | Chromestatus トラッカー | Chromium バグ

SVGViewElement.viewTarget を非推奨に

SVGViewElement.viewTarget 属性は SVG2.0 仕様の一部ではなく、使用頻度も低いか、まったく使用されていません。この属性は Chrome 54 で非推奨になりました。Chrome 56 で削除される予定です。

削除の意図 | Chromestatus トラッカー | Chromium バグ

SVGZoomEvent を削除

SVGZoomEvent は SVG2.0 仕様の一部ではなく、Chromium では機能しません。それでも機能は検出可能であるため、デベロッパーが混乱する可能性があります。削除されます。

削除の意図 | Chromestatus トラッカー | Chromium バグ