diff --git a/.travis.yml b/.travis.yml index c065b2d6d317..b47d5ac194e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ android: - extra-android-support - platform-tools - tools - - build-tools-23.0.2 + - build-tools-23.0.3 - android-23 env: diff --git a/README.md b/README.md index a3781d021ea1..35c05f08a273 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Finally, update `[PROJECT_ROOT]\.git\info\exclude` to ignore the symlink locally This project has both unit testing and integration testing, maintained and run separately. -Unit testing is done with the [Robolectric framework](http://robolectric.org/). To run unit tests simply run `gradlew testDebug`. Code coverage reports can be generated via [JaCoCo.](http://www.eclemma.org/jacoco/) To generate them locally run `gradlew jacocoTestReport`. +Unit testing is done with the [Robolectric framework](http://robolectric.org/). To run unit tests simply run `gradlew testDebug`. Integration testing is done with the [Android testing framework](http://developer.android.com/tools/testing/testing_android.html). To run integration tests run `gradlew connectedAndroidTest`. diff --git a/WordPressEditor/build.gradle b/WordPressEditor/build.gradle index 2d47277c4fa6..7f0b2f4e2904 100644 --- a/WordPressEditor/build.gradle +++ b/WordPressEditor/build.gradle @@ -8,7 +8,6 @@ buildscript { } apply plugin: 'com.android.library' -apply plugin: 'jacoco' apply plugin: 'maven' apply plugin: 'signing' @@ -119,43 +118,10 @@ uploadArchives { } // -// Testing and code coverage +// Testing // android.testOptions.unitTests.all { include '**/*Test.class' exclude '**/ApplicationTest.class' } - -jacoco { - toolVersion = "0.7.1.201405082137" -} - -// Use these to define which classes to include and exclude from code coverage analysis -def coverageSourceDirs = [ 'src/main/java' ] -def coverageExclusions = [ '**/R.class', - '**/R$*.class', - '**/*$ViewInjector*.*', - '**/BuildConfig.*', - '**/Manifest*.*', - '**/Legacy**.class', - '**/legacy/**/*.class' ] - -task jacocoTestReport(type: JacocoReport, dependsOn: "testDebug") { - group = "Reporting" - description = "Generate Jacoco coverage reports" - - classDirectories = fileTree( - dir: 'build/intermediates/classes/debug', - excludes: coverageExclusions - ) - - additionalSourceDirs = files(coverageSourceDirs) - sourceDirectories = files(coverageSourceDirs) - executionData = files('build/jacoco/testDebug.exec') - - reports { - xml.enabled = true - html.enabled = true - } -} diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java index d149212e7b1d..266e2ed4e066 100755 --- a/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java @@ -529,7 +529,7 @@ public void onClick(View v) { } else { // Visual mode mGetSelectedTextCountDownLatch = new CountDownLatch(1); - mWebView.execJavaScriptFromString("ZSSEditor.execFunctionForResult('getSelectedText');"); + mWebView.execJavaScriptFromString("ZSSEditor.execFunctionForResult('getSelectedTextToLinkify');"); try { if (mGetSelectedTextCountDownLatch.await(1, TimeUnit.SECONDS)) { dialogBundle.putString(LinkDialogFragment.LINK_DIALOG_ARG_TEXT, mJavaScriptResult); @@ -1251,7 +1251,7 @@ public void onGetHtmlResponse(Map inputArgs) { } } break; - case "getSelectedText": + case "getSelectedTextToLinkify": mJavaScriptResult = inputArgs.get("result"); mGetSelectedTextCountDownLatch.countDown(); break; diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java index f7ca4c0914de..f8e9989891fb 100755 --- a/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java @@ -211,7 +211,7 @@ public void executeCallback(String callbackId, String params) { responseIds.add("id"); responseIds.add("contents"); break; - case "getSelectedText": + case "getSelectedTextToLinkify": responseIds.add("result"); break; case "getFailedMedia": diff --git a/libs/editor-common/assets/ZSSRichTextEditor.js b/libs/editor-common/assets/ZSSRichTextEditor.js index e05190dd8537..22da90e05350 100755 --- a/libs/editor-common/assets/ZSSRichTextEditor.js +++ b/libs/editor-common/assets/ZSSRichTextEditor.js @@ -400,10 +400,53 @@ ZSSEditor.resetSelectionOnField = function(fieldId) { ZSSEditor.getSelectedText = function() { var selection = window.getSelection(); - return selection.toString(); }; +ZSSEditor.canExpandBackward = function(range) { + var caretRange = range.cloneRange(); + if (range.startOffset == 0) { + return false; + } + caretRange.setStart(range.startContainer, range.startOffset - 1); + caretRange.setEnd(range.startContainer, range.startOffset); + if (!caretRange.toString().match(/\w/)) { + return false; + } + return true; +}; + +ZSSEditor.canExpandForward = function(range) { + var caretRange = range.cloneRange(); + if (range.endOffset == range.endContainer.length) { + return false; + } + caretRange.setStart(range.endContainer, range.endOffset); + caretRange.setEnd(range.endContainer, range.endOffset + 1); + if (!caretRange.toString().match(/\w/)) { + return false; + } + return true; +}; + +ZSSEditor.getSelectedTextToLinkify = function() { + var selection = window.getSelection(); + var element = ZSSEditor.getField("zss_field_content"); + // If there is no text selected, try to expand it to the word under the cursor + if (selection.rangeCount == 1) { + var range = selection.getRangeAt(0); + while (ZSSEditor.canExpandBackward(range)) { + range.setStart(range.startContainer, range.startOffset - 1); + } + while (ZSSEditor.canExpandForward(range)) { + range.setEnd(range.endContainer, range.endOffset + 1); + } + selection.removeAllRanges(); + selection.addRange(range); + } + return selection.toString(); +}; + ZSSEditor.getCaretArguments = function() { var caretInfo = this.getYCaretInfo(); @@ -770,7 +813,13 @@ ZSSEditor.insertHTMLWrappedInParagraphTags = function(html) { // Needs addClass method ZSSEditor.insertLink = function(url, title) { - this.insertHTML('' + title + ""); + var html = '' + title + ""; + + if (this.getFocusedField().getHTML().length == 0) { + html = '<' + this.defaultParagraphSeparator + '>' + html; + } + + this.insertHTML(html); }; ZSSEditor.updateLink = function(url, title) {