diff --git a/lib/capybara/driver/webkit/browser.rb b/lib/capybara/driver/webkit/browser.rb index a8bccc2..038d1ec 100644 --- a/lib/capybara/driver/webkit/browser.rb +++ b/lib/capybara/driver/webkit/browser.rb @@ -31,15 +31,17 @@ class Capybara::Driver::Webkit def command(name, *args) @socket.puts name - @socket.puts args.size.to_s - args.each { |arg| @socket.puts arg } + @socket.puts args.size + args.each do |arg| + @socket.puts arg.bytesize + @socket.print arg + end check read_response end def evaluate_script(script) json = command('Evaluate', script) - puts "Got JSON: #{json}" JSON.parse("[#{json}]").first end diff --git a/spec/driver_spec.rb b/spec/driver_spec.rb index bea53c0..4a9851d 100644 --- a/spec/driver_spec.rb +++ b/spec/driver_spec.rb @@ -110,5 +110,10 @@ describe Capybara::Driver::Webkit do result = subject.evaluate_script(%<'"'>) result.should === "\"" end + + it "evaluates Javascript with multiple lines" do + result = subject.evaluate_script("[1,\n2]") + result.should == [1, 2] + end end diff --git a/src/Connection.cpp b/src/Connection.cpp index 52dbf20..ae06f61 100644 --- a/src/Connection.cpp +++ b/src/Connection.cpp @@ -16,31 +16,48 @@ Connection::Connection(QTcpSocket *socket, WebPage *page, QObject *parent) : m_socket = socket; m_page = page; m_command = NULL; + m_expectingDataSize = -1; connect(m_socket, SIGNAL(readyRead()), this, SLOT(checkNext())); } void Connection::checkNext() { - while (m_socket->canReadLine()) { - readNext(); + if (m_expectingDataSize == -1) { + if (m_socket->canReadLine()) { + readLine(); + checkNext(); + } + } else { + if (m_socket->bytesAvailable() >= m_expectingDataSize) { + readDataBlock(); + checkNext(); + } } } -void Connection::readNext() { - char buffer[1024]; - qint64 lineLength = m_socket->readLine(buffer, 1024); +void Connection::readLine() { + char buffer[128]; + qint64 lineLength = m_socket->readLine(buffer, 128); if (lineLength != -1) { buffer[lineLength - 1] = 0; - processLine(buffer); + processNext(buffer); } } -void Connection::processLine(const char *line) { +void Connection::readDataBlock() { + char *buffer = new char[m_expectingDataSize + 1]; + m_socket->read(buffer, m_expectingDataSize); + buffer[m_expectingDataSize] = 0; + processNext(buffer); + m_expectingDataSize = -1; + delete buffer; +} + +void Connection::processNext(const char *data) { if (m_command) { - continueCommand(line); + continueCommand(data); } else { - m_command = createCommand(line); + m_command = createCommand(data); if (m_command) { - std::cout << "Starting command: " << line << std::endl; startCommand(); } else { m_socket->write("bad command\n"); @@ -61,11 +78,13 @@ void Connection::startCommand() { SLOT(finishCommand(bool, QString &))); } -void Connection::continueCommand(const char *line) { +void Connection::continueCommand(const char *data) { if (m_argumentsExpected == -1) { - m_argumentsExpected = QString(line).toInt(); + m_argumentsExpected = QString(data).toInt(); + } else if (m_expectingDataSize == -1) { + m_expectingDataSize = QString(data).toInt(); } else { - m_arguments.append(line); + m_arguments.append(data); } if (m_arguments.length() == m_argumentsExpected) { @@ -77,7 +96,6 @@ void Connection::finishCommand(bool success, QString &response) { m_command->deleteLater(); m_command = NULL; m_arguments.clear(); - std::cout << "Finished command" << std::endl; if (success) { m_socket->write("ok\n"); } else { diff --git a/src/Connection.h b/src/Connection.h index 38588eb..15f1d24 100644 --- a/src/Connection.h +++ b/src/Connection.h @@ -16,8 +16,9 @@ class Connection : public QObject { void finishCommand(bool success, QString &response); private: - void readNext(); - void processLine(const char *line); + void readLine(); + void readDataBlock(); + void processNext(const char *line); Command *createCommand(const char *name); void startCommand(); void continueCommand(const char *line); @@ -27,5 +28,6 @@ class Connection : public QObject { QStringList m_arguments; int m_argumentsExpected; WebPage *m_page; + int m_expectingDataSize; }; diff --git a/src/Evaluate.cpp b/src/Evaluate.cpp index 0802fa9..94654ee 100644 --- a/src/Evaluate.cpp +++ b/src/Evaluate.cpp @@ -16,7 +16,6 @@ void Evaluate::start(QStringList &arguments) { void Evaluate::addVariant(QVariant &object) { if (object.isValid()) { - std::cout << "Got type:" << object.typeName() << std::endl; switch(object.type()) { case QMetaType::QString: { @@ -48,7 +47,6 @@ void Evaluate::addVariant(QVariant &object) { m_buffer.append("null"); } } else { - std::cout << "Got invalid result" << std::endl; m_buffer.append("null"); } }