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

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

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

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

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

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

HTTP/0.9 のサポート終了

要約: HTTP/0.9 のサポートが終了しました。デベロッパーは、新しいバージョン(HTTP/2 が望ましい)に移行する必要があります。

削除の目的 | Chromestatus Tracker | 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 Tracker | Chromium のバグ

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

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

この変更が適切な理由は、タッチイベントの仕様に含まれていないこと以外にも、さまざまな理由があります。Chrome での initTouchEvent の実装は Safari の initTouchEvent API とまったく互換性がなく、Android の Firefox とは異なります。最後に、TouchEvent コンストラクタの方がはるかに使いやすくなっています。

こうした理由から、仕様も互換性もない API を維持するのではなく、仕様に従うことにしました。代替機能を必要とするデベロッパーは、TouchEvent コンストラクタを使用する必要があります。

iOS と Android/Chrome で initTouchEvent API の実装方法が大きく異なるため、サイトは次のようなコードを備えていることがよくあります(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 は一致するようになり、このサポート終了となるため、これは好ましくありません。ただし、Android には他の WebKit ベースや古い Blink ベースのブラウザが当面存在するため、古い API をサポートする必要があることに変わりはありません。

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

    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 Tracker | 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 の終了イベントと属性、および onended 属性を削除します

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

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

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

SVGSVGElement.viewPort のサポート終了

この実装は、2012 年以降 Chrome で機能していません。この属性は他のブラウザにはまったく存在しないため、仕様から削除されました。このため、このプロパティのサポートは終了となります。Chrome 55 で削除される予定です。

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

SVGViewElement.viewTarget のサポート終了

SVGViewElement.viewTarget 属性は SVG2.0 仕様に含まれていないため、使用頻度は少ないか、まったくありません。この属性は Chrome 54 でサポートが終了しています。Chrome 56 で削除される予定です。

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

SVGZoomEvent を削除する

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

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