/*
 * Copyright 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Author: jud@google.com (Jud Porter)

syntax = "proto2";

import "net/instaweb/rewriter/critical_keys.proto";

option optimize_for = LITE_RUNTIME;

package net_instaweb;

// This represents the list of all above-the-fold images. We aggregate critical
// image information from multiple beacons, and so we store a history of
// multiple critical image beacon responses to deal with noisy data.
//
// Next free id: 7
message CriticalImages {
  // Ids 1-4 deleted, do not reuse.

  // Critical image information.
  optional CriticalKeys html_critical_image_support = 5;
  optional CriticalKeys css_critical_image_support = 6;
}
