patch 8.1.1574: tabpage option not yet implemented for popup window

Problem:    Tabpage option not yet implemented for popup window.
Solution:   Implement tabpage option, also for popup_getoptions().
diff --git a/src/popupwin.c b/src/popupwin.c
index b1c9840..e1fc0a7 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -827,11 +827,13 @@
     static win_T *
 popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
 {
-    win_T   *wp;
-    buf_T   *buf;
-    dict_T  *d;
-    int	    nr;
-    int	    i;
+    win_T	*wp;
+    tabpage_T	*tp = NULL;
+    int		tabnr;
+    buf_T	*buf;
+    dict_T	*d;
+    int		nr;
+    int		i;
 
     // Check arguments look OK.
     if (!(argvars[0].v_type == VAR_STRING && argvars[0].vval.v_string != NULL)
@@ -847,6 +849,22 @@
     }
     d = argvars[1].vval.v_dict;
 
+    if (dict_find(d, (char_u *)"tabpage", -1) != NULL)
+	tabnr = (int)dict_get_number(d, (char_u *)"tabpage");
+    else if (type == TYPE_NOTIFICATION)
+	tabnr = -1;  // notifications are global by default
+    else
+	tabnr = 0;
+    if (tabnr > 0)
+    {
+	tp = find_tabpage(tabnr);
+	if (tp == NULL)
+	{
+	    semsg(_("E996: Tabpage not found: %d"), tabnr);
+	    return NULL;
+	}
+    }
+
     // Create the window and buffer.
     wp = win_alloc_popup_win();
     if (wp == NULL)
@@ -875,20 +893,19 @@
     // Avoid that 'buftype' is reset when this buffer is entered.
     buf->b_p_initialized = TRUE;
 
-    if (dict_find(d, (char_u *)"tabpage", -1) != NULL)
-	nr = (int)dict_get_number(d, (char_u *)"tabpage");
-    else if (type == TYPE_NOTIFICATION)
-	nr = -1;  // notifications are global by default
-    else
-	nr = 0;
-
-    if (nr == 0)
+    if (tp != NULL)
+    {
+	// popup on specified tab page
+	wp->w_next = tp->tp_first_popupwin;
+	tp->tp_first_popupwin = wp;
+    }
+    else if (tabnr == 0)
     {
 	// popup on current tab page
 	wp->w_next = curtab->tp_first_popupwin;
 	curtab->tp_first_popupwin = wp;
     }
-    else if (nr < 0)
+    else // (tabnr < 0)
     {
 	win_T *prev = first_popupwin;
 
@@ -903,9 +920,6 @@
 	    prev->w_next = wp;
 	}
     }
-    else
-	// TODO: find tab page "nr"
-	emsg("Not implemented yet");
 
     popup_set_buffer_text(buf, argvars[0]);
 
@@ -1592,6 +1606,7 @@
     dict_T	*dict;
     int		id = (int)tv_get_number(argvars);
     win_T	*wp = find_popup_win(id);
+    tabpage_T	*tp;
     int		i;
 
     if (rettv_dict_alloc(rettv) == OK)
@@ -1614,6 +1629,25 @@
 	dict_add_number(dict, "drag", wp->w_popup_drag);
 	dict_add_string(dict, "highlight", wp->w_p_wcr);
 
+	// find the tabpage that holds this popup
+	i = 1;
+	FOR_ALL_TABPAGES(tp)
+	{
+	    win_T *p;
+
+	     for (p = tp->tp_first_popupwin; p != NULL; p = wp->w_next)
+		 if (p->w_id == id)
+		     break;
+	     if (p != NULL)
+		 break;
+	     ++i;
+	}
+	if (tp == NULL)
+	    i = -1;  // must be global
+	else if (tp == curtab)
+	    i = 0;
+	dict_add_number(dict, "tabpage", i);
+
 	get_padding_border(dict, wp->w_popup_padding, "padding");
 	get_padding_border(dict, wp->w_popup_border, "border");
 	get_borderhighlight(dict, wp);
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 7d723a0..451f0b6 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -398,8 +398,10 @@
   let winid = popup_create("text", {})
   let bufnr = winbufnr(winid)
   call assert_equal(1, popup_getpos(winid).visible)
+  call assert_equal(0, popup_getoptions(winid).tabpage)
   tabnew
   call assert_equal(0, popup_getpos(winid).visible)
+  call assert_equal(1, popup_getoptions(winid).tabpage)
   quit
   call assert_equal(1, popup_getpos(winid).visible)
 
@@ -411,11 +413,23 @@
   " global popup is visible in any tab
   let winid = popup_create("text", {'tabpage': -1})
   call assert_equal(1, popup_getpos(winid).visible)
+  call assert_equal(-1, popup_getoptions(winid).tabpage)
   tabnew
   call assert_equal(1, popup_getpos(winid).visible)
+  call assert_equal(-1, popup_getoptions(winid).tabpage)
   quit
   call assert_equal(1, popup_getpos(winid).visible)
   call popup_clear()
+
+  " create popup in other tab
+  tabnew
+  let winid = popup_create("text", {'tabpage': 1})
+  call assert_equal(0, popup_getpos(winid).visible)
+  call assert_equal(1, popup_getoptions(winid).tabpage)
+  quit
+  call assert_equal(1, popup_getpos(winid).visible)
+  call assert_equal(0, popup_getoptions(winid).tabpage)
+  call popup_clear()
 endfunc
 
 func Test_popup_valid_arguments()
diff --git a/src/version.c b/src/version.c
index 9060ceb..41db458 100644
--- a/src/version.c
+++ b/src/version.c
@@ -778,6 +778,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1574,
+/**/
     1573,
 /**/
     1572,