Web SQL の非推奨化と削除

Web SQL Database API は、ユーザーのコンピュータにデータを構造化された方法で保存できるようにする API です(内部的には SQLite データベース エンジンに基づいています)。この API は 2009 年 4 月に導入され、2010 年 11 月に廃止されました。この機能は WebKit(Safari の基盤)で実装され、Blink エンジン(Chrome の基盤)でもアクティブのままでしたが、Gecko(Firefox の基盤)では実装されず、WebKit は 2019 年にこの機能を削除しました。

World Wide Web Consortium(W3C)は、ウェブ データベースを必要とする企業に対して、Web Storage API テクノロジー(localStoragesessionStorageIndexedDB など)の導入を推奨しています。これらのテクノロジーは、Key-Value ストアと構造化データに強みを発揮しますが、強力なクエリ言語がないなどの弱点があることも認められています。ウェブ上で SQL が求められる理由はいくつかあります。

Web SQL のサポート終了と削除の手順

  • [ 完了しました。] WebSQL は、Chromium 97サードパーティ コンテキストで非推奨になり、削除されました(2022 年 1 月 4 日)。
  • [ 完了しました。] セキュアでないコンテキストでの Web SQL アクセスは、Chromium 105(2022 年 1 月 4 日)で非推奨になりました。この時点で、Chrome DevTools の問題パネルに警告メッセージが表示されました。

セキュアでないコンテキストでの Web SQL に関する警告が表示される Chrome DevTools の [Issues] パネルは非推奨になりました。

  • [ 完了しました。] Chromium 110(2022 年 1 月 4 日)以降、セキュアでないコンテキストでの Web SQL アクセスは利用できなくなりました。この機能を引き続き使用するためのエンタープライズ ポリシーは、Chromium 110(2022 年 1 月 4 日)から Chromium 123(2022 年 1 月 4 日)までご利用いただけます。
  • [ 完了しました。] すべてのコンテキストでの Web SQL アクセスは Chromium 115(2022 年 1 月 4 日)で非推奨になり、Chrome DevTools の問題パネルに警告メッセージが表示されます。
  • [ 完了しました。] Web SQL を引き続き使用するためのサポート終了トライアルは、Chromium 117(2022 年 1 月 4 日)から Chromium 123(2022 年 1 月 4 日)まで利用できました。非推奨トライアルの詳細については、オリジン トライアルの開始をご覧ください。
  • [ 完了しました。] Chromium 119 以降、すべてのコンテキストで Web SQL にアクセスできなくなります。

次のステップ

冒頭で説明したように、Web Storage API テクノロジー(localStoragesessionStorage など)や IndexedDB 標準は、多くのケースで優れた代替手段ですが、すべてのケースで優れているわけではありません。

ストレージをウェブ デベロッパーに任せる理由

Wasm の登場により、SQL または NoSQL ソリューションをウェブに導入できるようになりました。たとえば、DuckDB-Wasmabsurd-sql などです。こうした創造活動に基づいて、デベロッパー コミュニティは、ブラウザ ベンダーよりも迅速かつ優れた方法で、新しいストレージ ソリューションをイテレーションして作成できると考えています。

Google は Web SQL を削除するだけではありません。実際、この機能は、オープンソース コミュニティによってメンテナンスされ、ブラウザに直接修正や新機能を導入する負担なしで、必要に応じて更新できるパッケージとして提供されるものに置き換えられました。Google の目的は、デベロッパーが独自のデータベースをウェブに持ち込めるようにすることです。

さらに、この例がオープンソース データベースの新しいエコシステムの繁栄に役立つことを願っています。ファイル システム アクセス ハンドルのリリースにより、カスタム ストレージ ソリューションを構築できる新しいプリミティブが提供されるようになりました。

Web SQL のサポート終了の理由

持続可能性とセキュリティに関する懸念

Web SQL 仕様は持続的に実装できないため、イノベーションと新機能が制限されます。標準の最新バージョンでは、「ユーザー エージェントは Sqlite 3.6.19 でサポートされている SQL 言語を実装する必要があります」と明記されています

SQLite は当初、悪意のある SQL ステートメントを実行するように設計されていませんでしたが、Web SQL を実装すると、ブラウザはまさにこれを実行する必要があります。セキュリティと安定性の修正に対応するには、Chromium の SQLite を更新する必要があります。これは、SQLite 3.6.19 とまったく同じ動作をするという Web SQL の要件と直接矛盾します。

API シェイプ

Web SQL も古い API です。2000 年代後半に登場したこのライブラリは、次のコードサンプル(Nolan Lawson 提供)に示すように、「コールバック地獄」の典型的な例です。ご覧のとおり、SQL ステートメント(SQLite SQL 言語を使用)は文字列としてデータベース メソッドに渡されます。

openDatabase(
  // Name
  'mydatabase',
  // Version
  1,
  // Display name
  'mydatabase',
  // Estimated size
  5000000,
  // Creation callback
  function (db) {
    db.transaction(
      // Transaction callback
      function (tx) {
        // Execute SQL statement
        tx.executeSql(
          // SQL statement
          'create table rainstorms (mood text, severity int)',
          // Arguments
          [],
          // Success callback
          function () {
            // Execute SQL statement
            tx.executeSql(
              // SQL statement
              'insert into rainstorms values (?, ?)',
              // Arguments
              ['somber', 6],
              // Success callback
              function () {
                // Execute SQL statement
                tx.executeSql(
                  // SQL statement
                  'select * from rainstorms where mood = ?',
                  // Arguments
                  ['somber'],
                  // Success callback
                  function (tx, res) {
                    // Do something with the result
                    var row = res.rows.item(0);
                    console.log(
                      'rainstorm severity: ' +
                        row.severity +
                        ',  my mood: ' +
                        row.mood,
                    );
                  },
                );
              },
            );
          },
        );
      },
      // Error callback
      function (err) {
        console.log('Transaction failed!: ' + err);
      },
      // Success callback);
      function () {
        console.log('Transaction succeeded!');
      },
    );
  },
);

このコードを実行して Chrome DevTools で作成されたテーブルを調べると、次のようになります。

Chrome DevTools の [Web SQL] セクションを調べると、mydatabase というデータベースと、rainstorms というテーブルが見つかります。このテーブルには、ムード(テキスト)列と重大度(整数)列があり、ムード「somber」と重大度「6」のエントリが 1 つあります。

実装者のサポートがない

(少なくとも今日の観点から)難解な API の形状を除き、Mozilla は SQLite 上に構築された Web SQL について多くの懸念を抱いていました。

「[SQLite] は、一般的なウェブ コンテンツに公開される API の適切な基盤ではないと考えています。特に、有用な方法で SQL をサブセット化する信頼性が高く、広く受け入れられている標準がないためです。また、SQLite の変更が後でウェブに影響することを望んでおらず、SQLite に主要なブラウザ リリース(およびウェブ標準)を活用することは慎重であると考えます。」

Mozilla の懸念については、元 Mozilla 社員の Vladimir Vukićević のブログ投稿をご覧ください。詳細については、W3C ウェブ アプリケーション ワーキング グループの議事録(詳細を確認したい場合は、IRC ログ)とメーリング リスト アーカイブをご覧ください。また、Nolan Lawson のブログ投稿では、発生した事象の概要を確認できます。

フィードバック

この投稿で説明されている非推奨の手順についてご不明な点がございましたら、blink-dev メーリング リストでお知らせください。このグループへの参加は誰でも可能で、誰でも投稿できます。

謝辞

この記事は、Joe MedleyBen MorssJoshua Bell が確認しました。