/*
 * Copyright (C) 2006, 2007 Apple, Inc.  All rights reserved.
 * Copyright (C) 2012 Google, Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "web/EditorClientImpl.h"

#include "core/editing/SelectionType.h"
#include "public/web/WebContentSettingsClient.h"
#include "public/web/WebFrameClient.h"
#include "public/web/WebViewClient.h"
#include "web/WebLocalFrameImpl.h"
#include "web/WebViewImpl.h"

namespace blink {

EditorClientImpl::EditorClientImpl(WebViewImpl* webview) : m_webView(webview) {}

EditorClientImpl::~EditorClientImpl() {}

void EditorClientImpl::respondToChangedSelection(LocalFrame* frame,
                                                 SelectionType selectionType) {
  WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(frame);
  if (webFrame->client())
    webFrame->client()->didChangeSelection(selectionType != RangeSelection);
}

void EditorClientImpl::respondToChangedContents() {
  if (m_webView->client())
    m_webView->client()->didChangeContents();
}

bool EditorClientImpl::canCopyCut(LocalFrame* frame, bool defaultValue) const {
  WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(frame);
  if (!webFrame->contentSettingsClient())
    return defaultValue;
  return webFrame->contentSettingsClient()->allowWriteToClipboard(defaultValue);
}

bool EditorClientImpl::canPaste(LocalFrame* frame, bool defaultValue) const {
  WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(frame);
  if (!webFrame->contentSettingsClient())
    return defaultValue;
  return webFrame->contentSettingsClient()->allowReadFromClipboard(
      defaultValue);
}

bool EditorClientImpl::handleKeyboardEvent(LocalFrame* frame) {
  WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(frame);
  return webFrame->client()->handleCurrentKeyboardEvent();
}

}  // namespace blink
