// We lazy create interfaces like testRunner and internals on first access // inside layout tests since creating the bindings is expensive. Then we store // them in a hidden Map on the window so that later accesses will reuse the same // wrapper. static bool installTestInterfaceIfNeeded(LocalFrame& frame, v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info) { if (!LayoutTestSupport::isRunningLayoutTest()) return false; v8::Isolate* isolate = info.GetIsolate(); v8::Local<v8::Context> context = isolate->GetCurrentContext(); AtomicString propName = toCoreAtomicString(name); v8::Local<v8::Value> interfaces = V8HiddenValue::getHiddenValue(isolate, info.Holder(), V8HiddenValue::testInterfaces(isolate)); if (interfaces.IsEmpty()) { interfaces = v8::Map::New(isolate); V8HiddenValue::setHiddenValue(isolate, info.Holder(), V8HiddenValue::testInterfaces(isolate), interfaces); } v8::Local<v8::Map> interfacesMap = interfaces.As<v8::Map>(); v8::Local<v8::Value> result = v8CallOrCrash(interfacesMap->Get(context, name)); if (!result->IsUndefined()) { v8SetReturnValue(info, result); return true; } v8::Local<v8::Value> interface = frame.loader().client()->createTestInterface(propName); if (!interface.IsEmpty()) { v8CallOrCrash(interfacesMap->Set(context, name, interface)); v8SetReturnValue(info, interface); return true; } return false; }
void injectInternalsObject(v8::Local<v8::Context> context) { ScriptState* scriptState = ScriptState::from(context); ScriptState::Scope scope(scriptState); v8::Local<v8::Object> global = scriptState->context()->Global(); ExecutionContext* executionContext = scriptState->executionContext(); if (executionContext->isDocument()) { v8::Local<v8::Value> internals = toV8(Internals::create(toDocument(executionContext)), global, scriptState->isolate()); ASSERT(!internals.IsEmpty()); v8CallOrCrash(global->Set(scriptState->context(), v8AtomicString(scriptState->isolate(), Internals::internalsId), internals)); } }
ScriptValue call(ScriptValue v) override { RefPtr<ReadingContext> readingContext(m_readingContext); if (!readingContext) return v; bool done; v8::Local<v8::Value> item = v.v8Value(); ASSERT(item->IsObject()); v8::Local<v8::Value> value = v8CallOrCrash(v8UnpackIteratorResult(v.getScriptState(), item.As<v8::Object>(), &done)); if (done) { readingContext->onReadDone(); return v; } if (!V8Uint8Array::hasInstance(value, v.isolate())) { readingContext->onRejected(); return ScriptValue(); } readingContext->onRead(V8Uint8Array::toImpl(value.As<v8::Object>())); return v; }
void setV8ObjectPropertyAsNumber(v8::Isolate* isolate, v8::Local<v8::Object> object, String name, double value) { v8CallOrCrash(object->Set(isolate->GetCurrentContext(), stringToV8Value(name), doubleToV8Value(value))); }
Page* InspectorOverlay::overlayPage() { if (m_overlayPage) return m_overlayPage.get(); ScriptForbiddenScope::AllowUserAgentScript allowScript; DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<FrameLoaderClient>, dummyFrameLoaderClient, (EmptyFrameLoaderClient::create())); Page::PageClients pageClients; fillWithEmptyClients(pageClients); ASSERT(!m_overlayChromeClient); m_overlayChromeClient = InspectorOverlayChromeClient::create(m_webViewImpl->page()->chromeClient(), *this); pageClients.chromeClient = m_overlayChromeClient.get(); m_overlayPage = Page::create(pageClients); Settings& settings = m_webViewImpl->page()->settings(); Settings& overlaySettings = m_overlayPage->settings(); overlaySettings.genericFontFamilySettings().updateStandard(settings.genericFontFamilySettings().standard()); overlaySettings.genericFontFamilySettings().updateSerif(settings.genericFontFamilySettings().serif()); overlaySettings.genericFontFamilySettings().updateSansSerif(settings.genericFontFamilySettings().sansSerif()); overlaySettings.genericFontFamilySettings().updateCursive(settings.genericFontFamilySettings().cursive()); overlaySettings.genericFontFamilySettings().updateFantasy(settings.genericFontFamilySettings().fantasy()); overlaySettings.genericFontFamilySettings().updatePictograph(settings.genericFontFamilySettings().pictograph()); overlaySettings.setMinimumFontSize(settings.minimumFontSize()); overlaySettings.setMinimumLogicalFontSize(settings.minimumLogicalFontSize()); overlaySettings.setScriptEnabled(true); overlaySettings.setPluginsEnabled(false); overlaySettings.setLoadsImagesAutomatically(true); // FIXME: http://crbug.com/363843. Inspector should probably create its // own graphics layers and attach them to the tree rather than going // through some non-composited paint function. overlaySettings.setAcceleratedCompositingEnabled(false); RefPtrWillBeRawPtr<LocalFrame> frame = LocalFrame::create(dummyFrameLoaderClient.get(), &m_overlayPage->frameHost(), 0); frame->setView(FrameView::create(frame.get())); frame->init(); FrameLoader& loader = frame->loader(); frame->view()->setCanHaveScrollbars(false); frame->view()->setTransparent(true); const WebData& overlayPageHTMLResource = Platform::current()->loadResource("InspectorOverlayPage.html"); RefPtr<SharedBuffer> data = SharedBuffer::create(overlayPageHTMLResource.data(), overlayPageHTMLResource.size()); loader.load(FrameLoadRequest(0, blankURL(), SubstituteData(data, "text/html", "UTF-8", KURL(), ForceSynchronousLoad))); v8::Isolate* isolate = toIsolate(frame.get()); ScriptState* scriptState = ScriptState::forMainWorld(frame.get()); ASSERT(scriptState); ScriptState::Scope scope(scriptState); v8::Local<v8::Object> global = scriptState->context()->Global(); v8::Local<v8::Value> overlayHostObj = toV8(m_overlayHost.get(), global, isolate); ASSERT(!overlayHostObj.IsEmpty()); v8CallOrCrash(global->Set(scriptState->context(), v8AtomicString(isolate, "InspectorOverlayHost"), overlayHostObj)); #if OS(WIN) evaluateInOverlay("setPlatform", "windows"); #elif OS(MACOSX) evaluateInOverlay("setPlatform", "mac"); #elif OS(POSIX) evaluateInOverlay("setPlatform", "linux"); #endif return m_overlayPage.get(); }