This source file includes following definitions.
- create
- disconnect
- m_items
- populateContextMenu
- contextMenuItemSelected
- contextMenuCleared
- m_menuProvider
- disconnectClient
- setZoomFactor
- zoomFactor
- inspectedURLChanged
- setInjectedScriptForOrigin
- copyText
- escapeUnicodeNonCharacters
- sendMessageToBackend
- sendMessageToEmbedder
- showContextMenu
- getSelectionBackgroundColor
- getSelectionForegroundColor
- isUnderTest
#include "config.h"
#include "core/inspector/InspectorFrontendHost.h"
#include "bindings/v8/ScriptFunctionCall.h"
#include "bindings/v8/ScriptState.h"
#include "core/clipboard/Pasteboard.h"
#include "core/fetch/ResourceFetcher.h"
#include "core/frame/LocalFrame.h"
#include "core/html/parser/TextResourceDecoder.h"
#include "core/inspector/InspectorController.h"
#include "core/inspector/InspectorFrontendClient.h"
#include "core/loader/FrameLoader.h"
#include "core/page/ContextMenuController.h"
#include "core/page/ContextMenuProvider.h"
#include "core/page/Page.h"
#include "core/rendering/RenderTheme.h"
#include "platform/ContextMenu.h"
#include "platform/ContextMenuItem.h"
#include "platform/SharedBuffer.h"
#include "platform/UserGestureIndicator.h"
#include "platform/network/ResourceError.h"
#include "platform/network/ResourceRequest.h"
#include "platform/network/ResourceResponse.h"
namespace WebCore {
class FrontendMenuProvider FINAL : public ContextMenuProvider {
public:
static PassRefPtr<FrontendMenuProvider> create(InspectorFrontendHost* frontendHost, ScriptObject frontendApiObject, const Vector<ContextMenuItem>& items)
{
return adoptRef(new FrontendMenuProvider(frontendHost, frontendApiObject, items));
}
void disconnect()
{
m_frontendApiObject = ScriptObject();
m_frontendHost = 0;
}
private:
FrontendMenuProvider(InspectorFrontendHost* frontendHost, ScriptObject frontendApiObject, const Vector<ContextMenuItem>& items)
: m_frontendHost(frontendHost)
, m_frontendApiObject(frontendApiObject)
, m_items(items)
{
}
virtual ~FrontendMenuProvider()
{
contextMenuCleared();
}
virtual void populateContextMenu(ContextMenu* menu) OVERRIDE
{
for (size_t i = 0; i < m_items.size(); ++i)
menu->appendItem(m_items[i]);
}
virtual void contextMenuItemSelected(const ContextMenuItem* item) OVERRIDE
{
if (m_frontendHost) {
UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture);
int itemNumber = item->action() - ContextMenuItemBaseCustomTag;
ScriptFunctionCall function(m_frontendApiObject, "contextMenuItemSelected");
function.appendArgument(itemNumber);
function.call();
}
}
virtual void contextMenuCleared() OVERRIDE
{
if (m_frontendHost) {
ScriptFunctionCall function(m_frontendApiObject, "contextMenuCleared");
function.call();
m_frontendHost->m_menuProvider = 0;
}
m_items.clear();
}
InspectorFrontendHost* m_frontendHost;
ScriptObject m_frontendApiObject;
Vector<ContextMenuItem> m_items;
};
InspectorFrontendHost::InspectorFrontendHost(InspectorFrontendClient* client, Page* frontendPage)
: m_client(client)
, m_frontendPage(frontendPage)
, m_menuProvider(0)
{
ScriptWrappable::init(this);
}
InspectorFrontendHost::~InspectorFrontendHost()
{
ASSERT(!m_client);
}
void InspectorFrontendHost::disconnectClient()
{
m_client = 0;
if (m_menuProvider)
m_menuProvider->disconnect();
m_frontendPage = 0;
}
void InspectorFrontendHost::setZoomFactor(float zoom)
{
m_frontendPage->mainFrame()->setPageAndTextZoomFactors(zoom, 1);
}
float InspectorFrontendHost::zoomFactor()
{
return m_frontendPage->mainFrame()->pageZoomFactor();
}
void InspectorFrontendHost::inspectedURLChanged(const String& newURL)
{
if (m_client)
m_client->inspectedURLChanged(newURL);
}
void InspectorFrontendHost::setInjectedScriptForOrigin(const String& origin, const String& script)
{
m_frontendPage->inspectorController().setInjectedScriptForOrigin(origin, script);
}
void InspectorFrontendHost::copyText(const String& text)
{
Pasteboard::generalPasteboard()->writePlainText(text, Pasteboard::CannotSmartReplace);
}
static String escapeUnicodeNonCharacters(const String& str)
{
StringBuilder dst;
for (unsigned i = 0; i < str.length(); ++i) {
UChar c = str[i];
if (c >= 0xD800) {
unsigned symbol = static_cast<unsigned>(c);
String symbolCode = String::format("\\u%04X", symbol);
dst.append(symbolCode);
} else {
dst.append(c);
}
}
return dst.toString();
}
void InspectorFrontendHost::sendMessageToBackend(const String& message)
{
if (m_client)
m_client->sendMessageToBackend(escapeUnicodeNonCharacters(message));
}
void InspectorFrontendHost::sendMessageToEmbedder(const String& message)
{
if (m_client)
m_client->sendMessageToEmbedder(escapeUnicodeNonCharacters(message));
}
void InspectorFrontendHost::showContextMenu(Event* event, const Vector<ContextMenuItem>& items)
{
if (!event)
return;
ASSERT(m_frontendPage);
ScriptState* frontendScriptState = mainWorldScriptState(m_frontendPage->mainFrame());
ScriptObject frontendApiObject;
if (!ScriptGlobalObject::get(frontendScriptState, "InspectorFrontendAPI", frontendApiObject)) {
ASSERT_NOT_REACHED();
return;
}
RefPtr<FrontendMenuProvider> menuProvider = FrontendMenuProvider::create(this, frontendApiObject, items);
m_frontendPage->contextMenuController().showContextMenu(event, menuProvider);
m_menuProvider = menuProvider.get();
}
String InspectorFrontendHost::getSelectionBackgroundColor()
{
return RenderTheme::theme().activeSelectionBackgroundColor().serialized();
}
String InspectorFrontendHost::getSelectionForegroundColor()
{
return RenderTheme::theme().activeSelectionForegroundColor().serialized();
}
bool InspectorFrontendHost::isUnderTest()
{
return m_client && m_client->isUnderTest();
}
}