=== modified file 'debian/control'
--- debian/control	2016-01-28 16:23:17 +0000
+++ debian/control	2016-02-05 10:12:36 +0000
@@ -103,7 +103,7 @@
 Pre-Depends: ${misc:Pre-Depends}
 Depends: ${misc:Depends},
          ${shlibs:Depends},
-         liboxideqt-qmlplugin (>= 1.9),
+         liboxideqt-qmlplugin (>= 1.12),
          qml-module-qtquick2 (>= 5.4),
          qml-module-qtquick-window2 (>= 5.3),
          qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3),

=== modified file 'src/Ubuntu/Web/CMakeLists.txt'
--- src/Ubuntu/Web/CMakeLists.txt	2015-08-25 13:56:58 +0000
+++ src/Ubuntu/Web/CMakeLists.txt	2016-02-05 10:12:36 +0000
@@ -17,17 +17,17 @@
     Qt5::Qml
 )
 
-file(GLOB QML_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.qml qmldir *.js)
+file(GLOB PLUGIN_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.qml qmldir *.js *.png)
 install(TARGETS ${PLUGIN} DESTINATION ${UBUNTU_WEB_IMPORTS_DIR})
-install(FILES ${QML_FILES} DESTINATION ${UBUNTU_WEB_IMPORTS_DIR})
+install(FILES ${PLUGIN_FILES} DESTINATION ${UBUNTU_WEB_IMPORTS_DIR})
 
 if(NOT ${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
   # copy qml files over to build dir to be able to import them uninstalled
-  foreach(_file ${QML_FILES})
+  foreach(_file ${PLUGIN_FILES})
     add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_file}
                        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_file}
                        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${_file} ${CMAKE_CURRENT_BINARY_DIR}/${_file})
   endforeach(_file)
-  add_custom_target(copy_files_to_build_dir DEPENDS ${QML_FILES})
+  add_custom_target(copy_files_to_build_dir DEPENDS ${PLUGIN_FILES})
   add_dependencies(${PLUGIN} copy_files_to_build_dir)
 endif()

=== modified file 'src/Ubuntu/Web/UbuntuWebView02.qml'
--- src/Ubuntu/Web/UbuntuWebView02.qml	2016-01-05 08:35:58 +0000
+++ src/Ubuntu/Web/UbuntuWebView02.qml	2016-02-05 10:12:36 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013-2015 Canonical Ltd.
+ * Copyright 2013-2016 Canonical Ltd.
  *
  * This file is part of webbrowser-app.
  *
@@ -18,7 +18,7 @@
 
 import QtQuick 2.4
 import QtQuick.Window 2.2
-import com.canonical.Oxide 1.9 as Oxide
+import com.canonical.Oxide 1.12 as Oxide
 import Ubuntu.Components 1.3
 import Ubuntu.Components.Popups 1.3
 import "." // QTBUG-34418
@@ -138,6 +138,116 @@
         console.warn("WARNING: the copy() function is deprecated and does nothing.")
     }
 
+    touchSelectionController.handle: Image {
+        width: units.gu(1.5)
+        height: units.gu(1.5)
+        source: "handle.png"
+        Component.onCompleted: horizontalPaddingRatio = 0.5
+    }
+
+    UbuntuShape {
+        // FIXME: hide contextual actions while resizing the
+        // selection (needs an additional API in oxide?)
+        visible: _webview.touchSelectionController.active
+        aspect: UbuntuShape.DropShadow
+        backgroundColor: "white"
+        width: childrenRect.width + units.gu(2)
+        height: units.gu(6)
+
+        readonly property rect bounds: _webview.touchSelectionController.bounds
+        readonly property real handleHeight: units.gu(1.5)
+        readonly property real spacing: units.gu(1)
+        readonly property bool fitsBelow: (bounds.y + bounds.height + handleHeight + spacing + height) <= _webview.height
+        readonly property bool fitsAbove: (bounds.y - spacing - height) >= (_webview.locationBarController.height + _webview.locationBarController.offset)
+        x: bounds.x + (bounds.width - width) / 2
+        y: fitsBelow ? (bounds.y + bounds.height + handleHeight + spacing)
+                     : fitsAbove ? (bounds.y - spacing - height)
+                                 : bounds.y + (bounds.height - height) / 2
+
+        Row {
+            anchors {
+                top: parent.top
+                bottom: parent.bottom
+                left: parent.left
+                margins: units.gu(1)
+            }
+            spacing: units.gu(1)
+            width: {
+                // work around what seems to be a bug in Row’s childrenRect.width
+                var w = 0
+                for (var i in visibleChildren) {
+                    w += visibleChildren[i].width + spacing
+                }
+                return w - spacing
+            }
+            AbstractButton {
+                anchors {
+                    top: parent.top
+                    bottom: parent.bottom
+                }
+                width: visible ? height : 0
+                Icon {
+                    anchors.fill: parent
+                    name: "edit-cut"
+                }
+                visible: _webview.editingCapabilities & Oxide.WebView.CutCapability
+                onClicked: _webview.executeEditingCommand(Oxide.WebView.EditingCommandCut)
+            }
+            AbstractButton {
+                anchors {
+                    top: parent.top
+                    bottom: parent.bottom
+                }
+                width: visible ? height : 0
+                Icon {
+                    anchors.fill: parent
+                    name: "edit-copy"
+                }
+                visible: _webview.editingCapabilities & Oxide.WebView.CopyCapability
+                onClicked: _webview.executeEditingCommand(Oxide.WebView.EditingCommandCopy)
+            }
+            AbstractButton {
+                anchors {
+                    top: parent.top
+                    bottom: parent.bottom
+                }
+                width: visible ? height : 0
+                Icon {
+                    anchors.fill: parent
+                    name: "edit-paste"
+                }
+                visible: _webview.editingCapabilities & Oxide.WebView.PasteCapability
+                onClicked: _webview.executeEditingCommand(Oxide.WebView.EditingCommandPaste)
+            }
+            AbstractButton {
+                anchors {
+                    top: parent.top
+                    bottom: parent.bottom
+                }
+                width: visible ? height : 0
+                Icon {
+                    anchors.fill: parent
+                    name: "edit-delete"
+                }
+                visible: _webview.editingCapabilities & Oxide.WebView.EraseCapability
+                onClicked: _webview.executeEditingCommand(Oxide.WebView.EditingCommandErase)
+            }
+            AbstractButton {
+                anchors {
+                    top: parent.top
+                    bottom: parent.bottom
+                }
+                width: visible ? height : 0
+                Icon {
+                    anchors.fill: parent
+                    name: "edit-select-all"
+                }
+                visible: _webview.editingCapabilities & Oxide.WebView.SelectAllCapability
+                onClicked: _webview.executeEditingCommand(Oxide.WebView.EditingCommandSelectAll)
+            }
+        }
+    }
+
     QtObject {
         id: internal
         property int lastLoadRequestStatus: -1

=== added file 'src/Ubuntu/Web/handle@27.png'
Binary files src/Ubuntu/Web/handle@27.png	1970-01-01 00:00:00 +0000 and src/Ubuntu/Web/handle@27.png	2016-02-05 10:12:36 +0000 differ
