String SVGPoint::valueAsString() const { StringBuilder builder; builder.appendNumber(x()); builder.append(' '); builder.appendNumber(y()); return builder.toString(); }
static void appendServerMapMousePosition(StringBuilder& url, Event* event) { ASSERT(event); if (!is<MouseEvent>(*event)) return; ASSERT(event->target()); Node* target = event->target()->toNode(); ASSERT(target); if (!is<HTMLImageElement>(*target)) return; HTMLImageElement& imageElement = downcast<HTMLImageElement>(*target); if (!imageElement.isServerMap()) return; if (!is<RenderImage>(imageElement.renderer())) return; auto& renderer = downcast<RenderImage>(*imageElement.renderer()); // FIXME: This should probably pass true for useTransforms. FloatPoint absolutePosition = renderer.absoluteToLocal(FloatPoint(downcast<MouseEvent>(*event).pageX(), downcast<MouseEvent>(*event).pageY())); int x = absolutePosition.x(); int y = absolutePosition.y(); url.append('?'); url.appendNumber(x); url.append(','); url.appendNumber(y); }
void Option::dump(StringBuilder& builder) const { switch (type()) { case Options::Type::boolType: builder.append(m_entry.boolVal ? "true" : "false"); break; case Options::Type::unsignedType: builder.appendNumber(m_entry.unsignedVal); break; case Options::Type::doubleType: builder.appendNumber(m_entry.doubleVal); break; case Options::Type::int32Type: builder.appendNumber(m_entry.int32Val); break; case Options::Type::optionRangeType: builder.append(m_entry.optionRangeVal.rangeString()); break; case Options::Type::optionStringType: { const char* option = m_entry.optionStringVal; if (!option) option = ""; builder.append('"'); builder.append(option); builder.append('"'); break; } case Options::Type::gcLogLevelType: { builder.append(GCLogging::levelAsString(m_entry.gcLogLevelVal)); break; } } }
static void appendServerMapMousePosition(StringBuilder& url, Event* event) { if (!event->isMouseEvent()) return; ASSERT(event->target()); Node* target = event->target()->toNode(); ASSERT(target); if (!isHTMLImageElement(*target)) return; HTMLImageElement& imageElement = toHTMLImageElement(*target); if (!imageElement.isServerMap()) return; if (!imageElement.renderer() || !imageElement.renderer()->isRenderImage()) return; RenderImage* renderer = toRenderImage(imageElement.renderer()); // FIXME: This should probably pass true for useTransforms. FloatPoint absolutePosition = renderer->absoluteToLocal(FloatPoint(toMouseEvent(event)->pageX(), toMouseEvent(event)->pageY())); int x = absolutePosition.x(); int y = absolutePosition.y(); url.append('?'); url.appendNumber(x); url.append(','); url.appendNumber(y); }
String Color::serializedAsCSSComponentValue() const { StringBuilder result; result.reserveCapacity(32); bool colorHasAlpha = hasAlpha(); if (colorHasAlpha) result.appendLiteral("rgba("); else result.appendLiteral("rgb("); result.appendNumber(static_cast<unsigned char>(red())); result.appendLiteral(", "); result.appendNumber(static_cast<unsigned char>(green())); result.appendLiteral(", "); result.appendNumber(static_cast<unsigned char>(blue())); if (colorHasAlpha) { result.appendLiteral(", "); NumberToStringBuffer buffer; const char* alphaString = numberToFixedPrecisionString(alpha() / 255.0f, 6, buffer, true); result.append(alphaString, strlen(alphaString)); } result.append(')'); return result.toString(); }
String Color::serialized() const { if (!hasAlpha()) { StringBuilder builder; builder.reserveCapacity(7); builder.append('#'); appendByteAsHex(red(), builder, Lowercase); appendByteAsHex(green(), builder, Lowercase); appendByteAsHex(blue(), builder, Lowercase); return builder.toString(); } StringBuilder result; result.reserveCapacity(28); result.appendLiteral("rgba("); result.appendNumber(red()); result.appendLiteral(", "); result.appendNumber(green()); result.appendLiteral(", "); result.appendNumber(blue()); result.appendLiteral(", "); if (!alpha()) result.append('0'); else { result.append(Decimal::fromDouble(alpha() / 255.0).toString()); } result.append(')'); return result.toString(); }
static void appendServerMapMousePosition(StringBuilder& url, Event& event) { if (!is<MouseEvent>(event)) return; auto& mouseEvent = downcast<MouseEvent>(event); ASSERT(mouseEvent.target()); auto* target = mouseEvent.target()->toNode(); ASSERT(target); if (!is<HTMLImageElement>(*target)) return; auto& imageElement = downcast<HTMLImageElement>(*target); if (!imageElement.isServerMap()) return; auto* renderer = imageElement.renderer(); if (!is<RenderImage>(renderer)) return; // FIXME: This should probably pass UseTransforms in the MapCoordinatesFlags. auto absolutePosition = downcast<RenderImage>(*renderer).absoluteToLocal(FloatPoint(mouseEvent.pageX(), mouseEvent.pageY())); url.append('?'); url.appendNumber(std::lround(absolutePosition.x())); url.append(','); url.appendNumber(std::lround(absolutePosition.y())); }
// See http://tools.ietf.org/html/rfc2822#section-3.3 for more information. String makeRFC2822DateString(unsigned dayOfWeek, unsigned day, unsigned month, unsigned year, unsigned hours, unsigned minutes, unsigned seconds, int utcOffset) { StringBuilder stringBuilder; stringBuilder.append(weekdayName[dayOfWeek]); stringBuilder.appendLiteral(", "); stringBuilder.appendNumber(day); stringBuilder.append(' '); stringBuilder.append(monthName[month]); stringBuilder.append(' '); stringBuilder.appendNumber(year); stringBuilder.append(' '); stringBuilder.append(twoDigitStringFromNumber(hours)); stringBuilder.append(':'); stringBuilder.append(twoDigitStringFromNumber(minutes)); stringBuilder.append(':'); stringBuilder.append(twoDigitStringFromNumber(seconds)); stringBuilder.append(' '); stringBuilder.append(utcOffset > 0 ? '+' : '-'); int absoluteUTCOffset = abs(utcOffset); stringBuilder.append(twoDigitStringFromNumber(absoluteUTCOffset / 60)); stringBuilder.append(twoDigitStringFromNumber(absoluteUTCOffset % 60)); return stringBuilder.toString(); }
void WebInspectorServer::buildPageList(Vector<char>& data, String& contentType) { StringBuilder builder; builder.appendLiteral("[ "); ClientMap::iterator end = m_clientMap.end(); for (ClientMap::iterator it = m_clientMap.begin(); it != end; ++it) { WebPageProxy* webPage = it->second->page(); if (it != m_clientMap.begin()) builder.appendLiteral(", "); builder.appendLiteral("{ \"id\": "); builder.appendNumber(it->first); builder.appendLiteral(", \"title\": \""); builder.append(webPage->pageTitle()); builder.appendLiteral("\", \"url\": \""); builder.append(webPage->activeURL()); builder.appendLiteral("\", \"inspectorUrl\": \""); builder.append(remoteInspectorPagePath()); builder.appendNumber(it->first); builder.appendLiteral("\" }"); } builder.appendLiteral(" ]"); CString cstr = builder.toString().utf8(); data.append(cstr.data(), cstr.length()); contentType = "application/json; charset=utf-8"; }
String ImageInputType::resultForDialogSubmit() const { StringBuilder result; result.appendNumber(m_clickLocation.x()); result.append(","); result.appendNumber(m_clickLocation.y()); return result.toString(); }
void HTMLCanvasElement::createImageBuffer() const { ASSERT(!m_imageBuffer); m_hasCreatedImageBuffer = true; m_didClearImageBuffer = true; FloatSize logicalSize = size(); FloatSize deviceSize = convertLogicalToDevice(logicalSize); if (!deviceSize.isExpressibleAsIntSize()) return; if (deviceSize.width() * deviceSize.height() > MaxCanvasArea) { StringBuilder stringBuilder; stringBuilder.appendLiteral("Canvas area exceeds the maximum limit (width * height > "); stringBuilder.appendNumber(MaxCanvasArea); stringBuilder.appendLiteral(")."); document().addConsoleMessage(MessageSource::JS, MessageLevel::Warning, stringBuilder.toString()); return; } // Make sure we don't use more pixel memory than the system can support. size_t requestedPixelMemory = 4 * width() * height(); if (activePixelMemory + requestedPixelMemory > maxActivePixelMemory()) { StringBuilder stringBuilder; stringBuilder.appendLiteral("Total canvas memory use exceeds the maximum limit ("); stringBuilder.appendNumber(maxActivePixelMemory() / 1024 / 1024); stringBuilder.appendLiteral(" MB)."); document().addConsoleMessage(MessageSource::JS, MessageLevel::Warning, stringBuilder.toString()); return; } IntSize bufferSize(deviceSize.width(), deviceSize.height()); if (!bufferSize.width() || !bufferSize.height()) return; RenderingMode renderingMode = shouldAccelerate(bufferSize) ? Accelerated : Unaccelerated; setImageBuffer(ImageBuffer::create(size(), renderingMode)); if (!m_imageBuffer) return; m_imageBuffer->context().setShadowsIgnoreTransforms(true); m_imageBuffer->context().setImageInterpolationQuality(DefaultInterpolationQuality); if (document().settings() && !document().settings()->antialiased2dCanvasEnabled()) m_imageBuffer->context().setShouldAntialias(false); m_imageBuffer->context().setStrokeThickness(1); m_contextStateSaver = std::make_unique<GraphicsContextStateSaver>(m_imageBuffer->context()); JSC::JSLockHolder lock(scriptExecutionContext()->vm()); scriptExecutionContext()->vm().heap.reportExtraMemoryAllocated(memoryCost()); #if USE(IOSURFACE_CANVAS_BACKING_STORE) || ENABLE(ACCELERATED_2D_CANVAS) if (m_context && m_context->is2d()) // Recalculate compositing requirements if acceleration state changed. const_cast<HTMLCanvasElement*>(this)->setNeedsStyleRecalc(SyntheticStyleChange); #endif }
String CSSCursorImageValue::customCSSText() const { StringBuilder result; result.append(m_imageValue->cssText()); if (m_hotSpotSpecified) { result.append(' '); result.appendNumber(m_hotSpot.x()); result.append(' '); result.appendNumber(m_hotSpot.y()); } return result.toString(); }
String SVGRect::valueAsString() const { StringBuilder builder; builder.appendNumber(x()); builder.append(' '); builder.appendNumber(y()); builder.append(' '); builder.appendNumber(width()); builder.append(' '); builder.appendNumber(height()); return builder.toString(); }
JSStringRef JSContextCreateBacktrace(JSContextRef ctx, unsigned maxStackSize) { ExecState* exec = toJS(ctx); JSLockHolder lock(exec); unsigned count = 0; StringBuilder builder; CallFrame* callFrame = exec; String functionName; if (exec->callee()) { if (asObject(exec->callee())->inherits(&InternalFunction::s_info)) { functionName = asInternalFunction(exec->callee())->name(exec); builder.appendLiteral("#0 "); builder.append(functionName); builder.appendLiteral("() "); count++; } } while (true) { ASSERT(callFrame); int signedLineNumber; intptr_t sourceID; String urlString; JSValue function; exec->interpreter()->retrieveLastCaller(callFrame, signedLineNumber, sourceID, urlString, function); if (function) functionName = jsCast<JSFunction*>(function)->name(exec); else { // Caller is unknown, but if frame is empty we should still add the frame, because // something called us, and gave us arguments. if (count) break; } unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0; if (!builder.isEmpty()) builder.append('\n'); builder.append('#'); builder.appendNumber(count); builder.append(' '); builder.append(functionName); builder.appendLiteral("() at "); builder.append(urlString); builder.append(':'); builder.appendNumber(lineNumber); if (!function || ++count == maxStackSize) break; callFrame = callFrame->callerFrame(); } return OpaqueJSString::create(builder.toString()).leakRef(); }
static String imageTitle(const String& filename, const IntSize& size) { StringBuilder result; result.append(filename); result.appendLiteral(" ("); // FIXME: Localize numbers. Safari/OSX shows localized numbers with group // separaters. For example, "1,920x1,080". result.appendNumber(size.width()); result.append(static_cast<UChar>(0xD7)); // U+00D7 (multiplication sign) result.appendNumber(size.height()); result.append(')'); return result.toString(); }
String WebInspectorServer::inspectorUrlForPageID(int pageId) { if (pageId <= 0 || serverState() == Closed) return String(); StringBuilder builder; builder.appendLiteral("http://"); builder.append(bindAddress()); builder.append(':'); builder.appendNumber(port()); builder.append(remoteInspectorPagePath()); builder.appendNumber(pageId); return builder.toString(); }
String CSSCubicBezierTimingFunctionValue::customCSSText() const { StringBuilder builder; builder.appendLiteral("cubic-bezier("); builder.appendNumber(m_x1); builder.appendLiteral(", "); builder.appendNumber(m_y1); builder.appendLiteral(", "); builder.appendNumber(m_x2); builder.appendLiteral(", "); builder.appendNumber(m_y2); builder.append(')'); return builder.toString(); }
String CSSSpringTimingFunctionValue::customCSSText() const { StringBuilder builder; builder.appendLiteral("spring("); builder.appendNumber(m_mass); builder.append(' '); builder.appendNumber(m_stiffness); builder.append(' '); builder.appendNumber(m_damping); builder.append(' '); builder.appendNumber(m_initialVelocity); builder.append(')'); return builder.toString(); }
void Resource::onMemoryDump(WebMemoryDumpLevelOfDetail levelOfDetail, WebProcessMemoryDump* memoryDump) const { static const size_t kMaxURLReportLength = 128; static const int kMaxResourceClientToShowInMemoryInfra = 10; const String dumpName = getMemoryDumpName(); WebMemoryAllocatorDump* dump = memoryDump->createMemoryAllocatorDump(dumpName); dump->addScalar("encoded_size", "bytes", m_encodedSize); if (canDelete()) { dump->addScalar("dead_size", "bytes", m_encodedSize); } else { dump->addScalar("live_size", "bytes", m_encodedSize); } if (m_data) { dump->addScalar("purgeable_size", "bytes", isPurgeable() && !wasPurged() ? encodedSize() + overheadSize() : 0); m_data->onMemoryDump(dumpName, memoryDump); } if (levelOfDetail == WebMemoryDumpLevelOfDetail::Detailed) { String urlToReport = url().string(); if (urlToReport.length() > kMaxURLReportLength) { urlToReport.truncate(kMaxURLReportLength); urlToReport = urlToReport + "..."; } dump->addString("url", "", urlToReport); dump->addString("reason_not_deletable", "", reasonNotDeletable()); Vector<String> clientNames; ResourceClientWalker<ResourceClient> walker(m_clients); while (ResourceClient* client = walker.next()) clientNames.append(client->debugName()); ResourceClientWalker<ResourceClient> walker2(m_clientsAwaitingCallback); while (ResourceClient* client = walker2.next()) clientNames.append("(awaiting) " + client->debugName()); ResourceClientWalker<ResourceClient> walker3(m_finishedClients); while (ResourceClient* client = walker3.next()) clientNames.append("(finished) " + client->debugName()); std::sort(clientNames.begin(), clientNames.end(), codePointCompareLessThan); StringBuilder builder; for (size_t i = 0; i < clientNames.size() && i < kMaxResourceClientToShowInMemoryInfra; ++i) { if (i > 0) builder.append(" / "); builder.append(clientNames[i]); } if (clientNames.size() > kMaxResourceClientToShowInMemoryInfra) { builder.append(" / and "); builder.appendNumber(clientNames.size() - kMaxResourceClientToShowInMemoryInfra); builder.append(" more"); } dump->addString("ResourceClient", "", builder.toString()); } const String overheadName = dumpName + "/metadata"; WebMemoryAllocatorDump* overheadDump = memoryDump->createMemoryAllocatorDump(overheadName); overheadDump->addScalar("size", "bytes", overheadSize()); memoryDump->addSuballocation(overheadDump->guid(), String(WTF::Partitions::kAllocatedObjectPoolName)); }
String SVGTransform::valueAsString() const { double arguments[6]; size_t argumentCount = 0; switch (m_transformType) { case SVG_TRANSFORM_UNKNOWN: return emptyString(); case SVG_TRANSFORM_MATRIX: { arguments[argumentCount++] = m_matrix.a(); arguments[argumentCount++] = m_matrix.b(); arguments[argumentCount++] = m_matrix.c(); arguments[argumentCount++] = m_matrix.d(); arguments[argumentCount++] = m_matrix.e(); arguments[argumentCount++] = m_matrix.f(); break; } case SVG_TRANSFORM_TRANSLATE: { arguments[argumentCount++] = m_matrix.e(); arguments[argumentCount++] = m_matrix.f(); break; } case SVG_TRANSFORM_SCALE: { arguments[argumentCount++] = m_matrix.a(); arguments[argumentCount++] = m_matrix.d(); break; } case SVG_TRANSFORM_ROTATE: { arguments[argumentCount++] = m_angle; double angleInRad = deg2rad(m_angle); double cosAngle = cos(angleInRad); double sinAngle = sin(angleInRad); float cx = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * (1 - cosAngle) - m_matrix.f() * sinAngle) / (1 - cosAngle) / 2 : 0); float cy = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * sinAngle / (1 - cosAngle) + m_matrix.f()) / 2 : 0); if (cx || cy) { arguments[argumentCount++] = cx; arguments[argumentCount++] = cy; } break; } case SVG_TRANSFORM_SKEWX: arguments[argumentCount++] = m_angle; break; case SVG_TRANSFORM_SKEWY: arguments[argumentCount++] = m_angle; break; } ASSERT(argumentCount <= WTF_ARRAY_LENGTH(arguments)); StringBuilder builder; builder.append(transformTypePrefixForParsing(m_transformType)); for (size_t i = 0; i < argumentCount; ++i) { if (i) builder.append(' '); builder.appendNumber(arguments[i]); } builder.append(')'); return builder.toString(); }
void WebDevToolsFrontendImpl::didClearWindowObject(WebLocalFrameImpl* frame) { if (m_webFrame == frame) { v8::Isolate* isolate = v8::Isolate::GetCurrent(); ScriptState* scriptState = ScriptState::forMainWorld(m_webFrame->frame()); ScriptState::Scope scope(scriptState); if (m_devtoolsHost) m_devtoolsHost->disconnectClient(); m_devtoolsHost = DevToolsHost::create(this, m_webFrame->frame()); v8::Local<v8::Object> global = scriptState->context()->Global(); v8::Local<v8::Value> devtoolsHostObj = toV8(m_devtoolsHost.get(), global, scriptState->isolate()); ASSERT(!devtoolsHostObj.IsEmpty()); global->Set(v8AtomicString(isolate, "DevToolsHost"), devtoolsHostObj); } if (m_injectedScriptForOrigin.isEmpty()) return; String origin = frame->securityOrigin().toString(); String script = m_injectedScriptForOrigin.get(origin); if (script.isEmpty()) return; static int s_lastScriptId = 0; StringBuilder scriptWithId; scriptWithId.append(script); scriptWithId.append('('); scriptWithId.appendNumber(++s_lastScriptId); scriptWithId.append(')'); frame->frame()->script().executeScriptInMainWorld(scriptWithId.toString()); }
static String nodePosition(Node* node) { StringBuilder result; Element* body = node->document()->body(); Node* parent; for (Node* n = node; n; n = parent) { parent = n->parentOrHostNode(); if (n != node) result.appendLiteral(" of "); if (parent) { if (body && n == body) { // We don't care what offset body may be in the document. result.appendLiteral("body"); break; } if (n->isShadowRoot()) { result.append('{'); result.append(getTagName(n)); result.append('}'); } else { result.appendLiteral("child "); result.appendNumber(n->nodeIndex()); result.appendLiteral(" {"); result.append(getTagName(n)); result.append('}'); } } else result.appendLiteral("document"); } return result.toString(); }
CanvasRenderingContext* HTMLCanvasElement::getContext(const String& type, CanvasContextAttributes* attrs) { // A Canvas can either be "2D" or "webgl" but never both. If you request a 2D canvas and the existing // context is already 2D, just return that. If the existing context is WebGL, then destroy it // before creating a new 2D context. Vice versa when requesting a WebGL canvas. Requesting a // context with any other type string will destroy any existing context. // FIXME: The code depends on the context not going away once created, to prevent JS from // seeing a dangling pointer. So for now we will disallow the context from being changed // once it is created. https://bugs.webkit.org/show_bug.cgi?id=117095 if (is2dType(type)) { if (m_context && !m_context->is2d()) return nullptr; if (!m_context) { bool usesDashbardCompatibilityMode = false; #if ENABLE(DASHBOARD_SUPPORT) if (Settings* settings = document().settings()) usesDashbardCompatibilityMode = settings->usesDashboardBackwardCompatibilityMode(); #endif // Make sure we don't use more pixel memory than the system can support. size_t requestedPixelMemory = 4 * width() * height(); if (activePixelMemory + requestedPixelMemory > maxActivePixelMemory()) { StringBuilder stringBuilder; stringBuilder.appendLiteral("Total canvas memory use exceeds the maximum limit ("); stringBuilder.appendNumber(maxActivePixelMemory() / 1024 / 1024); stringBuilder.appendLiteral(" MB)."); document().addConsoleMessage(MessageSource::JS, MessageLevel::Warning, stringBuilder.toString()); return nullptr; } m_context = std::make_unique<CanvasRenderingContext2D>(this, document().inQuirksMode(), usesDashbardCompatibilityMode); #if USE(IOSURFACE_CANVAS_BACKING_STORE) || ENABLE(ACCELERATED_2D_CANVAS) // Need to make sure a RenderLayer and compositing layer get created for the Canvas setNeedsStyleRecalc(SyntheticStyleChange); #endif } return m_context.get(); } #if ENABLE(WEBGL) if (shouldEnableWebGL(document().settings())) { if (is3dType(type)) { if (m_context && !m_context->is3d()) return nullptr; if (!m_context) { m_context = WebGLRenderingContextBase::create(this, static_cast<WebGLContextAttributes*>(attrs), type); if (m_context) { // Need to make sure a RenderLayer and compositing layer get created for the Canvas setNeedsStyleRecalc(SyntheticStyleChange); } } return m_context.get(); } } #else UNUSED_PARAM(attrs); #endif return nullptr; }
AtomicString FrameTree::uniqueChildName(const AtomicString& requestedName) const { // If the requested name (the frame's "name" attribute) is unique, just use that. if (!requestedName.isEmpty() && !child(requestedName) && requestedName != "_blank") return requestedName; // The "name" attribute was not unique or absent. Generate a name based on the // new frame's location in the frame tree. The name uses HTML comment syntax to // avoid collisions with author names. // An example path for the third child of the second child of the root frame: // <!--framePath //<!--frame1-->/<!--frame2-->--> const char framePathPrefix[] = "<!--framePath "; const int framePathPrefixLength = 14; const int framePathSuffixLength = 3; // Find the nearest parent that has a frame with a path in it. Vector<Frame*, 16> chain; Frame* frame; for (frame = &m_thisFrame; frame; frame = frame->tree().parent()) { if (frame->tree().uniqueName().startsWith(framePathPrefix)) break; chain.append(frame); } StringBuilder name; name.append(framePathPrefix); if (frame) { name.append(frame->tree().uniqueName().string().substring(framePathPrefixLength, frame->tree().uniqueName().length() - framePathPrefixLength - framePathSuffixLength)); } for (int i = chain.size() - 1; i >= 0; --i) { frame = chain[i]; name.append('/'); if (frame->tree().parent()) { name.appendLiteral("<!--frame"); name.appendNumber(frame->tree().indexInParent()); name.appendLiteral("-->"); } } name.appendLiteral("/<!--frame"); name.appendNumber(childCount()); name.appendLiteral("-->-->"); return name.toAtomicString(); }
static void appendLength(StringBuilder& stringBuilder, const Length& length) { stringBuilder.appendNumber(length.intValue()); if (length.type() == Percent) stringBuilder.append('%'); else stringBuilder.append("px", 2); }
static String makeV8AsyncTaskUniqueId(const String& eventName, int id) { StringBuilder builder; builder.append(eventName); builder.append(" -> "); builder.appendNumber(id); return builder.toString(); }
String CSSFontFeatureValue::customCSSText() const { StringBuilder builder; builder.append('\''); builder.append(m_tag); builder.append("' "); builder.appendNumber(m_value); return builder.toString(); }
static void appendURLAndPosition(StringBuilder& builder, const String& url, unsigned lineNumber, unsigned columnNumber) { if (url.isEmpty()) return; builder.append(url); if (lineNumber > 0) { builder.append(':'); builder.appendNumber(lineNumber); } if (columnNumber > 0) { builder.append(':'); builder.appendNumber(columnNumber); } }
String FrameConsole::formatStackTraceString(const String& originalMessage, PassRefPtrWillBeRawPtr<ScriptCallStack> callStack) { StringBuilder stackTrace; for (size_t i = 0; i < callStack->size(); ++i) { const ScriptCallFrame& frame = callStack->at(i); stackTrace.append("\n at " + (frame.functionName().length() ? frame.functionName() : "(anonymous function)")); stackTrace.appendLiteral(" ("); stackTrace.append(frame.sourceURL()); stackTrace.append(':'); stackTrace.appendNumber(frame.lineNumber()); stackTrace.append(':'); stackTrace.appendNumber(frame.columnNumber()); stackTrace.append(')'); } return stackTrace.toString(); }
// static String IdentifiersFactory::addProcessIdPrefixTo(const String& id) { StringBuilder builder; builder.appendNumber(s_processId); builder.append('.'); builder.append(id); return builder.toString(); }