// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Use the <code>chrome.tabCapture</code> API to interact with tab media
// streams.
namespace tabCapture {

  enum TabCaptureState {
    pending,
    active,
    stopped,
    error
  };

  dictionary CaptureInfo {
    // The id of the tab whose status changed.
    long tabId;

    // The new capture status of the tab.
    TabCaptureState status;

    // Whether an element in the tab being captured is in fullscreen mode.
    boolean fullscreen;
  };

  // MediaTrackConstraints for the media streams that will be passed to WebRTC.
  // See section on MediaTrackConstraints:
  // http://dev.w3.org/2011/webrtc/editor/getusermedia.html
  dictionary MediaStreamConstraint {
    object mandatory;
    object? _optional;
  };

  // Whether we are requesting tab video and/or audio and the
  // MediaTrackConstraints that should be set for these streams.
  dictionary CaptureOptions {
    boolean? audio;
    boolean? video;
    MediaStreamConstraint? audioConstraints;
    MediaStreamConstraint? videoConstraints;
    [nodoc] DOMString? presentationId;
  };

  callback GetTabMediaCallback =
      void ([instanceOf=LocalMediaStream] object stream);

  callback GetCapturedTabsCallback = void (CaptureInfo[] result);

  interface Functions {
    // Captures the visible area of the currently active tab.  Capture can
    // only be started on the currently active tab after the extension has been
    // <em>invoked</em>, similar to the way that
    // <a href="activeTab#invoking-activeTab">activeTab</a> works.
    //  Capture is maintained across page navigations within
    // the tab, and stops when the tab is closed, or the media stream is closed
    // by the extension.
    //
    // |options| : Configures the returned media stream.
    // |callback| : Callback with either the tab capture MediaStream or
    //   <code>null</code>.  <code>null</code> indicates an error has occurred
    //   and the client may query chrome.runtime.lastError to access the error
    //   details.
    static void capture(CaptureOptions options,
                        GetTabMediaCallback callback);

    // Returns a list of tabs that have requested capture or are being
    // captured, i.e. status != stopped and status != error.
    // This allows extensions to inform the user that there is an existing
    // tab capture that would prevent a new tab capture from succeeding (or
    // to prevent redundant requests for the same tab).
    // |callback| : Callback invoked with CaptureInfo[] for captured tabs.
    static void getCapturedTabs(GetCapturedTabsCallback callback);

    // Creates an off-screen tab and navigates it to the given |startUrl|.
    // Then, capture is started and a MediaStream is returned via |callback|.
    //
    // Off-screen tabs are isolated from the user's normal browser experience.
    // They do not show up in the browser window or tab strip, nor are they
    // visible to extensions (e.g., via the chrome.tabs.* APIs).
    //
    // An off-screen tab remains alive until one of three events occurs: 1. All
    // MediaStreams providing its captured content are closed; 2. the page
    // self-closes (e.g., via window.close()); 3. the extension that called
    // captureOffscreenTab() is unloaded.
    //
    // Sandboxing: The off-screen tab does not have any access whatsoever to the
    // local user profile (including cookies, HTTP auth, etc.).  Instead, it is
    // provided its own sandboxed profile.  Also, it cannot access any
    // interactive resources such as keyboard/mouse input, media recording
    // devices (e.g., web cams), copy/paste to/from the system clipboard, etc.
    //
    // Note: This is a new API, currently only available in Canary/Dev channel,
    // and may change without notice.
    //
    // |options| : Constraints for the capture and returned MediaStream.
    // |callback| : Callback with either the tab capture MediaStream or
    //   <code>null</code>.  <code>null</code> indicates an error has occurred
    //   and the client may query chrome.runtime.lastError to access the error
    //   details.
    static void captureOffscreenTab(DOMString startUrl,
                                    CaptureOptions options,
                                    GetTabMediaCallback callback);
  };

  interface Events {
    // Event fired when the capture status of a tab changes.
    // This allows extension authors to keep track of the capture status of
    // tabs to keep UI elements like page actions in sync.
    // |info| : CaptureInfo with new capture status for the tab.
    static void onStatusChanged(CaptureInfo info);
  };

};
